我想在管道中使用Vim。这篇现有的文章看起来就像是我想要做的,但我希望不依赖Python的帮助,仅使用bash实现。如果可以的话,环境是Android上Terminal IDE应用程序中的bash shell。
请注意,我知道如何从Vim 内部将缓冲区通过命令传递给另一个进程。那很好,但这不是我想要的。我想退出Vim,并将活动缓冲区传递到标准输出(stdout)。
顺便说一下,我也知道如何将另一个命令作为输入传递给Vim。同样,这不是我想要实现的目标。
我想在管道中使用Vim。这篇现有的文章看起来就像是我想要做的,但我希望不依赖Python的帮助,仅使用bash实现。如果可以的话,环境是Android上Terminal IDE应用程序中的bash shell。
请注意,我知道如何从Vim 内部将缓冲区通过命令传递给另一个进程。那很好,但这不是我想要的。我想退出Vim,并将活动缓冲区传递到标准输出(stdout)。
顺便说一下,我也知道如何将另一个命令作为输入传递给Vim。同样,这不是我想要实现的目标。
看一下moreutils
中的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 ${TMPFILE}
使用
${EDITOR} ${TMPFILE}
sed -e 's/^/XXX:/'
时,你的仅限于Bash的解决方案对我不起作用;我在跳转时会得到一个混乱的Vim编辑器。 - Ingo Karkatvim ${TMPFILE}
为 vim ${TMPFILE} < /dev/tty > /dev/tty
。 - Sebastián Grignoliecho''|
,但肯定有一种方法可以让脚本处理这种情况。 - Migvim
需要在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.
相关链接:
ex
解决方案(https://vi.stackexchange.com/a/789/10024)可行。具体来说,就是这个命令:`ex -s "$@" '+%p|q!' /dev/stdin`。 - Konrad Rudolph你不能简单地将vim放在管道中,因为这样Vim无法显示其用户界面。
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
如果有多个管道步骤需要执行,您必须使用显式的shell调用:
ls | vimAndMore sh -c 'tr a-z A-Z | more'
vim“$TMPFILE”< /dev/tty > /dev/tty
而没有任何 exec
s。我猜你的解决方案只是缺少一行或两行重定向代码。但我仍然不确定具体是什么。干杯:) - saulius2> ls -1 fred*.c | vim -
执行该命令将导致Vim打开一个未命名的文件,其中包含文件列表fred*
也许我误解了你的问题...
另一种解释:
请参阅页面,其中描述了一种技术
在不保存当前缓冲区的情况下,您希望将其内容发送到解释器(python、scheme或其他),并且您希望该解释器在新生成的xterm中运行。新的xterm窗口很有用,因为在Vim内运行shell不允许同时检查程序输出和代码缓冲区,并且Vim的shell在几个方面都很弱。