vim:加载插件后启动命令

时间:2014-03-14 15:49:31

标签: vim vim-fugitive

使用vim,我可以在vim打开时启动命令,例如:打开vim并创建拆分

vim +sp

我使用vim-fugitive插件,我使用

vim +Gstatus

我得到了

E492: No es una orden del editor: Gstatus

可能因为在vim启动Gstatus

时没有加载逃犯

当我从终端启动vim时,如何在加载插件后执行命令?

特别是,如何从预先加载Gstatus的终端启动vim。

5 个答案:

答案 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)\"