1577 Stimmen

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

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 in der ersten def ... end Abschnitt. Was ist ein effizienter Weg, das in Vim zu tun?

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

51 Stimmen

Die akzeptierte Antwort sollte in eine der Antworten geändert werden, die eine detaillierte Anleitung enthält, wie man Blöcke zum Kommentieren und Löschen von Kommentaren ohne die Verwendung eines Plugins erstellen kann. Die aktuell akzeptierte Antwort ist im Grunde nur ein Link zu einem Plugin eines Drittanbieters.

0 Stimmen

Die am besten bewertete Antwort erwähnt keine Plugins, @rationalis Ihr Kommentar ist irreführend, könnten Sie ihn bitte entweder korrigieren oder entfernen, danke.

0 Stimmen

Angemessene Antwort sollte sein Magnus Antwort

3297voto

Christian C. Salvadó Punkte 763569

Für diese Aufgaben verwende ich die meiste Zeit Blockauswahl .

Setzen Sie den Cursor auf die erste # Zeichen, drücken Sie CtrlV (oder CtrlQ für gVim), und gehen Sie bis zur letzten kommentierten Zeile und drücken Sie x , die alle Daten aus dem # Zeichen vertikal.

Das Kommentieren eines Textblocks ist fast dasselbe:

  1. Gehen Sie zunächst zu der ersten Zeile, die Sie kommentieren möchten, und drücken Sie CtrlV . Dadurch wird der Editor in den VISUAL BLOCK Modus.
  2. Dann mit der Pfeiltaste und Auswahl bis zur letzten Zeile
  3. Jetzt drücken ShiftI , was den Editor in INSERT Modus und drücken Sie dann # . Dadurch wird der ersten Zeile eine Raute hinzugefügt.
  4. Dann drücken Sie Esc (warten Sie eine Sekunde), und es wird eine # Zeichen in allen anderen ausgewählten Zeilen.

Für die abgespeckte Version von vim, die standardmäßig mit Debian/Ubuntu ausgeliefert wird, geben Sie : s/^/# im dritten Schritt (eine verbleibende Hervorhebung des ersten Zeichens jeder Zeile kann mit :nohl ).

Hier sind zwei kleine Bildschirmaufnahmen als visuelle Referenz.

Kommentar: Comment

Unkommentiert: Uncomment

106 Stimmen

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

0 Stimmen

Beachten Sie, dass das Auskommentieren nur bei Ein-Zeichen-Kommentaren funktioniert

8 Stimmen

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

1082voto

amelia Punkte 10150

Um Blöcke in vim auszukommentieren:

  • Presse Esc (um den Bearbeitungs- oder anderen Modus zu verlassen)
  • treffen. ctrl + v (visueller Blockmodus)
  • verwenden Sie die / Pfeiltasten, um die gewünschten Zeilen auszuwählen (es wird nicht alles markiert - das ist OK!)
  • Shift + i (Kapital I)
  • den gewünschten Text einfügen, z. B. %
  • Presse EscEsc

Um Blöcke in vim zu entkommentieren:

  • Presse Esc (um den Bearbeitungs- oder anderen Modus zu verlassen)

  • treffen. ctrl + v (visueller Blockmodus)

  • verwenden Sie die / Pfeiltasten die Zeilen aus, die Sie auskommentieren möchten.

    Wenn Sie mehrere Zeichen auswählen möchten, verwenden Sie eine dieser Methoden oder kombinieren Sie sie:

    • Verwenden Sie die Pfeiltasten links/rechts, um weiteren Text auszuwählen.
    • um Textabschnitte zu markieren, verwenden Sie shift + / Pfeiltaste
    • Sie können die Löschtasten unten wiederholt drücken, wie eine normale Löschtaste
  • Presse d o x um Zeichen zu löschen, ggf. wiederholt

2 Stimmen

Diese Antwort scheint in VIM 7.2 (d.h. Standard-Vim auf OS X 10.6.8) nicht zu funktionieren. Allerdings funktioniert sie in VIM 7.4 :)

77 Stimmen

@amelia : Die Tastenkombination zum Kommentieren funktioniert bei mir nicht. Mit Shift + i komme ich in den Einfügemodus. Hängt es von der Vim-Version ab?

3 Stimmen

@user3527975 Ich bin im selben Boot. Der Vorposter sagte, dass es in vim 7.2 nicht funktioniert. Das ist das, was ich auch auf meinem Cluster habe.

448voto

Magnus Punkte 9928

Manchmal bin ich in einer entfernten Box gelandet, in der mir meine Plugins und .vimrc nicht helfen können, oder NerdCommenter macht manchmal etwas falsch (z.B. JavaScript eingebettet in HTML).

In diesen Fällen ist eine Low-Tech-Alternative der eingebaute norm Befehl, der einfach beliebige vim-Befehle in jeder Zeile in dem von Ihnen angegebenen Bereich ausführt. Zum Beispiel:

Kommentierung mit # :

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

Dies fügt "#" am Anfang jeder Zeile ein. Beachten Sie, dass bei der Eingabe von : der Bereich ausgefüllt wird, so dass es in Wirklichkeit wie folgt aussieht :'<,'>norm i#

Unkommentiert # :

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-Zeichen-Kommentar wie // verwendet hätte, würde ich einfach Folgendes tun :norm xx um beide Zeichen zu löschen.

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

:norm ^x

was bedeutet: "Gehe zum ersten Zeichen ohne Leerzeichen und lösche dann ein Zeichen". Beachten Sie, dass diese Technik im Gegensatz zur Blockauswahl auch dann funktioniert, wenn die Kommentare eine ungleichmäßige Einrückung aufweisen!

Hinweis : Seit norm ist buchstäblich nur das Ausführen von normalen Vim-Befehlen, Sie sind nicht auf Kommentare beschränkt, Sie können auch komplexe Bearbeitungen in jeder Zeile vornehmen. Wenn Sie das Escape-Zeichen als Teil Ihrer Befehlssequenz benötigen, geben Sie ctrl-v ein und drücken Sie dann die Escape-Taste (oder noch einfacher, zeichnen Sie einfach ein schnelles Makro auf und verwenden Sie dann norm, um dieses Makro in jeder Zeile auszuführen).

Anmerkung 2 : Sie können natürlich auch ein Mapping hinzufügen, wenn Sie sich mit norm eine Menge. Wenn Sie zum Beispiel die folgende Zeile in ~/.vimrc einfügen, können Sie Folgendes eingeben ctrl-n anstelle von :norm nachdem Sie Ihre visuelle Auswahl getroffen haben

vnoremap <C-n> :norm

Anmerkung 3 : Bare-bones vim hat manchmal nicht die norm Befehl kompiliert, also stellen Sie sicher, dass Sie die verbesserte Version verwenden, d.h. typischerweise /usr/bin/vim, nicht /bin/vi

(Dank an @Manbroski und @rakslice für Verbesserungen, die in diese Antwort eingeflossen sind)

0 Stimmen

Ich dachte, dies sei der richtige Weg, bis ich beim Scrollen diese Antwort las 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 das Kommentarzeichen eingefügt wird.

4 Stimmen

@Shyam Die ctrl-v-Technik in Kombination mit speziellen Blockauswahl-Befehlen ist das, was die meisten anderen Antworten empfehlen; ich persönlich finde jedoch die von mir beschriebene "norm"-Technik einfacher, weil sie außer dem norm-Befehl selbst keine neue Syntax einführt, so dass ich wiederverwenden kann, was ich bereits über vim weiß.

3 Stimmen

Um einen eingerückten Block zu entkommentieren, ist es nützlich, zu sagen :norm ^x . Diese Methode hat im Allgemeinen den Vorteil, dass sie mit der Auswahl von Regionen arbeitet (z. B. vi{ wählt innerhalb geschweifter Klammern). Solche Textobjektselektoren arbeiten nicht mit Visual Block .

200voto

Manuel Ceron Punkte 7978

Ich benutze die NERD-Kommentator-Skript . Damit können Sie Kommentare in Ihrem Code einfach kommentieren, auskommentieren oder umschalten.

Wie bereits in der Kommentare :

für alle, die durch die Verwendung verwirrt sind, der Standard-Anführer ist "\", also 10 \cc kommentiert zehn Zeilen und 10 \cu wird diese zehn Zeilen auskommentieren

0 Stimmen

Interessant! Ich lese den Doc und finde, dass es einen "sexy Kommentar" gibt - verwenden Sie einfach " \cs ". Für Ruby verwendet es =begin y =end um mehrere Zeilen zu kommentieren, anstelle von Rautezeichen.

0 Stimmen

Ich denke, dass es nicht der schnellste Weg ist, dies mit vim zu tun, da es die Installation eines Plugins erfordert. Auch die beste Antwort hat bereits mehr Stimmen erhalten, aber sie wurde nicht als Lösung markiert.

363 Stimmen

Bleiben Sie hier nicht stehen. Die meisten Antworten sind unten aufgeführt, ohne dass ein Plugin erforderlich ist. stackoverflow.com/a/15588798/2117868 y stackoverflow.com/a/1676690/2117868

167voto

jqno Punkte 14613

Ich habe folgendes in meinem .vimrc :

" Commenting blocks of code.
augroup commenting_blocks_of_code
  autocmd!
  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 = '" '
augroup END
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 eingeben ,cc um eine Zeile zu kommentieren und ,cu um eine Zeile auszukommentieren (funktioniert sowohl im normalen als auch im visuellen Modus).

(Ich habe es vor vielen Jahren von einer Website geklaut, daher kann ich nicht mehr genau erklären, wie es funktioniert :). Es gibt eine Kommentar wo es erklärt wird).

0 Stimmen

Wie lautet die Abkürzung, die ich verwenden sollte? Aus dem Vim-Code selbst kann ich es nicht genau erkennen!

0 Stimmen

Im normalen oder visuellen Modus verwenden Sie ",cc" (3-Zeichen-Folge), um die aktuelle Zeile zu kommentieren, und ",cu", um die aktuelle Zeile zu entkommentieren.

11 Stimmen

Ich mag es :)! Danke! Nebenbei bemerkt finde ich es nicht allzu schwer zu erklären. a) Es mappt einen Befehl (nicht rekursiv [siehe dies ]( stackoverflow.com/questions/3776117/ ), so daß jetzt, wenn Sie ,cc drücken, das :... Ding ausgeführt wird. b) das ist jetzt im Grunde ein sed (s/what/towhat/where) Befehl, der ^ (Zeilenanfang) in das richtig eingestellte Kommentarzeichen ändert, basierend auf dem Typ der Datei, die Sie geöffnet haben c) wie bei den stillen Dingern unterdrücken sie nur die Ausgabe von Befehlen. d):nohlsearch verhindert, daß die sed-Suche hervorgehoben wird

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X