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.