La 'path'
opción de Vim le permite especificar directorios a los que les gustan los comandos gf
y :find
buscará 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 :edit
comando 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 BufNewFile
autocmd 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 nested
se requiere calificador aquí desde autocmds no lo hacen normalmente nido. En este caso, desea que los autocmds típicos se activen cuando el :edit
comando 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 BufNewFile
se ejecuta, el búfer para el nombre de archivo especificado originalmente ya está creado. El uso :file
para 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 :find
para 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 :file
búfer con nombre.
keepalt file
tiene el mismo inconveniente que asignar avim.current.buffer.name
- vim le advierte que el archivo ya existe cuando intenta guardar sus cambios.