vim:如何检测 .vimrc 中的 stdin 输入?

S.V*_*S.V 1 vim stdin

如何检测 .stdin 输入.vimrc

我的命令中有以下命令~/.vimrc

autocmd BufWinEnter * silent loadview
Run Code Online (Sandbox Code Playgroud)

用光标在最后一行位置打开文件。但是,如果我在 stdin 上使用 vim,则会收到以下错误消息:

Error detected while processing BufWinEnter Autocommands for "*":
E32: No file name
Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)

.vimrc在这种情况下,如何检测在 stdin 上使用 vim来抑制命令的执行?

感谢您的帮助!

rom*_*inl 5

v:argv 是一个以程序完整路径开头的列表,并包含每个参数(如果有)。

如果你这样调用 Vim:

$ vim
Run Code Online (Sandbox Code Playgroud)

:echo v:argv 输出类似:

['/path/to/vim']
Run Code Online (Sandbox Code Playgroud)

如果你这样调用 Vim:

$ vim foo.txt bar.json
Run Code Online (Sandbox Code Playgroud)

:echo v:argv 输出类似:

['/path/to/vim', 'foo.txt', 'bar.json']
Run Code Online (Sandbox Code Playgroud)

如果你这样调用 Vim:

$ echo 'foo bar baz' | vim -
Run Code Online (Sandbox Code Playgroud)

:echo v:argv 输出类似:

['/path/to/vim', '-']
Run Code Online (Sandbox Code Playgroud)

因此,您可以将 的执行限制:loadview为 的内容v:argv[1]。注意我们使用get()是因为索引1可能不存在:

autocmd BufWinEnter * if get(v:argv, 1, '') != '-' | silent loadview | endif
Run Code Online (Sandbox Code Playgroud)

参考:

:help :get()
:help v:argv
Run Code Online (Sandbox Code Playgroud)