web-dev-qa-db-ja.com

vimでコマンドの結果によって与えられたファイルを開く

ほぼ毎日、次のことをしている

  1. 検索を実行(find -name somefile.txt
  2. 結果をvimで開きます

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

前もって感謝します

38
smauel

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

vim $(find -name somefile.txt)

または

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

これを試して:

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

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

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

または

試してください:

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

コマンドを再度実行しても構わない場合は、次を押します。 Upxargsコマンドを追加します。または履歴置換を使用して実行

!! | 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変数$Kに出力が格納されます。

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

各コマンドの出力を自動的に保存することは、シェルだけでは実際には不可能です。エミュレートされたターミナルでコマンドを実行する必要があります。 script (BSDユーティリティですが、LinuxやSolarisを含むほとんどのunicesで利用できます)を実行することで実行できます。これにより、セッションのすべての出力がファイルに保存されます( TypeScriptの最後のプロンプトを確実に検出するために必要な少しの努力)。

私はここでポイントを逃したに違いありません。

:find **/somefile.txt

(もし私が:echo &path)または、必要な場合:

:args **/somefile.txt

編集:おっと! OK、それで私はdid要点を逃します-実際に開いたファイルではなく、検索リストが必要ですか? (もう一度、Vim内から)試してください:

!!find . -name somefile.txt

-私の悪い:)

2
Barry Arthur

私はバックティックを使いたいです(それは〜と同じキーにあります)

> vim `find . -name somefile.txt`

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

コマンドの調整に数回費やすと非常に便利です。これは、ヒストリ置換を使用してエディターのコマンドを繰り返すことができるためです。

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

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

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

-oを使用しない場合、vimを終了した後のターミナルの状態がめちゃくちゃになる可能性があります。完了している場合は、次のコマンドで端末をリセットできるはずです。

reset
1
durum

私はあなたが望むことをする関数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
sente

Vimでlocateを使用してファイルを開くと、非常に便利で、findよりもはるかに高速であることがわかりました。

次のコマンドは、ディレクトリMyPythonProjectを含むパスでapp.pyというファイルを検索します。

:args `locate '*MyPythonProject*app.py'`
0
Searene

以下は、すでに述べたものよりも単純なxargsソリューションです。

find -name somefile.txt | xargs vim -p

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

0
Cory Klein

個々のタブにあるすべてのファイルを開くには、次の方法があります。

vim -p $(find -name somefile.txt)

または

find -name somefile.txt -exec vim -p {} +;
0
danba