Як я можу перевірити плагіни та включити їх лише у випадку, якщо вони існують у .vimrc?


14

В моєму випадку .vimrcя намагаюся використовувати ftpluginі, очевидно, використовувати деякі команди, що стосуються цієї програми, при припущенні, що вона була успішно завантажена. Однак зараз я стикався з декількома старими машинами, на яких плагін не встановлений. Чи можу я якось зробити завантаження цього плагіна умовним і додати filetype onта подібні директиви в той самий умовний блок?

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

NB: Будьте лагідні, я початківець VimScript.


1
Зауважте, що плагіни завантажуються після ваших ~/.vimrc, тому ви не зможете перевірити ефекти плагіну у вашому випадку, ~/.vimrcякщо ви не перевірите наявність файлу плагінів або відкладете тест до тих пір, поки плагіни не завантажуються з автокомандою, наприклад VimEnter.
garyjohn

@garyjohn: ага, це цікаво. Тому що цей вид суперечить існуючій відповіді. Чи можете ви написати це як відповідь?
0xC0000022L

Я відредагував свою відповідь, щоб дещо вирішити це питання.
qqx

Мій коментар не суперечив відповіді qqx; малося на увазі звернути увагу на момент, який міг бути пропущений, якби людина не прочитала уважно відповідь qqx або зробила з неї неправильні умовиводи. Відповідь було добре почати з того, що зараз ще зрозуміліше.
garyjohn

Відповіді:


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.


8

Мій кращий метод - це просто перевірити наявність файла плагіна. Я вважаю це простішим.

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

Звучить розумно, але що таке базовий шлях? Це автоматично будинок Vim (тобто зазвичай ~/.vim)?
0xC0000022L

Залежить від конфігурації .vimrc та налаштувань управління пакунками. Я роблю це:if filereadable($HOME."/.vim/plugins.vim") source ${HOME}/.vim/plugins.vim endif
user3751385

дякую, дивовижно Мене більше хвилювало те, що існує якийсь базовий шлях, що має на увазі те, що ви дали.
0xC0000022L

4

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

  1. Перевірте наявність кожного плагіна, перевіривши, чи є одна команда, яку він надає 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

ця відповідь не підходить для компанії vim-air. Зокрема, очікування події VimEnter для уточнення таких речей, як airline_themeвидається, викликає купу помилок ... Я не дуже впевнений, чому.
StevieP

3

Ще одна альтернатива - використання :silent! {cmd}, яке пригнічує помилку, коли її {cmd}немає. Основна перевага полягає в тому, що це коротка одна команда. Це навіть працює у Vim 6 і чудово підходить для додаткових матеріалів.

Наприклад, він використовується плагінами, які використовують Tim Pope's repe.vim, щоб зробити відображення повторюваними.


Це :silent!не так !silent, і це стосується всіх команд, що містяться, за винятком випадків, коли :unsilentвони використовуються десь усередині. (Але це рідко.)
Інго Каркат

2

Спочатку розміщено в іншому запитанні: /programming//a/48178537/2843583

Як альтернативу, ви також можете скористатись повторним виразом, щоб вирішити, чи підходить плагін у вас runtimepath:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.