将ex命令重定向到vim中的STDOUT

Tri*_*ych 4 vim ex

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

vim +'redir >outfile' +'hi' +'redir END' +'q'
Run Code Online (Sandbox Code Playgroud)

在此之后,outfile包含我想要的.但我宁愿输出到STDOUT来管道转换为突出显示信息的命令.

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

vim -E +'redir @a' +'silent! hi' +'redir END' +'put a' +'w !tee' +'q!' > outfile
Run Code Online (Sandbox Code Playgroud)

这非常接近,但输出一个主要的分页消息(另外255行...)和一些ANSI转义废话.设置nomore没有为我压制消息.我希望outfile将第一个命令中发送的确切输出发送到STDOUT.

glt*_*lts 8

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

首先,我们将以静默批处理模式运行Vim ,它使用-e -sflags(:h -s-ex)启用.我们禁用交换文件,-n因为如果我们需要在它被卡住时杀死Vim,它们将会很麻烦.

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

verbose highlight
Run Code Online (Sandbox Code Playgroud)

:verbose有必要让Vim输出:highlight消息给stderr.让我们看看到目前为止我们有什么:

$ vim -n -e -s -S hi.vim
Run Code Online (Sandbox Code Playgroud)

不要跑这个,否则你会陷入无头Vim的黑暗中!

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

$ vim -n -e -s -S hi.vim +quit 2>&1
Run Code Online (Sandbox Code Playgroud)

瞧!现在根据你的心愿把这个烂摊子送到任何文件或工具中.

有一篇关于这个主题的非常全面的wiki文章," Vim作为vimscript的系统解释器 ".


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

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

$ vim -n -e -s -S hi.vim +quit 2>&1 | tr -d '\r' | my-css-util
Run Code Online (Sandbox Code Playgroud)

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

不使用'term'和$ TERM.