Así es como reproduzco el comportamiento que estoy observando.
Primero, ingreso este comando:
echo aaaaa > a
vim a
En Vim, ingreso estos comandos:
:ls
:e #
:echo bufname('#')
Aquí está la salida de los tres comandos anteriores:
:ls
1 %a "a" line 1
:e #
E194: No alternate file name to substitute for '#'
:echo bufname('#')
El bufname('#')
comando no produce salida.
Ahora ingreso este comando:
:bd #
El búfer actual se elimina y se reemplaza con un búfer "[Sin nombre]":
:ls
2 %a "[No Name]" line 1
Esperaba recibir el E194
error al ejecutar :bd #
. ¿Por qué eliminó el búfer actual en su lugar?
Estoy usando VIM - Vi IMproved 8.0
.
buffers
vim-windows
Aprendiz solitario
fuente
fuente
NVIM v0.3.0-dev
, lo verifiqué.Respuestas:
Evidencia
Debido a que no hay un archivo alternativo, en realidad solo está ejecutando simplemente ol '
:bd
, eliminando el búfer actual ... pruébelo sin#
y verá que el resultado es el mismo. Algo similar sucede con:buffer
,:sbuffer
y al menos un par de otros comandos que aceptan#
como argumento: se comportan silenciosamente como si no se hubieran pasado argumentos.En el mismo sentido, si se intenta
:bunload #
obtiene este error:E90: Cannot unload last buffer
. Corre:bunload
sin argumentos y, una vez más, obtendrás el mismo resultado.Los documentos
Entonces tenemos evidencia de que
#
está siendo reemplazado por "nada" (probablemente una cadena vacía). ¿A dónde vamos desde aquí? Revisé los archivos de ayuda por un tiempo tratando de encontrar mención de este comportamiento. No había nada explícito pero:h cmdline-lines
dice (desplazarse hacia abajo una página o dos) ...Lo leí como Vim poniendo a
#
través de laexpand()
función (es decirexpand('#')
) o al menos el mismo código subyacente utilizado allí.:h expand()
dice:Suena familiar.
El código
Ahora nada de lo anterior es definitivo o da una idea de por qué. así que pasé más tiempo cavando ... esta vez en el código. Mi C está muy oxidado y no tengo ninguna buena herramienta instalada, pero logré encontrar una función que haga algunas configuraciones para
:bdelete
llamardo_bufdel()
. Esto envía argumentos de línea de comando a través de losbuflist_findpat()
cuales, si#
se encuentra, devuelve el valorcurwin->w_alt_fnum
. Ese es el "número de búfer" del búfer alternativo ... que no puede ser un valor positivo en nuestro escenario. (No se verifica si el archivo alt es válido / existe antes de que se seleccione ese valor de retorno).Retroceder en
do_bufdel()
una verificación se realiza contra ese valor de retorno para un número de búfer menor que 0, en cuyo caso se rompe el bucle de procesamiento de parámetros. Eso daría como resultado que no se presenten parámetros al:bdelete
código central ... que está en línea con mis intuiciones anteriores.¿Que sigue?
Parece estar funcionando según lo diseñado, ya que no vi nada que pareciera un error claro. Posiblemente pecado de omisión, sin embargo ... un caso de esquina que se ha pasado por alto y, por lo tanto, no tiene un manejo elegante. Pero solo los desarrolladores que escribieron esto lo saben con certeza. Entonces, el paso final sería tratar de obtener su opinión. Como Christian B. dijo, preguntar en la lista vim-dev es el camino a seguir.
(Tenga en cuenta que
buflist_findpat()
es una función de utilidad por lo que no requeriría un esfuerzo de imaginación para suponer que:bunload
,:buffer
, etc., están usando, también ... que explicaría su comportamiento común con respecto a#
.)fuente