Comment faire en sorte que Vim charge automatiquement .vimrc config à partir du répertoire actuel?

3

Quelques projets ont besoin de commandes différentes pour l'exécution, la construction et les tests. J'ai donc placé un fichier .vimrc dans chacun des répertoires de projet qui définissent les correspondances avec certains boutons F. Dans les fichiers d'aide de vim, il est écrit:

'exrc' 'ex' booléen (défaut désactivé)
                        global
                        {pas dans Vi}
        Active la lecture de .vimrc, .exrc et .gvimrc dans le courant
        annuaire.

J'ai donc cette option activée, mais quand je suis :cddans un répertoire, le fichier .vimrc n'est pas chargé. Si j'écris, :so .\.vimrcalors ça charge bien. Pourquoi n'est-il pas chargé automatiquement?


J'utilise gVim 7.3 x64 pour Windows.

Hubro
la source
Utiliser automatiquement un .vimrcfichier du répertoire en cours est une très mauvaise idée. Ce fichier pourrait facilement provenir d'une archive que vous avez téléchargée, et son extraction automatique permettrait à son créateur, quelle que soit sa création, d'exécuter du code arbitraire sur votre ordinateur.
QQX
@qqx: Je pense pouvoir garder cela à l'esprit, de la même manière que pour ne pas exécuter de binaires en qui je ne me fie pas: P
Hubro
set exrcjamais travaillé pour moi. Vous pouvez essayer ce plugin . Il y en a probablement d'autres sur vim.org.
Romainl

Réponses:

5

Si « exrc » est défini, le répertoire en cours est recherché un fichier nommé _vimrc, .vimrcou _exrc au démarrage . Cela ne se fait pas à chaque fois que vous vous dirigez :cdvers un nouveau répertoire. Voir

:help .vimrc
Garyjohn
la source
Est-ce que cela ne le rend pas inutile? : S au moins pour gVim. Existe-t-il un paramètre de démarrage gVim.exe que je peux utiliser pour choisir le répertoire de démarrage? De cette façon, je pourrais créer un raccourci pour chaque projet. Ou mieux encore, je pourrais peut-être spécifier un fichier de configuration vim dans le raccourci d'application afin d'éviter exrctout problème. J'arrive sur Google
Hubro
Cela n'aide pas avec gvim lancé à partir de votre bureau ou de votre gestionnaire de fichiers, mais il n'a pas été conçu pour vous aider. Ce dont vous avez besoin est quelque chose qui charge un vimrc à partir du répertoire parent du premier fichier que vous ouvrez au démarrage de gvim. Dans ce cas, vous savez que le nom du fichier sera transmis en tant qu'argument. Vous pouvez donc tester cela et la source%: h / .vimrc. Voir les :helpentrées pour argv()et fnamemodify(). J'ai écrit un plugin pour cela qui regarde le chemin de chaque fichier quand il est ouvert et crée un fichier de paramètres de tampon local dépendant du projet.
garyjohn
2

Voici quelque chose que vous pourriez essayer:

autocmd BufEnter{,other event} {full path to file} {do blah}

Et vous mettriez cela dans un groupe de commandes automatiques:

augroup {name you want here}
    autocmd!
    autocmd BufEnter{,other event} {full path to file} source {full path to vimrc file}
    autocmd BufEnter{,other event} {full path to file} {define mapping here}
    autocmd BufEnter{,other event} {full path to file} {do blah}
    autocmd BufEnter{,other event} {full path to file} {do blah}
augroup END

Ainsi, vous mettriez vos paramètres ici, de cette façon si vous êtes dans un tampon spécifique, ces mappages seront chargés.

Je recommande également de faire certains événements BufLeave afin de désélectionner ces mappages lorsque vous ne vous trouvez pas dans ces mémoires tampons, si vous le souhaitez.

cela fonctionnerait-il pour vos besoins? Je ne sais pas exactement de quoi vous avez besoin, alors j'ai tout simplement créé un modèle pour vous. :)

Comme je l'ai montré, vous pouvez le faire de différentes manières, vous décidez ce qui convient le mieux à vos besoins. Désolé, je ne résous pas le problème sous-jacent de ce paramètre ne fonctionne pas bien. :(

Greduan
la source
Je ne sais pas si vous plaisantez ... Je dis dans ma question que c'est exactement ce que je fais maintenant.
Hubro
@ Codemonkey / Facedesk 5 fois. J'ai raté cette dernière partie. Attendez juste une seconde, je vais modifier ma question pour utiliser des autocommandes (si je trouve un événement pour le faire). :)
Greduan
@ Codemonkey OK, j'ai changé ma réponse. Est-ce que cela fonctionnerait mieux pour vous?
Greduan
J'aimerais vraiment savoir pourquoi cela exrcne fonctionne pas comme annoncé. Ai-je mal compris ce que signifie l'option?
Hubro
OK, certaines choses à vérifier. Avez-vous set exrcdans votre fichier .vimrc actuel? En outre, au lieu d'un fichier .vimrc, saviez-vous que vous pouvez également utiliser un fichier .exrc pour ces personnalisations?
Greduan
2

Dans vim version 8.1 ^, il existe un événement autocmd nommé DirChanged que vous pouvez utiliser pour évaluer votre projet en particulier .vimrc. Voici plus de détails sur le moment où cet événement est déclenché:

DirChanged = Working directory has changed in response to the |:cd| or |:lcd| commands.

Exemple de travail

Je ne suis pas un expert en vim-script, mais j'ai créé la fonction suivante qui charge le .vimrcfichier spécifique à mon projet , une fois que je suis cddans le dossier du projet. Passé cette fonction dans votre ~/.vimrcfichier principal .

if !exists("*LoadProjectVimrc")
  function! LoadProjectVimrc()
    let vimrcFile = findfile(".vimrc", ".;")

    if !empty(vimrcFile)
      execute ":so" l:vimrcFile
      echom l:vimrcFile
    endif

  endfunction
endif
autocmd DirChanged * :call LoadProjectVimrc()
Vernon Grant
la source
1

À titre d'information, j'ai fini par créer un raccourci pour chacun de mes projets et à charger un fichier de configuration spécifique à un projet en tant que fichier de session à l'aide de -S session.vim.

Hubro
la source