So kommentieren Sie einen Python-Codeblock in Vim aus

186

Ich habe mich gefragt, ob es in Vim eine Tastenbelegung gibt, mit der ich bestimmte Codezeilen einrücken kann (ob diese Zeilen im visuellen Modus ausgewählt wurden oder n Zeilen über / unter der aktuellen Cursorposition).

Also im Grunde etwas, das Folgendes umwandelt

def my_fun(x, y):
    return x + y

zu

#def my_fun(x, y):
#    return x + y

Ich bin damit einverstanden, entweder #oder """zum Auskommentieren der relevanten Zeilen zu verwenden. Idealerweise möchte ich auch, dass das gleiche Keymapping die Zeilen auskommentiert, wenn die angegebenen Zeilen auskommentiert wurden.

Rishabh Manocha
quelle
Sie müssen das Rad nicht neu erfinden, es gibt ein Plugin: tComment für Sie, das (un) Kommentarcode für mehrere Sprachen unterstützt.
Miau

Antworten:

410

Schritt 1: Gehen Sie zur ersten Spalte der ersten Zeile, die Sie kommentieren möchten.

Ausgangszustand

Schritt 2: Drücken Sie: Ctrl+ vund wählen Sie die Zeilen aus, die Sie kommentieren möchten:

Linien auswählen

Schritt 3: Shift - I#space(Rufen Sie den Einfügemodus links auf und geben Sie die einzufügenden Zeichen ein. Die Auswahl wird ausgeblendet, aber alle darin enthaltenen Zeilen werden nach Schritt 4 geändert.)

Kommentar

Schritt 4: Esc

<Esc>

theosp
quelle
4
Das Kommentieren der Zeilen auf diese Weise funktioniert hervorragend. Gibt es eine Möglichkeit, diese Zeilen zu kommentieren? Shift-I # <ESC>hat nicht funktioniert (vielleicht mache ich es falsch).
Rishabh Manocha
41
@ rishabh-manocha: Verwenden Sie den visuellen Block (Strg-V), um alle hinzugefügten # auszuwählen, und geben Sie x ein, um sie zu löschen.
Theosp
3
Sie müssen sich daran erinnern, dass Shift-I "beim ersten Nicht-Leerzeichen in der Zeile einfügen" bedeutet, sodass es nicht zum Löschen verwendet werden kann. Wenn Sie mit Strg-V eine visuelle Auswahl treffen, werden die zu ändernden Zeichen markiert. Mit "x" wird ein Zeichen im ausgewählten Bereich gelöscht, und am Ende werden die Zeichen "#" gelöscht. Weitere Informationen finden Sie unter ": h I" und ": h CTRL-V" in vim.
der Blechmann
5
@ Samasursa Strg-V funktioniert wahrscheinlich nicht unter Windows. Versuchen Sie stattdessen Strg-Q.
AZ.
1
Um 2 Zeichen zu löschen (wenn Sie '#' eingefügt haben), suchen Sie den Cursor in der obersten Zeile, die Sie ändern möchten. Drücken Sie Strg-V, um den visuellen Blockmodus aufzurufen. Drücken Sie j (oder den Abwärtspfeil), um alle zu ändernden Zeilen hervorzuheben. Drücken Sie l (oder Pfeil nach rechts), um eine Breite von 2 Zeichen hervorzuheben (drücken Sie einmal pro Spalte, um sie hervorzuheben), und drücken Sie dann d, um den markierten Text zu löschen.
Thinkmassive
72

eine Möglichkeit manuell

:set number
:10,12s/^/#
Ghostdog74
quelle
4
Wie entfernst du sie?
Charlie Parker
15
@CharlieParker::10,12s/^#//
Bstpierre
1
Daumen hoch für Ex-Antwort (alte Schule :)
mlv
49

Sie können Ihrer .vimrc die folgende Zuordnung hinzufügen

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

Markieren Sie Ihren Block mit:

Shift+v

# um Ihre Zeilen aus der ersten Spalte zu kommentieren.

-# auf die gleiche Weise zu kommentieren.

cdated
quelle
5
Einfach ist genial! Danke!
I159
1
@architectonic hat keine Auswirkung, es sei denn, Sie befinden sich im visuellen Modus, und '#' ist im visuellen Modus ungebunden. vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators
aktualisiert
1
Ich habe ein wenig geändert: Strg + k für Kommentar "vnoremap <silent> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Strg + u für Kommentar: "vnoremap <silent> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das
1
@JonathanHartley Sie müssen nicht '/' verwenden, in diesem Fall ist '#' das Trennzeichen. Also: s / ^ / # / und: s / ^ # // sind die äquivalenten Substitutionen. Ersetzen Sie also den Zeilenanfang durch '#' und '#' in der ersten Spalte durch ''. <cr>: noh <cr> löscht nur die Suchzeichenfolge, sodass nach Abschluss nichts mehr hervorgehoben wird.
Uhr aktualisiert
1
@ JonathanHartley Ehrlich gesagt denke ich, ich bin einfach einem Muster gefolgt, ohne darüber nachzudenken. Jetzt bin ich überrascht, dass # vs / nicht früher aufgetaucht ist. Die Antwort wurde aufgrund des gesunden Menschenverstandes geändert. Vielen Dank!
Datum
26

