L' 'path'opzione di Vim ti consente di specificare le directory che comandano gfe :findcercheranno un file.
Se si desidera che questa funzionalità si attivi solo per un set specifico di file, è possibile utilizzare un autocmd per "reindirizzare" automaticamente il :editcomando sul file in una delle 'path'directory.
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>'))
Questo utilizza BufNewFileautocmd come trigger per file not found, so try to find it somewhere else. Quando viene rilevata tale situazione, utilizzare findfile()per provare a trovare il file nelle 'path'directory. Se viene trovato, modifica il nome del buffer corrente in quel file e modifica nuovamente il buffer, altrimenti continua a utilizzare il nuovo buffer.
Il nestedqualificatore è richiesto qui poiché gli autocmds normalmente non si annidano. In questo caso, si desidera che i tipici autocmds si attivino quando il :editcomando apre il file.
Si noti che ciò creerà comunque un buffer aggiuntivo rispetto alla semplice modifica manuale del file. Quando BufNewFileviene eseguito, il buffer per il nome file specificato in origine è già stato creato. L'uso :fileper modificare il nome di un buffer crea un nuovo buffer non caricato con il nome originale.
Se vuoi sempre cercare 'path', allora autocmd può essere semplicemente modificato per utilizzare il *modello di file piuttosto che specificare determinati file.
Ecco una versione aggiornata che dovrebbe soddisfare meglio le tue esigenze. Usa :findper aprire direttamente il file invece di impostare il nome del buffer in base al risultato di 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>'))
Questo risolve il problema nella funzione precedente in cui Vim si lamentava quando tentava di salvare il :filebuffer con nome.
keepalt fileha lo stesso inconveniente dell'assegnazione avim.current.buffer.name- vim ti avverte che il file esiste già quando provi a salvare le tue modifiche.