1. ホーム
  2. search

[解決済み] Vimで、カーソル位置からファイル末尾までを1回のコマンド実行で検索・置換する方法は?

2022-07-29 01:13:20

質問

検索時に /  ノーマルモードコマンドで

/\vSEARCHTERM

Vimはカーソル位置から検索を開始し、下へ下へと回り込みながら検索を続けます。しかし、検索と置換を :substitute コマンドを使用すると

:%s/\vBEFORE/AFTER/gc

Vimは、代わりにファイルの先頭から始めます。

Vim がカーソル位置から検索と置換を行う方法はありますか? で始まる検索と置換を実行させる方法はありますか?

どのように解決するのですか?

1.  を使えば、問題の動作を実現するのは難しくありません。 二段代入で実現することは難しくありません。

:,$s/BEFORE/AFTER/gc|1,''-&&

まず、置換コマンドは現在の行からファイルの終わりまで、各行に対して実行されます。 からファイルの終わりまで実行されます。

,$s/BEFORE/AFTER/gc

では、その :substitute コマンドは、同じ検索 パターン、置換文字列、フラグを指定します。 :& コマンドを使います。 (を使います(参照 :help :& ):

1,''-&&

しかし、後者はファイルの最初の行から前の文脈がある行まで ファイルの最初の行から,前のコンテキストマークが設定された行までの マークが設定された行から 1 を引いた範囲に対して置換を行います。最初の :substitute コマンド は実際の置換を開始する前にカーソル位置を保存するので で指定された行は '' で指定された行は、その置換コマンドが実行される前に現在の行であった で指定された行は,その置換コマンドが実行される前の現在の行である。(その '' のアドレスは ' 擬似マークを参照してください。 :help :range:help '' をご覧ください)。

なお、2番目のコマンド( | コマンドセパレータを参照してください。 :help :bar ) は、パターンやフラグが最初のもので変更されても、 変更は必要ありません。 が変更された場合、変更の必要はありません。

2.  入力の手間を省くために、上記の置換コマンドの骨格をコマンドラインに表示させるために コマンドラインで上記の置換コマンドの骨格を呼び出すために、次のように定義することができます。 のようにノーマルモードマッピングを定義します。

:noremap <leader>cs :,$s///gc\|1,''-&&<c-b><right><right><right><right>

末尾の <c-b><right><right><right><right> の部分が必要です。 は、カーソルをコマンドラインの先頭に移動させるために必要です ( <c-b> ) に移動し に移動し、次に4文字分右に移動する ( <right>  × 4), というように、最初の2つのスラッシュ記号の間に配置し、ユーザーが検索パターンを入力できるようにします。 を入力する。検索したいパターンと を入力すると、コマンドが実行されます。 Enter .

(このような場合 // の代わりに /// と入力します。 パターンを入力する場合は,区切り記号であるスラッシュ を入力し、その後に置換文字列を入力します。 右矢印でカーソルをすでにある区切り文字に移動して の上にカーソルを移動し、置換部分を開始します)。