在vim中打开命令结果给出的文件


34

我几乎每天都在做以下事情

  1. 运行查找(find -name somefile.txt
  2. 在打开结果 vim

问题是我必须复制的结果并将其粘贴findvim命令中。有什么办法可以避免这样做?我做了一些实验(find -name somefile.txt | vim),但没有发现任何有效的方法。

提前致谢

Answers:


31

您可以使用命令替换:

vim $(find -name somefile.txt)

要么

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

1
好。如果这是必需的,则找到-name somefile.txt |。xargs vim
balki 2011年

3
不,那不能正常工作,甚至可能使您的终端混乱!您无法通过管道传递给xargs vim,因为vim希望输入来自交互式终端。
dogbane

1
一位匿名用户指出,如果文件名包含空格
Michael Mrozek

4
另一个选择是vim `find -name somefile.txt`。@StuartPowers或者,vim `!-1`如果您已经使用过此命令,则可以使用以前的命令
Bernhard

1
@balki要在这种情况下使用xargs,必须使用标志-o,它在man中:-o在执行命令之前,在子进程中以/ dev / tty重新打开stdin。如果您希望xargs运行交互式应用程序,这将很有用。
davidmh 2013年

7

尝试这个:

  1. 启动vim
  2. 在vim中,使用以下命令:

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

搜索完成后,结果应显示在vim中。

要么

尝试:

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

我的解决方案完全一样,但是为什么不赞成呢?
巴尔基2011年

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中工作的命令的输出(它需要在父shell中执行管道的输出端)。管的命令到函数K(下面的zsh的定义),其ķ EEPS其在可变输出$K

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

仅使用shell确实不可能自动保存每个命令的输出,您需要在仿真终端中运行该命令。您可以通过在内部运行script(BSD实用程序,但在大多数unices上可用,包括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

(如果我知道自己中只有一个 :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在invim 的帮助下打开文件非常方便,而且比find

以下命令app.py在包含目录的路径中搜索名为的文件MyPythonProject

:args `locate '*MyPythonProject*app.py'`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.