web-dev-qa-db-fra.com

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

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

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

  • 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
78
bradreaves

En résumé

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

  • Vimrc par répertoire a pour 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 que vous faites 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 n'oubliez pas de les ajouter aux nouveaux fichiers)
  • Commandes automatiques spécifiques à un répertoire - 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 entreprises ou pour des projets clairement nommés.
  • Vimrc par répertoire à vérifier à l'ouverture du fichier (voir ci-dessous). Un autre assez facile à implémenter, surtout si votre code de projet est au même endroit.

Rechercher un en-tête

Dans de nombreuses organisations, un en-tête standard (avec une mention de copyright, un nom de projet, etc.) figure en haut de chaque fichier source. Si tel est le cas, vous pouvez faire en sorte que Vim analyse automatiquement les 10 premières lignes du fichier (par exemple) à 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 (ce 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 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 ligne au FileType *), la fonction ConfigureFiletypes est appelée. Ceci vérifie si le type de fichier est 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 certaines personnalisations. En plus de paramétrer expandtabs ou autre, cela change également la barre d'état pour afficher clairement le nom du groupe afin que vous sachiez que cela fonctionne 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, envisagez 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
39
DrAl

J'ai ceci dans $HOME/.vimrc:

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

Cela me permet de mettre un fichier .vim.custom dans chaque répertoire pour charger des commandes et des options spécifiques à ce répertoire. Si vous travaillez sur plusieurs projets ayant des structures de répertoires profondes, vous aurez peut-être besoin de quelque chose de plus sophistiqué (par exemple, parcourez l'arborescence de répertoires jusqu'à trouver un .vim.custom), mais la même idée de base fonctionnera.

METTRE À JOUR:

Je fais maintenant quelque chose comme ceci pour lire un fichier .vim à partir du même répertoire que le fichier que je suis en train de modifier, 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
61
JSBձոգչ

Vous pouvez également mettre autocommands dans votre .vimrc qui définit des options spécifiques chemin par chemin.

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

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’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 en ordre inverse. Le nom de fichier et la quantité de fichiers chargés sont personnalisables via des variables globales. ”

17
sledge

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

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

int main(int argc, char **argv)
{
    ...
12
Jim Mitchener

J'ai créé un outil open-source uniquement dans ce but. Oubliez les en-têtes, les analyses, les configurations et les fichiers vimrc locaux.

Essayez de nager.


Nager

swim est un outil rapide permettant de changer de fichier vimrc et de créer des alias pratiques. Voici une courte liste d'utilisation. Voir le Github repo pour un guide pas à pas gif 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

5
Dawson Botsford

Après avoir essayé le plugin localvimrc suggéré par l’affiche précédente, j’aime beaucoup avoir un contrôle non futzy par projet sur les paramètres vim. 

Il demande une confirmation avant de charger un fichier .lvimrc par défaut, mais il existe un paramètre permettant de 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 archiver sous la forme de paramètres partagés (développement des tabulations/espaces, tabulations, autres paramètres spécifiques au projet).

4
jerseyboy

Voici une variation sur Jamessan

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

Je vais fréquemment lancer vi sans fichier spécifique, ce qui permet de charger la configuration de façon 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 en dehors du répertoire de travail.

1
Michael Wasser

Comme mentionné par sledge , l'utilisation de ce plug-in est la meilleure option que j'ai vue et utilisée. jerseyboy a commenté que l'utilitaire avait recommandé de demander une confirmation avant le chargement (c'est-à-dire après l'ouverture de chaque fichier). Pour éviter cela, il suffit de définir dans votre .vimrc principal la liste des fichiers .lvimrc locaux:

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

1
jekik

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 de plusieurs fichiers vimrc, qui peut être utilisé pour charger différents paramètres pour différents environnements. En bref, vous pouvez gérer un grand nombre de fichiers de paramètres vim différents et ne charger que ceux dont vous avez besoin quand vous en avez besoin.

Je trouve particulièrement intéressant de garder la configuration dans son répertoire de données au lieu de s’attendre à ce que l’utilisateur éparpille des fichiers de points sur le système de fichiers. Ceci bien que souvent plutôt un méttre de goût personnel.

Je n'ai pas encore testé.

0
rfindeis