vimのコマンドの結果で指定されたファイルを開きます


34

ほぼ毎日次のことをやっている

  1. 検索を実行(find -name somefile.txt
  2. 結果を開く vim

問題はfindvimコマンドの結果をコピーして貼り付ける必要があることです。これを行うことを避ける方法はありますか?私は少し実験しました(find -name somefile.txt | vim)が、うまくいくものが見つかりませんでした。

前もって感謝します

回答:


31

コマンド置換を使用できます。

vim $(find -name somefile.txt)

または

find -name somefile.txt -exec vim {} \;

1
OK。それが必要な場合は、-name somefile.txt | xargs
vim-バルキ

3
いいえ、それは適切に動作せず、端末を台無しにするかもしれません!vimは対話型端末からの入力を想定しているため、xargs vimにパイプすることはできません。
ドッグベイン


4
別の方法としては次のようになりますvim `find -name somefile.txt`。また@StuartPowers、あなたが使用することができvim `!-1`ますが、すでにこの検索を使用する場合は、前のコマンドだった
ベルンハルト

1
このシナリオでxargsを使用するには、@ balkiフラグ-oを使用する必要があります。これは、manにあります。これは、xargsで対話型アプリケーションを実行する場合に便利です。
davidmh

7

これを試して:

  1. vimを開始
  2. vimでは、次を使用します。

:r!find /<path> -name 'expression'

検索が完了すると、結果がvimに表示されます。

または

試してください:

find /<path> -name > results.txt
vim results.txt 

私のソリューションはまったく同じですが、なぜ反対票を投じられますか?
バルキ

5

もう一度コマンドを実行してもかまわない場合は、コマンドを押しUpて追加しますxargs。または、履歴置換を使用して実行

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

kshとzshで機能するがbashでは機能しないコマンドの出力を保存する軽量な方法があります(パイプラインの出力側を親シェルで実行する必要があります)。管機能へのコマンドK(以下zshの定義)、kは可変でその出力をEEPS $K

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find  |K
vim $K

各コマンドの出力を自動的に保存することは、シェルだけでは実際には不可能です。エミュレートされたターミナルでコマンドを実行する必要があります。内部で実行することでそれを行うことができますscript(BSDユーティリティですが、LinuxおよびSolarisを含むほとんどの大学で使用可能)、ファイルを介してセッションのすべての出力を保存します)。


2

バックティックを使用したい `(〜と同じキーにあります)

> vim `find . -name somefile.txt`

バックティックはティック内でコマンドを実行し、出力はコマンドで使用できます。上記はすべてのファイルsomefile.txtを見つけるため、すべてのファイル:nextを移動するために使用できます。

履歴置換を使用してエディターのコマンドを繰り返すことができるため、コマンドをさらに数回試行する場合に非常に便利です。

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`

2

以下を使用するため、ここでポイントを逃したに違いありません。

:find **/somefile.txt

(自分のに1つしかないことを知っていた場合 :echo &path )、またはすべてが必要な場合:

:args **/somefile.txt

編集:おっ!わかりましたので、私ポイントを逃しました-あなたは実際のファイルではなく、検索リストが必要ですか?試してみてください(Vim内から):

!!find . -name somefile.txt

-私の悪い:)


1

@davidmhがコメントで指摘したように、対話型アプリケーションを使用する場合xargsは、フラグとともに使用でき-oます。

find . -name somefile.txt | xargs -o vim

を使用しない場合-o、vimを終了した後、おそらく端末の状態が台無しになります。完了したら、次のコマンドで端末をリセットできるはずです。

reset

0

関数を書きました pvimあなたが望むことを。複数の行がパイプされるpvimと、最初の行以外はすべて無視されますが、vimで複数のファイルを開くように拡張できます。

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

次のように使用します。

stu@sente ~ $ find . -name "foo.txt" | pvim

入力したかのように、最初の「foo.txt」をvimにロードします。

vim $(find . -name "foo.txt | head -n1")


0

xargsすでに述べたものよりも簡単なソリューションを次に示します。

find -name somefile.txt | xargs vim -p

この-pオプションはvim、各ファイルを個別のタブで開くように指示します。これはバッファを使用するよりも便利です。


0

locateはvim の助けを借りてファイルを開くことは非常に便利で、はるかに速いことがわかりましたfind

次のコマンドはapp.py、ディレクトリを含むパスで呼び出されるファイルを検索しますMyPythonProject

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