管道Vim缓冲器至标准装置 我想把VIM放在管子中间。这看起来像是我想要做的,除了我希望在没有Python帮助的情况下完成它——只有使用bash。[这很有帮助,环境是Android终端IDE应用程序中的bash shell。]
拜托,我知道如何通过Vim内部的命令来传递缓冲区。那很好,但不是我想要的。我想退出Vim并将活动缓冲区传递给stdout FWIW,我还知道如何将另一个命令作为输入传递到Vim中。再说一次,这不是我想要得到的管道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
> 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.