Wozu dient das Black-Hole-Register ("_")?

15

Ich habe kürzlich über das Black-Hole-Register gelesen, bei "_dem es sich nur um ein Schreibregister handelt.

Die Vim-Dokumentation beschreibt dies folgendermaßen:

  1. Schwarzes Loch Register "_

Beim Schreiben in dieses Register passiert nichts. Dies kann verwendet werden, um Text zu löschen, ohne die normalen Register zu beeinflussen. Beim Lesen aus diesem Register wird nichts zurückgegeben.

In allen Artikeln und Büchern, die ich lese, verwenden die Autoren immer das gleiche Beispiel, in dem dieses Register verwendet wird, wenn wir Text löschen müssen, ohne das zu löschen, was wir zuvor gezerrt haben.

Ich verstehe diese Verwendung, bin aber überrascht, dass ich keine anderen Anwendungsfälle dieses Registers finden kann, was mich zu zwei Fragen führt:

  • Ist dieses Register in einigen anderen Anwendungsfällen nützlich ? Wenn ja, welche?

  • Wenn der einzige Zweck dieses Registers darin besteht, in dem von mir zuvor zitierten Anwendungsfall verwendet zu werden, warum haben die Entwickler von Vim beschlossen, dieses Problem mit einem solchen Register zu lösen ? Ich meine, diese Antwort zeigt eine Lösung für das Problem, die weniger Tastenanschläge als die Verwendung impliziert "_. Mit "0können Sie auch die Verwendung des Black-Hole-Registers vermeiden. Warum wurde es erstellt?

statox
quelle

Antworten:

18

Das Black-Hole-Register wird in den folgenden Situationen verwendet /dev/null: Wenn Sie eine Aktion ausführen, die normalerweise etwas ausgibt, für die Sie jedoch keine Verwendung haben.

Vims Standardverhalten ist "Ausschneiden", nicht "Löschen". In den meisten Fällen spielt es keine Rolle, aber manchmal müssen Benutzer tatsächlich "löschen". Hier kommt das Black Hole Register zum Einsatz.

Ist dieses Register in einigen anderen Anwendungsfällen nützlich?

Das Black-Hole-Register dient dazu, Dinge zu schneiden, ohne das unbenannte Register und die nummerierten Register zu überfrachten.

Die möglichen Anwendungsfälle sind zahlreich, aber alle überraschenderweise sehr ähnlich:

  • Geben Sie ein tatsächliches "Löschen" an.
  • haben eine bessere Kontrolle über die Register, vor allem die unbenannten,
  • Halten Sie die nummerierten Register in einem stabilen Zustand,
  • etwas abschneiden und dabei die Fähigkeit behalten, aus dem nicht genannten Register zu setzen, was uns "wiederholbare Puts" gibt,
  • lege etwas über etwas, das dir egal ist,
  • Nebeneffekte in Skripten verhindern ...

Man könnte es "0pfür das "wiederholte Put" -Szenario verwenden (der häufigste Anwendungsfall, daher seine Allgegenwart in der Vim-Literatur), aber dieses Register ist bei weitem nicht so nützlich wie "_für die anderen Szenarien.

romainl
quelle
Ich sehe Ihre Anwendungsfälle eher als Konsequenzen des Verhaltens dieses Registers, aber ich denke, Ihre Antwort beschreibt dieses Register klar mit "Das Black-Hole-Register ist dazu da, Dinge zu schneiden, ohne das unbenannte Register und die nummerierten Register zu überfrachten." Erwarten Sie andere Antworten, aber es scheint, dass es die einzige Verwendung dieses Registers ist. Vielen Dank für Ihre Antwort!
statox
5

Neben dem Löschen von Text können Sie mit dem Black-Hole-Register auch andere Register löschen. Beispiel:

:let @a=@_

Dies ist eine Möglichkeit zum Löschen des Registers "a.

cbaumhardt
quelle
2
Für den Fall, dass jemand, der dies liest, denkt: "Ich frage mich, ob dies ein kürzerer, klarerer Ersatz :call setreg('a', [])ist", wie ich es getan habe: Leider lautet die Antwort nein. Es verhält sich wie :call setreg('a', '')( "ain der Ausgabe des :registersBefehls verlassen.
Rich
@Rich Was bedeutet es für die Uneingeweihten , "ain der Ausgabe von :registerszu bleiben?
Alexej Magura
@AlexejMagura Nun, wenn es Ihr Ziel ist, das aufzuräumen, was Sie beim Anzeigen Ihres Registerinhalts sehen, ist es möglicherweise nicht ideal, eine Reihe leerer Register zu hinterlassen. Ich bin mir nicht sicher, ob es einen anderen praktischen Unterschied zwischen einem gelöschten und einem leeren Register gibt.
Rich
1

Eine praktische Anwendung in einer Funktion. In der folgenden Funktion wird der Python-Kommentar #abhängig vom Ergebnis von hinzugefügt und entfernt getline('.')[0]. Wenn die Zeile einen Kommentar enthält, wird das Zeichen #gelöscht, aber in diesem Fall soll es nicht mit unserem Standardregister in Konflikt geraten.

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
quelle