let b:commentChar='//'
: Dies erstellt eine Variable in vim. Der b
hier angegebene Wert bezieht sich auf den Gültigkeitsbereich, der in diesem Fall im Puffer enthalten ist, dh die aktuell geöffnete Datei. Ihre Kommentarzeichen sind Zeichenfolgen und müssen in Anführungszeichen gesetzt werden. Die Anführungszeichen sind nicht Teil dessen, was beim Umschalten von Kommentaren ersetzt wird.
autocmd BufNewFile,BufReadPost *...
: Autocommands lösen verschiedene Dinge aus. In diesem Fall werden diese ausgelöst, wenn eine neue Datei oder die gelesene Datei mit einer bestimmten Erweiterung endet. Nach dem Auslösen führen Sie den folgenden Befehl aus, mit dem Sie den Befehl ändern könnencommentChar
Dateityp können. Es gibt andere Möglichkeiten, dies zu tun, aber sie sind für Anfänger (wie mich) verwirrender.
function! Docomment()
: Funktionen werden durch Beginnen mit function
und Beenden mit deklariert endfunction
. Funktionen müssen mit einem Großbuchstaben beginnen. das !
gewährleistet , dass diese Funktion alle vorherigen Funktionen überschreibt definiert als Docomment()
mit dieser Version von Docomment()
. Ohne !
hatte ich Fehler, aber das könnte daran liegen, dass ich neue Funktionen über die vim-Befehlszeile definierte.
execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: Execute ruft einen Befehl auf. In diesem Fall wird ausgeführt substitute
, was einen Bereich (standardmäßig ist dies die aktuelle Zeile) annehmen kann, z. B. %
für den gesamten Puffer oder '<,'>
für den hervorgehobenen Abschnitt. ^\s*
ist regulär, um mit dem Anfang einer Zeile übereinzustimmen, gefolgt von einer beliebigen Anzahl von Leerzeichen, die dann (aufgrund von &
) angehängt werden . Das .
hier wird für die Verkettung von Zeichenfolgen verwendet, da escape()
es nicht in Anführungszeichen eingeschlossen werden kann. escape()
Ermöglicht es Ihnen, Zeichen commentChar
, die mit den Argumenten übereinstimmen (in diesem Fall \
und /
), zu maskieren, indem Sie ihnen ein voranstellen \
. Danach verketten wir wieder mit dem Ende unserer substitute
Zeichenkette, die das hate
Flagge. Dieses Flag lässt uns stillschweigend scheitern, was bedeutet, dass wir nicht darüber schreien, wenn wir in einer bestimmten Zeile keine Übereinstimmung finden. Insgesamt können Sie in dieser Zeile ein Kommentarzeichen gefolgt von einem Leerzeichen vor dem ersten Text einfügen, um die Einrückungsstufe beizubehalten.
execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: Dies ist ähnlich wie bei unserem letzten langen Befehl. Einzigartig an diesem haben wir \v
, der sicherstellt, dass wir uns nicht entziehen müssen ()
, und 1
der sich auf die Gruppe bezieht, die wir mit unserem gemacht haben ()
. Grundsätzlich stimmen wir mit einer Zeile überein, die mit einer beliebigen Anzahl von Leerzeichen beginnt, gefolgt von unserem Kommentarzeichen und einer beliebigen Anzahl von Leerzeichen. Wir behalten nur den ersten Satz von Leerzeichen bei. e
Lassen Sie uns erneut unbemerkt scheitern, wenn in dieser Zeile kein Kommentarzeichen enthalten ist.
let l:line=getpos("'<")[1]
: dies setzt eine Variable, ähnlich wie wir es mit unserem Kommentarzeichen gemacht haben, l
bezieht sich jedoch auf den lokalen Gültigkeitsbereich (lokal für diese Funktion). getpos()
erhält in diesem Fall die Position des Beginns unserer Hervorhebung und des[1]
bedeutet, dass wir uns nur um die Zeilennummer kümmern, nicht um andere Dinge wie die Spaltennummer.
if match(getline(l:line), '^\s*'.b:commentChar)>-1
: Sie wissen, wie es if
funktioniert. match()
prüft, ob das Erste das Zweite enthält, also greifen wir zu der Zeile, in der wir unsere Hervorhebung begonnen haben, und prüfen, ob sie mit einem Leerzeichen beginnt, gefolgt von unserem Kommentarzeichen. match()
Gibt den Index zurück, in dem dies zutrifft und -1
wenn keine Übereinstimmungen gefunden wurden. Da if
alle Zahlen ungleich Null als wahr ausgewertet werden, müssen wir unsere Ausgabe vergleichen, um festzustellen, ob sie größer als -1 ist. Der Vergleich in vim
gibt 0 zurück, wenn er falsch ist, und 1, wenn er if
richtig ist.
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
: vnoremap
bedeutet, den folgenden Befehl im visuellen Modus abzubilden, aber nicht rekursiv abzubilden (dh keine anderen Befehle zu ändern, die auf andere Weise verwendet werden könnten). Grundsätzlich sollten Sie als Anfänger immer noremap
darauf achten, dass Sie nichts kaputt machen. <silent>
bedeutet "Ich will nicht deine Worte, nur deine Taten" und weist es an, nichts in die Befehlszeile zu drucken. <C-r>
ist das, was wir mappen, was in diesem Fall Strg + R ist (beachten Sie, dass Sie mit diesem Mapping Cr im normalen Modus immer noch normal für "Wiederherstellen" verwenden können). C-u
Das ist ein bisschen verwirrend, aber im Grunde stellt es sicher, dass Sie Ihre visuelle Hervorhebung nicht aus den Augen verlieren (laut dieser Antwort beginnt Ihr Befehl mit '<,'>
dem, was wir wollen).call
Hier wird vim lediglich angewiesen, die von uns benannte Funktion auszuführen, und es wird <cr>
auf das Drücken derenter
Taste. Wir müssen es einmal drücken, um die Funktion tatsächlich aufzurufen (ansonsten haben wir nur call function()
die Befehlszeile eingegeben , und wir müssen es erneut drücken, damit unsere Stellvertreter den ganzen Weg durchlaufen (nicht wirklich sicher, warum, aber was auch immer).