Was ist ein schneller Weg, um Zeilen in Vim zu kommentieren / zu kommentieren?


1168

Ich habe eine Ruby-Code-Datei in vi geöffnet, es gibt Zeilen auskommentiert mit #:

class Search < ActiveRecord::Migration
  def self.up
    # create_table :searches do |t|
    #   t.integer :user_id
    #   t.string :name
    #   t.string :all_of
    #   t.string :any_of
    #   t.string :none_of
    #   t.string :exact_phrase
    # 
    #   t.timestamps
    # end
  end

  def self.down
    # drop_table :searches
  end
end

Angenommen, ich möchte alle Zeilen im ersten def ... endAbschnitt auskommentieren . Was ist ein effizienter Weg, dies in Vim zu tun?

Im Allgemeinen suche ich nach einer einfachen und flüssigen Möglichkeit, Zeilen zu kommentieren und zu kommentieren. Hier habe ich es mit Ruby-Code zu tun, aber es könnte JavaScript ( //) oder Haml ( -#) sein.


20
Die akzeptierte Antwort sollte in eine der Antworten geändert werden, die detaillierte Anweisungen zum Ausführen von Kommentierungs- / Kommentierungsblöcken ohne Verwendung eines Plugins enthält. Die aktuell akzeptierte Antwort ist im Grunde nur ein Link zu einem Plugin eines Drittanbieters.
Ohnmachtssignal

In der am besten bewerteten Antwort werden keine Plugins erwähnt. @Rationalis Ihr Kommentar ist irreführend. Könnten Sie ihn bitte entweder korrigieren oder entfernen, danke.
Bonobo

Antworten:


180

Ich benutze das NERD Commenter Skript . Sie können Kommentare in Ihrem Code einfach kommentieren, kommentieren oder umschalten.

Wie in den Kommentaren erwähnt :

Für alle, die durch die Verwendung verwirrt sind, lautet der Standardleiter "\", sodass 10 \ cc zehn Zeilen kommentiert und 10 \ cu diese zehn Zeilen auskommentiert


Interessant! Ich habe den Doc gelesen und finde, dass es einen "sexy Kommentar" gibt - benutze einfach "\ cs". Für Ruby werden mehrere Zeilen anstelle von Hash-Tags verwendet =beginund =endkommentiert.
Hegwin

Ich denke, dass es nicht der schnellste Weg ist, dies mit vim zu tun, da ein Plugin installiert werden muss. Auch die beste Antwort hat bereits mehr Stimmen erhalten, wurde aber nicht als Lösung markiert.
whirmill

136
Hör hier nicht auf. Die meisten Antworten finden Sie weiter unten, ohne dass Plugins erforderlich sind. stackoverflow.com/a/15588798/2117868 und stackoverflow.com/a/1676690/2117868
kuttumiah

@whirmill Ich denke, "am besten" hängt wirklich vom Anwendungsfall ab. Der visuelle Blockierungsmodus ist schneller, wenn ich Kommentare einmal in meinem Leben umschalten möchte. Aber wenn es mir nichts ausmacht, ein Plugin zu installieren und so wenig Tastenanschläge wie möglich ausführen möchte, um Kommentare umzuschalten, und nicht zwischen dem Hinzufügen oder Entfernen von Kommentaren unterscheiden muss, dann ist dies hier möglicherweise die "beste Antwort".
Carolus

@Carolus Ich hätte dir zugestimmt, wenn die Frage mit "Was ist der beste Weg" anstelle von "Was ist ein schneller Weg" begonnen hätte.
Whirmill

2541

Für diese Aufgaben verwende ich die meiste Zeitblockauswahl .

Setzen Sie den Cursor auf das erste #Zeichen, drücken Sie CtrlV(oder CtrlQfür gVim) und gehen Sie bis zur letzten kommentierten Zeile nach unten und drücken Sie x, um alle #Zeichen vertikal zu löschen .

Das Kommentieren eines Textblocks ist fast dasselbe:

  1. Gehen Sie zunächst zur ersten Zeile, die Sie kommentieren möchten, und drücken Sie CtrlV. Dadurch wird der Editor in den VISUAL BLOCKModus versetzt.
  2. Verwenden Sie dann die Pfeiltaste und wählen Sie bis zur letzten Zeile
  3. Drücken Sie nun ShiftI, um den Editor einzuschaltenINSERT Modus versetzt wird, und drücken Sie dann #. Dadurch wird der ersten Zeile ein Hash hinzugefügt.
  4. Drücken Sie dann Esc(geben Sie ihm eine Sekunde) und es wird ein #Zeichen in alle anderen ausgewählten Zeilen eingefügt.

Geben Sie für die abgespeckte Version von vim, die standardmäßig mit debian / ubuntu geliefert wird, : s/^/#stattdessen den dritten Schritt ein (verbleibende Hervorhebungen des ersten Zeichens jeder Zeile können mit entfernt werden:nohl ).

Hier sind zwei kleine Bildschirmaufnahmen als visuelle Referenz.

Kommentar: Comment

Kommentar: Uncomment


87
Standardmäßig ist es STRG + V. Die Windows-Version von gvim verwendet Strg + Q, da Strg + V bereits zum Einfügen verwendet wird.
R. Martinho Fernandes

8
@amindfv Strg + V, n(wobei n num Zeilen - 1 ist), j, n(wobei n num Anzahl der Länge der Kommentarzeichenfolge - 1 ist), l, x.
michael.bartnett

27
Wie würden Sie das mit '//' machen?
AustinT

74
Sie können zweimal auf Esc klicken, um diese Sekunde nicht zu warten;)
Ahmed Hegazy

44
Das hat bei mir nicht funktioniert. Shift-I ging in den einfachen Einfügemodus.
Geremia

826

So kommentieren Sie Blöcke in vim aus:

  • Drücken Sie Esc (um die Bearbeitung oder einen anderen Modus zu verlassen)
  • schlagen ctrl + v(visueller Blockmodus)
  • benutze das / Pfeiltasten , um die gewünschten Linien auszuwählen (es wird nicht alles hervorgehoben - es ist in Ordnung!)
  • Shift+i (Kapital I)
  • Fügen Sie den gewünschten Text ein, z %
  • Drücken Sie EscEsc

So kommentieren Sie Blöcke in vim aus:

  • Drücken Sie Esc (um die Bearbeitung oder einen anderen Modus zu verlassen)
  • schlagen ctrl + v(visueller Blockmodus)
  • Verwenden Sie die Pfeiltasten / , um die zu kommentierenden Zeilen auszuwählen.

    Wenn Sie mehrere Zeichen auswählen möchten, verwenden Sie eines oder kombinieren Sie diese Methoden:

    • Verwenden Sie die Pfeiltasten nach links / rechts, um mehr Text auszuwählen
    • Verwenden Sie shift+ / , um Textblöcke auszuwählen Pfeiltaste
    • Sie können die Löschtasten wie eine normale Löschtaste wiederholt drücken

  • Drücken Sie doder x, um Zeichen zu löschen, ggf. wiederholt

34
@amelia: Die kommentierende Verknüpfung funktioniert bei mir nicht. Umschalt + i bringt mich in den Einfügemodus. Kommt es auf die vim-Version an?
Benutzer3527975

7
Warum dauert es eine Sekunde?
Conor Patrick

24
Das einzige Problem, das ich mit dieser Antwort habe, ist, dass Sie die Pfeiltasten verwenden müssen .
cosyconemotel

6
Drücken Sie stattdessen zweimal Esc. :)
Aaron Alphonsus

22
Das Aktivieren von Kommentaren funktionierte zunächst nicht für mich, aber nach dem Lesen funktionierte dies erneut einwandfrei: 1. Stellen Sie sicher, dass Sie Strg-V und nicht V für die Auswahl verwenden. 2. Beim Einfügen wird angezeigt, dass Sie nur eine einzelne Zeile 3 ändern. Alle Einfügungen erfolgen, wenn Sie am Ende Esc
drücken

333

Manchmal bin ich in eine Remote-Box geraten, in der meine Plugins und .vimrc mir nicht helfen können, oder manchmal versteht NerdCommenter das falsch (z. B. in HTML eingebettetes JavaScript).

In diesen Fällen ist der integrierte normBefehl eine Low-Tech-Alternative , mit der nur beliebige vim-Befehle in jeder Zeile in Ihrem angegebenen Bereich ausgeführt werden. Zum Beispiel:

Kommentieren mit # :

1. visually select the text rows (using V as usual)
2. :norm i#

Dies fügt am Anfang jeder Zeile "#" ein. Beachten Sie Folgendes: Wenn Sie Folgendes eingeben: Der Bereich wird ausgefüllt, sodass er wirklich so aussieht:'<,'>norm i#

Kommentar aus # :

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

Dadurch wird das erste Zeichen jeder Zeile gelöscht. Wenn ich einen 2- :norm xxZeichen -Kommentar wie // verwendet hätte, würde ich einfach beide Zeichen löschen.

Wenn die Kommentare wie in der Frage des OP eingerückt sind, können Sie Ihre Löschung wie folgt verankern:

:norm ^x

Dies bedeutet "Gehe zum ersten Nicht-Leerzeichen und lösche dann ein Zeichen". Beachten Sie, dass diese Technik im Gegensatz zur Blockauswahl auch dann funktioniert, wenn die Kommentare einen ungleichmäßigen Einzug aufweisen!

Hinweis : Da Sie normbuchstäblich nur reguläre vim-Befehle ausführen, sind Sie nicht auf Kommentare beschränkt, sondern können auch jede Zeile komplex bearbeiten. Wenn Sie das Escape-Zeichen als Teil Ihrer Befehlssequenz benötigen, geben Sie Strg-V ein und drücken Sie die Escape-Taste (oder noch einfacher, zeichnen Sie einfach ein schnelles Makro auf und verwenden Sie dann die Norm, um dieses Makro in jeder Zeile auszuführen).

Hinweis 2 : Sie können natürlich auch ein Mapping hinzufügen, wenn Sie häufig etwas verwenden norm. Wenn Sie beispielsweise die folgende Zeile in ~ / .vimrc einfügen, können Sie ctrl-nstatt :normnach der visuellen Auswahl eingeben

vnoremap <C-n> :norm

Anmerkung 3 : Bare-Bones-Vim hat manchmal nicht dienorm Befehl kompiliert. Verwenden Sie daher unbedingt die verbesserte Version, dh normalerweise / usr / bin / vim, nicht / bin / vi

(Vielen Dank an @Manbroski und @rakslice für die Verbesserungen in dieser Antwort)


