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

103

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

La solution idéale serait si Vim recherchait et lisait un .vimrc dans le répertoire courant avant de rechercher ~ / .vimrc, et y appliquait 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 quel que soit le vimrc d'un utilisateur ou 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 modeline suffirait. Mon objectif est de permettre aux vimmers d'adopter plus facilement des normes de codage dans un projet.

Wilhelmtell
la source

Réponses:

42

Je suis un partisan du plugin . Pour plusieurs raisons:

  • Les modelines sont particulièrement limitées: nous ne pouvons pas définir de variables (qui règlent d'autres plugins (ft), comme "les accolades du for-snippet doivent-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 actuel)
  • DRY : avec les modelines, un réglage doit être répété dans chaque fichier, s'il y a trop de choses à régler ou de réglages à changer, cela deviendra rapidement difficile à maintenir, de plus, cela nécessitera l'utilisation d'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 / peu importe)
  • Il est vraiment facile d'avoir un fichier de configuration par projet - avec le plugin, j'ai un fichier de configuration global 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, la solution de sth peut être utilisée pour générer un seul fichier de configuration. Ceci est très similaire à l'approche du plugin sauf que le .vimrc doit être parasité avec des options non globales, et il ne supporte pas facilement les fichiers de configuration multiples / partagés.

Luc Hermitte
la source
J'ai remarqué que vous devez enregistrer un nouveau fichier dans le chemin avant qu'il n'exécute correctement le plugin
cmcginty
En effet. Cette famille de plugins définit simplement un framework. Vous devez toujours écrire les définitions spécifiques au projet dans un fichier - que le framework va automatiquement générer.
Luc Hermitte
1
Veuillez noter que Luc associe son propre plugin. Cela semble bien mieux fonctionner que celui lié à la question. Merci.
données du
Bien. Je ne sais pas. Comme j'utilise le mien depuis des années, je n'ai jamais examiné de près les autres implémentations. De temps en temps, je reçois un rapport de bogue que je prends éventuellement en compte. BTW, ma version est implémentée pour être déclenchée avant mu-template afin de définir des variables spécifiques au projet avant de développer les templates (ce qui est très utile pour récupérer le répertoire racine du projet actuel et le découper à partir des chemins d'accès développés)
Luc Hermitte
1
@JasonMcCarrell Mon implémentation de local_vimrc et Markus "embear" celle de Braun supporte la liste noire, la liste blanche ... Si vous avez juste besoin de spécifier comment l'indentation est effectuée, le plugin EditorConfig-vim serait peut-être un meilleur choix.
Luc Hermitte
91

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

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4
qc
la source
1
C'est récursif, mais uniquement avec le *. Si vous essayez de le réduire à / chemin / vers / fichiers / ou / chemin / vers / fichiers, cela ne fonctionnera pas.
SystemParadox
C'est génial si votre projet a une arborescence de fichiers écrits avec "noexpandtab" et une autre arborescence avec tous les fichiers "expandtab" (par exemple CodeIgniter). Vous pouvez définir l'action appropriée pour les fichiers de chaque arborescence individuellement avec un fichier de configuration.
user9645
2
Curieusement, cela ne fonctionnait pas lorsque mon chemin incluait un lien symbolique; J'ai dû mettre le chemin complet sans lien symbolique avant que cela fonctionne.
Dolan Antenucci
Voir la réponse de joseph07 sur l'utilisation d'un "vim de confiance" comme alternative, inversion de cette approche (.vimrc distribué vs centralisé).
Nathan Schulte
50

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 autres, si vous possédez le fichier. Donc, si vous parvenez à éditer un fichier dans cette archive tar, je vous ai envoyé avec un .vimrccontenant:

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

vous serez probablement moins amusé que moi.

phén
la source
6
Cela est également vrai avec les plugins qui sont automatiquement exécutés lorsque vim est chargé.
Luc Hermitte
31

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

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

joseph07
la source
1
Cette approche est simple et correspond parfaitement à mes besoins.
Jinxed le
Quand j'essaye ceci et source $HOME/.vimrcde mon local .vimrc, Vim se plaint qu'il ne peut pas trouver mes plugins installés à l'échelle du système (pathogène dans ce cas; la execute pathogen#infect()commande au-dessus de my $HOME/.vimrcéchoue avec Unknown function ...). Comment puis-je réparer cela?
Nathan Schulte
20

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 startuppour plus de détails, le réglage 'exrc'permettra la lecture à .vimrcpartir du répertoire actuel.

Il est également recommandé de l' :set secureutiliser lors de son utilisation. Cela verrouille :autocmd, shell et écrit les commandes pour.vimrc dans le répertoire courant.

Une autre chose qui pourrait valoir la peine d'être examiné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.

grave
la source
6
S'il vous plaît voir le commentaire de phen. Cela peut entraîner de graves implications pour la sécurité.
données du
11

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

Par exemple.

Le fichier vimrc de mon dossier local est nommé "_gvimrc" (volontairement). 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 ce dernier a une certaine bizarrerie lorsqu'il est torturé en ouvrant plusieurs fichiers (10+) simultanément, (je ne sais pas pourquoi).

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

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

XEQtor
la source
Ici, la méfiance à l'égard de la portabilité des plugins n'a pas de fondement car ces plugins local_vimrc (du moins le mien) sont portables (ils étaient maintenus sur différents OS différents, et même Windows 95). Le problème du risque de sécurité est également exagéré: si nous suivons cette voie, nous n'installerons jamais rien pour faciliter notre travail.
Luc Hermitte
Mais, en ce qui me concerne, le premier vrai problème est que, avec votre approche, vous devez travailler à partir du répertoire exact qui contient le fichier _gvimrc (qui est un mauvais nom car il est censé contenir des éléments spécifiques à gvim). Si votre projet est composé de plusieurs répertoires, ce qui peut nécessiter une configuration commune, et des répertoires spécifiques (dans le cas de plusieurs modules), cela montrera rapidement ses limites.
Luc Hermitte
Le deuxième problème est que vous ne pouvez travailler que sur un projet à la fois - si je veux travailler sur OTB, openjpeg et un projet qui intègre les deux bibliothèques, cette solution ne me permettra pas d'avoir un paramètre spécifique pour chacun des trois projets.
Luc Hermitte
Cela fonctionne également pour charger en guirlande un fichier de syntaxe à partir d'un répertoire local.
maharvey67
2

En supposant que les gens n'ajoutent pas de fichiers tous les quelques jours, vous pouvez probablement ajouter une modeline 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 stipule que chaque fichier doit avoir une modélisation lors de son archivage.

Nathan Fellman
la source
2

Utilisez "editorconfig"

Si les types de normes de codage que vous souhaitez appliquer sont liés au style d'indentation, à la taille de l'onglet, au format de fichier et au jeu de caractères, alors vous pouvez consulter "editorconfig" , qui est une norme multi-éditeurs 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 des paramètres différents en fonction des extensions de fichier ou des noms dans le projet. (Vous pouvez donc avoir des Makefiles utilisant des TAB, vos scripts Python en utilisant 4 espaces et vos scripts shell en 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, vous n'avez donc pas à vous soucier trop des dépendances externes.

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

filbranden
la source
0

J'ai regardé les plugins qui existaient et je n'en avais pas vraiment envie, 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 conserver une table de confiance. Mettez simplement ce qui suit dans votre .vimrcfichier.

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 l' !option est définie sur le viminfoparamètre, alors le SAFE_VIMRCdictionnaire sera conservé entre les exécutions (notez le ^pour ajouter l'option au début afin qu'elle ne gâche pas l' noption).

Parakleta
la source