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>
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
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>
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.

Das Kommentarzeichen // war ja nur ein Beispiel. Man kann es einfach an /* */ anpassen.
Praktisch wäre, wenn die Funktionen sich automatisch an den Filetype anpassen würden (das wäre etwas übersichtlicher, als die Funktionen bzw. die Definition das Kommentarzeichens über viele Files zu verteilen).
Auf die Schnelle habe ich jetzt nicht in der VimDocu finden können
wie man eine Variable innerhalb eines Regex verwendet - mal schauen....
Gruß
Marc
Dann benutzt man aber nicht :s/...., sondern die funktion substitute. Dort kann man dann auch Vim-Variablen entsprechend einsetzen.
Oder man sucht sich eines der vorhandenen Kommentar-Plugins. Die machen das schon out-of-the box, glaub ich.