管道Vim缓冲器至标准装置 我想把VIM放在管子中间。这看起来像是我想要做的,除了我希望在没有Python帮助的情况下完成它——只有使用bash。[这很有帮助,环境是Android终端IDE应用程序中的bash shell。]

管道Vim缓冲器至标准装置 我想把VIM放在管子中间。这看起来像是我想要做的,除了我希望在没有Python帮助的情况下完成它——只有使用bash。[这很有帮助,环境是Android终端IDE应用程序中的bash shell。],vim,Vim,拜托,我知道如何通过Vim内部的命令来传递缓冲区。那很好,但不是我想要的。我想退出Vim并将活动缓冲区传递给stdout FWIW,我还知道如何将另一个命令作为输入传递到Vim中。再说一次,这不是我想要得到的 > ls -1 fred*.c | vim - 将导致Vim打开包含文件列表的未命名文件fred* 也许我误解了你的问题 备选解释: 请看下面这篇文章,它描述了一种 在不保存当前缓冲区的情况下,您希望将其内容发送到解释器(python、scheme等),并希望解释器在新生成的xte

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

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

> ls -1 fred*.c | vim -
将导致Vim打开包含文件列表的未命名文件
fred*

也许我误解了你的问题

备选解释:

请看下面这篇文章,它描述了一种

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


根据我有限的经验,不可能让Vim写入标准输出。我认为你不能轻易地把维姆放进管子里


您可以在此尝试使用命令
vipe

查看
vipe
,它是的一部分。它允许您将任何编辑器用作管道的一部分

 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放在管道中,因为这样vim就无法显示其UI

ls | vim - | more # Does not work
解决此问题的一种方法是在管道内部使用
gvim-f-
,因为它在单独的窗口中打开。您需要通过
:w>/dev/stdout
写入文件,然后
:退出

或者(也是在仅控制台的非图形环境中的唯一方法),您可以编写自己的脚本/函数
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"
}

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

相关的:

  • 在维姆东南
  • 在东南方向

当管道连接到
sed-e的/^/XXX://'时,您的bash only解决方案对我不起作用。
;我在跳来跳去的时候弄得Vim编辑器乱七八糟。太棒了。我还没有让它完全工作,但我认为它只是终端IDE环境中的一个路径问题。(我复制了您提供的bash脚本)我使它工作了,将这一行:`vim${TMPFILE}`替换为`vim${TMPFILE}/dev/tty`这太棒了,谢谢@SebastiánGrignoli,为什么这样做,它做了什么?可能重复的可能重复是你可能真正想要做的。您希望首先启动vim,然后将某些内容读入缓冲区,然后执行某些操作,然后将其输出以执行其他操作。不需要添加另一个花哨的shell工具(vipe)。不幸的是,这似乎不适用于nvim,也不适用于最新的vim 8(在macOS上)。@KonradRudolph它不会,因为我认为Neo vim故意从其代码库(说它不是流行和无用的功能),但我可能错了。否则,如果它仍然存在,它可以以不同的方式工作。我不知道这个问题的状态,但在NeoVim中肯定存在Ex模式。无论如何,我已经做了进一步的测试,这个解决方案在Linux上的Vim 8中也不起作用。请看我的后续问题,事实上,别介意那个问题。作品也就是说,这个:
ex-s“$@”+%p|q!'/dev/stdin
$ echo foo | vim +%p -escq /dev/stdin
foo
$ echo foo | vim -es '+%print' '+:q!' /dev/stdin
foo
$ 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.