如何“定位”多个文件并在 vim 中打开它们?

如何“定位”多个文件并在 vim 中打开它们?

假设我有一个名为 的文件filename123.txt,并且它是一个如此命名的文件,我可以locate使用命令locate filename123.它只返回这个文件。

现在我想用vi/打开它vim。但我不想转到该位置并键入vi命令和文件名。这里我希望将结果locate filename123附加到 vi 命令中。我怎样才能这样做呢?我已经尝试过:

locate filename123 | vi

但这不起作用。这个错误出现在终端中:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

答案1

您可以使用xargs

locate filename123 | xargs vi

默认情况下xargs将执行尽可能少的指定命令实例,并根据系统的情况传递尽可能多的参数ARG_MAX。要限制传递给 实例的参数数量vi,请使用xargs' -noption.

要处理包含空格的文件名,请使用xargs'-d选项:

locate filename123 | xargs -d '\n' vi

要处理包含换行符的文件名,请使用xargs'-0选项和locate's-0选项:

locate -0 filename123 | xargs -0 vi

(如果-0其中任何一个都不可用,--null也请检查,或使用其他方式指定字符\000作为分隔符。)

答案2

您可以使用命令扩展:

vi "$(locate filename123 | head -n1)"

vim读取其标准输入,您可以执行以下操作,但这只会为您提供文件名路径vim -的输出。locate这可能会起作用,使用vim gf普通命令将打开光标所在的路径。

编辑

对于文件名中包含空格的情况,您最好使用xargs提到的选项或vim上述解决方案。请注意,要进行gf工作,您需要添加空间isfname

set isfname+=32

描述了此技巧和替代方案这里

编辑2

添加了引号并head按照 PeterO 在中的建议评论

答案3

最简单的方法是传递locate外壳替换, 喜欢:

vim $(locate filename123)

您还可以考虑使用find而不是locate传递文件名进行编辑,例如:

find . -name 'filename123' -exec vim {} +

在 Unix/OSX 上,您可以使用xargs参数-o,例如:

locate filename123 | xargs -o vim

-o在执行命令之前,在子进程中将 stdin 重新打开为 /dev/tty。如果您希望 xargs 运行交互式应用程序,这非常有用。

或者在 Linux 上尝试使用以下解决方法:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

如果您使用不同的命令,请使用命令替换为了实现这一点,例如:

vim $(locate filename123)
vim `locate filename123`

或者使用 GNUparallel而不是xargs强制 tty 分配,例如:

locate filename123 | parallel -X --tty vi

注意:parallel在 Unix/OSX 上不起作用,因为它有不同的参数并且不支持 tty。

许多其他流行的命令也提供伪 tty 分配(如-tssh,因此请检查帮助。

其他建议是使用vipe(Vim 命令管道)或使用以下简单脚本:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

有关的:

相关内容