87 votes

Comment basculer entre plusieurs configurations de vim avec une commande ou des fichiers vimrc locaux ?

Je travaille dans plusieurs groupes, chacun d'entre eux ayant ses propres normes de tabulation/indentation/espacement en C.

Existe-t-il un moyen d'avoir des configurations VIM distinctes sélectionnables pour chacune d'entre elles, de sorte que, lorsque je modifie un fichier, soit.. :

  • Je fais quelque chose comme set group=1 pour sélectionner une configuration
  • un .vimrc local qui se trouve dans le répertoire de travail est utilisé pour définir la configuration automatiquement.

0 votes

0 votes

Voir aussi la question Basculer entre deux configurations différentes de vim sur le super-utilisateur.

66voto

JSBձոգչ Points 25069

Je l'ai dans $HOME/.vimrc :

if filereadable(".vim.custom")
    so .vim.custom
endif

Cela me permet de mettre un .vim.custom dans chaque répertoire pour charger les commandes et options spécifiques à ce répertoire. Si vous travaillez sur plusieurs projets qui ont des structures de répertoires profondes, vous pouvez avoir besoin de quelque chose de plus sophistiqué (par exemple, remonter l'arborescence des répertoires jusqu'à ce qu'un fichier de type .vim.custom est trouvé), mais la même idée de base fonctionnera.

UPDATE :

Je fais maintenant quelque chose comme ceci afin de lire une .vim dans le même répertoire que le fichier que je suis en train d'éditer, quel que soit le répertoire courant.

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

1 votes

C'est génial, je n'ai jamais vu ça !

1 votes

C'est une excellente solution pour les projets qui vivent dans des dépôts !

3 votes

Le site 'exrc' permet déjà de faire quelque chose de très similaire à ceci. Elle chargera un .vimrc / .exrc / .gvimrc dans le répertoire de travail actuel.

40voto

DrAl Points 29528

En résumé

Il y a plusieurs façons de procéder, dont la plupart ont été suggérées, mais j'ai pensé les résumer avec deux supplémentaires :

  • vimrc par répertoire - a l'inconvénient que Vim doit être lancé dans le bon répertoire : si votre projet se trouve dans le répertoire ~/project1 et vous avez ~/project1/.vim.custom et faire cd ~ ; vim project1/file.c les paramètres personnalisés ne seront pas trouvés.
  • Modelines - très efficace, mais présente l'inconvénient de devoir les ajouter à tous les fichiers (et de ne pas oublier de les ajouter aux nouveaux fichiers).
  • Autocommandes spécifiques à un répertoire - très efficace
  • Recherche d'un en-tête spécifique dans le fichier (voir ci-dessous) - c'est celui que j'ai le plus utilisé dans le passé lorsque je travaillais pour différentes sociétés ou sur des projets clairement nommés.
  • Vimrc par répertoire qui est vérifié lorsque le fichier est ouvert (voir ci-dessous). Une autre option assez facile à mettre en œuvre, surtout si le code de votre projet est regroupé en un seul endroit.

Recherche d'un en-tête

Dans de nombreuses organisations, il y a un en-tête standard (avec un avis de copyright et le nom du projet, etc.) en haut de chaque fichier source. Si c'est le cas, vous pouvez faire en sorte que Vim analyse automatiquement les 10 premières lignes (par exemple) du fichier à la recherche d'un mot-clé. S'il le trouve, il peut modifier vos paramètres. J'ai modifié ceci pour le rendre plus simple que le formulaire que j'utilise (qui fait beaucoup d'autres choses), mais créez un fichier ~/.vim/after/filetype.vim (si vous n'en avez pas encore) et ajoutez quelque chose comme ceci :

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

Chaque fois qu'un fichier, quel que soit son type, est ouvert et que le type de fichier est défini (la balise au FileType * ligne), le ConfigureFiletypes est appelée. Elle vérifie si le type de fichier figure dans la liste des types de fichiers associés au groupe actuel (GROUPNAME), dans ce cas 'c', 'cpp', 'vhdl' ou 'c.doxygen'. Si c'est le cas, il appelle CheckForGROUPNAMECode(), qui lit les 10 premières lignes du fichier et si elles contiennent GROUPNAME, il effectue quelques personnalisations. En plus de définir des onglets d'expansion ou autre, cela modifie également la barre d'état pour afficher clairement le nom du groupe afin que vous sachiez d'un coup d'œil que vous avez travaillé.

Vérification de la configuration à l'ouverture

Tout comme la suggestion de JS Bangs, avoir un fichier de configuration personnalisé peut être utile. Cependant, au lieu de le charger dans vimrc, envisagez quelque chose comme ceci, qui vérifiera, lorsqu'un fichier .c est ouvert, la présence d'un .vim.custom dans le même répertoire que le fichier .c.

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction

34voto

jamessan Points 16420

Vous pouvez également mettre autocommandes dans votre .vimrc qui définissent des options spécifiques sur une base par chemin.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

0 votes

C'est très pratique lorsque vous n'avez pas le contrôle du référentiel et que vous ne pouvez pas y mettre des fichiers ".vim.custom". J'aime que le référentiel reste propre. Merci. Avertissement : si le chemin d'accès change constamment d'une manière qui n'est pas respectueuse des motifs, alors la version ".vim.custom" est probablement plus agréable si l'on peut modifier le référentiel.

17voto

sledge Points 113

Le plugin fait ce qu'il faut : http://www.vim.org/scripts/script.php?script_id=441

"Ce plugin recherche les fichiers vimrc locaux dans l'arbre du système de fichiers du fichier actuellement ouvert. Par défaut, il recherche tous les fichiers ".lvimrc" du répertoire du fichier jusqu'au répertoire racine et les charge dans l'ordre inverse. Le nom de fichier et la quantité de fichiers chargés sont personnalisables grâce à des variables globales."

3 votes

Et la version github supporte également le chargement avec pathogen :-)

0 votes

Un autre plugin similaire est localrc.vim ; il permet également des réglages par répertoire spécifiques aux types de fichiers ; je le trouve indispensable. vim.org/scripts/script.php?script_id=3393

12voto

jcm Points 4968

En supposant que vos collègues développeurs ne s'en plaignent pas, vous pouvez toujours ajouter les paramètres vim à chaque fichier dans les commentaires.

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

2 votes

Je suis le seul ahem le dev éclairé sur la plupart de mes équipes, donc ça ne devrait déranger personne. C'est une solution très soignée pour chaque fichier.

1 votes

Je préfère les ajouter en bas de page pour qu'ils soient discrets, mais je suppose que c'est une question de style.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X