您可以使用该%p
命令将正在编辑的文件打印到标准输出。
在本例中,Vim 读取其标准输入并将其发送到标准输出:
$ (echo one; echo two; echo three; echo four) | \
vim - -nes -u NONE -c ':%p' -c ':q!' | \
tail -n +2 | \
grep t
two
three
笔记:
vim -
: 从标准输入读取
-n
:不创建交换文件,只使用内存
-e
: 以 ex 模式启动
-s
:静默或批处理模式
-u NONE
: 不要阅读.vimrc
(如果你想.vimrc
被阅读,跳过这个选项。但是不同的人有不同的.vimrc
-s,所以如果你不写-u NONE
,你的代码可能不适用于不同的人,甚至对你来说,如果你改变你的.vimrc
。)
-c <something>
: 作为命令运行某些东西
-c ':%p'
: 将缓冲区的内容打印到标准输出
-c 'q!'
: 不保存直接退出
tail -n +2
: 扔掉 Vim 输出的第一行(也就是 ' Vim: Reading from stdin...
' 行)
在下面的例子中,Vim 实际上做了一些有用的事情:它删除了标准输入的第一列。
$ (echo one; echo two; echo three; echo four) | \
vim - -nes -u NONE -c ':exec "normal G\<c-v>ggx"' -c ':%p' -c ':q!' | \
tail -n +2
ne
wo
hree
our
笔记:
:exec
:执行以下命令(命令行命令,非普通模式命令)
normal
:执行给定正常模式命令的命令行命令
G
: 转到文件的最后一行
\<c-v>
: 开始块选择
gg
: 转到第一行
x
: 删除选中的字符
编辑:
我可以在交互式会话中的 ":wq" 之后立即告诉 vim 发出 ":%p" 吗?
你可以告诉 Vim 诸如“退出前运行命令 X”之类的事情,例如使用 VimLeave 自动命令(参见:help autocommand
, :help VimLeave
):
$ (echo "line 1"; echo "line 2") | \
vim - -nes -u NONE -c ':autocmd VimLeave * :%p'
Vim: Reading from stdin...
:q! # you type :q!
line 1
line 2
问题出在“:%p”命令上。如果您使用“-e”参数,您将无法获得可视化编辑器。如果你不使用 "-e",Vim 不会将 ":%p" 的结果打印到标准输出,而是打印到终端。
我将在另一篇文章中提出不同的建议。