Vim, commento sensibile al contesto / comportamento di commento


9

Modifico molto codice PHP con Vim e mi sono imbattuto in alcuni problemi con il mio .vimrc.

Attualmente uso queste due macro per commentare / decommentare in stile 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

E questi due commentano / commentano in stile 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

Queste macro funzionano bene se applicate al tipo di file previsto, ma poiché spesso è incorporato HTML in un file PHP, lo stile di commento PHP è inutile.

Esiste un modo per Vim di rilevare se funziona su un pezzo di codice HTML all'interno di un file PHP e quindi applicare il comportamento corretto dei commenti?

Modifica: so che posso impostare manualmente il tipo di file e che ci sono plugin disponibili per questo, stavo cercando di saperne di più su come scrivere macro migliori.


Risposte:


2

Per fare quello che vuoi non c'è davvero modo di aggirare la scrittura di una funzione e la mappatura dei tuoi tasti preferiti.

Per iniziare, :echo synIDattr(synID(line("."), col("."), 1), "name")verrà stampato il nome del gruppo di evidenziazione per la parola corrente sotto il cursore.

È possibile utilizzare tali informazioni per determinare quale stile di commento utilizzare.

Un esempio approssimativo per iniziare:

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

Nel caso in cui sia possibile accettare di scegliere manualmente il tipo di commento che si desidera utilizzare, consiglierei questo suggerimento .

Avresti 4 combinazioni da ricordare:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.