将ex命令重定向到vim中的标准输出

将ex命令重定向到vim中的标准输出,vim,ex,Vim,Ex,我正在尝试编写一个命令,将vim的突出显示信息转储到标准输出。我可以成功写入如下文件: vim +'redir >outfile' +'hi' +'redir END' +'q' 在此之后,outfile正好包含我想要的内容。但我更愿意将输出到STDOUT的命令转换为将突出显示信息转换为CSS的命令 这种方法尝试将命令重定向到寄存器,写入当前缓冲区,然后将输出发送到tee vim -E +'redir @a' +'silent! hi' +'redir END' +'put a' +'w

我正在尝试编写一个命令,将vim的突出显示信息转储到标准输出。我可以成功写入如下文件:

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。

Vim支持输出到stderr,我们可以重定向到STDOUT以解决您的问题。但要小心,此功能仅用于调试目的,因此它有一些优势。下面是一个简短的示意图,说明了如何做到这一点

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

我们使用
-S
来生成脚本文件,而不是将Ex命令作为命令行参数传递。创建一个包含以下内容的文件
hi.vim

verbose highlight
需要使Vim向stderr输出
:突出显示
消息。让我们看看到目前为止的情况:

$ vim -n -e -s -S hi.vim
先别动,否则你会被困在无头机器人的黑暗中

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

$ vim -n -e -s -S hi.vim +quit 2>&1
瞧!现在,根据您的意愿,将这些乱七八糟的内容导入任何文件或实用程序

关于这个主题,有一篇非常详尽的维基文章,“


细节:由于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


我在执行你的第一个命令时出错了。我第二次运行它时,它转到了stdout。我猜这是因为文件已经存在。因此,您可以尝试(发送到已存在的内容):


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

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

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

我不确定这是否是您的选项:
vim+'redir!>输出文件“+”安静!嗨'+'redir END'+'q'&&cat outfile
为什么不使用内置的
:TOhtml
?@romainl由于某些原因,TOhtml没有为我输出正确的颜色。很好的一般性答案!对于特定的问题,我更愿意研究为什么
:TOhtml
不起作用。它的维护人员在vim_dev上,非常有帮助。回答很好。真正的黑魔法大师。:)
ex +"redir>>/dev/stdout | hi | redir END" -scq!