管道Vim缓冲区到stdout

Mik*_*ike 17 vim

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

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

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

dwa*_*ter 24

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

 ls -al | vipe | less
Run Code Online (Sandbox Code Playgroud)

若要使用它vim只是确保将其设置为默认编辑器在您bashrccshrc或任何外壳使用.

 EDITOR=vim
Run Code Online (Sandbox Code Playgroud)

更新:如果你想要一个bash唯一的解决方案,你可以使用这样的脚本

 #!/bin/bash
 # create temporary file
 TMPFILE=`mktemp /tmp/vipe.bashXXXXXXXX`
 cat > ${TMPFILE}
 vim ${TMPFILE} < /dev/tty > /dev/tty
 cat ${TMPFILE}
 rm ${TMPFILE}
Run Code Online (Sandbox Code Playgroud)

如需更便携的版本,请更换

 vim ${TMPFILE}
Run Code Online (Sandbox Code Playgroud)

 ${EDITOR} ${TMPFILE}
Run Code Online (Sandbox Code Playgroud)


Ing*_*kat 5

您不能简单地将 vim 放在管道中,因为那样 Vim 将无法显示其 UI。

ls | vim - | more # Does not work
Run Code Online (Sandbox Code Playgroud)

解决此问题的一种方法是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"
}
Run Code Online (Sandbox Code Playgroud)

并将管道更改为:

ls | vimAndMore | more
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

要将缓冲区打印到 shell 标准输出,vim需要以 Ex 模式启动,否则它将以自己的窗口打开“正常”方式并在退出时清除所有输出缓冲区。

这是最简单的工作示例:

$ echo foo | vim +%p -escq /dev/stdin
foo
Run Code Online (Sandbox Code Playgroud)

这相当于:

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

需要指定标准输入的特殊文件描述符 ( /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.
Run Code Online (Sandbox Code Playgroud)

有关的: