Vim - 如何在启动 Vim 时立即运行命令?

137

我有一个插件(FindFile.vim),需要在每次启动vim时运行:FindFileCache .来收集文件缓存以便快速打开。但是每次启动vim都需要手动运行这个命令。

我该如何编写一个命令,在每次启动vim时只运行一次?

6个回答

168

把配置文件放在.vimrc中是最好的选择。但是,它加载得太早了,可以查看:h startup

At startup, Vim checks environment variables and files and sets values
accordingly.  Vim proceeds in this order:

1. Set the 'shell' and 'term' option                *SHELL* *COMSPEC* *TERM*
2. Process the arguments
3. Execute Ex commands, from environment variables and/or files *vimrc* *exrc*
4. Load the plugin scripts.                                 *load-plugins*
5. Set 'shellpipe' and 'shellredir'
6. Set 'updatecount' to zero, if "-n" command argument used
7. Set binary options
8. Perform GUI initializations
9. Read the viminfo file
10. Read the quickfix file
11. Open all windows
12. Execute startup commands

正如您所看到的,您的.vimrc将在插件之前加载。如果您在其中放置:FindFileCache .,则会出现错误,因为该命令尚不存在。(一旦在第4步加载插件,它就存在了。)

为解决此问题,请不要直接执行命令,而是创建一个自动命令。自动命令在事件发生时执行某些命令。在这种情况下,VimEnter事件似乎很合适(来自:h VimEnter):

                                                    *VimEnter*
VimEnter                    After doing all the startup stuff, including
                            loading .vimrc files, executing the "-c cmd"
                            arguments, creating all windows and loading
                            the buffers in them.

然后,在你的.vimrc文件中添加这行代码:

autocmd VimEnter * FindFileCache .

3
+1,这应该被接受为答案,它比为一个命令创建单独的文件干净得多。 - user1318194
想要补充一下,我在使用E172时遇到了问题,因为在"."后面有一个空格。 - Caroline
尝试使用这种方法来调用: AnsiEsc,但它并没有产生预期的效果 - 你有没有可能知道如何检测是否已经运行了类似于: AnsiEsc 的命令? - serup
1
这可以解决许多问题,非常感谢您创建这篇文章。 - SdSaati

119
还有vim的-c标志。我在我的tmuxp配置中使用它来使vim以垂直分割的方式启动。
vim -c "vnew"

至少使用neovim,你也可以同时打开一个文件:
nvim -c "colorscheme mustang" some_file

8
谢谢,这正是我要找的。有时候我只需要像你展示的那样运行一个临时的启动命令,比如split,而不需要将其存储在我的vimrc文件中。 - verboze
无法打开文件:vim -c‘:colo default’ test.txt - van abel
1
对我来说也很完美 - 我正在使用 xolox/vim-notes,我想要一个打开 Vim 并准备好新笔记的 fish 函数。 - wsams
我使用以下命令在单独的窗口中启动vim帮助:vim -c 'help | only' 或简写为:vim -c'h|on'。这将启动vim并显示帮助信息,然后执行:only命令以将其转换为单个窗口。 - MacMartin
多个命令可以通过重复使用“-c”选项来链接,如下所示:vim -c "command1" -c "command2" - Claudiu
显示剩余2条评论

13

创建一个名为~/.vim/after/plugin/whatever_name_you_like.vim的文件,并将其填充。

FindFileCache .

在 vim 目录中读取和执行脚本的顺序已在 :help 'runtimepath' 中描述。


3
要比其他答案晚一点,但仍然在启动后立即运行,请在 .vimrc 中使用定时器。例如,这段代码在启动后等待半秒钟才设置变量。
function DelayedSetVariables(timer)
    let g:ycm_filetype_blacklist['ignored'] = 1
endfunction
let timer=timer_start(500,'DelayedSetVariables')

这个例子中的变量是来自YouCompleteMe插件的黑名单。我猜测,该插件会异步启动一些其他进程,这些进程创建变量时可能还没有准备好,但在vim启动时就已经尝试设置了该变量。无论是在.vimrc、after文件或VimEnter事件中尝试设置该变量都不起作用。这种情况似乎只针对我的Windows系统,YCM文档表示应该可以通过.vimrc来设置选项。


2
你可以运行 vim file.txt "+:FindFileCache ."

1
哦,现在我明白了 +/ 究竟是什么意思。 - Sridhar Sarnobat

1
FindFileCache放入您的.vimrc中。
自动加载命令不同,无法适用于您的情况。

谢谢指出,实际上是 plugin 而不是 autoload - Benoit

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