如何抑制Vim内部的“从STDIN读取”消息?


18

当使用Vim读取stdin时,它会显示一条信息:

$ echo foo | vim -
Vim: Reading from stdin...

$

这只是一个例子。实际使用中不允许使用shell构造。 vim <(echo foo)不是一个选择。

我可以使用Vim选项和/或vimrc设置来禁止这样做吗?


如果您确实需要知道这是干什么的,我正在尝试使用Vim来阅读联机帮助页(无耻的插件)。GNU man不允许使用shell构造MANPAGER,并且通过使用ftplugin/man.vim和其他方法,我已经成功地使用just来获得舒适的体验MANPAGER="vim -"。最后剩下的烦恼是在我查看过的每个联机帮助页之后打印的难看的消息。


使用export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'还是export MANPAGER="vim -"我没问题?man ls按预期打开手册页。
马丁·图尔诺伊

@Carpetsmoker,关闭之后呢?
muru 2015年

不,什么都没看到……
马丁·图尔诺伊

@Carpetsmoker您正在使用哪个版本的Vim?怎么样echo foo | vim -Nu NONE -
大师

在vim中,: help less提供了一些有关将其用作寻呼机的信息。
mtklr 2015年

Answers:


8

Vim 8.0.1308(2017年11月)开始,您可以使用该--not-a-term选项来禁止显示此消息。例如quit

$ echo hello | vi - --not-a-term -esc '%p|q!'
hello

或搭配exit

$ echo hello | vi - --not-a-term -esc 'x!/dev/stdout'
hello

cat照原样,它等效于,但对于将Vimscript应用于输入,例如+'runtime! syntax/2html.vim'将突出显示的文本导出为样式HTML(假定推导或指定的文件类型),仍然有用。到目前为止,除了上述选项以外,还有其他一些选项。首先想到的是mktemp用于存储命令的输出,并将其用作Vim的输入。您可以添加Vim的重定向和shell命令以将命令结果“粘贴”到缓冲区中,但这需要更多的工作。(Vim脚本文件可以自动执行冗长的调用,而无需使用别名。)
John P

可能可以编辑/粘贴套接字的输出,如果确实如此,这可能非常有用。我仍然说最好的选择是临时文件,除非有比公认的答案更糟糕的警告。但是,对于给定的外壳,可能存在一个现有的别名/内建文件/语法,该过程简化了该过程的某些部分,例如zshmisc手册页中列出的那些(重定向等)。另外-也许您可以转义并提供输入作为进入插入模式的参数之后的参数,因此它像输入一样进行解析?
约翰·P

--not-a-term在Ubuntu 16.04的Vim 7.4.1689中看到了(但在Mac上没有7.4.8056),但是它没有抑制该消息。
暂停,直到另行通知。

@DennisWilliamson参阅的变更日志:help version8.txt--not-a-term选项本身已添加,7.4.1419并且其行为已更改为也禁止显示从stdin ...读取消息8.0.1308。(顺便说一下,N个文件的编辑消息也被抑制了8.1.1258
ynn

12

您的确切问题的答案:

我可以仅使用Vim选项和/或vimrc设置来禁止这样做吗?

是:不,这不是因为下面的部分可能的

    if (read_stdin)
    {
#ifndef ALWAYS_USE_GUI
        mch_msg(_("Vim: Reading from stdin...\n"));
#endif

这意味着,如果您给-vim作为参数,它将机械地显示该消息。

但是,作为一种变通方法,如果您使用文件重定向而不是-参数,则会摆脱此消息:

echo "foo" | vim < /dev/tty

这是一个MANPAGE可以正常工作的设置示例(摘自管间):

export MANPAGER='bash -c "vim -MRn -c \"set ft=man nomod nolist nospell nonu\" -c \"nm q :qa!<CR>\" -c \"nm <end> G\" -c \"nm <home> gg\"</dev/tty <(col -b)"'

2
ALWAYS_USE_GUI定义的,你知道吗?
muru 2015年

2
参见feature.h(在未定义ALWAYS_USE_GUI的情况下完成,因此基本上所有的Unix版本都可以完成)。
Christian Brabandt 2015年

2
我无法解决该echo "foo" | vim < /dev/tty问题。这样做会给[2]+ Stopped echo "foo" | vim < /dev/tty
莱奥波德·赫兹(LéoLéopoldHertz)2016年

2
就像@LéoLéopoldHertz준영一样,tty技巧对我不起作用(gvim提供了一个空文档,vim与键盘输入真正混淆了,但至少没有收到SIGSTOP)。我非常幸运echo "foo" | gvim /dev/stdin(尽管非GUI vim仍会对此发出投诉:)Vim: Warning: Input is not from a terminal
亚当·卡兹

2
好吧,忘了我以前的消息。答案的诀窍<(col -b)部分是。从本质上讲,这是cat用于打印手册页的某些复杂版本,您最终可以摆脱echo test | vim < /dev/tty <(cat>

1

在Vim中,此问题已在234d162commit(> = v8.0.1387)中得到解决。

解决方案:不显示--not-a-term已使用的消息。

因此,仅当用户尚未重定向标准输入时才显示该消息。


在最新版本的Neovim> = v0.2.2-dev)中已经解决了类似的问题,您可以使用它代替Vim。

NVim v0.2.2发布后,您应该可以运行:

$ echo foo | nvim -

没有消息。


0
  1. 对于8.0.1387及更高版本的vim,您可以使用--not-a-termoption。

  2. 对于旧版本,请使用以下技巧: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

第一个参数/dev/tty以某种方式欺骗了Vim认为输入来自键盘。我猜这是因为isatty(3)对于该文件返回True。第二个参数只是将所有内容从标准输入传递到Vim的标准输入。最后,如果shell不支持bash -c特殊结构,则前缀是必需的,这样特殊结构<(...)才能起作用。在bash中,原始解决方案可以简化为 $ echo foo | vim < /dev/tty <(cat)


现有答案或问题本身都涵盖了这两个方面。这里有什么新消息?
muru 18-10-25,8

@muru没有解释第二种情况的工作原理,人们想知道为什么它仅在MANPAGE中起作用。
亚历山大·索洛维茨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.