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.if expand('%') !~ '^[.~]\?/'...endifpara que se omitan las rutas relativas o absolutas especificadas; y use ensilentlugar desilent!, porque si abrevim vimrcen dos terminales, el segundo esperará la entrada a la advertencia habitual de "el archivo está abierto en otro lugar", pero el usuario no tiene idea de lo que está esperando. Todavía no lo estoy editando, para ver si tienes mejores formas de abordarlo.La alternativa es hacer algunos comandos que lo harán más fácil:
Estoy usando el patrón
E/Sque rails.vim / projectionist.vim usa.Para más ayuda ver:
fuente
Esto no es una solución, pero es lo que hago para tener fácil acceso a
.vimrcy.zshrc. Personalmente, creo que esto es bastante bueno:fuente
En el espíritu de
CDPATH, escribí una función basada en Python para hacer esto (con la ayuda de Matt Boehm ):BufWinEnterlugar deBufNewFileporque este último no parecía comportarse de manera confiable cuando se daban múltiples nombres de archivo.badseguirlobdcomo una forma confiable de cerrar el búfer abierto para el archivo no utilizado. Esto todavía no funciona cuando lo hago:tabe some-file(no se abre una pestaña nueva). Sin embargo, esa es una pregunta para otro día.CDPATH, puedo agregar fácilmente más directorios editandoPATHSo convirtiéndolo en una variable de nivel Vim y modificándolo.Lo que las otras respuestas pierden, IMO, es que no quiero crear la configuración para cada archivo , sino para cada directorio . No me importa si estoy abriendo
fstabovimrcsimplemente quería que Vim buscara archivos en algún conjunto de directorios si no existía en el directorio actual. Sin embargo, hace +1 a todos por los esfuerzos específicos del archivo.fuente
*para el patrón de archivo, en lugar de archivos específicos, debería lograr lo mismo y evitar su problema:tabe.Con
'user-commands'y'Dictionary', podemos editar los archivos sin crear un búfer para anular el archivo que queremos editar en el búfer.Tenga en cuenta que la función
Editfileno intenta verificar su argumento. Hagamos que vim maneje todos los errores como otros comandos Ex normales. Si el argumento es correcto, vim comienza a editar el archivo y, si no es correcto, vim informará de errores.En mi opinión, no necesitamos crear un buffer. Tiene dos inconvenientes principales.
'not-edited'bandera. Como señala James en su respuesta , si configuramos el nombre del archivo actual con el:filecomando e intentamos escribir el archivo, nos encontraremos con el mensaje de errorE13: File exists (use ! to override)Esto se debe a que vim marca el archivo como "no editado" cuando cambiamos el nombre del archivo con:filemando:keepaltcomando. Cuando intentamos editar vimrc mientras editamos 'foo.bar', esperamos que el nombre de archivo alternativo sea 'foo.bar'. Pero si creamos un búfer y cambiamos el nombre, el nombre de archivo alternativo no se convierte en "foo.bar" sino en el antiguo nombre del búfer 'vimrc'. Peor aún, el viejo búfer se dejará comounlisted-bufferoinactive-buffer. Es por eso que debemos usar el:keepaltcomando para mantener el nombre de archivo alternativo como esperamos y establecer labufhiddenopciónwipepara eliminar el búfer anterior.Si la letra mayúscula en el nombre del comando (todos los comandos definidos por el usuario deben comenzar con la letra mayúscula) no nos concierne, sería mejor usarla. Debido a que no crea un búfer, estamos libres de carga para administrar el búfer. Simplemente pase el nombre del archivo a vim y vea cómo vim lo maneja.
fuente