マクロで単語をcamelCaseに変換するにはどうすればよいですか?


14

次のような単語のリストがあります。

these are
some
words that I want
to convert to
camel case

たとえば、マクロ内にcamel case変換camelCaseする方法(または、視覚的な行選択のすべての行をキャメルケースに変換する方法)が必要です。

wgUlhx必要に応じて何度でも使用できますが、問題は、長さが異なる単語では機能しないことです(たとえば、ではwgUlhxwgUlhx機能しますconvert this pleaseが、では機能しませんconvert these pretty please)。

上記の行の望ましい出力は次のようになります

theseAre
some
wordsThatIWant
toConvertTo
camelCase

これを自動化する方法はありますか?

回答:


16

ワンライナー

単純な正規表現の置換を見つけました(「マジック」が設定されていると仮定):

:s/ \([a-zA-Z]\)/\u\1/g

これは、スペースの後の任意の1文字に一致し、文字を保存します。次に、行内のすべての一致\uについて、大文字になった保存済みの文字(=大文字、\1=最初に保存された一致)に置き換えます。

との%間にファイル全体を適用します。:s

このソリューションの欠点は、行単位であるということです(これは例に適しています)が、行内の多くの単語のうち少数の単語だけをキャメルケースに収めたい場合は不十分です。

より充実したソリューション

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

これにより、モーションを操作できる新しいオペレーターが作成されます。<leader>asがある場合\、次のテキストを(|カーソルとして)指定します:

This is some |example text to work with.

入力\g~3wすると

This is some exampleTextTo work with.

つまり、ラクダは3語以上のケースを使いました。

その置換の説明:

s/置換を開始します。
\%>'\[少し痛いです。\%>'mマークの右に合うように述べています。mark [が必要ですが、これもこのパターンでエスケープする必要があります。したがって、これは、オペレーターに与えられたモーションの後に一致を開始します。
\([a-zA-Z\)上記のワンライナーと同じです。
\%<']これはもう一方の端で、モーションの終了前に一致します。
/\u\1/g上記のワンライナーの代替品です。


実際、それはライナーではないのでマクロではありませんが、キーの組み合わせにマップできます。
ジョン・オム。

それを行うためのオペレーターバージョンを追加しました。少し良くなりました。
ジョン・オム。

あなたの答えが特にマクロを使用していなくても大丈夫だと思います。私の意見では、質問者はXY問題を提示しまし
-tommcdo

@tommcdoはい、あなたは正しいです。実際のマクロである必要はありません。何らかの自動化された方法である必要があります。
ドアノブ

12

別の方法として、強制機能を提供するvim-abolishプラグインを使用します。

有効にするfooBarfoo_barcrs(snake_caseに強制)を押します。MixedCase(crm)、camelCase(crc)、snake_case(crs)、およびUPPER_CASE(cru)はすべて、わずか3キーストロークです。これらのコマンドはrepeat.vimをサポートしています


2
+1知らなかったTim Popeのプラグインが常にあるからです。
zool

5

次のキーストロークを使用して、1行でこれを行う再帰マクロを作成できます。

qqqqqf xgUl@qq

fとの間xのスペースはスペースバーのタップであり、一時停止ではないことに注意してください)

詳細に:

  1. qレジスタをクリアします。これは、再帰的なマクロを作成しているために必要です。(手順5を参照):qqq

  2. レジスターqでマクロの記録を開始します。 qq

  3. wここでモーションを使用することはできません。マクロが次の行にジャンプするのではなく、行の終わりに到達したときに中断するようにするためです。代わりに、fキーを押してからスペースバーを押して、行の次のスペース文字にジャンプします。f<space>

  4. スペースを削除し、次の文字を大文字にします。 xgUl

  5. 再帰。q手順1でレジスタをクリアしたので、まだ何もないので、これは何もしません:@q

  6. マクロを保存します。 q

次に、範囲を使用して、このマクロを複数の行に適用できます。

ファイル内のすべての行にマクロを適用します。

:%normal @q

2〜5行目にマクロを適用します。

:2,5normal @q

視覚的に選択してから、と入力し:normal @qます。これにより、:キーを押すとコマンドラインが事前に入力され、マクロが選択範囲のすべての行に適用されるコマンドが生成されます。

:'<,'>normal @a

キーストロークの記録を開始する前に、qレジスタをクリアする必要qqはありません。実際、それがまさにレジスタqqqをクリアするために働く理由ですq:)
tommcdo

もちろん、レジスタに追加するq(つまりを使用するqQ)必要がある処理を行っている場合は、おそらく最初にクリアする必要があります。
tommcdo

2
@tommcdo私のVimのコピーでは絶対にそうではありません。(Vim 7.3.87、で呼び出されますvim -u NONE)。既存の内容は、手順6でレジスタを保存するときにのみ消去されます。したがって、再帰する場合は、開始する前にレジスタを消去する必要があります。
リッチ

@tommcdoこのステップが必要な理由をより明確にするために、答えを更新しました。
リッチ

私の間違い、私はそこに銃をジャンプしました。優れた明確化!
-tommcdo

1

http://vim.wikia.com/wiki/Changing_case_with_regular_expressionsを参照してください。 \ U、\ L、\ u、\ l修飾子については、非常に明確かつ簡潔に説明しています。

その本質は次のとおりです。

ファイルを調べて、任意の基準に一致する文字の大文字と小文字を変更したい場合があります。正規表現をよく理解していれば、実際にかなり簡単にこれを行うことができます。

大文字小文字を変更する後方参照の前に\ Uまたは\ Lを配置し、最後に\ Eを配置するだけです。Vimは、後方参照のテキストを大文字または小文字(それぞれ)にします。後方参照の最初の文字の大文字と小文字を変更するには、\ uと\ l(末尾に\ Eを付けない)を使用します。

(「後方参照」は、正規表現の前の部分を参照する正規表現の一部です。最も一般的な後方参照は、&、\ 1、\ 2、\ 3、...、\ 9です)。

この手法の威力を示す例:

ファイル全体を小文字にする

:%s /.*/ \ L&/ g

(&は一致の完全なテキストを参照する便利な後方参照です。)

<が前に付くすべての単語を大文字にします(つまり、HTMLタグ名を開きます):

:%s/<\(\w*\)/<\U\1/g

guおよびgUコマンドにも注意してください。

たとえば、ggguGはファイル全体を小文字にします。(gg =先頭に移動、gu =小文字、G = EOFに移動)。

名前のもの(\ 1、\ 2など)の代わりに\ 0一般的なbackrefを使用することで、正規表現のreplaceスタンザの入力を節約できます。

この正規表現は、ファイル内の大文字の明示的な単語セットを大文字にします。

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

ロケット科学ではありませんが、そうでなければ、これを行う必要があります。

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
回答で言及した記事を要約してください。
エバーグリーン

またね?単一リンクの回答で問題ない場合、数年後にこのサイトが削除されたリンクでいっぱいになることが非常に重要です。あなただけが参照リンクの重要な部分をコピーし、ならしてもOPがさらにに関する情報を得ることができるリンクを与え、それは大丈夫です。
peterh -復活モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.