7

私は、正規表現、ある種の動き、およびコピーと貼り付けを組み合わせる必要がある問題に頻繁に直面しています。vimでこれを行う方法があると確信していますが、すべてをまとめたものは見たことがありません。例として、今私が解決しようとしている問題は次のようなものです。

  1. /^Description "(.*)"/ である行を見つけます。
  2. キャプチャしたテキストを保存する
  3. /^TEXT "(.*)-/ の行に移動します。
  4. 上記のキャプチャされたテキストを手順 2 のキャプチャされたテキストに置き換えます。
  5. ファイルを進めて、必要に応じて繰り返します

VIM でこのタイプのタスクをすばやく自動化する方法を知っている人はいますか?

4

2 に答える 2

4

次のシーケンスを未使用のキー(F2など)にマップしてから、必要な回数だけ押すことができます。

:map <F2> /^Description "(.*)"<CR>y//e/^TEXT "(.*)-<CR>Pd//e

オプションで<F2>、最後に追加して、一致が失敗するまで再帰的に実行されるようにすることもできます。

:map <F2> /^Description "(.*)"<CR>y//e/^TEXT "(.*)-<CR>Pd//e<F2>

これを分解して、何が起こっているかを見てみましょう。これは、最初の検索の最初に移動します。

/^Description "(.*)"<CR>

これは、最初の検索が終了するまでヤンクします。

y//e

これは2回目の検索です。

/^TEXT "(.*)-<CR>

これにより、ヤンクしたものがカーソルの直前に配置され、1文字右に移動してから、2回目の検索が終了するまで削除されます。

Pld//e
于 2012-05-29T20:38:56.417 に答える
4

私は、新しい vim のみの機能をすべて学んでいるわけではありません。vim の前に vim を学びましたが、このソリューションは vi っぽいエディターで動作します。おそらく、vim 機能を使用したさらに優れたソリューションがあるかもしれません。

この場合、私が通常行うことは、:mapコマンドを使用して複数のキーをバインドし、それぞれが上記の一部を実行することです。しばらくの間、なくても生きていける鍵をいくつか選ぶ必要があります。gこれにはandをよく使いますv。@Neil Forrester は、素晴らしいアイデアであるファンクション キーの使用を提案しました。

これで、一致グループを示す括弧付きの正規表現パターンが表示されました。(vi または vim では、実際には各括弧の前にバックスラッシュを付けて「魔法」にする必要があります。ドキュメントを参照してください。) ただし、この解決策では、代わりにfコマンドを使用します。キャラクター; および/またはt文字にジャンプするコマンド。 f文字のt直前までジャンプします。したがって、f"文字列の最初の二重引用符にジャンプし、次に を使用t"すると、2 番目の二重引用符の直前までジャンプできます。だから、シーケンスf"lyt"最初の二重引用符を見つけ、右に 1 文字移動し、次の二重引用符まですべてをヤンクします。しかし、ヤンクされたテキストを 26 の名前付きバッファの 1 つに格納しましょう。バッファ "a" を使用してみましょう:名前付きバッファ "a" を参照するf"l"ayt" ために使用する必要があるため、これは少し混乱しますが、他にも探している文字"aがたくさんあります。"

また、「マップ」内では、Enter キーのキーストロークを記録する必要がある場合があります。これを行う方法は、Ctrl+V を押してから Enter キーを押すことです。として表示され^Mます。以下の私のコードでは、実際の後に実際のキーが続くことを意味するのではなく、Enter キーを表す単一のキー^Mを意味することを意図していないことがわかります。^M

これで、2 つのキー マッピングを作成できます。vステップ1と2をg実行し、ステップ3と4を実行するようにバインドしましょう.

:map v /^Description "/^Mf"l"ayt"

:map g /^TEXT "/^Mf"ldt""aP

実際に ^M を入力するのではなく、Ctrl+V と Enter を使用することを忘れないでください。編集せずに上記をコピー/貼り付けすることはできません。

次に、キーを使用vして手順 1 と 2 を実行し、 キーを使用gして手順 3 と 4 を実行します。

vim でスクリプトを使用してこれを行う方法もあるかもしれませんが、一方、これをスクリプト化したい場合は、短い Python スクリプト (または好みの言語) を書きたいだけかもしれません。上記の 2 つの主要なマクロは、vim でこの種のことを実行するための高速な方法を実際に提供します。

vimには、入力したキーを記録する機能があり、この種のマクロをすばやく作成するために使用できると思います。

于 2012-05-29T20:46:04.183 に答える