Vim, comportement contextuel de commentaire / décommentation

9

J'édite beaucoup de code PHP avec Vim, et j'ai rencontré un problème avec quelques macros dans mon .vimrc.

J'utilise actuellement ces deux macros pour commenter / décommenter en style 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

Et ces deux pour commenter / décommenter dans le style 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

Ces macros fonctionnent bien lorsqu'elles sont appliquées à leur type de fichier prévu, mais comme il y a souvent du HTML incorporé dans un fichier PHP, le style de commentaire PHP est inutile.

Existe-t-il un moyen pour Vim de détecter s'il fonctionne sur un morceau de code HTML dans un fichier PHP, puis d'appliquer le comportement de commentaire correct?

Edit: Je sais que je peux définir manuellement le type de fichier, et qu'il existe des plugins disponibles pour cela, je cherchais à en savoir plus sur l'écriture de meilleures macros.

Sigma
la source
2
Donc, vous êtes en quelque sorte à la recherche d'un analogue de Vim au mode MMM d'Emacs , ce qui conduit à vim.wikia.com/wiki/…
Gilles 'SO- arrête d'être méchant'

Réponses:

2

Pour faire ce que vous voulez, il n'y a vraiment aucun moyen de contourner l'écriture d'une fonction et de la mapper avec vos touches préférées.

Pour commencer :echo synIDattr(synID(line("."), col("."), 1), "name"), imprimera le nom du groupe de surbrillance pour le mot actuel sous le curseur.

Vous pouvez utiliser ces informations pour déterminer le style de commentaire à utiliser.

Un exemple grossier pour vous aider à démarrer:

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
la source
0

Dans le cas où vous pouvez accepter de choisir manuellement le type de commentaire que vous souhaitez utiliser, je recommanderais cette astuce .

Vous auriez 4 combinaisons à retenir:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
Aurelien
la source