Vim, kontekstowe zachowanie komentujące / niekomentujące

9

Edytuję dużo kodu PHP w Vimie i wpadłem w kłopoty z kilkoma makrami w sobie .vimrc.

Obecnie używam tych dwóch makr do komentowania / usuwania komentarzy w stylu C.

"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

I tych dwóch do komentowania / odkomentowania w stylu HTML

"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

Te makra działają dobrze, gdy są stosowane do zamierzonego typu pliku, ale ponieważ w pliku PHP często osadzony jest HTML, styl komentowania PHP jest bezużyteczny.

Czy istnieje sposób, aby Vim wykrył, czy działa na kawałku kodu HTML w pliku PHP, a następnie zastosował prawidłowe zachowanie związane z komentowaniem?

Edycja: Wiem, że mogę ręcznie ustawić typ pliku i że są do tego dostępne wtyczki, chciałem dowiedzieć się więcej o pisaniu lepszych makr.

Sigma
źródło
2
Więc szukasz jakiegoś analogu Vima do trybu MMM Emacsa , który prowadzi do vim.wikia.com/wiki/...
Gilles 'SO- przestań być zły'

Odpowiedzi:

2

Aby zrobić to, co chcesz, naprawdę nie ma sposobu na obejście pisania funkcji i mapowanie jej na preferowane klawisze.

Aby rozpocząć :echo synIDattr(synID(line("."), col("."), 1), "name"), wydrukuje nazwę grupy wyróżnień dla bieżącego słowa pod kursorem.

Możesz użyć tych informacji, aby określić, który styl komentarza ma zostać użyty.

Szorstki przykład na początek:

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
źródło
0

Jeśli możesz ręcznie wybrać typ komentarza, którego chcesz użyć, polecam tę wskazówkę .

Będziesz mieć 4 kombinacje do zapamiętania:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
Aurelien
źródło