Vim, comentario sensible al contexto / comportamiento de comentario

9

Edito una gran cantidad de código PHP con Vim, y me he encontrado con un problema con algunas macros en mi .vimrc.

Actualmente uso estas dos macros para comentar / descomentar en estilo 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

Y estos dos para comentar / descomentar en estilo 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

Estas macros funcionan bien cuando se aplican a su tipo de archivo deseado, pero dado que a menudo hay HTML incrustado dentro de un archivo PHP, el estilo de comentario PHP es inútil.

¿Hay alguna forma de que Vim detecte si está trabajando en un fragmento de código HTML dentro de un archivo PHP y luego aplique el comportamiento de comentario correcto?

Editar: Sé que puedo configurar manualmente el tipo de archivo, y que hay complementos disponibles para esto, estaba buscando aprender más sobre cómo escribir mejores macros.

Sigma
fuente
2
Así que estás buscando un Vim análogo al modo MMM de Emacs , que lleva a vim.wikia.com/wiki/…
Gilles 'SO- deja de ser malvado'

Respuestas:

2

Para hacer lo que desea, realmente no hay forma de evitar escribir una función y asignarla a sus teclas preferidas.

Para comenzar :echo synIDattr(synID(line("."), col("."), 1), "name"), imprimirá el nombre del grupo resaltado para la palabra actual debajo del cursor.

Puede usar esa información para determinar qué estilo de comentario usar.

Un ejemplo aproximado para comenzar:

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
fuente
0

En caso de que pueda aceptar elegir manualmente qué tipo de comentario desea utilizar, le recomendaría este consejo .

Tendrías 4 combinaciones para recordar:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
Aurelien
fuente