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.


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>

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.