vimコマンドの引数として可変コンテンツを使用するにはどうすればよいですか?


12

たとえば、私がやったとしましょう

:let foo=pattern

そして今、私は実行したいが、リテラル文字列の代わりにGgrep patter変数fooを使用したいpatter

:echo foo

出力pattern、ただし

:Ggrep foo

fooを探すだけ

更新:

コマンドの文字列を作成してから:executeを実行することは解決策ではなく、ハックです。そして、それは重要な変数値で壊れます。


何であるGgrep(資本G?)?
akira

'fugutive' vimプラグインのgit grep
Vitaly Kushner

コマンド例が間違っています。foo = 'pattern'とする必要があります。:executeがハックであると完全に間違っていると言います。それが解決策です:vimでコマンドを実行する前に評価する必要があります
albfan

回答:


2

変数に関するものではありませんが、vimの省略コマンドが役立つ場合があります。コマンドラインから試してください:

:abbreviate foo pattern

その後

:Ggrep foo<space>

それはあなたの「パターン」に「foo」を完成させます。


今すぐ実行してみてくださいecho foo。変数echo patternではないOpps 。これはハックであり、誤解です。
albfan 2018年

7

何について:

:execute ':grep ' . foo

fooのコンテンツを適切にエスケープするにはどうすればよいですか?"、 '、/、\などの特殊文字が含まれている可能性があります
Vitaly Kushner

1
@Vitaly Kushner:「:help escape()」および「:help fnameescape()」を参照してください。
garyjohn '

escape()は知っていますが、エスケープする文字についてはわかりません
Vitaly Kushner、2011

fnameescape()は良くありません。ファイル名引数ではなく、プラグイン関数への引数です。I:let foo = "aaa \" bbbb'cccc "
Vitaly Kushner

1
私もこれで髪を抜いています。あなたは、次のようなコマンドを発行することはできませんlet xyz = tabpagenr()、その後tabnext xyz。Vimのスクリプト言語には、モーダル環境に問題がないのと同じくらい欠陥があります。
puk

2

:exeソリューションが気に入らない場合は、=式レジスタを使用して、変数の内容をコマンドラインに「読み込む」ことができます。例えば、入力:Ggrepを押しをCtrl- rして、入力=fooキーを押しEnter。変数fooに「パターン」が含まれているとすると、コマンドラインは次のようになります。

:Ggrep pattern

これには、実行される実際のコマンドが表示されEnter、2回目に押す前にそれを変更できるという利点があります。

見る:

:help "=
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.