La 'path'opción de Vim le permite especificar directorios a los que les gustan los comandos gfy :findbuscará un archivo.
Si solo desea que esta funcionalidad se active para un conjunto específico de archivos, puede usar un autocmd para "redirigir" automáticamente su :editcomando al archivo en uno de los 'path'directorios.
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>'))
Esto utiliza el BufNewFileautocmd como desencadenante para file not found, so try to find it somewhere else. Cuando se detecta esa situación, utilice findfile()para intentar encontrar el archivo en los 'path'directorios. Si se encuentra, cambie el nombre del búfer actual a ese archivo y vuelva a editar el búfer, de lo contrario, simplemente continúe usando el nuevo búfer.
El nestedse requiere calificador aquí desde autocmds no lo hacen normalmente nido. En este caso, desea que los autocmds típicos se activen cuando el :editcomando abra su archivo.
Tenga en cuenta que esto seguirá creando un búfer adicional en comparación con solo editar el archivo manualmente. Para cuando BufNewFilese ejecuta, el búfer para el nombre de archivo especificado originalmente ya está creado. El uso :filepara cambiar el nombre de un búfer crea un nuevo búfer descargado con el nombre original.
Si siempre desea buscar 'path', entonces el autocmd simplemente se puede cambiar para usar el *patrón de archivo en lugar de especificar ciertos archivos.
Aquí hay una versión actualizada que debe cumplir mejor con sus requisitos. Se utiliza :findpara abrir directamente el archivo en lugar de establecer el nombre del búfer en función del resultado 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>'))
Esto resuelve el problema en la función anterior donde Vim se quejaría al intentar guardar el :filebúfer con nombre.
keepalt filetiene el mismo inconveniente que asignar avim.current.buffer.name- vim le advierte que el archivo ya existe cuando intenta guardar sus cambios.