使用vim,我可以在vim打开时启动命令,例如:打开vim并创建拆分
vim +sp
我使用vim-fugitive插件,我使用
vim +Gstatus
我得到了
E492: No es una orden del editor: Gstatus
可能因为在vim启动Gstatus
当我从终端启动vim时,如何在加载插件后执行命令?
特别是,如何从预先加载Gstatus
的终端启动vim。
答案 0 :(得分:3)
: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)
答案 1 :(得分:3)
您的一般问题的答案包含在: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
自动命令。
对于您的具体问题,逃犯使用其插件文件中定义的VimEnter
自动命令来定义:Gstatus
和其他命令。如果你想自动做:Gstatus
,你应该使用类似的自动命令,并确保它在逃犯后定义,以便你的将在逃犯后执行。例如,将此行(未经测试)放在~/.vim/after/plugin/myfugitive.vim
或其中一些内容中:
:au VimEnter * if exists(':Gstatus') | Gstatus | endif
这将测试命令是否已定义;如果是这样,它将调用该命令。
答案 2 :(得分:1)
打开目标存储库的:Gstatus
文件后,Fugitive会自动运行.git/index
。不要尝试手动运行Gstatus
,而是使用以下命令:
vim .git/index
注意:
如果您想以OP建议(Gstatus
)方式调用$ vim +Gstatus
,可以在vimrc
添加以下内容:
command Gstatus edit .git/index
但,仅当您位于git存储库的根目录中时才有效。
逃犯插件使用Gstatus
定义command!
命令。这意味着逃犯会无声地覆盖此命令定义。
答案 3 :(得分:1)
您可以考虑的一件事是设置别名,例如
alias gst='vim $(git rev-parse --show-toplevel)/.git/index'
这将打开:没有文件的Gstatus(由derenio建议)但是你不需要在git的根目录下工作。
答案 4 :(得分:1)
关于打开.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)\"
。