web-dev-qa-db-ja.com

xargsの変更によりvimでファイルを開く

検出コマンドユーティリティを使用して、いくつかのディレクトリの場所をgrepでき、含まれているファイルを開く必要があります。 この例find . -name "*.txt" -exec vim {} +などのexecでfindを使用することはできません。

Grep出力を変更しない場合、xargsは次のように機能します

searchUtilityCommand | grep keyword | xargs vim

しかし、私は実際に必要です

searchUtilityCommand | grep keyword | xargs -I % vim %/extra/path

ただし、これを行うと最初のヒットが開き、閉じると2番目のヒットが開きます。それを閉じて3番目を開きます...私は使ってみました

searchUtilityCommand | grep keyword | xargs -P 0 -I % vim %/extra/path

しかし、それは失敗するだけです。私も試しました

vim `searchUtilityCommand | grep keyword | xargs -P 0 -I % vim %/extra/path`

運がない。

awkまたはsedを使用できると思いましたが、私はそれらに堪能ではなく、その価値があるかどうかわかりません。それは次のようなものかもしれません

searchUtilityCommand | grep keyword | <awk modify grepped path> | xargs vim

どんな助けでも。

ありがとう!

2
manolius

これをテストしていませんが、機能しない理由はありません。

_searchUtilityCommand | grep keyword | sed -e 's,$,/extra/path' | xargs vim
_

とはいえ、このようにvimを実行すると表示される「警告:入力は端末からではありません」というメッセージを取り除く方法がわかりません。 (私は一般的にその理由でvim $(command pipeline)を好みます)。

0
sitaram

Vimから、次のExコマンドを実行します。

:args `=systemlist('searchUtilityCommand | awk ''/keyword/{print $0 "/extra/path"}''')`

またはこれ:

:args `=map(filter(systemlist('searchUtilityCommand'), {_,v -> v =~# 'keyword'}), {_,v -> v.'/extra/path'})`

これにより、arglistにファイルパスのリストが入力されます。 searchUtilityCommandによって出力され、keywordと一致するものと/extra/path最後に追加。

そこから、次のようなあらゆる種類のことができます。

" open each file in a horizontal split (run `:only` to close all splits except the current one)
:all

" open each file in a vertical split
:vert all

" open each file in a tab page (run `:tabonly` to close all tab pages except the current one)
:tab all

" diff all the files
:vert all | windo diffthis

" replace all occurrences of `pat` with `rep` in each file
:argdo %s/pat/rep/g | update

詳細については、以下を参照してください。

:h `=
:h systemlist(
:h map(
:h filter(
:h :all
:h :argdo
0
user183956