2017-07-29 2 views
4

これはすでに投稿されている場合に謝罪する。vim wiki上でも答えが見つからないため、謝罪する。vim:1つのコマンドに基づいて複数のコマンドを実行する:globalコマンド

単一の:g検索のvimコマンドラインモードで複数のコマンドを実行する方法はありますか?例えば

:%g/foo/ s/bar/\[email protected]/g | exe "norm /cat\<enter>\"ayiw" 
fooに一致するすべての行に、レジスタ a、および の内容でbarを交換する必要があります(私はそれをするつもり何のために)

は、の次の反復を見つけますcat(たとえそれが数行先であっても)、周囲のワードをレジスタaに入れます。

代わりに、この特定の構文は、最初のaレジスタの現在の内容を使用してsubsitutionコマンドを完了してから、1行で(置換が完了した後に)通常モードコマンドを実行します。

この例は私の特定のユースケースではありませんが、この機能が役立つインスタンスが1つあります。 exe、つまり%g/foo/exe "norm :s/bar/\\[email protected]/g\<enter>/cat\<enter>\"ayiw"という1つの要素にすべてを入れることができるとわかりましたが、もっと柔軟に感じるので、最初の方法でやりたいと思います。


私は、この使用してバニラのvimを行うことを好むだろうが、プラグインは、このために存在する場合、それは大丈夫代替手段です。このようなことをする構文があるかどうか誰かが知っていますか?

+1

興味深い。通常、 'norm ...'は一致する行ごとに1回実行する必要がありますが、実際には1回だけ実行されるようです。 '/.../'検索はこれを引き起こすようです。 –

答えて

1

「少し小さい」汚れていますが、これはあなたのために機能しますか?

:let list = split(execute('g/cat/p'), '\n') | g/foo/ s/bar/\=matchstr(remove(list, 0), '\s\d\+\s\zs.*')/g 

これは、最初のリストに保存catのすべての出現箇所を読み込みます。 その後、最初のbarを最初のcat ...と置き換えてください。

汚れた部分はmatchstrです。

1 cat 
2 cat 
3 cat 
... 

私たちは正面から少しを削除する必要が理由だと:リストは次のようになりますので、g//pも結果の番号を返します。私は誰かがそれのためのきれいな解決策を知っている(私も清潔なvimscriptソリューションに興味があり、onelinerである必要はありません)を聞くことが大好きです。

関連する問題