Markieren Sie Ihren Block mit: ShiftV

Kommentieren Sie den ausgewählten Block mit: :norm i#(Kleinbuchstabe i)

Um den Kommentar zu entfernen, markieren Sie Ihren Block erneut und kommentieren Sie Folgendes aus: :norm ^x

Der :normBefehl führt für jede ausgewählte Zeile eine Aktion aus. Beim Kommentieren wird #am Anfang jeder Zeile ein eingefügt, beim Kommentieren wird dies gelöscht #.

user2437225
quelle
Mit einem aktuellen Vim und einer einfachen Konfiguration ändert das Auswählen von Zeilen im visuellen Modus (mit Shift+v) und die anschließende Verwendung :norm i#nur die erste ausgewählte Zeile. Dies funktioniert für mich, um die Zeilen 389 bis 391 zu kommentieren::389,391norm i #
mmell
22

Normalerweise fege ich einen visuellen Block ( <C-V>) aus, suche und ersetze das erste Zeichen durch:

:'<,'>s/^/#

(Wenn Sie den Befehlsmodus mit einem ausgewählten visuellen Block aufrufen, wird '<,'> automatisch in die Befehlszeile eingefügt.) Ich kann den Block dann auskommentieren, indem ich denselben visuellen Block auswische und:

:'<,'>s/^#//

quelle
19

Es gibt einige gute Plugins, die beim Kommentieren / Kommentieren von Zeilen helfen. Zum Beispiel Der NERD-Kommentator .

Geoff Reedy
quelle
9

Ich habe die folgenden Zeilen in meinem .vimrc:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

Die Verknüpfungen behalten Ihre Cursorposition und Ihre Kommentare bei, solange sie beginnen #(nach # steht ein Leerzeichen). Beispielsweise:

# variable x
x = 0

Nach dem Kommentieren:

# variable x
#x = 0

Nach dem Auftakt:

# variable x
x = 0
Lukas Cenovsky
quelle
Schön, aber ich denke, Sie sind besser dran, wenn Sie den einfacheren s/^/#/regulären Ausdruck verwenden. Ich bevorzuge, dass das Kommentarzeichen am Anfang der Zeile steht ... aber viel wichtiger ist, dass das Kommentieren von Kommentaren wirklich ziemlich wichtig ist. Ich würde auch das löschen au BufEnter *.py, da #Kommentare allgemein genug sind, damit die Befehle standardmäßig in allen Puffern verwendet werden.
Travc
5

Ehrlich gesagt benutze ich ein Tcomment Plugin für diesen Link . Es kann fast jede Syntax verarbeiten. Es definiert nette Bewegungen und macht es mit einigen für Python spezifischen Textblock-Matchern zu einem leistungsstarken Werkzeug.

Darek
quelle
5

NERDcommenter ist ein hervorragendes Plugin zum Kommentieren, das automatisch eine Reihe von Dateitypen und die zugehörigen Kommentarzeichen erkennt. Lächerlich einfach mit Pathogen zu installieren .

Kommentar mit <leader>cc. Kommentar mit <leader>cu. Und Kommentare umschalten mit <leader>c<space>.

(Der Standardschlüssel <leader>in vim ist \)

Abid H. Mujtaba
quelle
3

Es gibt viele Kommentar-Plugins für vim - von denen einige mehrsprachig sind - nicht nur Python. Wenn Sie einen Plugin-Manager wie Vundle verwenden , können Sie nach diesen suchen (sobald Sie Vundle installiert haben), indem Sie z.

:PluginSearch comment

Und Sie erhalten ein Fenster mit Ergebnissen. Alternativ können Sie auch vim-Skripte nach Kommentar-Plugins durchsuchen .

Pierz
quelle
3

Keine Plugins oder Mappings erforderlich. Probieren Sie den integrierten Befehl "norm" aus, der buchstäblich alles ausführt, was Sie in jeder ausgewählten Zeile wollen.

Füge Kommentare hinzu

1. shift V to visually select lines
2. :norm i#

# Kommentare entfernen

1. visually select region as before
2. :norm x

Oder wenn Ihre Kommentare eingerückt sind, können Sie dies tun :norm ^x

Beachten Sie, dass dies nur gewöhnliche vim-Befehle sind, denen ": norm" vorangestellt ist, um sie in jeder Zeile auszuführen.

Detailliertere Antwort für die Verwendung des Befehls "norm" in einer der Antworten hier

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

Magnus
quelle
1

Ein sehr minimales, leichtes Plugin : vim-comment.

gcceine Zeile
gcgczu kommentieren, um zu kommentieren . Weitere Informationen finden Sie auf der Plugin-Seite.

v+k/jMarkieren Sie dann den Block, gccum diesen Block zu kommentieren.

yantaq
quelle
0

CtrlK für einen Kommentar (visueller Modus):

vnoremap <silent> <C-k> :s#^#\##<cr>:noh<cr>

CtrlU zum Kommentieren (visueller Modus):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
Pradip Das
quelle