L' 'path'
opzione di Vim ti consente di specificare le directory che comandano gf
e :find
cercheranno 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 :edit
comando 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 BufNewFile
autocmd 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 nested
qualificatore è richiesto qui poiché gli autocmds normalmente non si annidano. In questo caso, si desidera che i tipici autocmds si attivino quando il :edit
comando apre il file.
Si noti che ciò creerà comunque un buffer aggiuntivo rispetto alla semplice modifica manuale del file. Quando BufNewFile
viene eseguito, il buffer per il nome file specificato in origine è già stato creato. L'uso :file
per 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 :find
per 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 :file
buffer con nome.
keepalt file
ha lo stesso inconveniente dell'assegnazione avim.current.buffer.name
- vim ti avverte che il file esiste già quando provi a salvare le tue modifiche.