如何将缓冲区内容写入stdout?

hoo*_*lei 31 vi vim shell stdout

有没有机会将当前vim缓冲区的内容写入stdout?

我想使用vim编辑通过stdin传递的内容 - 无需临时文件来检索修改后的内容(在Linux/Unix上).

是否有可能插件/脚本 - 退出或保存时将缓冲区内容放入stdout?

wey*_*amz 21

我认为:w !tee会很完美,

  • 您甚至可以在此命令中使用管道.例如,我使用[gpaste](https://github.com/Keruspe/GPaste/)`命令-range =%复制:<line1>,<line2>定义命令'Copy'以将特定行复制到剪贴板w!tee | gpaste` (3认同)
  • `:w !tee` 不适用于 Vim 8 或 NeoVim。在 macOS 和 Linux 上测试:`echo hello | vim '+wq! !tee'`。传递 `-e` 也不起作用,在 `+` 后添加冒号也没有区别。 (2认同)

jab*_*ali 20

由于您使用Linux/Unix,您可能也有兴趣尝试更多的用户.它提供了一个名为vipe,可以读取的命令stdin,允许您编辑文本$EDITOR,然后将修改后的文本打印到stdout.

因此,请确保将编辑器设置为Vim:

export EDITOR=vim
Run Code Online (Sandbox Code Playgroud)

然后你可以试试这些例子:

cat /etc/fstab | vipe
cut -d' ' -f2 /etc/mtab | vipe | less
Run Code Online (Sandbox Code Playgroud)

  • 很高兴了解`moreutils`.但是vipe使用临时文件,这不适合我的应用程序"解密文件,修改内容,加密结果". (4认同)

mie*_*war 7

从stdin读取:

echo "hey" | vim  -
Run Code Online (Sandbox Code Playgroud)

如果你:w还需要给它一个文件名.

使用vim它们的程序EDITOR,比如crontab -e传递一个文件名,以便用户可以:x而不用担心文件名.

编辑

你也可以这样做:

mkfifo /tmp/some_pipe
echo "hey" > /tmp/some_pipe ; cat /tmp/some_pipe
Run Code Online (Sandbox Code Playgroud)

并从另一个过程(或终端)

vim /tmp/some_pipe
Run Code Online (Sandbox Code Playgroud)

请注意,写入管道将阻塞,直到从中读取内容,并且读取将阻止直到写入内容,因此使用常规文件可能更安全.

  • 我用它来通过 vim 读写加密文件。打开 PGP 文件:`pgpv &lt;secret.pgp | vim -`。编辑后:`:w !pgpe -co secret.pgp`。在这种情况下,不要忘记禁用交换、备份、vimrc、历史记录等。 (2认同)

ken*_*orb 6

要将缓冲区打印到shell标准输出,vim需要在Ex模式下启动,否则它将使用自己的窗口打开"正常"方式并在退出时清除任何输出缓冲区.

这是最简单的工作示例:

$ echo foo | vim -es '+%print' '+:q!' /dev/stdin
foo
Run Code Online (Sandbox Code Playgroud)

需要指定标准输入的特殊文件描述符(/dev/stdin)以防止额外烦人的消息.

这里有一些字符串解析示例:

$ echo This is example. | vim -es '+s/example/test/g' '+%print' '+:q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+:q!'
Vim: Reading from stdin...
This is test.
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子ex,它相当于vi -e:

ex -s +%p -cq /etc/hosts
Run Code Online (Sandbox Code Playgroud)

有关: