5

我正在尝试制作一个命令来将 vim 的突出显示信息转储到 STDOUT。我可以成功写入这样的文件:

vim +'redir >outfile' +'hi' +'redir END' +'q'

在此之后,outfile包含我想要的内容。但我宁愿输出到 STDOUT 以管道到将突出显示信息转换为 CSS 的命令。

这种方法尝试将命令重定向到寄存器,写入当前缓冲区,然后将该输出发送到tee.

vim -E +'redir @a' +'silent! hi' +'redir END' +'put a' +'w !tee' +'q!' > outfile

这非常接近,但会输出一个领先的分页消息(多 255 行......)和最后的一些 ANSI 转义废话。设置nomore并没有压制我的信息。我希望将outfile在第一个命令中发送到的确切输出发送到 STDOUT。

4

3 回答 3

9

Vim 支持输出到 stderr,我们可以重定向到 stdout 来解决你的问题。不过要小心,此功能仅用于调试目的,因此它有一些优势。这是您如何做到这一点的简短草图。

首先,我们将在静默批处理模式下运行 Vim ,这通过-e -s标志 ( :h -s-ex) 启用。我们禁用交换文件-n是因为如果我们需要在 Vim 卡住时终止它,它们会很麻烦。

我们没有将 Ex 命令作为命令行参数传递,而是使用-S. 创建一个hi.vim包含以下内容的文件:

verbose highlight

:verbose使 Vim 将:highlight消息输出到 stderr 是必需的。让我们看看到目前为止我们有什么:

$ vim -n -e -s -S hi.vim

暂时不要运行它,否则你会陷入无头 Vim 的黑暗中!

添加:quit命令并将 stderr 重定向到 stdout:

$ vim -n -e -s -S hi.vim +quit 2>&1

瞧!现在,您可以随心所欲地将这些混乱传输到任何文件或实用程序中。

关于这个主题有一篇非常详尽的 wiki 文章,“ Vim 作为 vimscript 的系统解释器”。


更精细的点:由于 Vim 与终端环境的交互方式,它无法在批处理模式输出中编写正确的 unix LF 行结尾。相反,它写入看起来像 CRLF 行尾的行尾。

考虑添加一个过滤器来摆脱那些:

$ vim -n -e -s -S hi.vim +quit 2>&1 | tr -d '\r' | my-css-util

这回答了如何“将 ex 命令重定向到 vim 中的 STDOUT”的一般问题,但它不一定适用于您的问题,因为由标志:hi引起的这种约束:-e -s

'term' 和 $TERM 没有被使用。

于 2013-05-25T20:24:12.127 回答
2

如果您使用的是 Unix 兼容环境,则始终可以使用特殊文件,例如:

ex +"redir>>/dev/stdout | hi | redir END" -scq!

这会将任何 Vi/Ex 命令打印到标准输出中,您可以进一步解析。

于 2015-10-17T19:27:55.083 回答
1

我在运行您的第一个命令时错误地遇到了这个问题。我第二次运行它时,它进入了标准输出。我猜这是因为该文件已经存在。所以你可以尝试(发送到已经存在的东西):

vim +'redir >/dev/null' +'hi' +'redir END' +'q'
于 2013-05-28T12:18:22.827 回答