Vim, kontextsensitives Kommentar- / Kommentarverhalten

9

Ich bearbeite viel PHP-Code mit Vim und bin auf einen Haken mit einigen Makros gestoßen .vimrc.

Ich benutze derzeit diese beiden Makros, um im C-Stil zu kommentieren / zu kommentieren

"c-style (//) comment (press the [.] key)
au FileType php vnoremap . :s/^\(\s*\)\(.\+\)$/\1\/\/\2/<CR>:noh<CR>gv
"c-style (//) uncomment (press the [,] key)
au FileType php vnoremap , :s/^\(\s*\)\/\//\1/<CR>:noh<CR>gv

Und diese beiden im HTML-Stil zu kommentieren / zu kommentieren

"html-style (<!-- -->) comment (press the [.] key)
au FileType html vnoremap . :s/^\(\s*\)\(.\+\)$/\1<!-- \2 -->/g<CR>:noh<CR>gv
"html-style (<!-- -->) uncomment (press the [,] key)
au FileType html vnoremap , :s/^\(\s*\)<!-- \(.*\) -->/\1\2/g<CR>:noh<CR>gv

Diese Makros funktionieren einwandfrei, wenn sie auf den beabsichtigten Dateityp angewendet werden. Da jedoch häufig HTML in eine PHP-Datei eingebettet ist, ist der PHP-Kommentarstil nutzlos.

Gibt es eine Möglichkeit für Vim, zu erkennen, ob ein Teil des HTML-Codes in einer PHP-Datei bearbeitet wird, und dann das richtige Kommentierungsverhalten anzuwenden?

Bearbeiten: Ich weiß, dass ich den Dateityp manuell einstellen kann und dass dafür Plugins verfügbar sind. Ich wollte mehr über das Schreiben besserer Makros erfahren.

Sigma
quelle
2
Sie suchen also nach einem Vim-Analogon zum MMM-Modus von Emacs , was dazu führt, dass vim.wikia.com/wiki/…
Gilles '

Antworten:

2

Um das zu tun, was Sie wollen, gibt es wirklich keine Möglichkeit, eine Funktion zu schreiben und sie Ihren bevorzugten Tasten zuzuordnen.

Zunächst :echo synIDattr(synID(line("."), col("."), 1), "name")wird der Name der Markierungsgruppe für das aktuelle Wort unter dem Cursor gedruckt.

Mithilfe dieser Informationen können Sie bestimmen, welcher Kommentarstil verwendet werden soll.

Ein grobes Beispiel für den Einstieg:

function! s:MyComment () range
    for i in range(a:firstline, a:lastline)
        exe "normal " . i . "gg"
        normal ^
        let stuff = synIDattr(synID(line("."), col("."), 1), "name")
        if strpart(stuff, 0, 4) == "html"
            normal I<!-- 
            normal A -->
        else
            normal I//
        endif
    endfor
endfunction
vmap <silent> . :call <SID>MyComment()<CR>
k.parnell
quelle
0

Falls Sie akzeptieren können, manuell auszuwählen, welche Art von Kommentar Sie verwenden möchten, würde ich diesen Tipp empfehlen .

Sie müssen sich 4 Kombinationen merken:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
Aurelien
quelle