2009-09-11 8 views
43

J'ai quelques sections dans mon .vimrc qui ressemblent à ceci:autocommandes multiples dans vim

autocmd Filetype ruby setlocal ts=2 
autocmd Filetype ruby setlocal sts=2 
autocmd Filetype ruby setlocal sw=2 

maintenant il semble que je peux les convertir à ceci:

autocmd Filetype ruby setlocal ts=2 sts=2 sw=2 

mais voici ma question: Y a-t-il une manière vim d'avoir une structure comme celle-ci?

<something mentioning Filetype ruby> 
    setlocal ts=2 
    setlocal sts=2 
    ... 
<end> 

-à-dire, le bit peut autocmd Filetype en quelque sorte fait pour répondre à un groupe d'actions? (Ceci est un exemple simple, je demande vraiment pour des situations plus compliquées.)

Répondre

56

Vous pouvez appeler une fonction, si vous aimez:

autocmd Filetype ruby call SetRubyOptions() 
function SetRubyOptions() 
    setlocal ts=2 
    ... 
endfunction 
+0

hmmm, c'est très bien - merci - mais de toute façon pour le resserrer un peu plus (c'est-à-dire, enlever le besoin de nommer et se référer à la fonction)? – Peter

+6

Aussi sympa que cela puisse être, le script vim n'a pas de lambda: P –

+0

@Peter - Nope. C'est aussi serré que possible. –

40

Vous pouvez enchaîner avec la plupart des commandes |:

au Filetype ruby 
      \ setlocal ts=2 | 
      \ setlocal sts=2 | 
      \ ... 

Vous ne savez pas si cette syntaxe est meilleure ou pire que l'écriture d'une fonction. Certaines commandes ne peuvent pas être chaînées comme ceci, mais vous pouvez utiliser execute pour contourner cela; voir :h :bar. Voir également :h line-continuation pour une explication de la syntaxe bizarre avec le \ au début des lignes.

+0

C'était la pièce manquante, merci! –

20

ftplugins sont la bonne réponse à votre question.

  1. Assurez-vous que .vimrc a une ligne telle que :filetype plugin on
  2. Définir un fichier nommé {rtp}/ftplugin/{thefiletype}.vim ou {rtp}/ftplugin/{thefiletype}/whatever.vim (voir :h rtp pour plus de détails).
  3. Modifiez ce nouveau fichier et placez-y vos commandes VIM. C'est probablement une bonne idée d'utiliser la commande :setlocal pour vous assurer que les paramètres spécifiques à un type de fichier sont uniquement pour ce fichier (par exemple, ne mettez pas tous les commentaires en violet sur tous les types de fichiers).

Voir les exemples dans la distribution vim si vous prévoyez de remplacer les paramètres par défaut; ou parmi les many ftplugins I wrote sinon), écrivez simplement vos définitions :setlocal, :*map <buffer>, etc.

Il représente un peu plus de ligne à taper, mais au moins, il évolue.

+0

La seule mauvaise chose à propos de ftplugins est que votre vimrc finit par être divisé en dizaines de fichiers, et il est moins pratique de copier entre les ordinateurs. –

+2

Les ftplugins peuvent être distribués et partagés plus facilement qu'un seul .vimrc monolithique. Lorsque la configuration devient riche et complexe, nous ne pouvons pas tout conserver dans un seul fichier (voir ma suite C++ - et j'ai des configurations similaires et pourtant plus simples pour d'autres langages). BTW, je n'ai pas une douzaine de ftplugins (non standard), mais 78. Et il n'y a que 9 d'entre eux que je ne maintiens pas.Je suis heureux de ne pas avoir leur définition dans mon .vimrc. De plus, copier sa configuration entre différents ordinateurs est aussi simple qu'un appel pour trouver + xarg + tar. –

+0

J'ai créé mon propre plugin avec un répertoire ftplugin' contenant un fichier .vim pour chaque configuration de type de fichier que je veux et j'ai ajouté ce plugin en bundle dans ma configuration Vundle. De cette façon, les configurations pour certains types de fichiers sont conservées dans leurs propres fichiers et j'obtiendrai automatiquement ces configurations lors de l'activation de ma configuration Vundle. – joelpet