vimの括弧(または中括弧)でテキストを囲む方法はありますか?
言い換えれば、これをどのように行いますか?
初期文字列:
It is sunny outside.
最終的な文字列:
It is (sunny) outside.
面白いことに、私は:w
この質問を送信するためにヒットしました。
ハッピーvim-ing、SOCommunity!
vimの括弧(または中括弧)でテキストを囲む方法はありますか?
言い換えれば、これをどのように行いますか?
初期文字列:
It is sunny outside.
最終的な文字列:
It is (sunny) outside.
面白いことに、私は:w
この質問を送信するためにヒットしました。
ハッピーvim-ing、SOCommunity!
一言で言えば、私は以下を使用しています:
bcw()<Esc>P
つまり、単語の先頭に移動し、単語を切り取って挿入モードに入り、括弧を入力してから挿入モードを終了し、単語を貼り付けます。
これにより、ヤンクレジスタが上書きされることに注意してください。
もちろん、bcw を必要な移動と選択の種類に置き換えることができます。
5cc{<Enter>}<Esc>P
そのようなものの簡単なマッピングを定義できます。これはそれをするべきです。通常モードでは、zと入力して、括弧内の単語を囲みます。
:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
:s//
(検索して置換)を使用してみませんか?
例えば:
:s/sunny/(&)/
あなたはおそらく何か他のことを考えているでしょうが、私はあなたの質問からそれが何であるかを知ることができません。
(&
一致したテキストの省略形)
余談ですが、これを自動化するために、次のようなマクロを記録できます:(開始時にカーソルを使用sunny
):
qq
-レジスタにマクロの記録を開始しますq
ye
-単語の最後までヤンクします(sunny
この場合は)-またyE
、なども可能です。:s/
-コマンドモードに入り、検索と置換コマンドを開始しますCtrl+R, "
、ヤンクされたテキストを貼り付けます/(&)/
-上記のように、コマンドを終了します。コマンドラインは次のようになります:s/sunny/(&)/
enter
-括弧を追加するコマンドを実行します。q
-マクロの記録を停止しますここで、別の単語の先頭に移動すると、入力@q
してマクロを実行できます。マクロには単語に固有のものはsunny
ないので、何でも機能するはずです。
最初に、などを実行することで、単語の途中で機能するように更新できb
ます。あなたはその考えを理解します。カーソル位置を保存して復元することもできます。これは簡単に追加できます(例:mz
開始時と終了時の `z)。
私はプラグインを使用しないことを好み、簡単に移植できるようにすべてをドットファイルに制限したいと考えています。私が考える最も簡単な方法は、単純に記録して再生することです。セッション間でより頻繁に使用する予定がある場合は、.vimrc でキーをマップすることもできますが、私はその必要はありませんでした (そして、どのキーストロークにマップするかを理解するのが本当に苦手です)。
vim について初心者レベルの理解があると仮定して、(簡単にするために) 角かっこで囲みたい行があるとします。例えば
hello world
通常モードに入ります。q1
録音を開始します。今、次のことを行います
ESC ^i[ ESC $a] ESC
これにより、現在の行が括弧で囲まれたままになります。@1
これで、任意の行を選択して を押して繰り返すことができます。
たとえば、現在の単語を括弧で囲みたい場合は、次のレシピを記録して再生するだけです。
ESC bi[ ESC ea] ESC
もちろん、キーストロークの最適化を試みることもできますが、これは今のところ役に立ちます。
これは古い質問であることは知っていますが、このような複雑な解決策はまだここで言及されておらず、誰かを助けることができると確信しています. 私の.vimrcファイルには、次のような行があります。
xnoremap <silent> ( <ESC>:let p = &paste<CR>:set paste<CR>:let a = line2byte(line('.')) + col('.')<CR>gvc()<ESC>:if getregtype() ==# 'V'<CR>call setreg('"', substitute(@", '\n$', '', ''), 'c')<CR>endif<CR>P:exe "goto ".a<CR>:exe "let &paste=".p<CR>
ビジュアルモードでテキストを選択して を押すだけで十分(
です。このマッピングは、行単位およびブロック単位のビジュアル モードでも機能します。
それはどのように機能しますか?
<ESC>
ビジュアルモードを終了します
:let p = &paste<CR>:set paste<CR>...:exe "let &paste=".p<CR>
マクロが貼り付けモードで実行されることを確認します (自動インデントおよび同様の改善により、不要な余分なスペースが含まれる可能性があるため)。マクロ後の貼り付け状態は、マクロが実行される前と同じままです。
:let a = line2byte(line('.')) + col('.')<CR>
現在のバイト オフセットを検索します (1 ベース)
gv
以前に選択したテキストを再選択します
c
選択を削除し、挿入モードにして選択を置き換えます
()<ESC>
必要な括弧を入れて挿入モードを終了します
:if getregtype()==#'V'<CR>call setreg('"',substitute(@",'\n$','',''),'c')<CR>endif<CR>
\n
名前のない ( ) レジスタから末尾を削除"
し、そのタイプを文字単位に変更しますが、以前は行単位であった場合のみです (レジストリから括弧内に貼り付けることができるようにするため)。
P
以前に置き換えたテキストを括弧内に貼り付けます
:exe "goto ".a<CR>
カーソルを前の位置に戻します(goto
0ベースのオフセットを使用するため、左括弧が挿入されているため、以前に記録された位置を1つ増やす必要はありません)
他の回答ではまだ見たことのない、もう1つの便利なヒント:
マッピングでは、expand("<cword>")
(または他の同様<cWORD>
の<cexpr>
、 など) を使用します。これにより、「カーソルの下の単語」にアクセスできます。
たとえば、現在の行に出現する「カーソルの下の単語」をすべて括弧で囲まれたバージョンに置き換えるには、次のようにします。
nnoremap <leader>( :execute "s!" . expand("<cword>") . "!(&)!g"<CR>
いくつかの欠点があります。
<cword>
が壊れます (もちろん、別の文字を選択できますs///
)。/g
フラグを使用) を実行できます。を使用して、ファイル内のすべてのオカレンスを実行することもできます%s...
。このような場合は、外部プラグインを使用するよりも、範囲とグループで遊ぶ方がおそらく良いでしょう:
:%s~\v(\w{5}) ~(\1) ~g
上記は、スペースが続く 5 文字の単語を検索し、() を使用して一致をグループ化し、グループ化された一致を括弧で囲みます。