14

В моем .vimrc я пытаюсь использовать ftplugin и, очевидно, использовать некоторые команды, относящиеся к этому, при условии, что он был успешно загружен. Тем не менее, я столкнулся с несколькими старыми машинами, на которых не установлен плагин. Могу ли я как-то сделать загрузку этого плагина условной и добавить filetype on и аналогичные директивы в один и тот же условный блок?

Я видел, что есть условия для цветовых схем и версии Vim, но я не видел пример, который проверял бы плагин (или не распознавал его).

NB: будь осторожен, я начинающий VimScript.

5 ответов5

19

Вы можете заключить этот блок в условное выражение, которое использует функцию exists() чтобы проверить, известна ли vim переменная, команда или функция, определенная плагином.

Вот пара битов, которые у меня есть в файлах в ~/.vim:

" after/plugin/speeddating.vim
if exists(':SpeedDatingFormat')
    SpeedDatingFormat %-d %B %Y
endif

" ftplugin/ruby.vim
if exists('g:loaded_surround') && !exists('b:surround_'.char2nr(':'))
  let b:surround_{char2nr(':')} = ":\r"
endif

Обратите внимание, что приведенные выше биты находятся в файлах, которые оцениваются после обычных плагинов, здесь это ftplugin и файл в каталоге after/plugin .

Другой вариант - использовать блоки try/catch, хотя для этого требуется как минимум vim 7.0:

if v:version >= 700
    try
        runtime bundle/pathogen/autoload/pathogen.vim
        call pathogen#infect()
    catch
    endtry
endif

Если что-то в секции try этого блока завершается неудачей, оно переходит к секции catch . Поскольку секция catch пуста, она просто продолжит работу с остальной частью файла инициализации после оператора endtry .

Поскольку это загрузка кода вручную, а не использование уже загруженного плагина, это можно сделать в самом файле .vimrc.

7

Мой предпочтительный метод - просто проверить наличие файла плагина. Я считаю это проще.

if !empty(glob("path/to/plugin.vim"))
   echo "File exists."
endif
3

Еще одна альтернатива использует :silent! {cmd} , который подавляет ошибку, когда {cmd} не существует. Главное преимущество в том, что это короткая одиночная команда. Это даже работает в Vim 6 и отлично подходит для дополнительных вещей.

Например, он используется плагинами, которые используют repeat.vim Тима Попа для повторения отображений.

3

Я хотел достичь этого, сохраняя свою конфигурацию Vim вместе в .vimrc , а не в куче каталогов after/ . Это решение, которое я придумал:

  1. Проверьте существование каждого плагина, проверив наличие любой отдельной команды, которую он предоставляет с exist exists() , и установите его параметры, если он существует. (Это так же, как в принятом ответе.)

  2. Поместите все параметры, указанные выше, в функцию (называемую SetPluginOptionsNow() в моем коде).

  3. Вызывайте эту функцию для события VimEnter , которое запускается при входе в новый сеанс Vim, но, что важно, после того, как плагины все загружены. Из-за этого наши проверки exists() могут без проблем проверять функции плагина.

Вот образец из этой части моего .vimrc .

""" PLUGIN-SPECIFIC OPTIONS
" These are "supposed to be" set in after/plugin directory, but then
" cross-platform synchronization would get even messier. So, au VimEnter it is. 

function! SetPluginOptionsNow()


    " NERDTree Options
    if exists(":NERDTree")
        map <F10> :NERDTreeToggle<CR>
    endif

    " Syntastic Options
    if exists(":SyntasticCheck")
        let g:syntastic_stl_format = '[Syntax: line:%F (%e+%w)]'
        set statusline+=%#warningmsg#
        set statusline+=%{SyntasticStatuslineFlag()}
        set statusline+=%*
        " and so on...

endfunction

au VimEnter * call SetPluginOptionsNow()
""" END OF PLUGIN-SPECIFIC OPTIONS
0

Первоначально опубликовано в другой вопрос: https://stackoverflow.com/a/48178537/2843583

В качестве альтернативы вы также можете использовать регулярное выражение, чтобы решить, находится ли подключаемый модуль в вашем runtimepath:

if &rtp =~ 'plugin-name'
    ...
endif

Преимущество этого заключается в том, что он работает с плагинами, которые имеют только код vimscript в каталоге autoload , который, в свою очередь, не может быть обнаружен при первоначальном анализе .vimrc, так как фрагменты автозагрузки загружаются во время вызова функции.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .