22

我想在管道中间使用 Vim。这篇现有的帖子看起来像我想做的,除了我希望在没有 Python 帮助的情况下做这件事——只用 bash。[它有帮助,环境是 Android 上终端 IDE 应用程序中的 bash shell。]

拜托,我知道如何通过Vim内部的命令来传输缓冲区。这很好,但不是我想要的。我想退出 Vim 并将活动缓冲区传递给标准输出。

FWIW,我也知道如何将另一个命令作为输入传递给 Vim。再说一次,这不是我想要达到的目的。

4

5 回答 5

28

看看vipe哪个是moreutils. 它允许您将任何编辑器用作管道的一部分。

 ls -al | vipe | less

要使用它,vim只需确保将其设置为您bashrccshrc您使用的任何 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}
于 2012-05-21T14:08:05.977 回答
6

要将缓冲区打印到 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.

有关的:

于 2015-02-17T14:19:12.307 回答
5

您不能简单地将 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
于 2012-05-21T14:11:24.940 回答
2

根据我非常有限的经验,不可能让 Vim 写入stdout. 我认为你不能轻易地将 Vim 放入管道中。

你可以试试vipe这个中的命令。

于 2012-05-21T14:07:03.270 回答
1
> ls -1 fred*.c | vim -

将导致 Vim 打开一个包含文件列表的未命名文件fred*

也许我误解了你的问题......

替代解释:

请参阅此页面,该页面描述了一种技术

在不保存当前缓冲区的情况下,您希望将其内容发送到解释器(python、scheme 等),并且希望该解释器在新生成的 xterm 中运行。一个新的 xterm 窗口很有用,因为在 Vim 中运行 shell 不允许同时检查程序输出和代码缓冲区,而且 Vim 的 shell 在几个方面很弱。

于 2012-05-21T13:50:55.410 回答