A che cosa serve il registro del buco nero ("_)?


15

Di recente ho letto del registro del buco nero "_che è un registro di sola scrittura.

La documentazione di Vim la descrive in questo modo:

  1. Registro buco nero "_

Quando si scrive in questo registro, non succede nulla. Questo può essere usato per cancellare il testo senza influenzare i normali registri. Quando si legge da questo registro, non viene restituito nulla.

In tutti gli articoli e libri che leggo gli autori usano sempre lo stesso esempio che è quello di usare questo registro quando abbiamo bisogno di cancellare del testo senza cancellare ciò che abbiamo precedentemente strappato.

Capisco questo uso ma sono sorpreso dal fatto che non riesco a trovare altri casi d'uso di questo registro, il che mi porta a 2 domande:

  • Questo registro è utile in alcuni altri casi d'uso ? Se si, quali?

  • Se l'unico scopo di questo registro deve essere utilizzato nel caso d'uso che ho citato prima, perché i creatori di Vim hanno deciso di risolvere questo problema con un tale registro ? Voglio dire, questa risposta mostra una soluzione al problema che implica meno sequenze di tasti rispetto all'utilizzo "_. L'uso "0può anche evitare l'uso del registro del buco nero, quindi perché l'hanno creato?

Risposte:


18

Il registro del buco nero viene utilizzato nelle stesse situazioni di /dev/null: quando si esegue un'azione che normalmente genera qualcosa ma non si ha alcuna utilità per tale uscita.

Il comportamento predefinito di Vim è "tagliare", non "eliminare". Nella maggior parte dei casi non importa ma, a volte, gli utenti potrebbero effettivamente dover "eliminare". Ecco dove il registro del buco nero è utile.

Questo registro è utile in alcuni altri casi d'uso?

Il registro del buco nero è qui per permetterci di tagliare le cose senza ostruire il registro senza nome e i registri numerati.

I possibili casi d'uso sono numerosi ma tutti sorprendentemente molto simili:

  • fornire un vero "elimina",
  • avere un migliore controllo sui registri, principalmente quello senza nome,
  • mantenere i registri numerati in uno stato stabile,
  • tagliare qualcosa mantenendo la capacità di mettere dal registro senza nome, dandoci "put ripetibili",
  • metti qualcosa sopra qualcosa che non ti interessa,
  • prevenire effetti collaterali negli script ...

Si potrebbe usare "0pper lo scenario "ripetute put" (il caso d'uso più comune, quindi la sua ubiquità nella letteratura Vim) ma quel registro è lungi dall'essere utile come "_per gli altri scenari.


Vedo i tuoi casi d'uso più come conseguenze del comportamento di questo registro, ma penso che la tua risposta descriva chiaramente questo registro con `Il registro del buco nero è qui per permetterci di tagliare le cose senza ostruire il registro senza nome e i registri numerati. aspettando altre risposte ma sembra che sia l'unico uso di questo registro. Grazie mille per la tua risposta!
statox

5

Oltre a eliminare il testo, è possibile utilizzare il registro del buco nero per eliminare altri registri. Esempio:

:let @a=@_

Questo è un modo per cancellare il registro "a.


2
Nel caso in cui qualcun altro legga questo, "Mi chiedo se si tratta di una sostituzione più breve e più chiara di :call setreg('a', [])", come ho fatto io: purtroppo, la risposta è no. Si comporta come :call setreg('a', '')(lasciando "anell'output del :registerscomando.
Rich

@Rich Qual è il significato di lasciare "al'output di :registersper i non iniziati?
Alexej Magura,

@AlexejMagura Bene, se il tuo obiettivo è mettere in ordine ciò che vedi quando visualizzi il contenuto del tuo registro, lasciare un mucchio di registri vuoti potrebbe non essere l'ideale. Non sono sicuro se ci sia qualche altra differenza pratica tra un registro cancellato e uno esistente che sembra essere vuoto.
Rich

1

Un uso pratico in una funzione. Nella seguente funzione il commento di Python #viene aggiunto e rimosso a seconda del risultato di getline('.')[0]. Se la riga ha un commento, il carattere #viene eliminato, ma in questo caso non vogliamo che si rovini con il nostro registro predefinito.

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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.