Comment charger conditionnellement des plugins

14

Je cherchais une réponse à cela, mais je n'ai encore rien trouvé, donc si j'ai raté quelque chose d'évident, je m'en excuse. Je pensais que ce serait une recherche rapide sur Google, alors c'est peut-être plus compliqué que je ne le pensais.

J'aimerais pouvoir charger conditionnellement des plugins en fonction du type de fichier que je modifie. Par exemple, lors de l'édition de python, je ne veux pas les raccourcis clavier qui vim-sexps'installent, mais lorsque je travaille sur clojure, je veux que ce plugin soit chargé.

J'utilise actuellement neovim et pathogen, mais s'il y a un autre gestionnaire de plugins qui le fait pour moi, je serais prêt à changer. De plus, si cela existe, :set syntax whateverchangez-vous les plugins? Parce que ce serait super :)

Merci d'avance pour toute aide / direction!

Hoopes
la source
1
Vous posez une question, mais vous en décrivez une autre: si un plugin installe des raccourcis clavier globaux, désactivez-les (lisez la documentation du plugin sur la façon de le faire), et réactivez-les localement (en utilisant autocmds par exemple) uniquement pour les types de fichiers que vous vouloir. Si le plugin est bien écrit, vous ne gagnez pas trop en retardant son initialisation. Mais si vous ne désactivez pas les liaisons de touches globales indésirables activées par un plugin, elles vous affecteront toujours après le chargement du plugin.
VanLaser

Réponses:

18

Vous pouvez le faire avec Vim-Plug. Voir le README :

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

Je pense que vous devrez utiliser :set filetype whateverau lieu d' set syntax whateveractiver le plugin.

(Un autre gestionnaire de plugins pourrait vous permettre de le faire, voir Quelle est la différence entre les gestionnaires de plugins vim? )

statox
la source
8

Au lieu d'appeler execute pathogen#infect()pour charger tous les plugins, appelez pathogen#interposepour chaque plugin, c'est-à-dire:

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

L'API pathogène n'est pas documentée en dehors de la source , mais elle est assez simple (même si les noms de fonction sont obscurs et non descriptifs). Vous pouvez également utiliser pathogen#surround()des chemins absolus.

Vous pouvez charger des plugins conditionnellement avec une base autocmd:

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

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

Si vous trouvez que vous avez plusieurs de ces cas, vous pouvez même le diviser en différents chemins:

  • ~/.vim/bundle/always pour les plugins que vous voulez toujours
  • ~/.vim/bundle/<filetype> pour les plugins pour un type de fichier spécifique
  • Et puis chargez-le comme ceci:

    " 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
    

De cette façon, vous n'avez pas à ajouter un tas de autocmds pour chaque type de fichier / plugin.

si cela existe, :set syntax whateverchangez-vous les plugins? Parce que ce serait super :)

  • Une fois qu'un plugin est chargé, il est chargé. Un « plug - in » est tout simplement une collection de function, commandet mapDEFINITIONS. Je ne connais aucun moyen simple de «décharger» cela.

  • Il fait des plugins de charge pour un type de fichier que vous utilisez IFF :set filetype; En général, vous voulez toujours utiliser :set filetypeet non :set syntax , comme syntaxmet à jour la mise en évidence de la syntaxe, et non l'indentation et d' autres paramètres (par exemple iskeyword, formatexpr, etc.).

Martin Tournoij
la source