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

21voto

Andy Punkte 1106

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

Zum Kommentar:

wenn die Zeile keinen Tabulator/Leerzeichen am Anfang hat:
ctrl + V puis jjj puis shift + I (cappital i) puis // dann esc esc
wenn die Zeile am Anfang einen Tabulator/Leerzeichen hat, können Sie immer noch das oben genannte tun oder durch c :
ctrl + V puis jjj puis c puis // dann esc esc

Zum Auskommentieren:

wenn die Zeilen keinen Tabulator/Leerzeichen am Anfang haben:
ctrl + V puis jjj puis ll (lower cap L) puis c

wenn die Zeilen am Anfang Tabulatoren/Leerzeichen haben, dann wird eine Zeile übersprungen und esc
ctrl + V puis jjj puis ll (lower cap L) puis c puis space puis esc

20voto

innaM Punkte 46916

Hier ist ein Ausschnitt aus meinem .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 im visuellen Modus kann ich damit die ,ic um Kommentare einzufügen und ,rc um Kommentare zu entfernen.

0 Stimmen

Dies ist sehr hilfreich für einen Anfänger, der das Schreiben lernen will. .vimrc .

6 Stimmen

map deckt den normalen und den visuellen Modus ab, so dass Sie nicht die vmap Zeilen

0 Stimmen

Ein besserer Platz ist in after/ftplugin/ruby.vim .

20voto

Visuelle und Shift-I hat bei mir nicht funktioniert.

Das einfachste, das ohne Plugins funktioniert, ist


  1. Block auswählen - V puis j o k oder eine entsprechende Bewegung (keine Pfeiltasten verwenden) :)

  2. Dann drücken Sie : fordert es den Befehl auf :'<,'>

    Zum Kommentar

    Using #  - `s/^/#/` 
    
    Using `//` - `s/^/\/\//`

    Unkommentiert

    Using #  - `s/^#//` 
    
    Using `//` - `s/^\/\//`

Exaplanation -

'<,'> - Auf den Sichtblock anwenden

s - Ersatz

^ - beginnt mit

nach / Zeichen hinzufügen # in diesem Fall von \/\/ entflohen für //


更新情報

Ich habe eine Funktion zum Kommentieren und Dekommentieren der aktuellen Zeile mit <Space><Space>

Funktioniert zum Beispiel für die nächsten 10 Zeilen 10<Space><Space>

Einfügen in .vimrc

function CommentUncomment()
  let line = getline('.')
  if line[:1] == "//"
      norm ^2x
  else 
      norm I//
  endif
endfunction

nnoremap <Space><Space> :call CommentUncomment()<CR>

3 Stimmen

Dies ist bei weitem der einfachste Weg, den ich gefunden habe. In diesem Fall würde der vollständige Befehl zum Einfügen des Befehls lauten '<,'>s/^/#/g . Für mich würde es nicht funktionieren, wenn nicht hinzufügen /g at the end, which indicates the cursor to move at the end of the '<,'>` Bereich

1 Stimmen

Wenn Sie Nummernzeilen aktiviert haben, können Sie dies tun: :1,10 s/^/#/ die Zeilen 1 bis 10 zu kommentieren.

1 Stimmen

Sie müssen die Schrägstriche nicht auslassen, sondern nur ein anderes Trennzeichen verwenden: :s#^#//

19voto

mathewguest Punkte 573

Ich habe die Antworten von Phil und jqno kombiniert und Kommentare mit Leerzeichen untoggle gemacht:

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/\([^ ]\)/' . escape(b:comment_leader,'\/') . ' \1/'
    execute ':silent! s/^\( *\)' . escape(b:comment_leader,'\/') . ' \?' . escape(b:comment_leader,'\/') . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>

wie es funktioniert:

Gehen wir davon aus, dass wir mit #-Kommentaren arbeiten.

Der erste Befehl s/\([^ ]\)/# \1/ sucht nach dem ersten Zeichen ohne Leerzeichen [^ ] und ersetzt diese durch # + itself . Die Selbstersetzung erfolgt durch die \(..\) in den Suchmustern und \1 im Ersetzungsmuster.

Der zweite Befehl s/^\( *\)# \?# \?/\1/ sucht nach Zeilen, die mit einem doppelten Kommentar beginnen ^\( *\)# \?# \? (wobei 0 oder 1 Leerzeichen zwischen den Kommentaren zulässig sind) und ersetzt diese einfach durch den Teil ohne Kommentar \( *\) (d.h. die gleiche Anzahl von Leerzeichen davor).

Für weitere Details über Vim-Muster siehe diese aus.

11voto

uckelman Punkte 24070

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

0 Stimmen

Eigentlich müsste es wohl heißen: n,ms/^ \s. #// Weil Sie möglicherweise ein Leerzeichen am Anfang haben und der Raute kein Leerzeichen folgt

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