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) ...
Cuando se usa el carácter '%' o '#' donde se espera un nombre de archivo, se expanden al nombre de archivo actual y alternativo.
Lo leí como Vim poniendo a #
través de la expand()
función (es decir expand('#')
) o al menos el mismo código subyacente utilizado allí.
:h expand()
dice:
Expandir .. palabras clave especiales. .. Cuando se usa '%' o '#', y el nombre de archivo actual o alternativo no está definido, se usa una cadena vacía.
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
llamar do_bufdel()
. Esto envía argumentos de línea de comando a través de los buflist_findpat()
cuales, si #
se encuentra, devuelve el valor curwin->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 #
.)
NVIM v0.3.0-dev
, lo verifiqué.