使用Vim从标准输入中读取信息时,它会显示一条信息:

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

$


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

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


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

评论

使用export MANPAGER ='vim -c“%!col -b” -c“ set ft = man nomod nolist ignorecase”-'或export MANPAGER =“ vim-”我没问题吗? man ls按预期方式打开联机帮助页。

@Carpetsmoker,然后关闭它吗?

不,什么也没看到...

@Carpetsmoker您正在使用哪个版本的Vim?那echo foo呢? vim -Nu NONE-

在vim中,:help less提供了一些用作寻呼机的信息。

#1 楼

从Vim 8.0.1308(2017年11月)开始,可以将“ --not-a-term”选项与
$ echo hello | vi - --not-a-term -esc '%p|q!'
hello


或带有“退出”:

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


http://github.com/vim/vim/issues/1552

评论


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

– John P
17-10-30在10:57



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

– John P
17-10-30在11:17

我在Ubuntu 16.04的Vim 7.4.1689中看到--not-a-term(在Mac上不是7.4.8056),但是它不会抑制该消息。

–丹尼斯·威廉姆森
18/12/11在23:48

@DennisWilliamson通过:help version8.txt查看更改日志。 --not-a-term选项本身已在7.4.1419中添加,其行为已更改为也抑制了8.0.1308中的“从标准输入中读取...”消息。 (顺便说一句,从8.1.1258开始,也禁止了N个文件编辑消息)

– ynn
19-10-20在15:13



#2 楼

确切问题的答案:


我可以禁止仅使用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)"'


评论


什么时候定义ALWAYS_USE_GUI,您知道吗?

–muru
2015年9月9日在8:46

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

–克里斯蒂安·布拉班特(Christian Brabandt)
2015年9月9日在8:54

我无法获得解决方法echo“ foo” | vim
–LéoLéopoldHertz준영
16年7月1日在5:51

就像@LéoLéopoldHertz준영一样,tty技巧对我不起作用(gvim提供了一个空文档,vim与键盘输入真正混淆了,但至少没有收到SIGSTOP)。我对echo“ foo”有更多的希望| gvim / dev / stdin(尽管非GUI vim仍会发出以下投诉:Vim:警告:输入不是来自终端)。

–亚当·卡兹(Adam Katz)
17年1月14日在1:38



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

–亚历山大·索洛维茨(Alexander Solovets)
18-10-25在8:37

#3 楼

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


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


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


在Neovim的最新版本中已解决了类似的问题(> = v0.2.2 -dev)代替Vim。

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

$ echo foo | nvim -


没有消息。

#4 楼


对于8.0.1387及更高版本的vim,您可以使用--not-a-term选项。
对于较旧的版本,请使用以下技巧:
$ echo foo | bash -c 'vim < /dev/tty <(cat)'

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

评论


现有答案或问题本身都涵盖了这两个方面。这里有什么新消息?

–muru
18-10-25在8:58

@muru没有解释第二种情况的工作原理,人们想知道为什么它仅在MANPAGE中起作用。

–亚历山大·索洛维茨(Alexander Solovets)
18-10-25在9:36