web-dev-qa-db-fra.com

Vim: appliquer les paramètres sur les fichiers du répertoire

Comment spécifier les paramètres Vim pour tous les fichiers du répertoire actuel?

La solution idéale serait que Vim recherche et lise un .vimrc dans le répertoire courant avant de rechercher ~/.vimrc, et y applique les paramètres pour l'arborescence entière.

J'ai vu un plugin , mais cela signifie que les paramètres appliqués ne sont pas transparents car ils nécessitent l'installation du plugin. En revanche, une modeline est transparente car indépendamment du vimrc d'un utilisateur ou de l'invocation de vim spécifique, les paramètres de modeline seront appliqués pour ce fichier.

Les choses que j'ai essayées sont

  • placer un .vimrc dans le répertoire de travail
  • :so vimrc dans la modeline.

Je suppose que les deux ne fonctionnent pas pour des raisons de sécurité. Je n'ai pas besoin de la pleine puissance d'un vimrc; être lié à des paramètres acceptables par une modélisation suffirait. Mon objectif est de permettre aux vimmers d'adopter plus facilement des normes de codage dans un projet.

98
wilhelmtell

Je suis un partisan de la façon plugin . Pour plusieurs raisons:

  • Les modèles sont particulièrement limités: nous ne pouvons pas définir de variables (qui accordent d'autres plugins (ft), comme "les accolades du for-snippet devraient-elles être sur une nouvelle ligne?"), Ou appeler une fonction à partir d'elles (je ne me limite pas aux normes de codage, j'ai également défini le makefile à utiliser en fonction du répertoire courant)
  • SEC : avec les modelines, un réglage doit être répété dans chaque fichier, s'il y a trop de choses à régler ou des réglages à changer, cela deviendra rapidement difficile pour le maintenir, en outre, il faudra utiliser un plugin template-expander (que vous devriez considérer si vous avez plusieurs vimmers dans votre projet).
  • Tout le monde n'utilise pas vim pour se développer. Je ne veux pas être dérangé par les paramètres de l'éditeur d'autres personnes, pourquoi devrais-je parasiter les leurs?
  • Il est plus facile de demander aux vimmers d'installer un même plugin, au lieu de leur demander de copier-coller et de maintenir les mêmes lignes dans leur .vimrc
  • Les paramètres peuvent être enregistrés avec les autres fichiers du projet (cvs/svn/git/autre)
  • Il est vraiment facile d'avoir un fichier de configuration par projet - avec le plugin, j'ai un fichier de configuration globale pour les normes de codage du projet global, et des fichiers de configuration spécifiques pour chaque sous-projet (quel makefile utiliser, quel exécutable appeler , ...)

BTW, solution de sth peut être utilisé pour source un seul fichier de configuration. C'est très similaire à l'approche du plugin, sauf que le .vimrc doit être parasité avec des options non globales, et il ne prend pas facilement en charge les fichiers de configuration multiples/partagés.

42
Luc Hermitte

Vous pouvez mettre quelque chose comme ça dans $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4
86
sth

Je suggère fortement de ne pas utiliser set exrc

Même avec set secure, sous * nix, vim exécutera toujours les autocommandes, Shell, et al, si vous possédez le fichier. Donc, si vous êtes prêt à éditer un fichier dans cette archive, je vous ai envoyé un .vimrc contenant:

autocmd BufEnter * :silent! !echo rm -rf ~/

vous serez probablement moins amusé que moi.

49
phen

Cette question est ancienne, mais elle semble être une préoccupation assez naturelle et persistante.

Ma solution est assez simple. Je place un .vimrc fichier dans le répertoire racine de mes projets. La première ligne du .vimrc le fichier source généralement ~/.vimrc, puis ajoute la configuration particulière que je souhaite. Je alias tvim='vim -u .vimrc', et utilisez tvim dans mes répertoires de projets personnels. "tvim" pour "trust vim", ce qui signifie que si je l'exécute dans un répertoire avec un .vimrc fichier et quelque chose ne va pas, je n'ai personne à blâmer que moi-même, puisque j'ai dit explicitement que je lui faisais confiance. De plus, je garde un groupe de ceux-ci en mémoire afin que je puisse parfois simplement créer un lien logiciel vers celui que je veux pour un type de projet particulier.

28
joseph07

Placer un .vimrc dans le répertoire de travail est en fait pris en charge, uniquement désactivé par défaut. Voir :h 'exrc' Et :h startup Pour plus de détails, le réglage de 'exrc' Permettra la lecture de .vimrc Dans le répertoire courant.

Il est également recommandé de :set secure Lorsque vous l'utilisez. Cela verrouille :autocmd, Shell et écrit des commandes pour .vimrc Dans le répertoire courant.

Une autre chose qui mérite d'être étudiée est la configuration d'une session (:h session) Avec une vue et des paramètres standard pour le projet.

Cela dit, j'irais probablement avec l'option plugin détaillée par Luc Hermitte moi-même.

20
gravious

Pour minimiser les risques de sécurité avec TOUTES les fonctionnalités "autorun" pour TOUT de nos jours, puis-je vous conseiller d'utiliser les fonctionnalités existantes de vim au lieu des plugins (bagages de portabilité)?

Par exemple.

Le fichier vimrc de mon dossier local est nommé "_gvimrc" (exprès). Cela réduit l'espoir pour des gens comme phen de s'amuser à nos dépens. :-)

Dans mon fichier $ VIM/.vimrc, j'ai inséré:

if filereadable("_gvimrc")
    source _gvimrc
endif

à la fin.

J'utilise "filereadable ()" sur "fileexists ()" car le dernier a une certaine bizarrerie lorsqu'il est torturé en ouvrant plusieurs (10+) fichiers simultanément, (je ne sais pas pourquoi).

Bien sûr, vous pouvez donner votre propre nom de fichier unique pour obscurcir davantage les fauteurs de troubles potentiels. Tels que "_mygvimrc", "_gobbledygook", etc. Il vous suffit de choisir un nom standardisé et de le trouver en conséquence dans votre $ VIM/.vimrc. S'appuyer sur les internes vi/vim pour cela exclut les problèmes de portabilité. MAIS, NE le nommez pas .vimrc (ou _vimrc) pour empêcher le sourcing récursif au cas où vous éditez le fichier $ VIM/.vimrc avec vim plus tard.

Je l'utilise depuis Windoze 98SE, via Windork XP Pro, et maintenant Windorkier 7 (5+ années déjà). Je marquerai une liste de fichiers .txt dans l'Explorateur, puis j'utiliserai "Modifier avec multiple Vim ", ce qui entraîne l'ouverture simultanée de plusieurs fenêtres vim. Pour mon travail, je le fais plusieurs fois par jour, tous les jours. Tous les fichiers ont été traités avec ce que j'ai défini dans mon _gvimrc local.

10
XEQtor

En supposant que les gens n'ajoutent pas de fichiers tous les quelques jours, vous pouvez probablement ajouter une modélisation en haut de chaque fichier. En fait, si votre système de contrôle de version le permet, vous pourriez probablement appliquer une règle qui dit que chaque fichier doit avoir une modélisation lors de son archivage.

2
Nathan Fellman

Je suis d'accord avec l'approche plugin pour des raisons de sécurité.

Il existe un très bon plugin qui n'a pas encore été mentionné. Il vous permet d'utiliser un .lvimrc dans les répertoires de votre projet.

Essayez "localvimrc":

http://www.vim.org/scripts/script.php?script_id=441

https://github.com/embear/vim-localvimrc

2
asgeo1

Essayez vim-localrc

~/
|- .local.vimrc     (1)
`- project/
   |- .local.vimrc  (2)
   `- src/
      |- .local.vimrc   (3)
      `- main.c

https://github.com/thinca/vim-localrc/blob/master/doc/localrc.txt

1
Touv

Utilisez "editorconfig"

Si les types de normes de codage que vous souhaitez appliquer sont liés au style d'indentation, à la taille des onglets, au format de fichier et au jeu de caractères, alors vous voudrez peut-être examiner "editorconfig" , qui est une norme multi-éditeur pour spécifier ce type de paramètres dans un projet spécifique et que tous les éditeurs suivent cette configuration.

La spécification "editorconfig" permet aux projets de demander différents paramètres en fonction des extensions de fichier ou des noms dans le projet. (Vous pouvez donc avoir des Makefiles en utilisant des TABs, vos Python utilisant 4 espaces et vos scripts Shell utilisant 2 espaces pour l'indentation.)

Vous avez besoin d'un plug-in pour utiliser "editorconfig" dans Vim. Le site officiel en fournit un, mais personnellement, je recommanderais sgur/vim-editorconfig , qui est écrit en pur Vimscript, donc vous n'avez pas trop à vous soucier des dépendances externes.

Étant donné que "editorconfig" vise la compatibilité entre les éditeurs, il est assez limité dans ce qu'il fait, donc si vous voulez un espace blanc cohérent, un format de fichier (DOS vs Unix) et un encodage (Unicode utf-8, etc.), alors "editorconfig " est pour toi.

1
filbranden

J'ai regardé les plugins qui existaient et je n'ai pas vraiment aimé l'un d'eux, j'ai donc écrit une fonction simple qui s'appuie sur vim-fugitive . L'avantage de ceci est qu'il sait que la racine du projet est toujours la racine du référentiel, et en plus je peux hacher le fichier pour garder une table de confiance. Mettez simplement ce qui suit dans votre .vimrc fichier.

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

Si la ! est définie sur le paramètre viminfo, puis sur SAFE_VIMRC le dictionnaire sera conservé entre les exécutions (notez le ^ pour ajouter l'option afin qu'elle ne gâche pas l'option n).

0
Parakleta