Vim: условно используйте функцию беглого # statusline в vimrc - PullRequest
7 голосов
/ 13 мая 2011

Я использую один и тот же vimrc на многих машинах, на некоторых из которых установлен fugitive.vim, а на некоторых нет.Мне нравится включать fugitive#statusline() в мою строку состояния, но на машинах, на которых не установлен плагин, возникает ошибка.

Есть ли способ проверить существование этой функции перед вызовом set statusline?Я пытался использовать exists y, но по какой-то причине это не работает (порядок загрузки?)

if exists("*fugitive#statusline")
  set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff)
endif

Я также пытался заставить эту ошибку замолчать, добавив к команде префикс silent!, ноэто тоже не похоже на работу.

Ответы [ 4 ]

10 голосов
/ 13 мая 2011

Это будет ярлык:

set statusline+=%{exists('g:loaded_fugitive')?fugitive#statusline():''}
8 голосов
/ 09 декабря 2013

Поскольку беглец не определяет fugitive#statusline в каталоге autoload, его, к сожалению, нельзя отследить, используя технику silent! call / exists (Спасибо @Christopher).Однако есть несколько альтернатив:

  • Поместите троичную ветвь в ваш параметр 'statusline', как предложено @tungd.
  • Установите 'statusline' в файле after/plugin, как предлагает @Christopher,Это решает проблему, но означает, что ваша строка состояния определена в довольно маловероятном месте, поэтому, вероятно, было бы лучше добавить хороший комментарий в ваш файл ~/.vimrc.
  • Просто определите функцию в вашем файле ~/.vimrc.

Пример:

if !exists('*fugitive#statusline')
  function! fugitive#statusline()
      return ''
  endfunction
endif
  • Другой вариант - использовать событие Fugitive autocmd, которое определяет Fugitive.Обратите внимание, что это сработает только тогда, когда Fugitive обнаружит каталог git.

Поместите что-то подобное в ваш файл ~/.vimrc:

augroup fugitive_status
  autocmd!
  autocmd user Fugitive set statusline=%<\ %f\ %{fugitive#statusline()} ...
augroup END

Лично я считаю, что решение @tungd - этоПростейшие.Однако, просто определить фиктивную функцию было бы моим следующим выбором.Беглец переопределит его, если Беглец установлен.Самое приятное то, что это делает ваш вариант 'statusline' опрятным и чистым.

4 голосов
/ 05 декабря 2013

Я думаю, что я разработал, как этого добиться. Проверка на наличие fugitive#statusline() должна произойти после загрузки плагинов. До этого никакие переменные или функции, связанные с беглецом, не загружаются.

Добавьте этот файл кода в $VIMRUNTIME/after/plugin путь:

" $VIMRUNTIME/after/plugin/fugitive-statusline.vim
if has("statusline") && exists('*fugitive#statusline')
    " git fugitive statusline
    set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P

    " show statusline always
    set laststatus=2

    " turn off ruler
    set noruler
endif
1 голос
/ 13 мая 2011

Вы можете попробовать проверить загруженную переменную беглого плагина?

if exists('g:loaded_fugitive')
   set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff)
endif

, хотя, если не работает статусная строка беглеца #, это может быть не так эффективно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...