Usr_12

Nvim の:helpページ。 生成されたもので、ソースtree-sitter-vimdoc パーサーを使用して生成されています。


VIM ユーザーマニュアル - Bram Moolenaar 著
便利なテクニック
複数のコマンドを組み合わせることで、Vim でほぼあらゆる操作を実行できます。この章では、いくつかの便利な組み合わせを紹介します。これには、前の章で紹介したコマンドと、いくつかの新しいコマンドを使用します。
12.1 単語の置換 12.2 「Last, First」を「First Last」に変更 12.3 リストのソート 12.4 行の順序の反転 12.5 単語数のカウント 12.6 man ページの検索 12.7 空白のトリミング 12.8 単語が使用されている場所の検索
次の章: usr_20.txt コマンドラインコマンドの高速入力 前の章: usr_11.txt クラッシュからの復旧 目次: usr_toc.txt

単語の置換

substitute コマンドを使用して、単語のすべての出現箇所を別の単語に置き換えることができます。
:%s/four/4/g
「%」範囲は、すべての行で置換することを意味します。末尾の「g」フラグは、行内のすべての単語を置換することを意味します。ファイルに「thirtyfour」も含まれている場合、これは正しく動作しません。「thirty4」に置き換えられます。これを回避するには、「\<」アイテムを使用して単語の先頭と一致させます。
:%s/\<four/4/g
明らかに、これは「fourteen」でも間違っています。「\>」を使用して単語の末尾と一致させます。
:%s/\<four\>/4/g
プログラミングをしている場合、コメント内の「four」を置き換えたいが、コード内は置き換えたくない場合があります。これは指定が難しいため、「c」フラグを追加して、substitute コマンドに各置換についてプロンプトを表示させます。
:%s/\<four\>/4/gc

複数のファイルでの置換

複数のファイルで単語を置き換えたいとします。各ファイルを編集してコマンドを手動で入力することもできますが、記録と再生を使用する方がはるかに高速です。C++ファイル(すべて「.cpp」で終わる)を含むディレクトリがあるとします。「GetResp」という名前の関数を「GetAnswer」に名前変更したいとします。
vim *.cpp Vim を起動し、引数リストにすべての C++ ファイルが含まれるように定義します。これで最初のファイルが開かれます。qq q レジスタに記録を開始します :%s/\<GetResp\>/GetAnswer/g 最初のファイルで置換を実行します。 :wnext このファイルを書き込み、次のファイルに移動します。 q 記録を停止します。 @q q レジスタを実行します。これにより、置換と「:wnext」が再生されます。エラーメッセージが生成されないことを確認できます。 999@q 残りのファイルで q レジスタを実行します。
最後のファイルでは、「:wnext」が次のファイルに移動できないため、エラーメッセージが表示されます。これにより実行が停止し、すべてが完了します。
注記: 記録されたシーケンスを再生するときは、エラーによって実行が停止します。そのため、記録時にエラーメッセージが表示されないようにしてください。
.cpp ファイルのいずれかに「GetResp」という単語が含まれていない場合、エラーが発生し、置換が停止します。これを回避するには、substitute コマンドに「e」フラグを追加します。
:%s/\<GetResp\>/GetAnswer/ge
「e」フラグは、一致が見つからないことがエラーではないことを`:substitute`に伝えます。

12.2 「Last, First」を「First Last」に変更

このような形式の名前のリストがあります。
Doe, John
Smith, Peter
これを次のように変更したいとします。
John Doe
Peter Smith
これは1つのコマンドだけで実行できます。
:%s/\([^,]*\), \(.*\)/\2 \1/
これを部分的に分解してみましょう。明らかに、substitute コマンドで始まります。「%」は行範囲であり、ファイル全体を表します。したがって、置換はファイルのすべての行で実行されます。substitute コマンドの引数は「/from/to/」です。スラッシュは「from」パターンと「to」文字列を区切ります。「from」パターンには次のものがあります。
\([^,]*\), \(.*\)
\( \)の間の最初の部分は「Last」と一致します \( \) コンマ以外の任意の文字 [^,] 任意の数 * ", " を文字通りに一致します , \( \)の間の2番目の部分は「First」と一致します \( \) 任意の文字 . 任意の数 *
「to」の部分には「\2」と「\1」があります。これらはバックリファレンスと呼ばれます。パターン内の「\( \)」部分で一致したテキストを参照します。「\2」は2番目の「\( \)」で一致したテキスト(「First」の名前)を参照し、「\1」は最初の「\( \)」で一致したテキスト(「Last」の名前)を参照します。「to」の部分のsubstituteコマンドでは、最大9個のバックリファレンスを使用できます。「\0」は一致したパターン全体を表します。substitute コマンドにはさらにいくつかの特別な項目があります。sub-replace-specialを参照してください。

