Wer kennt das nicht: Schnell mal im Programm ein paar Zeilen auskommentieren. Nun kann man mühsam in jede Zeile gehen und dort am Anfang das Kommentarzeichen eingeben. Wer etwas schlauer ist, nutzt vielleicht auch Suchen und Ersetzen über den selektierten Text. Das hat leider oft den Nachteil, dass dann auch bereits leere Zeilen auskommentiert werden, oder bereits auskommentierte noch einmal, was dann ärgerlich ist, wenn man die Kommentierung wieder entfernen möchte.
Die Methode mit Suchen und Ersetzen kann man dann noch auf eine Tastenkombination legen und schon hat man eine schnelle Möglichkeit, einen selektierten Text auszukommentieren oder das Kommentarzeichen wieder zu entfernen (sofern eines vorhanden ist).
Das geht so:
CODE:
" Auskommentieren (Merke: COmment)
vmap <silent> <leader>co :<C-U>sil! '<,'>s/^[^//].*$/\/\/&/<CR>
" Einkommentieren (Merke: UnCOmment)
vmap <silent> <leader>uco :<C-U>sil! '<,'>s/^\/\/\(.*\)$/\1/<CR>
Erklärung des ersten Mappings
vmap - Mappe im Selektionsmodus
<silent> - Ohne dass das Mapping in der Command-line erscheint
<leader>co - die zu drückende Tastenkombination (normalerweise '\co')
: - Gehe in den Command-line Modues (Ex-Kommandos)
<C-U> - lösche alle eingefügten Zeichen bis zum Anfang (hier werden standardmäßig die Marker '<,'> eingefügt, die aber nicht mit sil funktionieren)
sil! - führe das nachfolgende Kommando aus, ohne irgendwelchen Output zu geben (z.B. keine Fehlermeldungen)
'<,'> - im Bereich des selektierten Textes
s - Suche
/^[^//].*$ - alle Zeilen, die nicht mit einem Kommentarzeichen anfangen und die nicht leer sind und
/\/\/&/ - ersetze diese Zeilen mit den Kommentarzeichen // gefolgt vom gematchten String (& steht für den gematchten String aus dem ersten Teil von :s)
<CR> - Enter (Kommando fertig, führe aus)
Erklärung des zweiten Mappings
vmap - Mappe im Selektionsmodus
<silent> - Ohne dass das Mapping in der Command-line erscheint
<leader>uco - die zu drückende Tastenkombination (normalerweise '\uco')
: - Gehe in den Command-line Modues (Ex-Kommandos)
<C-U> - lösche alle eingefügten Zeichen bis zum Anfang (hier werden standardmäßig die Marker '<,'> eingefügt, die aber nicht mit sil funktionieren)
sil! - führe das nachfolgende Kommando aus, ohne irgendwelchen Output zu geben (z.B. keine Fehlermeldungen)
'<'> - im Bereich des selektierten Textes
s - Suche
/^\/\/\(.*\)$/ - alle Zeilen, die mit einem Kommentarzeichen anfangen und die nicht leer sind und
/\1/ - entferne in diesen Zeilen das Kommentarzeichen
<CR> - Enter (Kommando fertig, führe aus)
Das einzig nervige ist jetzt noch ein gesetztes :hls. Damit werden alle Fundstellen markiert nach denen gesucht wurde. Das sind nur dummerweise gerade fast alle Zeilen. Um dies zu umgehen, bietet es sich an, diese Funktionalität in eine Funktion auszulagern (oder besser zwei):
CODE:
function! UnComment()
let s:oldSearch=@/
s/^\/\/\(.*\)$/\1/
let @/=s:oldSearch
endfunction
function! Comment()
let s:oldSearch=@/
s/^[^//].*$/\/\/&/
let @/=s:oldSearch
endfunction
In diesen Funktionen werden einfach die letzten Suchmuster gesichert, dann wird neu gesucht und hinterher das Suchmuster wieder zurück gesetzt. Damit kann man jetzt folgendes einer Taste zuweisen:
CODE:
vmap <silent> <leader>co :<C-U>sil! '<,'>:call Comment()<CR>
vmap <silent> <leader>uco :<C-U>sil! '<,'>:call UnComment()<CR>
Die Beispiele sollten so in eine der Dateien geschrieben werden, die von Vim beim Start gelesen werden. In diesem Fall böte es sich an, die Definitionen in die Datei ~/.vim/after/php.vim zu schreiben, da // ein Kommentarzeichen von PHP ist. Im after-Verzeichnis werden Dateityp-abhängige Einstellungen geschrieben, die die Vim-Defaults ändern können (diese Datei wird erst nach dem einlesen der Systemweiten Plugins eingelesen).
Testen kann man das, indem man eine .php Datei öffnet, einen Bereich markiert (z.B. mit 'V' im Normalmodus) und dann \co bzw. \uco tippt.