Vimの一部のテキストを括弧(または中括弧)で囲む方法はありますか?
つまり、これをどのように行うのでしょうか?
初期文字列:
It is sunny outside.
最終文字列:
It is (sunny) outside.
面白いことに、私は:w
この質問を送信します。
SOコミュニティ!
Surround.vim でうまくいくはずです。 '。'でそれを繰り返したい場合は、 here を参照してください。
1つのWordについて、私は使用しています:
bcw()<Esc>P
つまり、Wordの先頭に移動し、Wordを切り取って挿入モードにし、かっこを入力してから挿入モードを終了し、Wordを貼り付けます。
これにより、yankレジスタが上書きされることに注意してください。
もちろん、bcwを、次のような必要な移動と選択タイプに置き換えることができます。
5cc{<Enter>}<Esc>P
surround.vim を使用した例を次に示します。 vim通常モードで、目的のWord(この場合は晴れ)の上にカーソルを置き、次のように入力します。
ysiw
次に、)
と入力します
そう:
初期文字列:
It is sunny outside.
最終文字列:
It is (sunny) outside.
余分なスペース:開始括弧、または括弧(ysiw(
など)を使用して、括弧で囲み、括弧とparenとstart + endの間のスペースを囲みます)
ビジュアルモードの方が簡単ですv
を押してビジュアルモードに入ります。ここでS(
と入力すると、Wordはスペースで囲まれます。ただし、閉じる)
を代わりにS)
を使用する場合、スペースで囲まれません。
これは、()
だけでなく、<> [] {} ()
を囲むすべてのブラケットペアに適用されます。 S<
の動作は、タグエンクロージャーを予期するため、S>
のみが<>
として囲むことができます。
その他:
ysiw
に続けて}
を入力して、カーリーに対して同じことを行います
ここにさらに例を追加することもできます。
cs('
と入力して[c] hange [s] urroundings from(to '
cs'(
は、周囲から()に変更します
ds(.
から[d] elete (
[s]周辺まで
さらに:
そして、Tpopeの残りのページを引用して、リンクをクリックするのを防いでみませんか?
//引用を開始:
例で説明するのが最も簡単です。
内部で
cs"'
を押します"こんにちは世界!"に変更する
'Hello world!'
-
次に
cs'<q>
を押して変更します
<q>Hello world!</q>
-
完全に一周するには、
cst"
を押して取得します
"Hello world!"
-
区切り文字を完全に削除するには、
ds".
を押します
Hello world!
-
「Hello」にカーソルを合わせて、
ysiw]
を押します(iwはテキストオブジェクトです)。
[Hello] world!
その中括弧を作成して、スペースを追加します(スペースなしの場合は{の代わりに}を使用します):
cs]{
{ Hello } world!
-
次に、
yssb
またはyss)
で行全体を括弧で囲みます。
({ Hello } world!)
-
元のテキストに戻す:
ds{ds)
Hello world!
-
こんにちは:
ysiw<em>
<em>Hello</em> world!
-
最後に、視覚モードを試してみましょう。大文字の
V
(行ごとの視覚モードの場合)に続けてS<p class="important">
を押します。<p class="important"> <em>Hello</em> world! </p>
このプラグインはHTMLとXMLの編集に非常に強力であり、現在はVimの土地では不足しているように見えます。 (多くのプラグインが利用可能なHTML/XML挿入とは対照的に)。タグのペアを同時に追加、変更、削除するのは簡単です。
.
コマンドは、 repeat.vim をインストールすると、ds
、cs
、およびyss
で動作します。
そのsort'a事のために簡単なマッピングを定義できます。これを行う必要があります。通常モードでは、zを入力して、Wordを括弧で囲みます。
:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
なぜ:s//
( 検索と置換 )?
例えば:
:s/sunny/(&)/
おそらく何か他のことを念頭に置いていますが、あなたの質問からそれが何であるかを伝えることはできません。
(&
は一致したテキストの省略形です)
私はこれが古い質問であることを知っていますが、このような複雑な解決策はまだここで言及されておらず、誰かを助けることができると確信しています。 。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つ増やす必要はありません)
次のコマンドを使用できます。
cw(<C-r><C-o>")<ESC>
利点は、ドットコマンドを使用して、さまざまな単語に対してこのアクションを繰り返すことができることです。これは、たとえば次のようなカスタムの囲いでも機能します。
変更前:
Word
次のコマンドを使用します。
cw\enquote{<C-r><C-o>"}<ESC>
最終結果:
\enquote{Word}
私はプラグインを使わないことを好み、簡単に移植できるようにすべてをドットファイルに制限したい。私が考えられる最も簡単な方法は、単純に記録して再生することです。セッション間でより頻繁に使用する予定がある場合は、.vimrcでキーをマップすることもできますが、必要はありませんでした(どのキーストロークをマップするかわからない)。
あなたがvimの初心者レベルの理解を持っていると仮定して、角括弧で囲みたい(簡単にするために)線があるとしましょう。例えば.
hello world
通常モードに入ります。 q1
で記録を開始します。今、次を行います
ESC ^i[ ESC $a] ESC
これにより、現在の行が括弧で囲まれます。これで、任意の行を選択し、@1
を押して繰り返すことができます。
たとえば、現在のWordを構文解析する場合は、次のレシピを記録および再生します。
ESC bi[ ESC ea] ESC
もちろん、キーストロークの最適化を試みることもできますが、これは今のところ役立ちます。
このようなことについては、外部プラグインを使用するよりも、範囲とグループで遊ぶほうがおそらく良いでしょう:
:%s~\v(\w{5}) ~(\1) ~g
上記の例では、5文字の単語とそれに続くスペースを検索し、()を使用して一致をグループ化し、グループ化された一致を囲む括弧で置き換えます。