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:
set group=1
pour sélectionner une configurationIl y a plusieurs façons de le faire, la plupart ont été suggérées, mais je pensais les résumer avec deux autres:
~/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.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.
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
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
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
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. ”
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)
{
...
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.
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:
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
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).
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.
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'
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é.