1

検索後に見つかったすべての一致でマップを使用するにはどうすればよいですか?

マップを使用して呼び出すさまざまな関数を作成しました。
見つかったすべての検索一致でマップを使用したいと思います。

テキストで日付を検索する場合、見つかった検索一致ごとに ai/v/nmap をどのように適用しますか?

このようなもの?

%s/search-pattern/=\normal mode map/g
%s/search-pattern/=\insert mode map/g

マップの結合も可能ですか?

私が自分自身を明確にしたことを願っています。

4

2 に答える 2

4

Vim は非常に強力であり、挿入モード/通常モードのマップは、ここで最も便利なアプローチではないと思います。

始めるのに役立つイディオム:

編集:私はあなたの以前の質問( 計算を逆方向に視覚的に選択するにはどうすればよいですか? )に基づいて構築し、チャット で説明されたデモを提供しました

1. マクロを記録します。

qqniMyText<Esc>q

これにより、各一致位置に「MyText」が挿入されます。ここで、100@q を 100 回繰り返します (:se nowrapscan最初からやり直さないように設定を検討してください)。

2.使用:global

:g/somepattern/norm! Aappended<Esc>

検索パターンを含む各行に「appended」というテキストを追加します

3. スマート置換を使用する:

置換パターンを使用して、いくつかの「静的」編集アクションを実行できます。

:%s/\v(\d\d)-(\d\d)-(\d{4})/\3\2\1/g

dd-mm-yyyy を yyyymmdd 日付スタンプに変換します。

動的に評価される置換 (置換式で vimscript を使用\=) を行うには、事実上すべてのことを実行できます (必要に応じて、メールの送信やドキュメントの印刷を含む)。

:%s/\v<DB_\w+>/\=substitute(submatch(0), '\v_?([^_])([^_]*)', '\U\1\L\2', 'g')/g

「データベース スタイル」の名前を次のように変換するには

var DB_USER_ID = f();
var DB_USER_FIRST_NAME = f();
var DB_USER_LAST_NAME = f();
var DB_USER_HOME_ADDRESS = f();

次のような「キャメルケーススタイル名」に

var DbUserId = f();
var DbUserFirstName = f();
var DbUserLastName = f();
var DbUserHomeAddress = f();

式評価によるライブ デモ

編集コメント/チャットに応じて:これにはアプローチ#1を非常に簡単に使用できます:

/\v\c\s*\zs(\s{-}(((sqrt|log|sin|cos|tan|exp)?\(.{-}\))|(-?[0-9,.]+(e-?[0-9]+)?)|([-+*/%^]+)))+(\s*\=?)?\s*
qqa<M-.><Esc>nq

これで、すべてのドキュメントに対して繰り返すことができます:

:set nowrapscan
100@q

ここに画像の説明を入力

于 2012-05-13T00:51:58.877 に答える
3

すべての行に一致するものが 1 つしかない場合は、:global代わりに:s次を使用できます。

:%g/search-pattern/normal nrX

:[range]normalカーソルを行の先頭に配置するためn、マッピングの前に最初の一致に移動します (rX例として使用します)。すべての一致を 1 行で処理するカスタム コマンドを作成することもできますが、代わりに再帰マクロを使用してユース ケースを解決します。

最初に search: を実行して/search-patternから、マッピングを含むマクロを記録します。これにより、最後に次の一致にジャンプします: qarXnq。を介して手動で繰り返しマクロを適用したり、または@aを介し​​て再帰的にしたりできるようになりました。これを 1 回実行すると、一致がなくなるまで実行されます。qA@aq:let @a .= '@a'@a

于 2012-05-12T12:52:16.143 に答える