我想在管道中间使用 Vim。这篇现有的帖子看起来像我想做的,除了我希望在没有 Python 帮助的情况下做这件事——只用 bash。[它有帮助,环境是 Android 上终端 IDE 应用程序中的 bash shell。]
拜托,我知道如何通过Vim内部的命令来传输缓冲区。这很好,但不是我想要的。我想退出 Vim 并将活动缓冲区传递给标准输出。
FWIW,我也知道如何将另一个命令作为输入传递给 Vim。再说一次,这不是我想要达到的目的。
看看vipe
哪个是moreutils
. 它允许您将任何编辑器用作管道的一部分。
ls -al | vipe | less
要使用它,vim
只需确保将其设置为您bashrc
或cshrc
您使用的任何 shell 中的默认编辑器。
EDITOR=vim
更新:如果你想要一个bash
唯一的解决方案,你可以使用这样的脚本
#!/bin/bash
# create temporary file
TMPFILE=`mktemp /tmp/vipe.bashXXXXXXXX`
cat > ${TMPFILE}
vim ${TMPFILE} < /dev/tty > /dev/tty
cat ${TMPFILE}
rm ${TMPFILE}
如需更便携的版本,请更换
vim ${TMPFILE}
和
${EDITOR} ${TMPFILE}
要将缓冲区打印到 shell 标准输出,vim
需要以 Ex 模式启动,否则它将以“正常”方式打开自己的窗口并在退出时清除任何输出缓冲区。
这是最简单的工作示例:
$ echo foo | vim +%p -escq /dev/stdin
foo
这相当于:
$ echo foo | vim -es '+%print' '+:q!' /dev/stdin
foo
需要指定标准输入的特殊文件描述符 ( /dev/stdin
) 以防止出现额外的烦人消息。
以下是一些解析字符串的示例:
$ echo This is example. | vim '+s/example/test/g' '+%p' -escq! /dev/stdin
This is test.
$ echo This is example. | vim - '+s/example/test/g' '+%p' -escq!
Vim: Reading from stdin...
This is test.
有关的:
您不能简单地将 vim 放在管道中,因为这样 Vim 无法显示其 UI。
ls | vim - | more # Does not work
解决此问题的一种方法是gvim -f -
在管道内部使用,因为它在单独的窗口中打开。您需要通过:w >> /dev/stdout
然后写入文件:quit!
。
或者(并且是仅在控制台的非图形环境中的唯一方法),您可以编写自己的脚本/函数vimAndMore
,该脚本/函数将应该在管道中跟随 vim 的命令作为参数,如下所示:
vimAndMore()
{
TMPFILE=/tmp/pipecontents
# Slurp stdin into the temp file.
cat - > "$TMPFILE" || exit $?
# Reconnect stdin to the terminal, so that Vim doesn't complain with "Warning:
# Input is not from a terminal", and the terminal is kept intact.
exec 0</dev/tty
# Launch the editor.
"${EDITOR:-vim}" "$TMPFILE" || exit $?
# Carry on with the pipe.
cat "$TMPFILE" | exec "$@"
rm "$TMPFILE"
}
并将管道更改为:
ls | vimAndMore | more
根据我非常有限的经验,不可能让 Vim 写入stdout
. 我认为你不能轻易地将 Vim 放入管道中。
你可以试试vipe
这个包中的命令。
> ls -1 fred*.c | vim -
将导致 Vim 打开一个包含文件列表的未命名文件fred*
也许我误解了你的问题......
替代解释:
请参阅此页面,该页面描述了一种技术
在不保存当前缓冲区的情况下,您希望将其内容发送到解释器(python、scheme 等),并且希望该解释器在新生成的 xterm 中运行。一个新的 xterm 窗口很有用,因为在 Vim 中运行 shell 不允许同时检查程序输出和代码缓冲区,而且 Vim 的 shell 在几个方面很弱。