ヘルプから:help backtick-expansion
:
On Unix and a few other systems you can also use backticks for the file name
argument, for example:
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch \| head -n1`
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program. The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
termination.
ヘルプから取得したコマンドを入力すると、エラーが発生します。
:next `find . -name ver\\*.c -print
E79: Cannot expand wildcards
ヘルプの例で1つではなく2つのバックスラッシュを使用するのはなぜですか、なぜ機能しないのですか?
次の作業:
find
プログラムの前にシェルによってスターが拡張されるのを防ぐ2つのバックスラッシュの1つを削除すると、次のようになります。:next `find . -name ver\*.c -print`
両方のバックスラッシュを削除し、パターンを一重引用符で囲むと
ver*.c
::next `find . -name 'ver*.c' -print`
これまでのルールは
、シェルコマンドにスターが含まれていて、コマンドの前にシェルで展開したくない場合は、その前にバックスラッシュを1つ置くか、パターンを一重引用符で囲みます。
しかし、ヘルプは別の例を示します:
:view `ls -t *.patch \| head -n1`
このコマンドは変更せずに機能し、一重引用符もバックスラッシュも不要です。
私がそれが機能する理由は、ls
コマンドが(コマンドの-name
引数とは逆にfind
)複数のファイル引数を受け入れ、シェルの展開に問題がないためだと思います*.patch
。
それでは、私は拡張子を持つすべてのファイルを探したいとしましょう.conf
内部の/etc
フォルダやパイプの出力find
にgrep
文字列を含む唯一のマッチを取得しますinput
。
シェルでは、任意の作業ディレクトリから、次のように入力します。
find /etc -name '*.conf' | grep input
そしてそれはうまくいくでしょう。
vimでは、同じコマンドを入力してバッククォートを囲み、パイプ記号の前にバックスラッシュを付けて、vimがコマンド終了と解釈しないようにします。
:next `find /etc -name '*.conf' \| grep input`
そしてそれは機能します。
ここで、パイプとなしで同じコマンドを入力するとgrep input
、エラーが発生します。
:next `find /etc -name '*.conf'`
E79: Cannot expand wildcards
一重引用符で星を保護しているのに、この場合エラーが発生するのはなぜですか?
そして、なぜ今エラーが発生していますが、直前にパイプとgrep input
?
理解を試みるために、より簡単なコマンドを考え出しました。
find . -name '*.conf'
.conf
作業ディレクトリで拡張子が付いたすべてのファイルを検索します。コマンドはシェルで機能します。
vimでテストするには、次のように入力しました:next `find . -name '*.conf'`
。この場合、ドットはvimセッションを起動してからの:pwd
ホームディレクトリであるExコマンドで表示される現在の作業ディレクトリを表し/home/username
ます。
現在の作業ディレクトリで検索を要求すると機能するのに、次のような任意のフォルダーで検索を要求すると機能しないのは/etc
なぜですか?
ここで、vim Exコマンド/home/username
を使用/etc
して作業ディレクトリをからに変更し、:cd /etc
以前と同じコマンドを再試行すると、再びエラーになります。
:next `find . -name '*.conf'`
E79: Cannot expand wildcards
ホームフォルダーにいるときは同じコマンドが機能するのに、ホームフォルダーにいるときは機能しないのはなぜ/etc
ですか。
いくつかのロジックがあると確信していますが、それを見つけることができません。
arglistに任意のシェルコマンド(スター、パイプを含み、任意の作業ディレクトリから任意のディレクトリを検索する)を入力するための一般的で正しい構文は何ですか?
私はvimバージョン7.4.942を使用していますが、zshがデフォルトのシェルです。これらのコマンドを、vim -u NORC -N
bashとzshからの初期化()を最小限にしてテストしました。
zshではなくbashを呼び出すようにvimを構成する必要がありますか?
vim $(find . -name ver\*.c -print)
、vim $(ls -t *.patch | head -n1)
、vim $(find /etc -name '*.conf' | grep input)
、vim $(find /etc -name '*.conf')
、vim $(find . -name '*.conf')
--remote
、vi.stackexchange.com / a / 5618/4939を参照)。しかし、その方法を知りたいと思っています。現在のセッションから直接実行してください。それが不可能な場合は問題ありませんが、ヘルプを読んだ後は、実行できるようです。もしそうなら、なぜvimが同様のコマンドに対して非常に異なる反応をするのかを理解したいと思います。
find /etc -name '*.conf'
ない場合、そのコマンドからいくつかの面白い名前が出てくると思います。これが、をパイプで通しgrep
たときに機能した理由かもしれません。
vim $(find . -name ver*.c)