filesystem – ¿Cómo hago para que vim busque un archivo en un conjunto de directorios, si no existe en el directorio actual?

Pregunta:

Cuando quiero editar mi zshrc , simplemente zshrc :

vim .zshrc

Sin especificar la ruta completa ( ~/.zshrc ), si estoy en un directorio diferente, esto iniciará un nuevo archivo. Esto es muy molesto, ya que solo tengo un .zshrc , en ~ , y solo un vimrc , en ~/.vim/ . Entonces, ¿cómo hago para que vim abra ~/.zshrc o ~/.vim/vimrc cuando hago vim .zshrc o vim vimrc en algún otro directorio?


Aunque crear alguna configuración para cada archivo individual es una forma, estaba pensando en algo CDPATH . CDPATH es una variable en algunos shells que contiene una lista de rutas donde cd buscará un directorio. Por ejemplo, si tuviera CDPATH=:/home/muru , y estuviera en cualquier directorio que no contenga un directorio llamado Desktop , podría hacer cd Desktop y llegar a /home/muru/Desktop . Sencillo, elegante, flexible. Si vim tuviera un VIMPATH donde buscaría archivos para editar, esa sería la mejor opción.

Respuesta:

La opción 'path' Vim le permite especificar directorios cuyos comandos como gf y :find buscarán un archivo.

Si solo desea que esta funcionalidad se active para un conjunto específico de archivos, entonces puede usar un autocmd para "redirigir" automáticamente su comando :edit al archivo en uno de los directorios de 'path' .

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 usa el BufNewFile BufNewFile como un disparador para el file not found, so try to find it somewhere else . Cuando se detecte esa situación, use findfile() para intentar encontrar el archivo en los directorios de 'path' . Si lo 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.

Aquí se requiere el calificador nested ya que los autocmds normalmente no anidan. En este caso, desea que los autocmds típicos se activen cuando el comando :edit abre su archivo.

Tenga en cuenta que esto seguirá creando un búfer adicional en comparación con solo editar el archivo manualmente. Cuando se ejecuta BufNewFile , el búfer para el nombre de archivo especificado originalmente ya está creado. El uso de :file para cambiar el nombre de un búfer crea un búfer nuevo descargado con el nombre original.

Si siempre desea buscar en 'path' , entonces el autocmd simplemente se puede cambiar para usar el patrón de archivo * lugar de especificar ciertos archivos.


Aquí hay una versión actualizada que debería adaptarse mejor a sus requisitos. Utiliza :find para abrir directamente el archivo en lugar de establecer el nombre del búfer según el 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 quejaba al intentar guardar el búfer con nombre de :file .

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım