通过xargs修改在vim中打开文件

通过xargs修改在vim中打开文件

使用发现命令实用程序,我可以 grep 某些目录的位置,并且需要打开包含的文件。我无法将 find 与 exec 一起使用,例如这个例子 find . -name "*.txt" -exec vim {} +

如果我不修改 grep 输出,xargs 的工作方式如下

searchUtilityCommand | grep keyword | xargs vim

但我确实需要

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

但是,这样做时它会打开第一个命中,在我关闭后它会打开第二个;关闭它并打开第三个...我尝试使用

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

有什么帮助吗?

谢谢!

答案1

还没有测试过,但没有理由它不起作用:

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

不过,我不得不说,我不知道如何摆脱这样运行 vim 时出现的“警告:输入不是来自终端”消息。(vim $(command pipeline)出于这个原因,我通常更喜欢这样做)。

答案2

从 Vim 运行此 Ex 命令:

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

或者这个:

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

这应该用文件路径列表填充参数列表;由 输出的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

有关详细信息,请参阅:For more information, see:

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

相关内容