複数行を引用符で囲む Vim

複数行を引用符で囲む Vim

次のような形式のブロックがあります。

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

    String that is not supposed to be enclosed in quotes
    String that is supposed to be enclosed in quotes

引用符で囲む必要がある行を引用符で囲む必要があります。

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

    String that is not supposed to be enclosed in quotes
    "String that is supposed to be enclosed in quotes"

Vim でこれを半自動的に実行する方法はありますか? 解決策として、gコマンドを使用する可能性があると思いました。

答え1

正規表現の使用:

:%s/.*is supposed.*/"&"/

「半自動」とは、各置換の前にプロンプ​​トを表示することを意味する場合は、/c置換パターンに修飾子を追加するだけです。

:%s/.*is supposed.*/"&"/c

説明

  • :%s現在のバッファ内のすべての行にこの置換を適用することを意味します
  • パターンは、単語を含む行ですis supposed(他の行に「引用符で囲む」という単語が含まれず、「is ought」という単語が含まれている場合は、パターンを次のように変更できます。.*is supposed to be enclosed in quotes.*
  • 一致したパターンを置き換えるために使用する文字列は です"&"。ここで、&はパターンに一致したものを表します。

答え2

有名なサラウンドプラグインは、これを素早く簡単にするさまざまなマッピングを提供します。行全体を引用するには (インデントなし)、 を使用します。コマンドと をyss"使用すると、サンプル テキストの一致するすべての行にこれを自動的に適用できます。:global:normal

:g/is supposed/normal yss"

または、一致する行を検索して、を介して繰り返しますn.

答え3

私はほとんどの場合、検索と置換よりもマクロを好みます。マクロの方が強力で、覚える必要も少なく、実行する前に対話的に確認するオプションも保持されているからです。変更したい最初の行でこれを試してください (読みやすくするために ESC と ENTER の前後にスペースを入れましたが、入力しないでください)。

qqI" ESC $bea" ESC /is supposed ENTER zzq

機能:

  • qq「q」という名前のマクロを開始します(qaはマクロ「a」を開始します)
  • I" ESC「0」のように行の先頭ではなく、最初の単語の前に「」を挿入します。これにより、通常は貴重な空白がそこに保持されます。
  • $bea" ESC行末 ($) まで移動しますが、その後単語を 1 つ戻し (b)、再び行末 (e) まで進み、最後に " (a) を追加します。この操作により、通常は役に立たない末尾の空白が続く場合でも、行の最後の単語の後に追加されます。
  • /is supposed編集を実行すると、これは「is ought」の次のインスタンスを検索します。これは、さらに数ページ下にある可能性があります。そして、カーソルをそこに適切に配置して、ユーザーが確認し、編集を続行するかどうかを決定できるようにします。「is ought」が見つからない場合、マクロは損傷なく終了します。
  • zzq行をページの中央にうまく配置 (zz) して、現在の行の後の行をいくつか表示できるようにします。マクロをすばやく適用し、数行先を確認したい場合に便利です。"q" はマクロの定義を終了し、マクロも "q" と呼ばれます。

使い方:

  • 上記のマクロの定義が完了した時点で、最初の行はすでに変更されていました。
  • エラーが発生した場合は、この 1 行を元に戻して再試行してください。
  • カーソルは、2 番目に一致するものがあればその上に配置され、ページの中央にきちんと配置されます。
  • 必要に応じて、@q を使用してマクロ (または他の同様のマクロ) を適用できます。これにより、行が編集され、3 番目の一致に位置付けられます。
  • 最後のマクロを @@ で再適用できます (@q よりも高速)。
  • 111@@ のように、一度に複数実行することもできます。マクロの適用中にエラーが発生した場合は、それ以上の繰り返しは行われないことに留意してください。
  • または、PageDown などのキーを使用して手動で先に進み、マクロを再適用することもできます。
  • また、マクロを他の編集と組み合わせることもできます。
  • また、次に :tab を押すと、このマクロを他のバッファまたはファイルに適用できます。
  • さらに嬉しいことに、マクロは vim を終了した後でも記憶されます。

マクロに慣れれば、驚くべきパワーが得られます!

答え4

正規表現バージョンは、行が実際にそのようであり、どの行がどの行であるかを識別するための文字列がある場合に機能します。そうでない場合は、大きいやりたいことをやる。

これを行うには、2 行目の先頭に移動して、次を押します。

qq I" Escape A" Escape 3j q

こうすると、最初の行が引用され、次の行が表示されます。次に、 を@q押すと、実行したすべてのアクションを再生できます。つまり、5@qこれを 5 回実行できます。

仕組み: qは、マクロの記録を開始するコマンドで、これも呼び出していますq(任意の文字を選択できます)。そのマクロでは、行の先頭に二重引用符を挿入し ( I")、挿入モードを終了し (Escape)、行末に二重引用符を追加し ( )、再び挿入モードを終了します。引用符を付ける次の行までA"3 行下に移動します ( )。マクロの記録を停止します。3jq

その後、開始した場所と同じような場所に戻るので、@として保存したマクロ ( )を実行qして、次の 2 行を再度実行できます。 の@ようにの前にカウントを付けると5@q、その回数だけ実行します。


3jスペースが不規則な場合は、の代わりにを使用できます}}k。次の段落の後の空白行まで2段落下に移動します (}}) を実行してから ( ) 戻りますk。どちらの方法でも、マクロの実行は同じです。

実際、必要な操作を実行し、目的の場所に戻るための一連のアクションを記録できます。実行する手順が、マクロを実行するすべてのコンテキストで意味をなす限り、マクロを開始し、必要な変更をすべて行って次の場所に移動し、マクロを停止して繰り返すことができます。

関連情報