我想在管道中间使用Vim。这个existing post看起来像我想要做的,除了我希望在没有Python帮助的情况下这样做 - 只有bash。 [它有帮助,环境是Android上终端IDE应用程序中的bash shell。]
请知道如何从内部 Vim中通过管道缓冲区。这很好,但不是我想要的。我想退出Vim并将活动缓冲区传递给stdout。
FWIW,我也知道如何将另一个命令传递给Vim作为输入。再说一遍,这不是我想要到达的地方。
答案 0 :(得分:20)
查看属于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}
答案 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
命令。