将Vim缓冲区传送到stdout

hmtdttj4  于 2022-11-30  发布在  其他
关注(0)|答案(5)|浏览(160)

我想在管道中间使用Vim。这个existing post看起来像我想做的,只是我希望不用Python的帮助--只需要bash。[如果有帮助,环境就是Android上Terminal IDE应用程序中的bash shell。]
拜托,我知道如何通过Vim内部的命令来传输缓冲区。这很好,但这不是我想要的。我想退出Vim并将活动缓冲区传递给stdout。
FWIW,我还知道如何将另一个命令作为输入传递到Vim中。

bd1hkmkf

bd1hkmkf1#

从我有限的经验来看,让Vim写stdout是不可能的。
您可以从这个package尝试vipe指令。

jpfvwuh4

jpfvwuh42#

  1. > ls -1 fred*.c | vim -

将导致Vim打开一个未命名的文件,其中包含文件列表fred*
也许我误解了你的问题。
替代解释:
请参见page,它描述了一种技术,
在不保存当前缓冲区的情况下,您希望将其内容发送到解释器(python、scheme等),并且希望该解释器在新生成的xterm中运行。新的xterm窗口很有用,因为在Vim中运行shell不允许同时检查程序输出和代码缓冲区,而且Vim的shell在几个方面都很弱。

8zzbczxx

8zzbczxx3#

看看vipe,它是moreutils的一部分,它允许你使用任何编辑器作为管道的一部分。

  1. ls -al | vipe | less

要在vim中使用它,只需确保将其设置为bashrccshrc或您使用的任何shell中的默认编辑器。

  1. EDITOR=vim

UPDATE:如果您想要一个仅bash的解决方案,可以使用如下脚本

  1. #!/bin/bash
  2. # create temporary file
  3. TMPFILE=`mktemp /tmp/vipe.bashXXXXXXXX`
  4. cat > ${TMPFILE}
  5. vim ${TMPFILE} < /dev/tty > /dev/tty
  6. cat ${TMPFILE}
  7. rm ${TMPFILE}

如需更便于携带的版本,请更换

  1. vim ${TMPFILE}

  1. ${EDITOR} ${TMPFILE}
展开查看全部
tpgth1q7

tpgth1q74#

要将缓冲区打印到shell标准输出,vim需要在Ex模式下启动,否则它将以"正常"方式打开自己的窗口,并在退出时清除任何输出缓冲区。
下面是最简单的工作示例:

  1. $ echo foo | vim +%p -escq /dev/stdin
  2. foo

其等效于:

  1. $ echo foo | vim -es '+%print' '+:q!' /dev/stdin
  2. foo

需要指定标准输入的特殊文件描述符(/dev/stdin),以防止出现额外的恼人消息。
下面是一些解析字符串的示例:

  1. $ echo This is example. | vim '+s/example/test/g' '+%p' -escq! /dev/stdin
  2. This is test.
  3. $ echo This is example. | vim - '+s/example/test/g' '+%p' -escq!
  4. Vim: Reading from stdin...
  5. This is test.

相关:

展开查看全部
5hcedyr0

5hcedyr05#

不能简单地将Vim放在管道中,因为那样Vim就不能显示它的UI。

  1. ls | vim - | more # Does not work

解决这个问题的一个方法是在管道中使用gvim -f -,因为它在一个单独的窗口中打开。
或者(也是在仅支持控制台的非图形环境中的唯一方法),您可以编写自己的脚本/函数vimAndMore,该函数将管道中应该跟随在vim后面的命令作为参数,如下所示:

  1. vimAndMore()
  2. {
  3. TMPFILE=/tmp/pipecontents
  4. # Slurp stdin into the temp file.
  5. cat - > "$TMPFILE" || exit $?
  6. # Reconnect stdin to the terminal, so that Vim doesn't complain with "Warning:
  7. # Input is not from a terminal", and the terminal is kept intact.
  8. exec 0</dev/tty
  9. # Launch the editor.
  10. "${EDITOR:-vim}" "$TMPFILE" || exit $?
  11. # Carry on with the pipe.
  12. cat "$TMPFILE" | exec "$@"
  13. rm "$TMPFILE"
  14. }

并将管道更改为:

  1. ls | vimAndMore more

如果后面有多个管道步骤,则必须使用显式shell调用:

  1. ls | vimAndMore sh -c 'tr a-z A-Z | more'
展开查看全部

相关问题