Aqui está como reproduzo o comportamento que estou observando.
Primeiro, insiro este comando:
echo aaaaa > a
vim a
No Vim, insiro estes comandos:
:ls
:e #
:echo bufname('#')
Aqui está a saída dos três comandos acima:
:ls
1 %a "a" line 1
:e #
E194: No alternate file name to substitute for '#'
:echo bufname('#')
O bufname('#')
comando não produz saída.
Agora insiro este comando:
:bd #
O buffer atual é excluído e substituído por um buffer "[No Name]":
:ls
2 %a "[No Name]" line 1
Eu esperava receber o E194
erro na execução :bd #
. Por que ele excluiu o buffer atual?
Eu estou usando VIM - Vi IMproved 8.0
.
buffers
vim-windows
Aluno Solitário
fonte
fonte
NVIM v0.3.0-dev
, verifiquei.Respostas:
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) ...Eu li isso como Vim colocando
#
através daexpand()
função (ieexpand('#')
) ou pelo menos o mesmo código subjacente usado lá.:h expand()
diz: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
chamadasdo_bufdel()
. Isso envia argumentos de linha de comando através dosbuflist_findpat()
quais, se#
encontrado, retorna valorcurwin->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#
.)fonte