L' 'path'
option de Vim vous permet de spécifier les répertoires que les commandes aiment gf
et :find
rechercheront un fichier.
Si vous souhaitez uniquement que cette fonctionnalité se déclenche pour un ensemble spécifique de fichiers, vous pouvez utiliser un autocmd pour "rediriger" automatiquement votre :edit
commande vers le fichier dans l'un des 'path'
répertoires.
set path+=~/
function! FindInPath(name)
let found = findfile(a:name)
if !empty(found)
exe 'silent keepalt file '. fnameescape(found)
edit
endif
endfunction
autocmd BufNewFile .vimrc,.zshrc nested call FindInPath(expand('<afile>'))
Cela utilise l' BufNewFile
autocmd comme déclencheur pour file not found, so try to find it somewhere else
. Lorsque cette situation est détectée, utilisez findfile()
pour essayer de trouver le fichier dans les 'path'
répertoires. S'il est trouvé, changez le nom du tampon actuel en ce fichier et rééditez le tampon, sinon continuez simplement à utiliser le nouveau tampon.
Le nested
qualificatif est requis ici car les autocmds ne s'emboîtent pas normalement. Dans ce cas, vous souhaitez que les autocmds typiques se déclenchent lorsque la :edit
commande ouvre votre fichier.
Notez que cela créera toujours un tampon supplémentaire par rapport à la simple modification manuelle du fichier. Au moment de l' BufNewFile
exécution, le tampon du nom de fichier spécifié à l'origine est déjà créé. L'utilisation de :file
pour modifier le nom d'un tampon crée un nouveau tampon non chargé avec le nom d'origine.
Si vous souhaitez toujours rechercher 'path'
, alors l'autocmd peut simplement être modifié pour utiliser le *
modèle de fichier plutôt que de spécifier certains fichiers.
Voici une version mise à jour qui devrait mieux correspondre à vos besoins. Il utilise :find
pour ouvrir directement le fichier au lieu de définir le nom du tampon en fonction du résultat de findfile()
.
function! FindInPath(name)
let path=&path
" Add any extra directories to the normal search path
set path+=~,~/.vim,/etc
" If :find finds a file, then wipeout the buffer that was created for the "new" file
setlocal bufhidden=wipe
exe 'silent! keepalt find '. fnameescape(a:name)
" Restore 'path' and 'bufhidden' to their normal values
let &path=path
set bufhidden<
endfunction
autocmd BufNewFile * nested call FindInPath(expand('<afile>'))
Cela résout le problème dans la fonction précédente où Vim se plaindrait en essayant de sauvegarder le :file
tampon nommé.
keepalt file
a le même inconvénient que l'attribution àvim.current.buffer.name
- vim vous avertit que le fichier existe déjà lorsque vous essayez d'enregistrer vos modifications.if expand('%') !~ '^[.~]\?/'
...endif
pour que les chemins relatifs ou absolus spécifiés soient ignorés; et utilisez à lasilent
place desilent!
, car si vous ouvrezvim vimrc
dans deux terminaux, le second attendra l'entrée dans l'avertissement habituel "le fichier est ouvert ailleurs", mais l'utilisateur n'a aucune idée de ce qu'il attend. Je ne le modifie pas encore, pour voir si vous avez de meilleures façons de vous attaquer non plus.L'alternative est de rendre certaines commandes qui faciliteront cela:
J'utilise le modèle
E
/S
que rails.vim / projectionist.vim utilise.Pour plus d'aide, voir:
la source
Ce n'est pas une solution, mais c'est ce que je fais pour avoir un accès facile à
.vimrc
et.zshrc
. Personnellement, je pense que c'est plutôt bien:la source
Dans l'esprit de
CDPATH
, j'ai écrit une fonction basée sur Python pour ce faire (avec l' aide de Matt Boehm ):BufWinEnter
place deBufNewFile
parce que ce dernier ne semblait pas se comporter de manière fiable lorsque plusieurs noms de fichiers étaient fournis.bad
puisbd
comme un moyen fiable de fermer le tampon ouvert pour le fichier inutilisé. Cela ne fonctionne toujours pas quand je le fais:tabe some-file
(aucun nouvel onglet n'est ouvert). Cependant, c'est une question pour un autre jour.CDPATH
, je peux facilement ajouter plus de répertoires en éditantPATHS
, ou en faisant une variable de niveau Vim et en la modifiant.Ce que les autres réponses manquent, IMO, c'est que je ne veux pas créer de configuration pour chaque fichier , mais pour chaque répertoire . Peu m'importe si j'ouvre
fstab
ouvimrc
, je voulais juste que Vim recherche des fichiers dans un ensemble de répertoires s'il n'existait pas dans le répertoire courant. +1 à tous pour les efforts spécifiques au fichier, cependant.la source
*
pour le modèle de fichier, plutôt que des fichiers spécifiques, devrait réaliser la même chose et éviter votre problème:tabe
.Avec
'user-commands'
et'Dictionary'
, nous pouvons éditer les fichiers sans créer de tampon pour remplacer le fichier que nous voulons éditer sur le tampon.Notez que la fonction
Editfile
n'essaie pas de vérifier son argument. Faisons en sorte que vim gère toutes les erreurs comme les autres commandes Ex normales. Si l'argument est correct, vim commence à éditer le fichier et s'il n'est pas correct, vim signalera des erreurs.À mon avis, nous n'avons pas besoin de créer un tampon. Il présente deux inconvénients principaux.
'not-edited'
drapeau serait mis. Comme le souligne jamessan dans sa réponse , si nous définissons le nom du fichier actuel avec la:file
commande et essayons d'écrire le fichier, nous rencontrerons le message d'erreur.E13: File exists (use ! to override)
C'est parce que vim marque le fichier comme "non modifié" lorsque nous changeons le nom du fichier avec:file
commande.:keepalt
commande. Lorsque nous essayons de modifier vimrc lors de l'édition de 'foo.bar', nous nous attendons à ce que le nom de fichier alternatif soit 'foo.bar'. Mais si nous créons un tampon et changeons le nom, le nom de fichier alternatif ne devient pas le "foo.bar" mais l'ancien nom du tampon 'vimrc'. Pire encore, l'ancien tampon restera commeunlisted-buffer
ouinactive-buffer
. C'est pourquoi nous devrions utiliser la:keepalt
commande afin de conserver le nom de fichier alternatif comme nous l'attendons et définir l'bufhidden
optionwipe
pour effacer l'ancien tampon.Si la majuscule du nom de la commande (toutes les commandes définies par l'utilisateur doivent commencer par une majuscule) ne nous concerne pas, il serait préférable de l'utiliser. Parce qu'il ne crée pas de tampon, nous sommes libres de gérer le tampon. Passez simplement le nom du fichier à vim et voyez comment vim le gère.
la source