Wenn Sie sprachspezifische Kommentare wünschen, benötigen Sie ein Plugin wie nerdcommenter .
Alternativ können Sie eingebaute vim-Aktionen und Ihre Kenntnisse der Kommentarzeichen jeder Sprache verwenden, obwohl dies Ihre eigentliche Frage nicht beantwortet.
Option 1: V-Blöcke
:1
Enter (Gehe zu Zeile 1)
- Ctrl-V (V-Block-Modus)
jjj
(3 weitere Zeilen runter)
- Shift-I (Einfügemodus vor dem Block aufrufen)
#
(Ein '#' einfügen)
- Esc (Zurück zum normalen Modus)
Option 2: Substitution
:1,4s/^/#/
Nervenzusammenbruch:
:
Es folgt der Ex-Befehl
1,4
in den Zeilen von 1 bis 4
s
Ersatz
/
Trennzeichen für Teile des Substitutionsbefehls.
(Sie können auch ein anderes Zeichen verwenden, z. B. :
)
^
Beginn der Zeile
/
Separator
#
das Kommentarzeichen für Python
/
Endabscheider
Option 3: Wiederholen der Anwendung eines Makros ( Quelle )
:1
Enter (Gehe zu Zeile 1)
qa
(Aufnahme im Register starten a
)
- Shift-I (Geben Sie den Einfügemodus am Anfang der Zeile ein
#
(Fügen Sie am Anfang der Zeile ein '#' hinzu.)
- Esc (Zurück zum normalen Modus)
q
(Höre auf, aufzunehmen)
:2,4 normal @a
(Führen Sie das aufgezeichnete Makro erneut aus, um es a
in den Zeilen 2 bis 4 zu registrieren. )
ODER
Sie können die Linien im visuellen Modus auswählen und drücken :
, um die Ex-Linie automatisch mit :'<,'>
(einem Bereich vom Anfang bis zum Ende der visuellen Auswahl) zu füllen. Geben Sie dann ein normal @a
und drücken Sie Enter( Quelle ).
Wenn Sie nun einige Zeilen kommentieren möchten, führen Sie einfach das aufgezeichnete Makro erneut aus, um sich a
in diesen Zeilen zu registrieren :
:9,22 normal @a (comment out lines 9-22)
:9,22 normal I#
nach meiner Antwort tun können .normal
Befehl, bevor ich diese Antwort schrieb. Du hast recht;:9,22 normal I#
wird auch funktionieren.Wählen Sie im visuellen Blockmodus ( CtrlV) den Zeilenanfang aus. Drücken Sie dann I#(das ist ein Großbuchstabe
I
), um das Hash-Zeichen in jede dieser Zeilen einzufügen. Drücken Sie dann Esc, um vom Einfügemodus zum normalen Modus zurückzukehren.quelle
ctrl
? Dennctrl+v
ist eine andere Sache als nurv
.I
. Wenn ich drückeI
,#
wird das nur vor die erste Zeile gesetzt.Esc
nach dem beschriebenen Verfahren nicht gedrückt.Esc
am ende drücken .Wenn Sie für jede Sprache, in der Sie sich gerade befinden, nur eine schnelle Lösung benötigen und den Text bereits im visuellen Modus ausgewählt haben, dann
macht den Job. (Wechseln Sie im normalen Modus für jede Zeile in die erste Spalte und fügen Sie sie ein
#
. Mit:norm I#
wird sie vor dem ersten Nicht-Leerzeichen eingefügt. Dies ist möglicherweise nicht das, was Sie möchten.) Mit:norm i#
funktioniert auch, da:norm
am Anfang von beginnt Linie, aber es ist weniger explizit und weniger klar, wenn Sie das nicht wissen.Wenn Sie dies häufig tun möchten, möchten Sie natürlich ein Mapping einrichten oder nach einem Plugin suchen.
quelle
normal
Befehl standardmäßig mit dem Cursor am Zeilenanfang ausgeführt wird.Wenn Sie dies automatisch tun, müssen Sie Ihrer
vimrc
Datei ( Quelle ) Folgendes hinzufügen :Verwenden Sie, ,cum eine Region zu kommentieren und eine Region zu kommentieren ,u. Dadurch werden die Kommentarsymbole für verschiedene Sprachen manuell festgelegt.
Die zweite Möglichkeit ist die Verwendung eines Plugins wie tcomment , vim-commentary oder comments.vim . Ich benutze Tcomment selbst. Bitte lesen Sie die Anweisungen zur Verwendung und Installation auf deren Seiten, da ich glaube, dass dies über das Thema der Frage hinausgeht.
Ich würde vorschlagen, dass Sie ein Plugin (eines der oben genannten oder eines anderen) verwenden, da dies viel einfacher ist, als einen Teil des Codes in Ihrer
vimrc
Datei zu verwalten.Bearbeiten: Ich habe den manuellen Weg entfernt, da die Frage geändert wurde und auch der richtige Weg von 200_success beantwortet wurde.
quelle
//
(nur/* */
) nicht.:s
Befehle aus dem Auszug in der Antwort ausführen. Der Scheck selbst wäre so etwas wiegetline('.') =~ "^" . escape(b:comment_leader, '\/')
. Wenn es wahr ist, Kommentar, sonst. Dies ist nicht getestet und soll nur als Beispiel dienen.Ich benutze dafür scrooloose / nerdcommenter .
Mit diesem Plugin können Sie Ihre Zeilen visuell auswählen und mit leader+ cKommentare umschalten. Je nach Dateityp werden unterschiedliche Symbole zum Kommentieren verwendet.
quelle
Nachdem Sie die Zeilen ausgewählt haben, geben Sie einfach ein
:
wird automatisch in'<,'>
die Befehlszeile eingefügt. Dies ist ein Bereich vom Anfang Ihrer Auswahl bis zum Ende.norm
Führt einen normalen Modusbefehl aus und handelt in diesem Bereich.I#
ist der Normalmodus-Befehl, der am Zeilenanfang ein '#' einfügt.quelle
Ich bin ein großer Fan von TComment . Ich kann nicht nur Dateityp-spezifische Kommentarstile erstellen, sondern auch für Sprachen, die Blockkommentare unterstützen, Block gegen Zeilen angeben.
quelle
Ich finde, dass das VIM-Kommentar-Plugin bei weitem der einfachste Weg ist, dies zu tun. Wählen Sie einen Linienbereich aus und drücken Sie einfach gc. Es wird ein entsprechendes Kommentarzeichen für den geöffneten Dateityp verwendet. Es ist sogar ohne visuelle Auswahl möglich, benachbarte kommentierte Zeilen mit gcuoder zu kommentieren gcgc.
quelle
Angenommen, Sie möchten 5 Zeilen am Zeilenanfang mit einem Präfix versehen, dann können Sie Suchen und Ersetzen verwenden :
oder am Ende der Zeilen:
Oder verwenden Sie den visuellen Modus (Ctrl + v), um einen vertikalen Textblock auszuwählen. Rufen Sie dann den Einfügemodus ( I) auf, geben Sie etwas ein und drücken Sie Esc, um die Änderungen zu bestätigen und auf andere Zeilen anzuwenden.
Verbunden:
quelle
Diese Antwort ist hier, um 1) den richtigen Code zum Einfügen in ein
.vimrc
zu bekommenvim 7.4+
Block zu tun zu kommentieren / uncommenting während Einrückungsebene mit 1 Verknüpfung im visuellen Modus zu halten und 2) es zu erklären.Hier ist der Code:
Wie es funktioniert:
let b:commentChar='//'
: Dies erstellt eine Variable in vim. Derb
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 mitfunction
und Beenden mit deklariertendfunction
. Funktionen müssen mit einem Großbuchstaben beginnen. das!
gewährleistet , dass diese Funktion alle vorherigen Funktionen überschreibt definiert alsDocomment()
mit dieser Version vonDocomment()
. 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ührtsubstitute
, 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, daescape()
es nicht in Anführungszeichen eingeschlossen werden kann.escape()
Ermöglicht es Ihnen, ZeichencommentChar
, die mit den Argumenten übereinstimmen (in diesem Fall\
und/
), zu maskieren, indem Sie ihnen ein voranstellen\
. Danach verketten wir wieder mit dem Ende unserersubstitute
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()
, und1
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 esif
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. Daif
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 invim
gibt 0 zurück, wenn er falsch ist, und 1, wenn erif
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 immernoremap
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 nurcall 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).Wie auch immer, hoffentlich hilft das. Dies nimmt alles mit
v
,V
oderC-v
überprüft, ob die erste Zeile kommentiert ist. Wenn ja, kommentieren Sie alle markierten Zeilen aus und fügen Sie, falls nicht, jeder Zeile eine zusätzliche Ebene mit Kommentarzeichen hinzu. Das ist mein gewünschtes Verhalten; Ich wollte nicht nur umschalten, ob jede Zeile im Block kommentiert wurde oder nicht, deshalb funktioniert es perfekt für mich, nachdem ich mehrere Fragen zu diesem Thema gestellt habe.quelle