Ich dachte, dies wäre der richtige Weg, bis ich gescrollt habe, um diese Antwort zu lesen. Stackoverflow.com/a/1676690/850996 Die Blockauswahl mit STRG + V (im Gegensatz zur Zeilenauswahl mit UMSCHALT + V) bietet eine viel bessere Kontrolle darüber, wo der Kommentar ist Das Einfügen von Zeichen erfolgt.
Shyam Habarakada

2
@Shyam Die meisten anderen Antworten empfehlen die Strg-V-Technik in Kombination mit speziellen Befehlen nur für die Blockauswahl. Ich persönlich finde die von mir beschriebene "Norm" -Technik jedoch einfacher, da sie außer dem Normbefehl selbst keine neue Syntax einführt, sodass ich das, was ich bereits über vim weiß, wiederverwenden kann.
Magnus

2
Zum Kommentieren eines eingerückten Blocks ist es nützlich zu sagen :norm ^x. Diese Methode hat im Allgemeinen den Vorteil, mit Regionsauswahl zu arbeiten (z. B. vi{wird in geschweiften Klammern ausgewählt). Solche Textobjekt-Selektoren funktionieren nicht mit Visual Block.
ivan-k

1
Ah, ich habe es gerade herausgefunden - auf Centos 6 /bin/viist das Vim 7.2, aber es ist ein anderer Build als /usr/bin/vimund es hat Funktionen wie diese deaktiviert .
Rakslice

3
Dies ist bei weitem die beste Antwort. Besonders in Kombination mit vip, um einen ganzen Absatz auszuwählen.
Meh

121

Ich habe folgendes in meinem .vimrc:

" Commenting blocks of code.
autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
autocmd FileType sh,ruby,python   let b:comment_leader = '# '
autocmd FileType conf,fstab       let b:comment_leader = '# '
autocmd FileType tex              let b:comment_leader = '% '
autocmd FileType mail             let b:comment_leader = '> '
autocmd FileType vim              let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

Jetzt können Sie ,cceingeben, um eine Zeile und zu kommentieren,cu eingeben, um eine Zeile (funktioniert sowohl im normalen als auch im visuellen Modus).

(Ich habe es vor vielen Jahren von einer Website gestohlen, daher kann ich nicht mehr vollständig erklären, wie es funktioniert :). Es gibt einen Kommentar, in dem er erklärt wird.)


Was ist die Verknüpfung, die ich verwenden sollte? Ich kann es mir aus dem VIM-Code selbst nicht ganz sicher sein!
Gideon

Verwenden Sie im normalen oder visuellen Modus ", cc" (3-stellige Sequenz), um die aktuelle Zeile zu kommentieren, und ", cu", um die aktuelle Zeile zu kommentieren.
Dan

8
ich mag das :)! Vielen Dank! Nebenbei bemerkt finde ich es nicht schwer zu erklären. a) Es ordnet einen Befehl neu zu (nicht rekursiv [siehe dies] ( stackoverflow.com/questions/3776117/… ). Wenn Sie also drücken, wird Folgendes ausgeführt: b). Dies ist im Grunde ein Sed (s) / what / towhat / where) Befehl, der ^ (Zeilenanfang) in das korrekt eingestellte Kommentarzeichen ändert, basierend auf dem Dateityp, den Sie geöffnet haben. c) Bei den stillen Dingen unterdrücken sie nur die Ausgabe von Befehlen. d): nohlsearch verhindert, dass die sed search
ramrunner

14
Beachten Sie, dass dies nicht die richtige Methode zum Laden von Autobefehlen ist. Sie sollten sich in einer Augroup befinden, sonst werden sie mehrmals zu vim hinzugefügt und verursachen viel Verlangsamung. Siehe: learnvimscriptthehardway.stevelosh.com/chapters/14.html . Ich habe meine Antwort auf diese Frage hinzugefügt.

Nett. Dies ist eine tatsächliche Antwort auf die Frage, die ich zum (Un-) Kommentieren hatte, während Sie eine Blockauswahl haben.
Erwin Rooijakkers

119

Geben Sie an, welche Zeilen in vim kommentiert werden sollen:

Zeigen Sie die Zeilennummern an:

:set number

dann

:5,17s/^/#/     this will comment out line 5-17

oder dieses:

:%s/^/#/        will comment out all lines in file

11
Da Sie nur das 1. Zeichen jeder Zeile ändern, brauchen Sie das "g" am Ende nicht
Magnus

1
Einige Vims auf eingebetteten Boxen (wie openwrt) haben keinen visuellen Modus. Das ist also verdammt großartig :)
kim0

Kannst du erklären, warum :%s/^/#/galle Zeilen auskommentiert werden? Ich fragte mich das Prozentzeichen%
Bin

18
Und um diese Zeilen zu kommentieren, können Sie schreiben: 5,17s / ^ # /
Iraklis Moutidis

