85

vimの括弧(または中括弧)でテキストを囲む方法はありますか?

言い換えれば、これをどのように行いますか?

初期文字列:

It is sunny outside.

最終的な文字列:

It is (sunny) outside.

面白いことに、私は:wこの質問を送信するためにヒットしました。

ハッピーvim-ing、SOCommunity!

4

12 に答える 12

100

一言で言えば、私は以下を使用しています:

bcw()<Esc>P

つまり、単語の先頭に移動し、単語を切り取って挿入モードに入り、括弧を入力してから挿入モードを終了し、単語を貼り付けます。

これにより、ヤンクレジスタが上書きされることに注意してください。

もちろん、bcw を必要な移動と選択の種類に置き換えることができます。

5cc{<Enter>}<Esc>P
于 2014-07-11T14:46:41.203 に答える
40

サラウンド.vimがそのトリックを実行するはずです。'。'で繰り返したい場合は、こちらをご覧ください

于 2011-11-09T20:09:29.453 に答える
9

そのようなものの簡単なマッピングを定義できます。これはそれをするべきです。通常モードでは、zと入力して、括弧内の単語を囲みます。

:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
于 2011-11-09T21:56:23.283 に答える
5

:s//検索して置換)を使用してみませんか?

例えば:

:s/sunny/(&)/

あなたはおそらく何か他のことを考えているでしょうが、私はあなたの質問からそれが何であるかを知ることができません。

&一致したテキストの省略形)


余談ですが、これを自動化するために、次のようなマクロを記録できます:(開始時にカーソルを使用sunny):

  • qq-レジスタにマクロの記録を開始しますq
  • ye-単語の最後までヤンクします(sunnyこの場合は)-またyE、なども可能です。
  • :s/-コマンドモードに入り、検索と置換コマンドを開始します
  • Ctrl+R, "、ヤンクされたテキストを貼り付けます
  • /(&)/-上記のように、コマンドを終了します。コマンドラインは次のようになります:s/sunny/(&)/
  • enter-括弧を追加するコマンドを実行します。
  • q-マクロの記録を停止します

ここで、別の単語の先頭に移動すると、入力@qしてマクロを実行できます。マクロには単語に固有のものはsunnyないので、何でも機能するはずです。

最初に、などを実行することで、単語の途中で機能するように更新できbます。あなたはその考えを理解します。カーソル位置を保存して復元することもできます。これは簡単に追加できます(例:mz開始時と終了時の `z)。

于 2011-11-09T20:10:01.980 に答える
5

サラウンド.vim

于 2011-11-09T20:10:28.603 に答える
1

私はプラグインを使用しないことを好み、簡単に移植できるようにすべてをドットファイルに制限したいと考えています。私が考える最も簡単な方法は、単純に記録して再生することです。セッション間でより頻繁に使用する予定がある場合は、.vimrc でキーをマップすることもできますが、私はその必要はありませんでした (そして、どのキーストロークにマップするかを理解するのが本当に苦手です)。

vim について初心者レベルの理解があると仮定して、(簡単にするために) 角かっこで囲みたい行があるとします。例えば

hello world

通常モードに入ります。q1録音を開始します。今、次のことを行います

ESC ^i[ ESC $a] ESC

これにより、現在の行が括弧で囲まれたままになります。@1これで、任意の行を選択して を押して繰り返すことができます。

たとえば、現在の単語を括弧で囲みたい場合は、次のレシピを記録して再生するだけです。

ESC bi[ ESC ea] ESC

もちろん、キーストロークの最適化を試みることもできますが、これは今のところ役に立ちます。

于 2014-07-19T00:20:43.903 に答える
1

これは古い質問であることは知っていますが、このような複雑な解決策はまだここで言及されておらず、誰かを助けることができると確信しています. 私の.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>カーソルを前の位置に戻します(goto0ベースのオフセットを使用するため、左括弧が挿入されているため、以前に記録された位置を1つ増やす必要はありません)

于 2018-09-11T18:46:01.807 に答える
1

他の回答ではまだ見たことのない、もう1つの便利なヒント:

マッピングでは、expand("<cword>")(または他の同様<cWORD><cexpr>、 など) を使用します。これにより、「カーソルの下の単語」にアクセスできます。

たとえば、現在の行に出現する「カーソルの下の単語」をすべて括弧で囲まれたバージョンに置き換えるには、次のようにします。

nnoremap <leader>( :execute "s!" . expand("<cword>") . "!(&)!g"<CR>

いくつかの欠点があります。

  • 感嘆符が含まれていると、これ<cword>が壊れます (もちろん、別の文字を選択できますs///)。
  • カーソルの下の 1 つの単語だけを置き換えることはできません。行の最初の 1 つ (デフォルト)、または行のすべての出現 (上記のように、/gフラグを使用) を実行できます。を使用して、ファイル内のすべてのオカレンスを実行することもできます%s...
于 2020-07-25T17:16:02.120 に答える
0

このような場合は、外部プラグインを使用するよりも、範囲とグループで遊ぶ方がおそらく良いでしょう:

:%s~\v(\w{5}) ~(\1) ~g

上記は、スペースが続く 5 文字の単語を検索し、() を使用して一致をグループ化し、グループ化された一致を括弧で囲みます。

于 2013-12-23T17:16:24.707 に答える