Vim, comportamento de comentário / comentário sensível ao contexto

9

Eu edito muito código PHP com o Vim, e tenho um problema com algumas macros no meu .vimrc .

Atualmente, uso essas duas macros para comentar / descomentar no estilo C

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

E estes dois para comentar / descomentar no estilo HTML

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

Essas macros funcionam bem quando aplicadas ao tipo de arquivo pretendido, mas como geralmente há HTML embutido em um arquivo PHP, o estilo de comentários do PHP é inútil.

Existe uma maneira do Vim detectar se está trabalhando em um trecho de código HTML dentro de um arquivo PHP e, em seguida, aplicar o comportamento de comentário correto?

Edit: Eu sei que eu posso definir manualmente o tipo de arquivo, e que existem plugins disponíveis para isso, eu estava olhando para aprender mais sobre como escrever melhores macros.

    
por Sigma 06.07.2011 / 21:24

2 respostas

2

Para fazer o que você quer, não há como escrever uma função e mapear suas chaves preferidas.

Para começar, :echo synIDattr(synID(line("."), col("."), 1), "name") imprimirá o nome do grupo de destaque da palavra atual sob o cursor.

Você pode usar essas informações para determinar qual estilo de comentário usar.

Um exemplo aproximado para você começar:

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>
    
por 06.10.2011 / 17:40
0

Caso você possa optar por escolher manualmente o tipo de comentário que deseja usar, eu recomendaria essa dica .

Você teria 4 combinações para lembrar:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
    
por 04.03.2012 / 16:15

Tags