Vim:警告:输入不来自终端

7

我编写了一个简单的 jsonview 脚本来查看 JSON 文件:

#!/bin/bash
tmp_file=/tmp/jsonview.json
cat "${@}" | python -m json.tool > $tmp_file
[[ -f $tmp_file ]]  &&  vim $tmp_file

我不使用less,因为我需要语法高亮显示。 那个无用的cat ${@} | ...是为了让脚本可以用作过滤器:

jsonview t.json

并且:

cat t.json | jsonview

如果像第二种情况那样使用 jsonview - 即使 vim 不是在管道上而是在具体文件上调用,我仍然会收到这个主题中的警告。我可以查看 json 文件,但退出后,终端会出现混乱。为什么会有这个警告?为什么 vim 认为它从管道中读取数据?

你想引用 "${@}" 的扩展,以使其对带有空格的参数安全。而 vim 并不是说它正在从一个不是终端的地方 读取,只是标准输入不是终端,而是管道。 - Etan Reisner
2个回答

4

Vim 不喜欢标准输入被重定向,除非你使用 vim - 命令进行调用。这种情况下,它知道 stdin 被重定向并进行处理。另外一个好处是可以让你摆脱临时文件。

#!/bin/bash
cat "$@" | python -m json.tool | vim +'set syntax=javascript' -R -

为确保文件名中的空格不会破坏您的脚本,请始终引用"$@"

-R在退出Vim时消除保存缓冲区的提示。


+1,那差不多可以了!正如我所提到的,我需要语法高亮,并且这里的vim不知道文件类型。我现在正在寻找如何告诉vim管道的文件类型... - Leonid Volnitsky
还有一个 view 命令,它的使用方式类似于 vim -R(在我所知的 NeoVim 中已被删除)。 - Hauleth

3
你也可以使用vim $tmp_file </dev/tty命令告诉Vim输入来自终端而不是标准输入。"最初的回答"

有意思,请详细解释一下: 1)为什么vim在有文件作为参数的情况下也关心重定向的stdin?我从未遇到过像这样的程序。2)为什么从/dev/tty重定向输入会有所帮助?我已经测试过了,但我原本期望vim会阻塞并等待从终端输入。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接