2012-02-05 56 views
8

在Vim中,读取shell命令输出的最佳方式(便携式和快速)是什么?这个输出可能是二进制的,因此包含空值和(不)具有重要的尾随换行符。我看到的当前解决方案:读取shell命令输出的最佳方法

  1. 使用system()。问题:不适用于NULL。
  2. 使用:read !。问题:不会保存结尾的换行符,尝试智能检测输出格式(dos/unix/mac)。
  3. 使用!重定向到临时文件,然后readfile(, "b")来读取它。问题:fs的两次调用,shellredir选项默认情况下也会重定向stderr,它应该不太容易(这里提到的'shellredir'是因为它可能被设置为有效值)。
  4. 使用system()并通过xxd过滤输出。问题:非常缓慢,最不便携(管道没有相当于'shellredir')。

还有其他想法吗?

回答

4

您正在使用文本编辑器。如果您关心NUL,尾随EOL和(可能)冲突的编码,您仍需要使用十六进制编辑器?

如果我需要我的操作控制这个量,我使用XXD路线的确,与

:se binary 

一个不错的选择,你似乎怀念的是插入模式表达寄存器插入:

=system('ls -l')输入

这对于字符编码业务来说可能是也可能不是更聪明/更少侵入,但是如果它足够重要,您可以尝试一下。

或者你可以使用Perl或Python的支持,以有效地利用popen

粗略的想法:

:perl open(F, "ls /tmp/ |"); my @lines = (<F>); $curbuf->Append(0, @lines) 
+0

你可以试试' =系统( 'printf的 '' \ x00的' '')'。它不会输出任何东西,而':%!printf'\ x00''会将单个NULL看作'^ @'在缓冲区中(大问题:':%!printf'\ x00 \ r \ n''会一样)。 – ZyX 2012-02-08 04:01:12

+0

这里的问题是,我不想有两个功能:“将命令读入缓冲区”,通常可以通过“%!”和“将命令输出到文件中”来实现,我不能说我永远不会需要更多。类似于'readfile()'是这种情况下最灵活的解决方案。 – ZyX 2012-02-08 04:09:03

+0

刚想到使用perl/python支持;请参阅初学者的答案 – sehe 2012-02-08 08:22:07