12.3 リストのソート

Makefileでは、多くの場合、ファイルのリストがあります。例えば
OBJS = \
version.o \
pch.o \
getopt.o \
util.o \
getopt1.o \
inp.o \
patch.o \
backup.o
このリストをソートするには、テキストを外部ソートコマンドでフィルタリングします。
/^OBJS
j
:.,/^$/-1!sort
これは最初の行に移動し、「OBJS」が行の先頭にあります。次に1行下に移動し、次の空行まで行をフィルタリングします。ビジュアルモードで行を選択してから「!sort」を使用することもできます。これは入力しやすいですが、行が多い場合は作業量が多くなります。結果は次のようになります。
OBJS = \
backup.o
getopt.o \
getopt1.o \
inp.o \
patch.o \
pch.o \
util.o \
version.o \
各行の末尾のバックスラッシュは、行が続くことを示すために使用されていることに注意してください。ソート後、これは間違っています!最後にあった「backup.o」行にはバックスラッシュがありませんでした。ソートして別の場所に移動したため、バックスラッシュが必要です。最も簡単な解決策は、「A \<Esc>」でバックスラッシュを追加することです。空行が後に続くようにすれば、最後の行のバックスラッシュを維持できます。そうすれば、この問題は再び発生しません。

12.4 行の順序の反転

:globalコマンドは:moveコマンドと組み合わせて、最初の行の前にあるすべての行を移動し、ファイルの順序を反転させることができます。コマンドは次のとおりです。
:global/^/move 0
省略形
:g/^/m 0
「^」正規表現は行の先頭と一致します(行が空の場合でも)。:moveコマンドは、一致する行を仮想的な0行の後に移動するため、現在一致している行がファイルの最初の行になります。:globalコマンドは行番号の変更に混乱しないため、:globalはファイルの残りの行すべてと一致し、それぞれを最初に入れます。
これは行の範囲でも機能します。まず、最初の行の上に移動し、「mt」でマークします。次に、カーソルを範囲の最後の行に移動して、次のように入力します。
:'t+1,.g/^/m 't

12.5 単語数のカウント

最大単語数のテキストを作成する必要がある場合があります。Vim は単語数をカウントできます。ファイル全体で単語数をカウントする場合は、次のコマンドを使用します。
g CTRL-G
g の後にスペースを入力しないでください。これはコマンドを読みやすくするためだけに使用されています。出力は次のようになります。
0 の 1 列目;157 の 141 行目;774 の 748 単語;4976 の 4489 バイト
現在位置にある単語数(748)とファイル内の単語の総数(774)を確認できます。
テキストがファイルの一部だけの場合、テキストの先頭に移動して「g CTRL-G」を入力し、テキストの末尾に移動して「g CTRL-G」をもう一度入力し、脳を使って単語位置の差を計算できます。これは良い練習ですが、より簡単な方法があります。ビジュアルモードで、単語をカウントするテキストを選択します。次に、「g CTRL-G」を入力します。結果は次のとおりです。
選択された行 293 の 5;単語 1884 の 70;バイト 10928 の 359
単語、行、その他の項目をカウントする他の方法については、count-itemsを参照してください。

12.6 man ページの検索 find-manpage

シェルスクリプトまたはCプログラムを編集中に、man ページを探したいコマンドまたは関数を使用しています(これはUnix上です)。まず、簡単な方法を使用してみましょう。ヘルプを探したい単語にカーソルを移動し、次のキーを押します。
K
Nvim は単語に対して:Manを実行します。man ページが見つかった場合は、表示されます。 :Manコマンドを使用して、man ページのウィンドウを開くこともできます。
:Man csh
スクロールできます。テキストが強調表示されます。これにより、必要なヘルプを見つけることができます。作業中のテキストを含むウィンドウにジャンプするには、CTRL-W w を使用します。特定のセクションのmanページを見つけるには、最初にセクション番号を入力します。たとえば、セクション3で「echo」を検索するには、次のようになります。
:Man 3 echo
典型的な形式「word(1)」でテキストにある別のmanページにジャンプするには、その上でCTRL-]を押します。以降の`:Man`コマンドは同じウィンドウを使用します。
カーソル下の単語のmanページを表示するには、次のコマンドを使用します。
K
たとえば、この行を編集中に「strstr()」の戻り値を知りたいとします。
if ( strstr (input, "aap") == )
「strstr」のどこかにあるカーソルを移動し、「K」を入力します。「strstr()」のmanページを表示するウィンドウが開きます。

