使用 vim,我可以在 vim 打开时启动命令,例如:打开 vim 并创建一个拆分
vim +sp
我用 vim-fugitive 插件,是我用
vim +Gstatus
我明白了
E492: No es una orden del editor: Gstatus
可能是因为 vim 启动时没有加载逃犯Gstatus
当我从终端启动 vim 时,如何在加载插件后执行命令?
特别是,我如何从Gstatus
预加载的终端启动 vim。
使用 vim,我可以在 vim 打开时启动命令,例如:打开 vim 并创建一个拆分
vim +sp
我用 vim-fugitive 插件,是我用
vim +Gstatus
我明白了
E492: No es una orden del editor: Gstatus
可能是因为 vim 启动时没有加载逃犯Gstatus
当我从终端启动 vim 时,如何在加载插件后执行命令?
特别是,我如何从Gstatus
预加载的终端启动 vim。
您的一般问题的答案包含在 中:help startup
。以下是一些相关部分:
3. Execute Ex commands, from environment variables and/or files
...
*VIMINIT* *.vimrc* *_vimrc* *EXINIT* *.exrc* *_exrc* *$MYVIMRC*
c. Four places are searched for initializations. The first that exists
is used, the others are ignored. ...
- The user vimrc file(s):
"$HOME/.vimrc" (for Unix and OS/2) (*)
...
"$HOME/_vimrc" (for MS-DOS and Win32) (*)
"$VIM/_vimrc" (for MS-DOS and Win32) (*)
...
4. Load the plugin scripts. *load-plugins*
This does the same as the command: >
:runtime! plugin/**/*.vim
...
8. Perform GUI initializations
Only when starting "gvim", the GUI initializations will be done. See
|gui-init|.
...
12. Execute startup commands
If a "-t" flag was given to Vim, the tag is jumped to.
The commands given with the |-c| and |+cmd| arguments are executed.
The starting flag is reset, has("vim_starting") will now return zero.
If the 'insertmode' option is set, Insert mode is entered.
The |VimEnter| autocommands are executed.
这是一种作弊,在终端中无法与 vim 一起使用,但您可以将命令放入您的 gvimrc 文件中,它们将在所有插件加载后运行。正如@Peter Rincker 在回答后的评论中建议的那样,更可靠的是使用VimEnter
自动命令。
对于您的特定问题,fugitive 使用VimEnter
在其插件文件中定义的自动命令来定义:Gstatus
和其他命令。如果你想:Gstatus
自动执行,你应该使用类似的自动命令并确保它是在逃犯之后定义的,这样你的就会在逃犯之后执行。例如,将此行(未经测试)放入~/.vim/after/plugin/myfugitive.vim
或类似:
:au VimEnter * if exists(':Gstatus') | Gstatus | endif
这将测试命令是否已定义;如果是这样,它将调用该命令。
:Gstatus
是一个缓冲区特定的命令。因此,除非您在存储库中打开文件,否则该命令将不存在。在此处阅读更多信息::h :command-buffer
以及此处的第一段:h fugitive-commands
例子:
vim -c Gstatus <filename> # -c "cmd" will be executed after the first file has been read.
vim +Gstatus <filename> # +command is a shortcut for `-c command`
vim .git/index # opens :Gstatus without a file (answer by derenio)
Fugitive:Gstatus
在打开.git/index
目标存储库的文件后自动运行。不要尝试手动运行Gstatus
,而是使用以下命令:
vim .git/index
注意:
如果您想Gstatus
按照 OP 建议的方式调用 ( $ vim +Gstatus
),您可以将以下内容添加到您的vimrc
:
command Gstatus edit .git/index
但是,这仅在您位于 git 存储库的根目录中时才有效。
逃犯插件Gstatus
用command!
. 这意味着逃犯默默地覆盖了这个命令定义。
关于打开.git/index
文件的所有建议基本上都是正确的,但需要注意该文件的实际位置。从技术上讲,最正确的调用是:
alias gst='vim $(git rev-parse --git-path index)'
一个充分的调用是:
alias gst='vim $(git rev-parse --git-dir)/index'
这正确地考虑了诸如索引存储在根存储库的子目录中(而不是在工作树中)的工作树之类的事情。
我首选的方法是通过git
定义如下的别名:
[alias]
vim = "!_(){ cd ${GIT_PREFIX}; \
vim '+ped ${GIT_DIR}/index' '+winc P' '+setl fdl=1' ${1:+'+winc p'} $* \
;};_"
的目的cd ${GIT_PREFIX}
是因为别名总是从存储库的基础运行,所以这确保我们返回到我们调用它的目录。在ped ${GIT_DIR}/index
预览窗口中加载索引(这是什么:Gstatus
),并将winc P
焦点设置到预览窗口。这setl fdl=1
只是为了撤消折叠,因为我默认启用了它们,但不希望它们出现在状态窗口中。
这${1:+'winc p'} $*
意味着传递给的任何参数随后git vim
也会传递vim
给winc p
文件)只有在有参数的情况下。
请注意,如果您想成为完全未来的证明,您可以'+ped ${GIT_DIR}/index'
替换为。\"+ped $(git rev-parse --git-path index)\"
您可以考虑的一件事是设置别名,例如
alias gst='vim $(git rev-parse --show-toplevel)/.git/index'
这将在没有文件的情况下打开 :Gstatus(如 derenio 建议的那样),但是您不需要位于 git 的根目录中即可。