我想在管道中间使用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只是确保将其设置为默认编辑器在您bashrc或cshrc或任何外壳使用.
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)
您不能简单地将 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)
要将缓冲区打印到 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)
有关的: