Как условно загрузить плагины

14

Я искал ответ на этот вопрос, но пока ничего не нашел, поэтому, если я пропустил что-то очевидное, я прошу прощения. Я думал, что это будет быстрый поиск в Google, так что, может быть, это сложнее, чем я думал.

Я хотел бы иметь возможность загружать плагины в зависимости от типа редактируемого файла. Например, при редактировании python я не хочу, чтобы vim-sexpустанавливалась комбинация клавиш , но при работе с clojure я хочу, чтобы этот плагин загружался.

В настоящее время я использую neovim и pathogen, но если есть другой менеджер плагинов, который сделает это для меня, я буду открыт для переключения. Кроме того, если это существует, :set syntax whateverпереключает ли плагины? Потому что это было бы супер :)

Заранее спасибо за любую помощь / направление!

Хупес
источник
1
Вы задаете вопрос, но на самом деле описываете другое: если плагин устанавливает глобальные привязки клавиш, отключите их (ознакомьтесь с документацией к плагину о том, как это сделать) и повторно включите их локально (например, с помощью autocmds) только для тех типов файлов, которые вы используете. хочу. Если плагин хорошо написан, вы не сильно выиграете, отложив его инициализацию. Но если вы не отключите нежелательные глобальные привязки клавиш, активированные плагином, они все равно будут влиять на вас после загрузки плагина.
VanLaser

Ответы:

18

Вы можете сделать это с Vim-Plug. Смотрите README :

" On-demand loading
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }

Я думаю, вам придется использовать :set filetype whateverвместо того, set syntax whateverчтобы включить плагин.

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

statox
источник
8

Вместо вызова execute pathogen#infect()для загрузки всех плагинов, вызов pathogen#interposeдля каждого плагина, то есть:

execute pathogen#interpose('bundle/unicode.vim')
execute pathogen#interpose('bundle/AnsiEsc.vim')

API патогенов не документирован вне источника , но он достаточно прост (хотя имена функций неясны и не описательны). Вы также можете использовать pathogen#surround()для абсолютных путей.

Вы можете загружать плагины условно с помощью autocmd:

" Always use this plugin
execute pathogen#interpose('bundle/unicode.vim')

" Only for Python
autocmd FileType python execute pathogen#interpose('bundle/vim-sexp')

Если вы обнаружите, что у вас есть много таких случаев, вы можете даже разбить его на разные пути:

  • ~/.vim/bundle/always для плагинов вы всегда хотите
  • ~/.vim/bundle/<filetype> для плагинов для определенного типа файла
  • А затем загрузить его так:

    " Always use this plugin
    execute pathogen#infect('bundle/always/{}')
    
    " Load filetype plugins if they exist
    autocmd FileType * if isdirectory('/home/martin/.vim/bundle/' . &ft) | execute pathogen#infect('bundle/' . &ft. '/{}') | endif
    

Таким образом, вам не нужно добавлять целую кучу autocmds для каждого типа файла / плагина.

если это существует, :set syntax whateverпереключает ли плагины? Потому что это было бы супер :)

  • Как только плагин загружен, он загружается. А «плагин» это просто коллекция function, commandи mapdefinitons. Я не знаю ни одного простого способа «разгрузить» это.

  • Это делает загрузки подключаемые модули для типов файлов тогда и только тогда вы используете :set filetype; В общем, вы всегда хотите использовать, :set filetypeа не :set syntax , так как syntaxбудет только устанавливать подсветку синтаксиса, а не отступ и другие настройки (например iskeyword, formatexprи т. Д.).

Мартин Турной
источник