Evidência
Como não há nenhum arquivo alternativo, você está apenas executando o simples :bd
, excluindo o buffer atual ... tente sem #
e verá que o resultado é o mesmo. Uma coisa semelhante acontece com :buffer
, :sbuffer
e pelo menos alguns outros comandos que aceitam #
como argumento: eles se comportam silenciosamente como se nenhum argumento fosse passado.
Na mesma linha, se você tentar :bunload #
você receber esse erro: E90: Cannot unload last buffer
. Execute :bunload
sem argumentos e, mais uma vez, você obterá o mesmo resultado.
Os documentos
Portanto, temos evidências de que #
está sendo substituído por "nada" (provavelmente uma string vazia). Para onde vamos daqui? Examinei os arquivos de ajuda por um tempo tentando encontrar menções a esse comportamento. Não havia nada explícito, mas :h cmdline-lines
diz (role uma página ou duas) ...
Quando o caractere '%' ou '#' é usado onde um nome de arquivo é esperado, eles são expandidos para o nome atual e alternativo.
Eu li isso como Vim colocando #
através da expand()
função (ie expand('#')
) ou pelo menos o mesmo código subjacente usado lá.
:h expand()
diz:
Expanda .. palavras-chave especiais. .. Ao usar '%' ou '#', e o nome do arquivo atual ou alternativo não está definido, uma sequência de caracteres vazia é usada.
Soa familiar.
O código
Agora, nenhuma das opções acima é definitiva ou dá uma pista sobre o porquê? então passei mais tempo cavando ... dessa vez no código. Meu C está muito enferrujado e não tenho boas ferramentas instaladas, mas consegui encontrar uma função que faz algumas configurações para :bdelete
chamadas do_bufdel()
. Isso envia argumentos de linha de comando através dos buflist_findpat()
quais, se #
encontrado, retorna valor curwin->w_alt_fnum
. Esse é o "número do buffer" do buffer alternativo ... que não pode ser um valor positivo em nosso cenário. (Não é possível verificar se o arquivo alt é válido / existe antes que esse valor de retorno seja selecionado.)
O retorno em do_bufdel()
uma verificação é feito com relação ao valor de retorno para um número de buffer menor que 0; nesse caso, o loop de processamento de parâmetros é interrompido. Isso resultaria em nenhum parâmetro sendo apresentado ao :bdelete
código principal ... o que está de acordo com minhas intuições anteriores.
Qual é o próximo?
Parece estar funcionando como projetado, pois não vi nada que parecesse um bug claro. Possivelmente pecado de omissão, no entanto ... uma caixa de esquina que foi ignorada e, portanto, não tem manuseio gracioso. Mas apenas os desenvolvedores que escreveram isso sabem com certeza. Portanto, o passo final seria tentar obter sua contribuição. Como Christian B. disse, perguntar na lista vim-dev é o caminho a percorrer.
(Note-se que buflist_findpat()
é uma função de utilidade por isso não seria necessário um esforço de imaginação para supor que :bunload
, :buffer
etc. estão usando-o, também ... isso explicaria seu comportamento comum com relação a #
.)
NVIM v0.3.0-dev
, verifiquei.