Großartig! Es funktioniert wirklich gut mit Blockauswahl wie: va{oder mit varfür Rubin.
Artur Małecki

58

So mache ich das:

  1. Gehen Sie zum ersten Zeichen in der ersten Zeile, die Sie auskommentieren möchten.

  2. Hit Ctrl+ qin gVim oder Ctrl+ vin VIM, dann gehen Sie erste Zeichen auf den Linien zu wählen, um Stellung zu nehmen .

  3. Drücken Sie dann cund fügen Sie das Kommentarzeichen hinzu.

Das Kommentieren funktioniert genauso, geben Sie einfach ein Leerzeichen anstelle des Kommentarzeichens ein.


44
clöscht auch das erste Zeichen. CMS Antwort hat es richtig, dh drücken, Idann die Kommentarzeichen eingeben und dann Esc(dies ist auf Windows Vim)
Samaursa

6
Dies funktioniert, außer dass 'r' in Schritt drei gedrückt werden muss, nicht 'c'.
David Baucum

alternativ können Sie ESCzweimal nach dem Drücken drücken cund das sollte den Trick machen
nihiser

Alle diese Optionen zerstören das erste Zeichen in der Zeile.
Josiah

36

Ich habe mir eine einfache Ergänzung zu meiner .vimrc-Datei ausgedacht, die ziemlich gut funktioniert und einfach erweitert werden kann. Sie fügen der comment_map und ihrem Kommentarleiter einfach einen neuen Dateityp hinzu.

Ich habe den normalen und visuellen Modi eine Zuordnung hinzugefügt, aber Sie können sie nach Belieben neu zuordnen. Ich bevorzuge nur eine Funktion zum Umschalten. Man trägt mehrere Mappings etc.

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
        else 
            if getline('.') =~ "^\\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
            else
                " Comment the line
                execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

Hinweis:

Ich verwende keine Rückrufe oder Hooks für die Dateitypen / das Laden, da ich finde, dass sie den Start von Vim mehr verlangsamen als die .vimrcstatische Funktion / Map, aber das ist nur meine Präferenz. Ich habe auch versucht, es einfach und performant zu halten. Wenn Sie automatische Befehle verwenden, müssen Sie sicherstellen, dass diese in eine automatische Befehlsgruppe eingefügt werden. Andernfalls werden die Rückrufe mehrmals pro geladener Datei zum Dateityp hinzugefügt und führen zu erheblichen Leistungseinbußen.


1
Ich bin völlig neu in vim. Welche Taste sollte ich drücken, um die zugeordnete Funktion umzuschalten? Was ist diese <leader><Space>Erklärung unten?
Jens Kohl

2
Sie können <Leiter> durch einen Schlüssel wie <,> ersetzen. Dann drückst du LEERTASTE und es wird der Kommentarstatus der Zeile umgeschaltet. Anführer ist was auch immer Ihr Anführer ist, Vims Standard <Leiter> ist \, aber Sie können Ihren eigenen festlegen wie "let mapleader = ','"

Tolle Antwort, ein Ärger, wenn Sie Blöcke kommentieren, die bereits einige Kommentare enthalten, werden kommentierte gegen nicht kommentierte Zeilen ausgetauscht. QtCreator für z. B. entfernt Kommentare nur, wenn alle nicht leeren Zeilen führende Kommentare enthalten, andernfalls fügen Sie einen führenden Kommentar hinzu.
ideasman42

1
Ich habe eine etwas andere Version mit \zsund \zeRegex-Trick gemacht, der Code wurde etwas kleiner. Sie können es hier sehen
SergioAraujo

33

Kommentare umschalten

Wenn alles , was Sie brauchen , ist Toggle Kommentare würde ich eher mit gehen commentary.vim von tpope .

Geben Sie hier die Bildbeschreibung ein

Installation

Erreger:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

vim-plug:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

Weitere Anpassung

Fügen Sie dies Ihrer .vimrc-Datei hinzu: noremap <leader>/ :Commentary<cr>

Sie können jetzt Kommentare umschalten, indem Sie Leader+ drücken /, genau wie bei Sublime und Atom.


Vielen Dank! Wird es irgendwann in Zukunft CSS-Kommentare in einem HTML unterstützen?
Dan Oak

25

Verwenden Sie Strg-V, um Textrechtecke auszuwählen: Gehen Sie zum ersten #Zeichen, geben Sie Ctrl+ ein V, bewegen Sie sich einmal nach rechts und dann nach unten bis zum Ende der Kommentare. Geben xSie nun Folgendes ein : Sie löschen alle #Zeichen, gefolgt von einem Leerzeichen.


18

Hier ist ein Abschnitt von mir .vimrc:

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

Im normalen und visuellen Modus kann ich drücken ,ic, um Kommentare einzufügen und Kommentare ,rczu entfernen.


Dies ist sehr hilfreich für Anfänger, um das Schreiben selbst zu lernen .vimrc.
coolste

3
mapdeckt normale und visuelle Modi ab, so dass Sie die vmapLinien nicht benötigen
doubleDown

Besserer Ort ist in after/ftplugin/ruby.vim.
Santosh Kumar

benutze auch <leader>icund<leader>rc
Hans Kristian

15

Ich benutze vim 7.4 und das funktioniert bei mir.
Angenommen, wir kommentieren / kommentieren 3 Zeilen.

Kommentieren:

wenn die Leitung hat keinen Tabulator / Leerzeichen am Anfang:
ctrl + Vdann jjjdann shift + I (cappital i)dann //dann , esc esc
wenn die Leitung hat Tabulator / Leerzeichen am Anfang noch können Sie die oben oder Swap für tun c:
ctrl + Vdann jjjdann cdann //dannesc esc

zu uncomment:

Wenn die Zeilen am Anfang keine Tabulator / Leerzeichen haben:
ctrl + Vdann jjjdann ll (lower cap L)dannc

wenn die Linien Tabulator / Leerzeichen am Anfang, dann Raum , den Sie über und esc
ctrl + Vdann jjjdann ll (lower cap L)dann cdann spacedannesc



9

Mit 30 Antworten vor mir werde ich versuchen, eine noch einfachere Lösung zu finden: Fügen Sie #am Anfang der Zeile ein ein. Gehen Sie dann eine Zeile nach unten und drücken Sie Punkt ( .). Zur Wiederholung, nicht j, ., j, ., etc ... zu uncomment, entfernen ein #(Sie können schlagen xdie über #), und tut das Gegenteil mit k, .usw ...


1
Es ist eine sehr einfache Antwort, die selbst Anfänger verstehen und verwenden können. Es funktioniert jedoch ziemlich langsam bei großen Zeilenmengen, die kommentiert werden müssen. Um dies zu umgehen, können Sie I#<Esc>jin den Puffer schreiben - sagen wir c- und dann tun 10@c, oder wie viele Zeilen zu Ihnen passen.
Daerdemandt

9

So kommentieren Sie die folgenden drei Zeilen in vi aus:

#code code
#code
#code code code

Platzieren Sie den Cursor über dem oberen linken #Symbol und drücken Sie CtrlV. Dies versetzt Sie in den visuellen Blockmodus. Drücken Sie den Abwärtspfeil oder Jdreimal, um alle drei Zeilen auszuwählen. Dann drücken Sie D. Alle Kommentare verschwinden. Zum Rückgängigmachen drücken Sie U.

So kommentieren Sie die folgenden drei Zeilen in vi:

code code
code
code code code

Platzieren Sie den Cursor über dem oberen linken Zeichen und drücken Sie CtrlV. Dies versetzt Sie in den visuellen Blockmodus. Drücken Sie dreimal oder J, um alle drei Zeilen auszuwählen. Dann drücken:

I//Esc

Das ist eine Hauptstadt I, // und Escape.

Wenn Sie drücken ESC, erhalten alle ausgewählten Zeilen das von Ihnen angegebene Kommentarsymbol.


1
Wenn Sie den Hash "oben links" verpassen, können Sie o drücken , um den Cursor im visuellen Modus auf die "andere Seite" zu bewegen.
dylnmc

Ich denke, das ist am besten zu verwenden. Keine Notwendigkeit für Dritte, verwenden Sie einfach native vim
Ardi Nusawan

beste Antwort, einfach und ohne Dritte
aze

8

Ja, es gibt bereits 33 (meist sich wiederholende) Antworten auf diese Frage.

Hier ist ein weiterer Ansatz zum Kommentieren von Zeilen in Vim: Bewegungen . Die Grundidee besteht darin, Zeilen mit der gleichen Methode wie das Ziehen eines Absatzes durch Eingabe zu kommentieren oder zu kommentierenyip oder Löschen von 2 Zeilen durch Eingabedj .

Mit diesem Ansatz können Sie Folgendes tun:

  • ccjdie nächsten 2 Zeilen zu kommentieren und cuksie zu kommentieren ;

  • cci{einen Block auskommentieren und cui{auskommentieren;

  • ccipeinen ganzen Absatz auskommentieren und cuipauskommentieren.

  • ccGalles bis zur letzten Zeile cuggauskommentieren und alles bis zur ersten Zeile auskommentieren.

Sie benötigen lediglich 2 Funktionen, die über Bewegungen ausgeführt werden , und 2 Zuordnungen für jede Funktion. Zunächst die Zuordnungen:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(Siehe das Handbuch über den g@Bediener und dieoperatorfunc Variable.)

Und jetzt die Funktionen:

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
  endif
endfunction

Ändern Sie die obigen regulären Ausdrücke nach Ihrem Geschmack, wo sich die befinden #sollten:


"völlig neue [...] Bewegungen" scheinen etwas übertrieben: Mit den Plugins t_comment und vim-comment, die beide vor dieser Antwort erstellt wurden, können Sie Kommentare mit Bewegungen abgeben.
Rich

Gutes Zeug! Upvoted. (Ich denke auch, dass ich anfangen könnte, diesen Ansatz anstelle des Plugins zu verwenden, das ich zuvor verwendet habe, also danke, dass Sie es geschrieben haben!)
Rich

7

Wenn Sie die Zeilennummern bereits kennen, n,ms/# //würde das funktionieren.


Eigentlich sollte das wahrscheinlich sein: n, ms / ^ \ s. # // Weil Sie möglicherweise einen führenden Leerraum haben und dem Hash möglicherweise nicht mit einem folgen
Skip Huffman

7

Ich markiere die erste und letzte Zeile (ma und mb) und mache dann: 'a,' bs / ^ # //


6

Ich benutze EnhancedCommentify . Es kommentiert alles, was ich brauchte (Programmiersprachen, Skripte, Konfigurationsdateien). Ich benutze es mit Visual-Mode-Bindungen. Wählen Sie einfach den Text aus, den Sie kommentieren möchten, und drücken Sie co / cc / cd.

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 

5

Ich kombinierte die Antwort von Phil und jqno und machte Kommentare mit Leerzeichen:

autocmd FileType c,cpp,java,scala let b:comment_leader = '//'
autocmd FileType sh,ruby,python   let b:comment_leader = '#'
autocmd FileType conf,fstab       let b:comment_leader = '#'
autocmd FileType tex              let b:comment_leader = '%'
autocmd FileType mail             let b:comment_leader = '>'
autocmd FileType vim              let b:comment_leader = '"'
function! CommentToggle()
    execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>

5

Es gibt dieses lebensverändernde Plugin tpopenamensvim-commentary

https://github.com/tpope/vim-commentary

Dieses Plugin bietet :

  • Geistige Gesundheit
  • Richtig eingerückte Kommentare
  • Kommentiert keine leeren / unnötigen Zeilen aus

Verwendung :

  • Installieren Sie über Vundle (oder Pathogen, denke ich).
  • Markieren Sie Ihren Text und drücken Sie :, um anzuzeigen, wie:<,'>
  • Geben Sie hier Kommentar ein :<,'>Commentaryund drücken Sie Enter.
  • Boom. Du bist fertig, Kumpel.

vim-commentary(wie alle Plugins von tpope) hat den Bonus, idiomatisch zu sein. gc= "Kommentar gehen", gcap= "Kommentar kommentieren" usw.
Goldenratio

Könnte dies nur eine Bearbeitung der Antwort von Tim Pope von Jim Stewart gewesen sein?
jdk1.0

5

Diese Antwort ist am nützlichsten, wenn Sie keine Plugins installieren können, Ihre Kommentarzeichen jedoch den vorhandenen Einrückungsstufen folgen sollen.

Diese Antwort ist hier auf 1) den richtigen Code zeigen , in eine Paste .vimrczu erhalten vim 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:

let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
function! Docomment ()
  "make comments on all the lines we've grabbed
  execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
  "uncomment on all our lines
  execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
endfunction
function! Comment ()
  "does the first line begin with a comment?
  let l:line=getpos("'<")[1]
  "if there's a match
  if match(getline(l:line), '^\s*'.b:commentChar)>-1
    call Uncomment()
  else
    call Docomment()
  endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

Wie es funktioniert:

  • let b:commentChar='//': Dadurch wird eine Variable in vim erstellt. Das bhier bezieht sich auf den Bereich, 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 *...: Autobefehle werden für verschiedene Dinge ausgelöst. 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 wir den commentCharDateityp abhängig ändern können. Es gibt andere Möglichkeiten, dies zu tun, aber sie sind für Anfänger (wie mich) verwirrender.

  • function! Docomment(): Funktionen werden beginnend mit functionund endend mit deklariert endfunction. Funktionen müssen mit einem Großbuchstaben beginnen. Das !stellt sicher, dass diese Funktion alle vorherigen Funktionen überschreibt, die wie Docomment()bei dieser Version von definiert wurden Docomment(). Ohne das !hatte ich Fehler, aber das könnte daran liegen, dass ich neue Funktionen über die vim-Befehlszeile definiert habe.

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': Execute ruft einen Befehl auf. In diesem Fall wird ausgeführt substitute, was einen Bereich annehmen kann (standardmäßig ist dies die aktuelle Zeile), z. B. %für den gesamten Puffer oder '<,'>für den hervorgehobenen Abschnitt. ^\s*ist Regex, um mit dem Anfang einer Zeile übereinzustimmen, gefolgt von einer beliebigen Anzahl von Leerzeichen, an die dann (aufgrund von &) angehängt wird . Das .hier wird für die Verkettung von Zeichenfolgen verwendet, da escape()es nicht in Anführungszeichen gesetzt werden kann. escape()Ermöglicht es Ihnen, Zeichen zu maskieren commentChar, die den Argumenten entsprechen (in diesem Fall \und /), indem Sie ihnen ein vorangestellt haben\ . Danach verketten wir erneut mit dem Ende unserer substituteZeichenfolge, die dieeFlagge. Mit dieser Flagge können wir lautlos versagen. Wenn wir also in einer bestimmten Zeile keine Übereinstimmung finden, werden wir nicht darüber schreien. Insgesamt können wir in dieser Zeile ein Kommentarzeichen gefolgt von einem Leerzeichen kurz vor dem ersten Text einfügen, was bedeutet, dass wir unsere Einrückungsstufe beibehalten.

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': Dies ähnelt unserem letzten großen langen Befehl. Einzigartig in diesem Fall haben wir \v, was sicherstellt, dass wir unserem nicht entkommen müssen (), und 1was sich auf die Gruppe bezieht, die wir mit unserem gebildet haben (). Grundsätzlich stimmen wir mit einer Zeile überein, die mit einer beliebigen Anzahl von Leerzeichen beginnt, und dann mit unserem Kommentarzeichen, gefolgt von einer beliebigen Anzahl von Leerzeichen, und wir behalten nur den ersten Satz von Leerzeichen bei. Auch hier ekönnen wir unbemerkt fehlschlagen , wenn wir auf dieser Linie keinen Kommentar Charakter haben.

  • let l:line=getpos("'<")[1]: Dies setzt eine Variable ähnlich wie bei unserem Kommentarzeichen, lbezieht sich jedoch auf den lokalen Bereich (lokal für diese Funktion). getpos()erhält in diesem Fall die Position des Beginns unserer Hervorhebung und [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 iffunktioniert. match()prüft, ob das erste Ding das zweite enthält, also greifen wir zu der Zeile, in der wir mit der Hervorhebung begonnen haben, und prüfen, ob sie mit Leerzeichen gefolgt von unserem Kommentarzeichen beginnt. match()Gibt den Index zurück, in dem dies zutrifft, und -1wenn keine Übereinstimmungen gefunden wurden. Da ifalle 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 vimgibt 0 zurück, wenn falsch, und 1, wenn wahr, was ifgesehen werden soll, um richtig zu bewerten.

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: vnoremapbedeutet, den folgenden Befehl im visuellen Modus zuzuordnen, ihn jedoch nicht rekursiv zuzuordnen (dh keine anderen Befehle zu ändern, die möglicherweise auf andere Weise verwendet werden). Grundsätzlich sollten Sie als Anfänger immer noremapsicherstellen, dass Sie nichts kaputt machen. <silent>bedeutet "Ich will nicht deine Worte, nur deine Taten" und sagt, dass nichts in die Kommandozeile gedruckt werden soll. <C-r>ist das, was wir abbilden, was in diesem Fall Strg + r ist (beachten Sie, dass Sie Cr bei dieser Zuordnung im normalen Modus weiterhin für "Wiederherstellen" verwenden können). C-uist ein bisschen verwirrend, aber im Grunde stellt es sicher, dass Sie Ihre visuelle Hervorhebung nicht aus den Augen verlieren (gemäß dieser Antwort beginnt Ihr Befehl damit '<,'>, was wir wollen).call weist vim hier lediglich an, die von uns genannte Funktion auszuführen, und <cr>bezieht sich auf das Drücken derenterTaste. Wir müssen es einmal drücken, um die Funktion tatsächlich aufzurufen (andernfalls haben wir nur call function()in der Befehlszeile getippt , 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 erfordert alles, was mit markiert vist V, oder C-vprüft, ob die erste Zeile kommentiert ist. Wenn ja, versuchen Sie, alle markierten Zeilen zu kommentieren. Wenn nicht, fügen Sie jeder Zeile eine zusätzliche Ebene mit Kommentarzeichen hinzu. Dies ist mein gewünschtes Verhalten; Ich wollte nicht nur umschalten, ob jede Zeile im Block kommentiert wurde oder nicht, also funktioniert es perfekt für mich, nachdem ich mehrere Fragen zu diesem Thema gestellt habe.



3

Sie können vim-comment von tpope ( https://github.com/tpope/vim-commentary) verwenden ) wie folgt verwenden:

Rufen Sie den visuellen Modus auf, indem Sie drücken

'v'

Dann drücken

'j' repeatedly or e.g 4j to select 4 row

Jetzt müssen Sie nur noch die Eingabetasten eingeben:

'gc'

Dadurch wird die gesamte Auswahl auskommentiert, um die Wiederholungstasten zu kommentieren:

'gc'

3

Hier ist ein grundlegender Einzeiler basierend auf dem C-vfolgendenI oben skizzierte Verfahren.

Dieser Befehl ( :Comment) fügt eine ausgewählte Zeichenfolge am Anfang aller ausgewählten Zeilen hinzu.

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

Fügen Sie diese Zeile zu Ihrer hinzu .vimrc, um einen Befehl zu erstellen, der ein einzelnes Argument akzeptiert und das Argument am Anfang jeder Zeile in der aktuellen Auswahl platziert.

ZB wenn der folgende Text ausgewählt ist:

1
2

und Sie führen dies aus : :Comment //, das Ergebnis wird sein:

//1
//2

3

Ausgehend von den Ideen in den Antworten hier habe ich meine eigene Kommentarfunktion gestartet. Kommentare werden ein- und ausgeschaltet. Es kann Dinge wie behandeln //print('blue'); //this thing is blueund schaltet nur den ersten Kommentar um. Darüber hinaus werden Kommentare und ein einzelnes Leerzeichen hinzugefügt, genau dort, wo sich das erste Nicht-Leerzeichen befindet und nicht ganz am Anfang der Zeile. Außerdem werden die Leerzeichen nicht unnötig kopiert, sondern es werden Zooms (: h \ zs als Hilfe) verwendet, um diese zusätzliche Arbeit beim Kommentieren und Einrücken von Zeilen zu vermeiden. Hoffe, es hilft einigen Minimalisten da draußen. Vorschläge sind willkommen.

" these lines are needed for ToggleComment()
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction

nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>

1
Ich habe eine etwas andere Version Ihrer Lösung erstellt, die auch die Cursorposition wiederherstellt. Ich möchte Ihre Meinung dazu. auf Github
SergioAraujo

Cool. Sie können meinen Beitrag bearbeiten und Ihre Lösung hinzufügen (wegen Ähnlichkeit)!
Mike

Es wurde geändert, um ein Backslashing von c, cpp, java und die Verwendung eines anderen Trennzeichens bei Substitutionen zu vermeiden, um E488 zu vermeiden. Auch der Abstand ändert sich für Java, cpp, da die Kommentare drei Zeichen // plus Leerzeichen enthalten. Dies erfolgt durch l: Leerzeichen.
SergioAraujo

3

Ich benutze Kommentare.vim von Jasmeet Singh Anand (gefunden auf vim.org),

Es funktioniert mit C, C ++, Java, PHP [2345], Proc, CSS, HTML, HTML, XML, XHTML, Vim, Vimrc, SQL, Sh, Ksh, Csh, Perl, Tex, Fortran, ml, Caml, Ocaml, vhdl, haskel und normale dateien

Es kommentiert und entkommentiert Zeilen in verschiedenen Quelldateien sowohl im normalen als auch im visuellen Modus

Verwendungszweck:

  • CtrlCkommentieren eine einzige Zeile
  • CtrlXzu un-Kommentar eine einzige Zeile
  • ShiftVund wählen Sie mehrere Zeilen aus, um dann CtrlCdie ausgewählten mehreren Zeilen zu kommentieren
  • ShiftVund wählen Sie mehrere Zeilen aus, CtrlXum die ausgewählten mehreren Zeilen zu entfernen

3

Die schnellste und intuitivste Methode von allen besteht darin, die Zeilen neu )zu kommentieren und dann (zu kommentieren . Probieren Sie es aus und Sie werden nicht zurückkehren.

In Ruby oder Bash mit 2-Leerzeichen:

map ) I# <Esc>j
map ( k^2x

In C / C ++ oder PHP mit 4 Leerzeichen:

map ) I//  <Esc>j
map ( k^4x

Nachteile sind, dass Sie verlieren (und )Satzbewegungen ausführen (aber dort dasausfüllen können), und dass Sie gelegentlich auf das Auswählen und Ersetzen oder CtrlVauf die Bearbeitung langer Abschnitte zurückgreifen . Aber das ist ziemlich selten.

Und im C-Stil lassen sich die langen Kommentare am besten behandeln mit:

set cindent
set formatoptions=tcqr

... was sich gut mit der Verwendung V[move]gqzum Wiederherstellen des Zeilenumbruchs kombinieren lässt .


2

Dieser einfache Ausschnitt stammt aus meiner .vimrc:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

Es ist für // - Kommentare, aber Sie können es leicht für andere Zeichen anpassen. Sie können autocmd verwenden, um einen Leader festzulegen, wie von jqno vorgeschlagen.

Dies ist eine sehr einfache und effiziente Methode, um auf natürliche Weise mit Bereichen und dem visuellen Modus zu arbeiten.


2

Ich mag /* ... */(C ansi Kommentare), also hier ist es mein Trick für dich. Sie können es natürlich anpassen, um es in verschiedenen Fällen zu verwenden.


Kommentar mit / * ... * /

Wählen Sie den Text aus (gehen Sie zum Anfang, starten Sie den visuellen Block, springen Sie mit }):

<c-V>}

Geben Sie den Befehl ein, der in der Auswahl angewendet werden soll

:norm i/* <c-v><esc>$a */

Der Befehl sieht folgendermaßen aus: :'<,'>norm i /* ^[$a */

Siehe (i *) für Details.


Kommentieren Sie das / * ... * / aus

Wählen Sie den Text aus (wie zuvor oder auf andere Weise):

<c-V>}

Geben Sie den Befehl ein, der in der Auswahl angewendet werden soll

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

Der Befehl sieht folgendermaßen aus: :'<,'>norm :s-\s*/\*\s*-^M$bbld$

Siehe (ii *) für Details.


Ergebnis

Effekt ist Kommentare Zeile für Zeile:

Comment block
Comment block
Comment block

Wird (und umgekehrt):

/* Comment block */
/* Comment block */
/* Comment block */

Es ist besser, es als etwas mapoder @regin Ihrem zu speichern .vimrc, weil es viel zu tippen ist. Wenn Sie einen einzelnen /*und */den gesamten Block bevorzugen , verwenden Sie:

Kommentar mit einem einzelnen / * * / den gesamten Block

Speichern Sie es in einem Register, indem Sie es beispielsweise qcam Anfang eines Absatzes aufzeichnen , um zu kommentieren:

v}di/*  */<esc>hhhp

und vergiss nicht noch qeinmal, um die Aufnahme zu beenden.

Siehe (iii *) für Details.


Kommentieren Sie ein einzelnes / * * / aus einem Block aus

Speichern Sie es beispielsweise im Register @u. Platzieren Sie den Cursor an einer beliebigen Stelle im Block und:

?/\*<enter>xx/\*/<enter>xx

Speichern Sie das Register, indem Sie den qBefehl beenden .

Siehe (iv *) für Details.


Ergebnis

Effekt ist ein einzelner Kommentar für mehrere Zeilen:

Comment block
Comment block
Comment block

Wird (und umgekehrt):

/* Comment block
Comment block
Comment block */

Erklärungen

(i *) Es funktioniert, indem normder Befehl in jeder ausgewählten Zeile wiederholt angewendet wird. Der Befehl fügt einfach a ein /*, findet das Ende dieser Zeile und endet mit dem Einfügen von a*/

:norm i/* <c-v><esc>$a */

(ii *) Es wird auch verwendet norm, um das Suchen / Ersetzen in jeder Zeile zu wiederholen. Suche spaces /* spacesund ersetze durch nichts. Danach findet das Ende der Zeile, zwei Wörter zurück, rechts einen Buchstaben, bis zum Ende löschen.

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii *) Wählt den Absatz durch aus v}, löscht ihn, fügt einen Kommentar zum Öffnen und Schließen ein, bewegt sich in die Mitte und fügt den gelöschten Block ein.

v}di/*  */<esc>hhhp

(iv *) Irgendwo in der Mitte findet rückwärts a /*, löscht es; findet vorwärts a */, löscht es.

?/\*<enter>xx/\*/<enter>xx
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.