2

我正在尝试使用此命令从命令行在 vim 中打开多个文件。出于某种原因,我遇到了错误,如下所示。

 $ find . -name edit.html.erb  \
     | perl -pi -e 's/^..//'   \
     | perl -pi -e 's/\n$/ /'  \
     | vim

当我在没有“| vim”的情况下运行它时,如下命令:

 $ find . -name edit.html.erb  \
     | perl -pi -e 's/^..//'   \
     | perl -pi -e 's/\n$/ /'

并得到这个输出:

 addresses/edit.html.erb claims/edit.html.erb emails/edit.html.erb owners/edit.html.erb packages/edit.html.erb users/edit.html.erb vessels/edit.html.erb voyages/edit.html.erb %

我收到一个错误,可能与输出末尾的“%”标记有关。

这是输出和错误:

 Vim: Warning: Input is not from a terminal
 Vim: Error reading input, exiting...
 Vim: preserving files...
 Vim: Finished.

我怎样才能解决这个问题?由于我是新手,因此不确定是哪个部分导致了错误,但我们将不胜感激!

4

4 回答 4

9

您将文件的内容作为键盘输入传递。我想你想要做的是vim在打开文件的情况下启动。我不知道vim,但这通常是通过将文件名作为参数传递来实现的。

在 bash 中,人们会使用:

vim $( find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /' )

(删除了无意义的使用-i。)

实际上,将换行符更改为空格是没有用的,删除前导也是./如此,所以您只需要:

vim $( find . -name edit.html.erb )
于 2012-10-03T20:12:01.343 回答
3

让我们看看 vim 的文档:

SYNOPSIS
   vim [options] [file ..]
   vim [options] -
   vim [options] -t tag
   vim [options] -q [errorfile]

这告诉我们,我们可以指定很多文件名作为命令行参数,并-表示“文件”将从 STDIN 加载。但这不是文件名,而是缓冲区内容!

让您的 Perl 脚本exec使用正确的参数进入 vim。

exec "vim", @filenames;

或类似的。这将使您的工具链

 $ find . -name edit.html.erb  \
   | perl -pi -e 's/^..//'   \
   | perl -ne 'chomp; push @files, $_; }{ exec "vim", @files'

(您真的确定要删除任何文件名的前两个字符吗?就是s/^..//这样。转义点以匹配文字.

于 2012-10-03T20:03:18.773 回答
3

进入标准输入vim不会做任何事情(无论如何都有帮助)。您想传递命令行参数,而不是输入。在bash中,为此使用反引号或$(...)语法。

vim `find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /'`
vim $(find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /')

-iPerl 的选项在这里也不做任何事情。当您在命令行上提供文件名时,该选项用于“就地”编辑文件。)

于 2012-10-03T20:09:19.840 回答
1

不要忘记辅助操作系统:vim

:args `find . -name edit.html.erb`
:argadd `find . -name edit.html.js`

甚至

:args **/edit.html.erb

(另见 :argdelete、:args、:argdo 等)

(其他答案几乎击败了使用某些文件名参数调用 vim 的其他路径)

于 2012-10-03T22:00:18.550 回答