管道Vim缓冲区到stdout

时间:2012-05-21 13:27:47

标签: vim

我想在管道中间使用Vim。这个existing post看起来像我想要做的,除了我希望在没有Python帮助的情况下这样做 - 只有bash。 [它有帮助,环境是Android上终端IDE应用程序中的bash shell。]

请知道如何从内部 Vim中通过管道缓冲区。这很好,但不是我想要的。我想退出Vim并将活动缓冲区传递给stdout。

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

5 个答案:

答案 0 :(得分:20)

查看属于moreutilsvipe。它允许您将任何编辑器用作管道的一部分。

 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}

答案 1 :(得分:4)

你不能简单地将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

答案 2 :(得分:2)

要将缓冲区打印到shell标准输出,vim需要在Ex模式下启动,否则它将打开&#34; normal&#34;使用自己的窗口并在退出时清除任何输出缓冲区。

这是最简单的工作示例:

$ 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.

相关:

答案 3 :(得分:1)

> ls -1 fred*.c | vim -

将导致Vim打开包含文件列表fred*

的未命名文件

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

替代解释:

请参阅此page,其中介绍了

的技巧
  

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

答案 4 :(得分:1)

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

您可以尝试使用此package中的vipe命令。