12.7 空白のトリミング

行末のスペースとタブを無駄で、非効率で、見苦しいと考える人もいます。すべての行の末尾にある空白を削除するには、次のコマンドを実行します。
:%s/\s\+$//
行範囲「%」が使用されているため、これはファイル全体で機能します。`:substitute`コマンドが一致するパターンは「\s\+$」です。これは行末($の前)にある空白文字(\s)、1つ以上(+)を見つけます。このようなパターンの書き方については、後で説明します。usr_27.txtを参照してください。substituteコマンドの「to」の部分は空です:「//」。したがって、何も置き換えられず、一致する空白が効果的に削除されます。
スペースの別の無駄な使い方は、タブの前に配置することです。多くの場合、空白の量を変更せずにこれらを削除できます。しかし、必ずしもそうではありません!したがって、手動で行うのが最適です。次の検索コマンドを使用します。
/
表示されませんが、このコマンドの先頭にスペースとタブがあります。つまり、"/<Space><Tab>"となります。「x」を使ってスペースを削除し、空白の量が変化しないことを確認してください。変化した場合は、タブを挿入する必要があるかもしれません。「n」を入力して次の一致を探します。一致が見つからなくなるまで繰り返します。

12.8単語の使用箇所の検索

Unixユーザーの場合は、Vimとgrepコマンドを組み合わせて、特定の単語を含むすべてのファイルを編集できます。これは、プログラムを操作していて、特定の変数を含むすべてのファイルを表示または編集したい場合に非常に便利です。たとえば、"frame_counter"という単語を含むすべてのCプログラムファイルを編集したいとします。そのためには、次のコマンドを使用します。
vim `grep -l frame_counter *.c`
このコマンドを詳しく見てみましょう。grepコマンドは、指定された単語を含む一連のファイル内を検索します。-l引数が指定されているため、このコマンドは単語を含むファイルのみを一覧表示し、一致する行は表示しません。検索対象の単語は"frame_counter"です。実際には、これは任意の正規表現にすることができます。(注記: grepが使用する正規表現は、Vimが使用するものとまったく同じではありません。)コマンド全体はバッククォート()で囲まれています。これは、Unixシェルにこのコマンドを実行させ、その結果がコマンドラインに入力されたかのように見せかけることを意味します。そのため、grepコマンドが実行され、ファイルの一覧が生成され、これらのファイルがVimのコマンドラインに配置されます。これにより、grepの出力がファイルリストとなり、Vimでそのファイルリストが編集されます。その後、「:next」や「:first」などのコマンドを使用して、ファイルを参照できます。

各行の検索

上記のコマンドでは、単語が見つかったファイルのみが検索されます。ファイル内の単語をまだ検索する必要があります。Vimには、指定された文字列を含む一連のファイルを検索するために使用できる組み込みコマンドがあります。たとえば、すべてのCプログラムファイルで"error_string"のすべての出現箇所を検索する場合は、次のコマンドを入力します。
:grep error_string *.c
これにより、Vimは指定されたファイル(*.c)内の文字列"error_string"を検索します。エディターは、一致が見つかった最初のファイルを開き、カーソルを最初の一致する行に配置します。次の行の一致箇所に移動するには(ファイルが何であっても)、":cnext"コマンドを使用します。前のマッチに移動するには、":cprev"コマンドを使用します。すべてのマッチとその場所を確認するには、":clist"を使用します。":grep"コマンドは、外部コマンドgrep(Unix)またはfindstr(Windows)を使用します。これは、オプション'grepprg'を設定することで変更できます。
次の章: usr_20.txt コマンドラインコマンドの高速入力
著作権: manual-copyrightを参照してください vim:tw=78:ts=8:noet:ft=help:norl
メイン
コマンド索引
クイックリファレンス