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

Je travaille en plusieurs groupes, chacun ayant ses propres normes de tabulation / indentation / espacement en C.

Existe-t-il un moyen d’avoir des configurations VIM sélectionnables distinctes pour chacun, lorsque je modifie un fichier, soit:

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

En résumé

Il y a plusieurs façons de faire, dont la plupart ont été suggérées, mais je pensais les résumer avec deux autres:

  • Vimrc par répertoire – a l’inconvénient que Vim doit être démarré dans le bon répertoire: si votre projet est dans ~/project1 et que vous avez ~/project1/.vim.custom et do cd ~ ; vim project1/file.c cd ~ ; vim project1/file.c , les parameters personnalisés ne seront pas trouvés.
  • Modelines – très efficace, mais présente l’inconvénient de devoir les append à tous les fichiers (et n’oubliez pas de les append aux nouveaux fichiers)
  • Autocommandes spécifiques à l’annuaire – c’est très efficace
  • Rechercher un en-tête spécifique dans le fichier (voir ci-dessous) – c’est celui que j’ai le plus utilisé par le passé lorsque je travaillais pour différentes entresockets ou pour des projets clairement nommés.
  • Vimrc par répertoire qui est vérifié à l’ouverture du fichier (voir ci-dessous). Un autre assez facile à mettre en œuvre, surtout si votre code de projet est tout au même endroit.

Recherche d’un en-tête

Dans de nombreuses organisations, il existe un en-tête standard (avec un avis de copyright et un nom de projet, etc.) en haut de chaque fichier source. Si tel est le cas, vous pouvez faire en sorte que Vim parsing automatiquement les premières (par exemple) les 10 lignes du fichier à la recherche d’un mot-clé. S’il le trouve, il peut changer vos parameters. 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 ~/.vim/after/filetype.vim (si vous n’en avez pas encore) et ajoutez quelque chose comme ce:

 au FileType * call ConfigureFiletypes(expand("")) " List of file types to customise let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen'] func! 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 =~ '\' " 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! ConfigureFiletypes(filetype) if index(s:GROUPNAMETypes, a:filetype) != -1 call CheckForGROUPNAMECode() endif endfunc 

Chaque fois qu’un fichier de n’importe quel type est ouvert et que le type de fichier est défini (la ligne au FileType * ), la fonction ConfigureFiletypes est appelée. Cela vérifie si le type de fichier se trouve 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 que celles-ci contiennent GROUPNAME. En plus de définir expandtabs ou autre, cela change également la barre d’état pour afficher clairement le nom du groupe afin que vous sachiez qu’il a fonctionné d’un coup d’œil.

Vérification de la configuration lors de 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, pensez à quelque chose comme ceci, qui vérifiera quand un fichier .c est ouvert pour un fichier .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 

J’ai ceci dans $HOME/.vimrc :

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

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

METTRE À JOUR:

Je fais maintenant quelque chose comme ça pour lire un fichier .vim du même répertoire que le fichier que je modifie, quel que soit le répertoire actuel.

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

Vous pouvez également placer des autocommandes dans votre .vimrc qui définit des options spécifiques pour chaque chemin.

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

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

«Ce plug-in recherche les fichiers vimrc locaux dans l’arborescence 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 via des variables globales.

En supposant que vos collègues développeurs ne s’en plaindront pas, vous pouvez toujours append les parameters vim à chaque fichier dans les commentaires.

 /* * vim:ts=4:sw=4:expandtab:... */ int main(int argc, char **argv) { ... 

J’ai créé un outil open-source pour cela. Oubliez les en-têtes, l’parsing, les configurations et les fichiers vimrc locaux.

Essayez de nager.

Nager

swim est un outil rapide pour changer de fichier vimrc et créer des alias pratiques. Voici une courte liste d’utilisation. Voir le repo Github pour un gif de procédure pas à pas et les instructions de téléchargement:

Usage

 swim add ~/dotfiles/myVimrc favorite #Add new swim alias swim ls #Show available swim aliases swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example swim with favorite #Set alias favorite as primary .vimrc swim with main #Set alias main as primary .vimrc 

Lire la suite

https://github.com/dawsonbotsford/swim

Après avoir essayé le plugin localvimrc proposé par le poster précédent, j’aime bien avoir un contrôle par projet non-futzy sur les parameters de vim.

Il demande une confirmation avant de charger un fichier .lvimrc par défaut, mais il existe un paramètre pour charger automatiquement les fichiers .lvimrc. Certains pourraient voir cela comme une faille de sécurité, mais cela fonctionne comme annoncé.

J’ai choisi de .gitignore les fichiers .lvimrc. Vous pouvez également les enregistrer sous forme de parameters partagés (extension de tabulation / espace, tabulations, autres parameters spécifiques au projet).

Comme mentionné par sledge, l’utilisation de ce plug-in est la meilleure option que j’ai vue et utilisée. jerseyboy a déclaré que l’utilitaire recommandé demandait une confirmation avant le chargement (c.-à-d. après l’ouverture de chaque fichier). Pour éviter cela, définissez simplement sur votre .vimrc la liste des fichiers .lvimrc locaux:

let g:localvimrc_whitelist='/development/kernel/.lvimrc'

Voici une variation sur les jamessan

 function! ConditionalLoad() let cwd = getcwd() if getcwd() =~ $HOME . "/src/mobile" so $HOME/.vim.mobile endif endfunction autocmd VimEnter * call ConditionalLoad() 

Je lance fréquemment vi sans fichier spécifique sur lequel je saute, ce qui permet de charger la configuration de manière conditionnelle en fonction du répertoire de travail actuel. L’inconvénient est que la configuration n’est pas appliquée en fonction du fichier mais du répertoire de travail.

En cherchant principalement le même problème, j’ai également trouvé le plug-in Sauce: http://www.vim.org/scripts/script.php?script_id=3992

Il réclame:

Sauce est un gestionnaire léger pour plusieurs fichiers vimrc, qui peut être utilisé pour charger différents parameters pour différents environnements. En bref, vous pouvez gérer de nombreux fichiers de parameters vim et ne charger que ceux dont vous avez besoin au moment où vous en avez besoin.

Je trouve particulièrement intéressant qu’il conserve sa configuration dans son répertoire de données au lieu d’attendre de l’utilisateur qu’il sauve des fichiers de points sur le système de fichiers. Ceci bien souvent plutôt un compteur de goût personnel.

Je ne l’ai pas encore testé.