Comment puis-je tester les plugins et les inclure uniquement s'ils existent dans .vimrc?

14

Dans mon .vimrc, j'essaie d'utiliser ftpluginet évidemment d'utiliser certaines commandes liées à cela sous l'hypothèse qu'il a été chargé avec succès. Cependant, j'ai maintenant rencontré quelques vieilles machines sur lesquelles le plugin n'est pas installé. Puis-je en quelque sorte rendre le chargement de ce plug-in conditionnel et ajouter filetype ondes directives similaires dans le même bloc conditionnel?

J'ai vu qu'il y avait des conditions pour les jeux de couleurs et la version Vim, mais je n'ai pas vu d'exemple qui vérifierait le plugin (ou ne l'a pas reconnu).

NB: Soyez doux, je suis un débutant VimScript.

0xC0000022L
la source
1
Notez que les plugins sont chargés après votre ~/.vimrc, vous ne serez donc pas en mesure de tester les effets d'un plugin au sein de votre, ~/.vimrcsauf si vous testez l'existence du fichier de plugin ou différez le test jusqu'à ce que les plugins aient été chargés avec une autocommande telle que VimEnter.
garyjohn
@garyjohn: aha, c'est intéressant. Parce que ce genre de contradiction avec la réponse existante. Pourriez-vous l'écrire comme réponse?
0xC0000022L
J'ai modifié ma réponse pour résoudre quelque peu ce problème.
qqx
Mon commentaire ne contredit pas la réponse de qqx; il était destiné à attirer l'attention sur un point qui aurait pu être manqué si l'on n'avait pas lu attentivement la réponse de qqx ou en avait fait des inférences incorrectes. La réponse était bonne au départ et est encore plus claire maintenant.
garyjohn

Réponses:

19

Vous pouvez encapsuler ce bloc dans un conditionnel qui utilise la exists()fonction pour vérifier si une variable, une commande ou une fonction définie par le plugin est connue de vim.

Voici quelques bits que j'ai dans des fichiers sous ~ / .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

Notez que les bits ci-dessus sont dans des fichiers qui sont évalués après des plugins normaux, ici un ftplugin et un fichier dans le after/plugin répertoire.

Une autre option serait d'utiliser des blocs try / catch, bien que cela nécessite au moins vim 7.0:

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

Une fois que quelque chose dans la trysection de ce bloc échoue, il passera à la catchsection. Étant donné que la catchsection est vide, elle continuera simplement avec le reste du fichier d'initialisation après l' endtryinstruction.

Comme il s'agit de charger manuellement du code plutôt que de compter sur un plugin déjà chargé, cela peut être fait dans le fichier .vimrc lui-même.

qqx
la source
Pourriez-vous ajouter les exigences de version pour la tryconstruction? Le vieux Vim comprendrait-il cela? C'est-à-dire quand a-t-il été introduit. Merci et +1 pour l'instant.
0xC0000022L
1
J'ai ajouté des informations sur la version requise.
qqx
Je pense que la dernière solution avec la vérification de version trydevrait fonctionner. Merci beaucoup. Voyons si une autre réponse arrivera toujours. Sinon, je vais bien sûr accepter le vôtre.
0xC0000022L
ah, bien sûr, cela désactive le plugin sur les versions 6.x. Hmmm ... besoin de trouver quelque chose de mieux, mais cela fonctionnera en attendant. Merci.
0xC0000022L
Encore une autre alternative utilise :silent! {cmd}, qui supprime l'erreur lorsqu'il {cmd}n'existe pas. Cela fonctionne même dans Vim 6.
Ingo Karkat
7

Ma méthode préférée consiste simplement à vérifier l'existence du fichier de plugin. Je trouve cela plus simple.

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

Je voulais y parvenir tout en conservant ma configuration Vim ensemble .vimrc, plutôt que dans un tas de after/répertoires. Voici la solution que j'ai trouvée:

  1. Vérifiez l'existence de chaque plugin en recherchant toute commande unique qu'il fournit exists()et définissez ses options si elle existe. (C'est comme dans la réponse acceptée.)

  2. Mettez toutes les options définies de la manière ci-dessus dans une fonction (appelée SetPluginOptionsNow()dans mon code).

  3. Appelez cette fonction sur l' VimEnterévénement, qui se déclenche lors de l'entrée dans une nouvelle session Vim - mais surtout, une fois les plugins chargés. De ce fait, notreexists() vérifications peuvent vérifier les fonctions du plugin sans problème.

Voici un échantillon de cette partie de mon .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
Sundar - Rétablir Monica
la source
cette réponse n'est pas agréable avec vim-airlines. En particulier, attendre que l'événement VimEnter spécifie des choses comme airline_themesemble induire un tas d'erreurs ... Je ne sais pas vraiment pourquoi.
StevieP
3

Pourtant, une autre alternative utilise :silent! {cmd}, qui supprime l'erreur lorsque{cmd} n'existe pas. Le principal avantage est qu'il s'agit d'une courte commande unique. Cela fonctionne même dans Vim 6, et est idéal pour les éléments facultatifs.

Par exemple, il est utilisé par des plugins qui utilisent repeat.vim de Tim Pope pour rendre les mappages reproductibles.

Ingo Karkat
la source
Est-ce que quelque chose comme du !silent runtime ftplugin/man.vim | filetype on | filetype plugin on | filetype indent ontravail pour fermer toutes les commandes suivant le !silentou est-ce toujours spécifique à la commande suivante?
0xC0000022L
Ce n'est :silent!pas le cas !silentet cela s'applique à toutes les commandes contenues, sauf quand :unsilentest utilisé quelque part à l'intérieur. (Mais c'est rare.)
Ingo Karkat
oups, difficile à corriger maintenant dans le commentaire. Mais j'ai compris. Merci.
0xC0000022L
1

Initialement publié dans une autre question: /programming//a/48178537/2843583

Tout comme une alternative, vous pouvez également utiliser une expression rationnelle pour décider si le plugin à portée de main est dans votre runtimepath:

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

Cela a l'avantage de fonctionner avec des plugins qui n'ont que du code vimscript dans le autoloadrépertoire, qui à son tour ne peut pas être détecté lorsque .vimrc est initialement analysé car les extraits de chargement automatique sont chargés au moment d'un appel de fonction.

bergercookie
la source