Para que serve o registro do buraco negro ("_)?

15

Recentemente, li sobre o registro do buraco negro, "_que é um registro somente para gravação.

A documentação do Vim descreve da seguinte maneira:

  1. Registro do buraco negro "_

Ao escrever neste registro, nada acontece. Isso pode ser usado para excluir texto sem afetar os registros normais. Ao ler este registro, nada é retornado.

Em todos os artigos e livros que li, os autores sempre usam o mesmo exemplo, que é o de usar esse registro quando precisamos excluir algum texto sem apagar o que puxamos anteriormente.

Entendo esse uso, mas estou surpreso pelo fato de não encontrar outros casos de uso desse registro, o que me leva a duas perguntas:

  • Esse registro é útil em outros casos de uso ? Se sim, quais?

  • Se o único objetivo deste registro é para ser usado no caso de uso que citei anteriormente, por que os criadores do Vim decidiram resolver esse problema com esse registro ? Quero dizer que esta resposta mostra uma solução para o problema, o que implica menos pressionamentos de tecla do que usar "_. O uso "0também pode evitar o uso do registro do buraco negro. Por que eles o criaram?

statox
fonte

Respostas:

18

O registro do buraco negro é usado nas mesmas situações que /dev/null: quando você executa uma ação que normalmente gera algo, mas que não tem utilidade para esse resultado.

O comportamento padrão do Vim é "cortar", não "excluir". Na maioria dos casos, isso não importa, mas, às vezes, os usuários podem realmente precisar "excluir". É aí que o registro do buraco negro é útil.

Esse registro é útil em outros casos de uso?

O registro do buraco negro está aqui para nos permitir cortar coisas sem atrapalhar o registro sem nome e os registros numerados.

Os possíveis casos de uso são numerosos, mas todos surpreendentemente muito semelhantes:

  • forneça uma "exclusão" real,
  • ter um melhor controle sobre os registros, principalmente o sem nome,
  • mantenha os registros numerados em um estado estável,
  • cortar algo, mantendo a capacidade de colocar a partir do registro sem nome, fornecendo "golpes repetíveis",
  • coloque algo sobre algo que você não gosta,
  • evitar efeitos colaterais em scripts ...

Pode-se usar "0ppara o cenário de "repetições" (o caso de uso mais comum, daí sua onipresença na literatura do Vim), mas esse registro está longe de ser tão útil quanto "_para os outros cenários.

romainl
fonte
Eu vejo seus casos de uso mais como conseqüências do comportamento desse registro, mas acho que sua resposta descreve claramente esse registro com `` O registro do buraco negro está aqui para nos permitir cortar coisas sem prejudicar o registro não nomeado e os registros numerados ''. esperando outras respostas, mas parece que é o único uso desse registro. Muito obrigado pela sua resposta!
statox
5

Além de excluir o texto, você pode usar o registro do buraco negro para excluir outros registros. Exemplo:

:let @a=@_

Essa é uma maneira de limpar o registro "a.

cbaumhardt
fonte
2
Caso alguém mais leia isso pense: "Gostaria de saber se é uma substituição mais curta e clara de :call setreg('a', [])", como eu fiz: lamentavelmente, a resposta é não. Ele age como :call setreg('a', '')(deixando "ana saída do :registerscomando.
Rich
@ Rich Qual é o significado de deixar "ana produção :registerspara os não iniciados?
Alexej Magura
@AlexejMagura Bem, se seu objetivo é arrumar o que você vê ao visualizar o conteúdo do seu registro, deixar um monte de registros vazios pode não ser o ideal. Não tenho certeza se existe outra diferença prática entre um registro excluído e um existente que esteja vazio.
Ricos
1

Um uso prático em uma função. Na função abaixo, o comentário python #é adicionado e removido, dependendo do resultado de getline('.')[0]. Se a linha tem um comentário o caractere #é excluído, mas neste caso nós não queremos isso para mexer com o nosso padrão de registro.

function! ToggleComment()
    let l:win_view = winsaveview()
    if getline('.')[0] == "#"
        normal! 0"_x
    else
        normal! I#
    endif
    call winrestview(l:win_view)
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
vnoremap <Leader>t <C-o>:call ToggleComment()<CR>
SergioAraujo
fonte