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.if expand('%') !~ '^[.~]\?/'
...endif
para que se omitan las rutas relativas o absolutas especificadas; y use ensilent
lugar desilent!
, porque si abrevim vimrc
en 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
/S
que 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
.vimrc
y.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 ):BufWinEnter
lugar deBufNewFile
porque este último no parecía comportarse de manera confiable cuando se daban múltiples nombres de archivo.bad
seguirlobd
como 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 editandoPATHS
o 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
fstab
ovimrc
simplemente 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
Editfile
no 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:file
comando 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:file
mando:keepalt
comando. 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-buffer
oinactive-buffer
. Es por eso que debemos usar el:keepalt
comando para mantener el nombre de archivo alternativo como esperamos y establecer labufhidden
opciónwipe
para 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