Frage Was ist eine schnelle Möglichkeit, Zeilen in Vim zu kommentieren / auszukommentieren?


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 Kommentar entfernen def ... end Sektion. Was ist ein effizienter Weg, das in Vim zu tun?

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


835
2017-11-04 21:06


Ursprung


Antworten:


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

Wie in der Bemerkungen:

Für jeden, der durch die Verwendung verwirrt ist, ist der Standard-Vorspann "\", so dass 10 \ cc zehn Zeilen kommentiert und 10 \ cu diese zehn Zeilen auskommentiert


155
2017-11-04 21:33



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

Setzen Sie den Cursor auf den ersten # Zeichen, drücken Sie StrgV (oder StrgQ für gVim), und gehen Sie bis zur letzten kommentierten Zeile und drücken Sie x, das wird alle löschen # Zeichen vertikal.

Zum Kommentieren ist ein Textblock fast gleich:

  1. Gehen Sie zuerst zur ersten Zeile, die Sie kommentieren möchten, und drücken Sie StrgV. Dies bringt den Editor in die VISUAL BLOCK Modus.
  2. Dann mit der Pfeiltaste und bis zur letzten Zeile auswählen
  3. Jetzt drücken Verschiebungich, in den der Editor eingefügt wird INSERT Modus und drücken Sie dann #. Dies fügt der ersten Zeile einen Hash hinzu.
  4. Dann drücken Esc (geben Sie es eine Sekunde), und es wird ein einfügen # Zeichen auf allen anderen ausgewählten Zeilen.

Geben Sie für die abgespeckte Version von vim, die standardmäßig mit debian / ubuntu ausgeliefert wird, ein : s/^/# im dritten Schritt stattdessen.


1734
2017-11-04 21:16



Blöcke in vim auskommentieren:

  • Drücken Sie Esc (um den Bearbeitungsmodus oder anderen Modus zu verlassen)
  • schlagen Strg+v (visueller Blockmodus)
  • benutze die Pfeiltasten um die gewünschten Zeilen auszuwählen (es wird nicht alles hervorgehoben - es ist OK!)
  • Verschiebung+ich (Hauptstadt I)
  • Fügen Sie den gewünschten Text ein, z. %
  • Drücken Sie EscEsc

Um Blöcke in vim auszukommentieren:

  • Drücken Sie Esc (um den Bearbeitungsmodus oder anderen Modus zu verlassen)
  • schlagen Strg+v (visueller Blockmodus)
  • benutze die / Pfeiltasten, um die zu entfernenden Zeilen auszuwählen.

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

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

  • Drücken Sie d oder x um Zeichen zu löschen, bei Bedarf wiederholt

671
2018-03-23 15:54



Manchmal werde ich in eine Remotebox geschleudert, wo mir meine Plugins und .vimrc nicht helfen können, oder manchmal stimmt es mit NerdCommenter falsch (zB JavaScript in HTML eingebettet).

In diesen Fällen ist eine Low-Tech-Alternative das eingebaute norm Befehl, der nur jede beliebige vim-Befehle an jeder Zeile in Ihrem angegebenen Bereich ausführt. Beispielsweise:

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, dass wenn Sie tippen: der Bereich wird ausgefüllt, so wird es wirklich aussehen :'<,'>norm i#

Uncommentation  #:

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

Dies löscht das erste Zeichen jeder Zeile. Wenn ich einen 2-Char-Kommentar wie // verwendet hätte, würde ich es einfach tun :norm xx um beide Zeichen zu löschen.

Wenn die Kommentare wie in der OP-Frage eingerückt sind, können Sie Ihre Löschung folgendermaßen verankern:

:norm ^x

was bedeutet "gehe zum ersten Nicht-Leerzeichen, dann lösche ein Zeichen".

Hinweis: Schon seit norm führt im Grunde nur normale vim-Befehle aus, Sie sind nicht nur auf Kommentare beschränkt, Sie können jede Zeile komplex bearbeiten. Wenn Sie das Escapezeichen als Teil Ihrer Befehlssequenz benötigen, geben Sie ctrl-v ein und drücken Sie die Escape-Taste.

Anmerkung 2: Sie können natürlich auch ein Mapping hinzufügen, wenn Sie sich selbst verwenden norm viel. Wenn Sie beispielsweise die folgende Zeile in ~ / .vimrc einfügen, können Sie tippen ctrl-n Anstatt von :norm nachdem Sie Ihre visuelle Auswahl getroffen haben

vnoremap <C-n> :norm

Notiz 3: Bare-bones vim hat manchmal nicht die norm Befehl, der darin kompiliert wird, also sicher sein, die verstärkte Version zu benutzen, dh normalerweise / usr / bin / vim, nicht / bin / vi

(Danke an @Manboski und @rakslice für Verbesserungen in dieser Antwort enthalten)


210
2018-04-14 14:44



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 tippen ,cc eine Zeile 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, so kann ich nicht mehr erklären, wie es funktioniert :). Da ist ein Kommentar wo es erklärt wird.)


102
2017-11-04 21:14



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

Enthülle die Zeilennummern:

:set number

dann

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

oder dieses:

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

82
2017-11-05 18:07



Hier ist, wie ich es mache:

  1. Gehe zum ersten Zeichen in der ersten Zeile, die du auskommentieren möchtest.

  2. Schlagen Strg+q in GVIM oder Strg+v in VIM, dann gehe nach unten, um das erste Zeichen in den Zeilen auszuwählen, um es auskommentieren zu lassen.

  3. Dann drücken c, und fügen Sie das Kommentarzeichen hinzu.

Das Kommentieren funktioniert auf die gleiche Weise. Geben Sie einfach ein Leerzeichen anstelle des Kommentarzeichens ein.


47
2017-11-04 21:13



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

Ich habe ein Mapping zu den normalen und visuellen Modi hinzugefügt, aber Sie können zu allem, was Sie möchten, neu zuordnen. Ich bevorzuge nur eine "Toggle" -Stil-Funktion. Ein Bär trägt mehrere Abbildungen usw.

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 Callbacks oder Hooks in den Dateitypen / loading, weil ich finde, dass sie Vim's Startup mehr verlangsamen als die .vimrc statische Funktion / Karte tut das aber nur meine Vorliebe. Ich habe auch versucht, es einfach und leistungsfähig zu halten. Wenn Sie Autocommands verwenden, müssen Sie sicherstellen, dass sie in eine Autocommand-Gruppe eingefügt werden, da sonst die Callbacks mehrmals zum Dateityp hinzugefügt werden und eine erhebliche Leistungseinbuße verursachen.


28
2018-06-04 20:24



Verwenden Sie Strg-V, um Textrechtecke auszuwählen: Gehen Sie zur ersten #Zeichen, geben Sie ein Strg+V, bewege dich einmal nach rechts und dann nach unten, bis zum Ende der Kommentare. Jetzt tippen x: Sie löschen alle # Zeichen gefolgt von einem Leerzeichen.


22
2017-11-04 21:11



Kommentare umschalten

Wenn alles was du brauchst ist Kommentare umschalten Ich würde lieber mitgehen Kommentar.Vim durch tpope.

enter image description here

Installation

Erreger:

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

Vim-Stecker:

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 durch Drücken von wechseln Leader+/, genau wie Sublime und Atom.


20
2017-10-21 03:07



Drücken Sie zuerst -> StrgV

Drücken Sie die Pfeiltaste nach oben oder unten

Dann drücken Sie -> Verschiebungich

Dann fügen Sie einen Kommentar mit -> ein Verschiebung#

Esc


16
2017-10-23 06:01