vim: команда запуска после загрузки плагинов

С помощью vim я могу запустить команду, когда vim открыт, например: открыть vim и создать разделение

vim +sp

Я использую vim-fugitive плагин, я использую

vim +Gstatus

я получил

E492: No es una orden del editor: Gstatus

может потому что беглецы не грузятся при запуске vim Gstatus

когда я запускаю vim из терминала, как я могу выполнить команду после загрузки плагинов?

В частности, Как я могу запустить VIM из терминала с Gstatus поджат.

4 ответа

Ответ на ваш общий вопрос содержится в :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

Это проверит, была ли команда определена; если это так, он вызовет команду.

: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)

Одна вещь, которую вы могли бы рассмотреть, это создать псевдоним, такой как

alias gst='vim $(git rev-parse --show-toplevel)/.git/index'

это откроет:Gstatus без файла (как предложено derenio), однако вам не нужно находиться в корневом каталоге git, чтобы это работало.

Беглец автоматически бежит :Gstatus после открытия .git/index файл вашего целевого хранилища. Вместо того, чтобы пытаться запустить вручную Gstatus, используйте эту команду:

vim .git/index

Замечания:
Если вы хотели бы призвать Gstatus как предложено ФП ($ vim +Gstatus), вы можете добавить следующее к вашему vimrc:

command Gstatus edit .git/index

Однако это работает, только если вы находитесь в корневом каталоге вашего репозитория git.

Беглый плагин определяет Gstatus команда с command!, Это означает, что беглец молча перезаписывает это определение команды.

Все предложения по открытию .git/indexfile, по сути, верны, но нужно быть осторожным в отношении фактического местоположения этого файла. Технически правильный вызов:

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)\" если вы хотите быть полностью уверенными в завтрашнем дне.

Другие вопросы по тегам