Subversive は、迅速な置換を非常に簡単に実行できるようにする 2 つの新しいオペレーター モーションを提供します。これにはデフォルトのマッピングが含まれていないため、独自のマップを追加するまでは効果がありません。
以下のテキストではなく、このプラグインのビデオ説明を見たい場合は、ここも参照してください。
設定例:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
この場合、文字変更キーs
シャドウすることになるため、長い形式のcl
使用する必要があることに注意してください。
これらのマップを追加した後、 s<motion>
を実行して、モーションによって提供されるテキスト オブジェクトをデフォルト レジスタ (または提供されている場合は明示的なレジスタ) の内容に置き換えることができます。たとえば、 siw
実行してカーソル下の現在の単語を現在のヤンクに置き換えたり、 sip
実行して段落などを置き換えたりできます。
Subversive が提供するもう 1 つの興味深い演算子を使用すると、複数の連続したモーションを使用して、置換するテキストと変更を適用する行範囲の両方を指定できます。
設定例:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
このマップを追加した後、 <leader>s<motion1><motion2>
を実行し、ステータス バーのプロンプトにテキストを入力すると、 motion1
で指定されたテキストが、各行のプロンプトに入力したテキストに置き換えられます。 motion2
によって提供されます。あるいは、ビジュアル モードでmotion1
選択し、 <leader>s<motion2>
を押して同じ効果を得ることができます。
これは非常に強力です。たとえば、 <leader>siwip
実行して、カーソル下の段落内に存在する、カーソル下の現在の単語のすべてのインスタンスを置き換えることができます。または、 <leader>sl_
使用して、現在の行のカーソルの下にある文字のすべてのインスタンスを置き換えます。
<leader>ss
マッピングは、カーソル下の現在の単語を置き換えるショートカットとして使用されます。これにより、たとえば、 <leader>ssip
実行して、現在の段落のカーソル下の単語を置き換えることができます。これは完全な単語に一致するため、 <leader>siwip
とは異なることに注意してください (各一致に単語の境界がある必要はありません)。
実際に動作を見てみましょう:
この gif では、まず<leader>ssom
実行してローカルfoo
パラメータの名前を変更し、次にプロンプトにbar
と入力します ( om
「outer c# method」を表すカスタム モーションであり、このプラグインでは提供されていないことに注意してください)。また、 <leader>ss
使用しているため、テキスト_foos
完全な単語と一致しないため影響を受けないことにも注意してください。この場合、関数内のパラメータの名前を変更するだけなので、これは役に立ちます。
その後、ビジュアル モードに切り替えて、 foo
パーツ_foos
を選択し、 <leader>sie
を実行して、もう一度プロンプトにbar
と入力します。 ie
もentire buffer
を表すカスタム モーションです (詳細については次のセクションを参照)
その後、 AddFoo
のFoo
部分に移動して<leader>seie
を実行し、もう一度Bar
を入力します。最後に、完全に大文字のFOOS
に対して同じことを行います。
neovim を使用している場合は、 inccommand
オプションを有効にして、入力中に置換のリアルタイム プレビューを取得できることに注意してください ( g:subversivePromptWithActualCommand
を1
に設定するのと同等)
この動作は繰り返し可能であることにも注意してください。ある段落で<leader>siwip
実行した場合は、別の段落に移動して、 を押します.
すると、同じ置換がカーソル下の新しい段落に適用されます。
これらのマッピングを実際に活用するには、現在の段落 ( ip
)、現在の文 ( is
)、または現在の行 ( _
) などの組み込みテキスト オブジェクトに加えて、カスタム テキスト オブジェクトを追加すると便利です。現在のインデント レベル、現在のメソッド、現在のクラス、バッファ全体、現在のスクロール ページなどのカスタム テキスト オブジェクトはすべて、ここで非常に役立ちます。
たとえば、破壊活動に役立つ非常に単純なモーションをいくつか示します。
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
他にも、多くのカスタム テキスト オブジェクトを提供するプラグインがあるので、検討してみることをお勧めします。
多くの置換では、ハイライト プレビューを利用して、何が置換されているかを理解できます。ただし、ファイル全体にわたって大規模な置換を行う場合は、それぞれを確認する必要があるかもしれません。次のマップを使用してこれを行うことができます。
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
これらは、各置換を 1 つずつ実行することを除いて、上記の<leader>s
マップと同じように機能します。
上記の代替モーションのいずれかに明示的なレジスタを指定すると、プロンプトは表示されず、代わりに指定されたレジスタの内容が使用されます。たとえば、 "a<leader>siwip
カーソルの下にある現在の単語のすべてのインスタンスを、現在の段落内に存在するレジスタa
の内容に即座に置き換えます。
これで十分でない場合は、代わりに次のプラグを使用することもできます。
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
これは、プロンプトを表示する代わりにデフォルトのレジスタを使用することを除いて、以前のプラグと同じように機能します。
これを行うには、ブラック ホール レジスタを代替オーバーレンジ コマンドの 1 つに渡します。たとえば、各削除を確認する場合は、 "_<leader>siwip
または"_<leader>csiwip
となります。
残念ながら、この入力とエスケープによるキャンセルを区別する方法がないため、プロンプトに空の値を入力することはできません ( g:subversivePromptWithActualCommand
を1
に設定しない限り、その場合は正常に動作します)。
g:subversivePromptWithCurrent
- 1
に設定すると、プロンプトには置換されるテキストが含まれます。これは、単に編集したい場合に便利です。デフォルト: 0
g:subversiveCurrentTextRegister
- 設定すると、指定されたレジスタに置換されるテキストが設定されます。これは、 g:subversivePromptWithCurrent
の代替として便利です。これにより、プロンプトを編集したいときにプロンプト内で<cr>r
押すことができます ( 'r'
に設定したと仮定します)。それ以外の場合は、必要なときに直接入力するだけです。完全な交換。g:subversivePromptWithActualCommand
- 1
に設定すると、置換テキストの入力を求めるだけでなく、ネイティブの vim 置換コマンドを使用してプロンプトが表示されます。ベテランの vim ユーザーは、さまざまな置換フラグを自分で調整できるようにこれを好むかもしれません。デフォルト: 0
g:subversivePreserveCursorPosition
- 1
に設定すると、置換が適用されるときにカーソルは移動しません。デフォルトは0
で、通常の vim の動作と一致します。 vim-abolish もインストールしている場合は、次のようなマッピングを追加することも検討してください。
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
これは、vim の組み込み代替コマンドを使用する代わりに廃止 'subvert' を実行することを除いて、 <leader>s
と同じように動作します。これにより、置換が適用され、元の単語の大文字と小文字が区別されずに保持されます。例えば:
この場合、カーソルをfoo
の上に移動し、 <leader><leader>seie
を実行してからbar
を入力します。これにより、大文字と小文字に関係なくfoo
のすべてのインスタンスが置き換えられます。
これは、名前の変更をすばやく実行するのに非常に便利な方法です。
ご想像のとおり、 <leader><leader>ss
マッピングは、単語の境界を含む完全な単語のみに一致することを除いて、同様に機能します。
また、必要に応じて、プロンプトの代わりにデフォルトのレジスタを使用する代替プラグもあります。
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
vim-yoink を vim-subversive と一緒にインストールすると、貼り付け後の yoink スワッピング機能が自動的に Subversive (シングルモーション) 置換でも機能することに注意してください。言い換えれば、デフォルトのマッピングを仮定すると、 siw
を実行してから<cn>
/ <cp>
を押して、yoink 履歴からの異なるヤンク間で交換できます。
Subversive は、ビジュアル モードのペーストを置き換えるプラグも提供し、ポスト ペーストの交換も提供します。
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
ビジュアル モードでp
押すと、通常モードで貼り付けたときと同じようにヤンクを切り替えることができます。