读取shell命令输出的最佳方法

ZyX*_*ZyX 9 vim shell shellexecute

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

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

还有其他想法吗?

seh*_*ehe 5

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

如果我需要对操作进行这种控制,则可以使用xxd路由,

:se binary
Run Code Online (Sandbox Code Playgroud)

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

C-r=system('ls -l')Enter

这可能会或可能不会更聪明/对字符编码业务的影响较小,但如果对您而言足够重要,您可以尝试一下。

或者您可以使用Perl或Python支持来有效使用 popen

粗略的想法:

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