Do czego służy rejestr czarnej dziury („_)?

15

Niedawno przeczytałem o rejestrze czarnej dziury, "_który jest rejestrem tylko do zapisu.

Dokumentacja Vima opisuje to w następujący sposób:

  1. Rejestr czarnej dziury "_

Podczas pisania do tego rejestru nic się nie dzieje. Można tego użyć do usunięcia tekstu bez wpływu na normalne rejestry. Podczas odczytu z tego rejestru nic nie jest zwracane.

We wszystkich artykułach i książkach, które czytam, autorzy zawsze używają tego samego przykładu, którym jest użycie tego rejestru, gdy musimy usunąć jakiś tekst bez usuwania tego, co wcześniej szarpaliśmy.

Rozumiem to zastosowanie, ale jestem zaskoczony faktem, że nie mogę znaleźć innych przypadków użycia tego rejestru, co prowadzi do dwóch pytań:

  • Czy ten rejestr jest przydatny w niektórych innych przypadkach użycia ? Jeśli tak, które?

  • Jeśli jedynym celem tego rejestru jest wykorzystanie cytowanego wcześniej przypadku użycia, dlaczego twórcy Vima postanowili rozwiązać ten problem za pomocą takiego rejestru ? Mam na myśli, że ta odpowiedź pokazuje rozwiązanie problemu, który pociąga za sobą mniejszą liczbę naciśnięć klawiszy niż używanie "_. Używanie "0może również uniknąć użycia rejestru czarnej dziury, więc dlaczego go stworzyli?

statox
źródło

Odpowiedzi:

18

Rejestr czarnej dziury jest używany w tych samych sytuacjach, co /dev/null: gdy wykonujesz akcję, która normalnie wyprowadza coś, ale nie używasz tego wyjścia.

Domyślne zachowanie Vima to „wycinanie”, a nie „usuwanie”. W większości przypadków nie ma to znaczenia, ale czasami użytkownicy mogą wymagać „usunięcia”. Tutaj przydatny jest rejestr czarnej dziury.

Czy ten rejestr jest przydatny w niektórych innych przypadkach użycia?

Rejestr czarnej dziury jest tutaj, aby umożliwić wycinanie rzeczy bez blokowania rejestru bez nazwy i rejestrów numerowanych.

Możliwe przypadki użycia są liczne, ale wszystkie są zaskakująco bardzo podobne:

  • podać rzeczywiste „usuń”,
  • mieć lepszą kontrolę nad rejestrami, głównie nienazwanymi,
  • utrzymywać numerowane rejestry w stabilnym stanie,
  • wyciąć coś, zachowując możliwość wstawienia z nienazwanego rejestru, dając nam „powtarzalne wstawienia”,
  • połóż coś na czymś, na czym ci nie zależy,
  • zapobiegaj skutkom ubocznym w skryptach…

Można użyć "0pscenariusza „wielokrotnego wprowadzania” (najczęstszy przypadek użycia, stąd jego wszechobecność w literaturze Vima), ale rejestr ten nie jest tak przydatny jak "_w innych scenariuszach.

romainl
źródło
Widzę twoje przypadki użycia bardziej jako konsekwencje zachowania tego rejestru, ale myślę, że twoja odpowiedź jasno opisuje ten rejestr: „Rejestr czarnej dziury jest tutaj, aby pozwolić nam wycinać rzeczy bez blokowania rejestru bez nazwy i rejestrów numerowanych. Byłem oczekuję innych odpowiedzi, ale wydaje się, że jest to jedyne zastosowanie tego rejestru. Dziękuję bardzo za odpowiedź!
statox
5

Oprócz usuwania tekstu, możesz użyć rejestru czarnej dziury, aby usunąć inne rejestry. Przykład:

:let @a=@_

Jest to jeden ze sposobów kasowania rejestru "a.

cbaumhardt
źródło
2
Na wypadek, gdyby ktoś czytający to pomyślał: „Zastanawiam się, czy jest to krótszy, wyraźniejszy zamiennik :call setreg('a', [])”, tak jak ja: niestety odpowiedź brzmi „nie”. Działa jak :call setreg('a', '')(pozostawiając "aw wyniku :registerspolecenia.
Rich
@Rich Jakie znaczenie ma pozostawienie "aw dorobku :registersdla niewtajemniczonych?
Alexej Magura
@AlexejMagura Cóż, jeśli Twoim celem jest uporządkowanie tego, co widzisz podczas przeglądania zawartości rejestru, pozostawienie pustych rejestrów może nie być idealne. Nie jestem pewien, czy istnieje jakakolwiek inna praktyczna różnica między skasowanym rejestrem a istniejącym, który jest pusty.
Bogaty
1

Jedno praktyczne zastosowanie w jednej funkcji. W funkcji poniżej komentarz Pythona #jest dodawany i usuwany w zależności od wyniku getline('.')[0]. Jeśli wiersz ma komentarz, znak #jest usuwany, ale w tym przypadku nie chcemy, aby zadziałał z naszym domyślnym rejestrem.

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
źródło