Vim, komentar peka konteks / perilaku tidak komentar


9

Saya mengedit banyak kode PHP dengan Vim, dan saya mengalami hambatan dengan beberapa makro di komputer saya .vimrc.

Saat ini saya menggunakan dua makro ini untuk berkomentar / batalkan komentar dalam gaya-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

Dan keduanya memberi komentar / tanda komentar dalam gaya 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

Makro ini berfungsi dengan baik bila diterapkan pada tipe file yang dimaksudkan, tetapi karena sering ada HTML yang tertanam di dalam file PHP, gaya berkomentar PHP tidak berguna.

Apakah ada cara bagi Vim untuk mendeteksi jika itu bekerja pada sepotong kode HTML di dalam file PHP, dan kemudian menerapkan perilaku berkomentar yang benar?

Sunting: Saya tahu bahwa saya dapat secara manual mengatur filetype, dan bahwa ada plugins yang tersedia untuk ini, saya ingin belajar lebih banyak tentang cara menulis makro yang lebih baik.


Jawaban:


2

Untuk melakukan apa yang Anda inginkan, benar-benar tidak ada cara untuk menulis fungsi dan memetakannya tombol pilihan Anda.

Untuk memulai :echo synIDattr(synID(line("."), col("."), 1), "name")akan mencetak nama grup sorotan untuk kata saat ini di bawah kursor.

Anda dapat menggunakan informasi itu untuk menentukan gaya komentar mana yang akan digunakan.

Contoh kasar untuk memulai:

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

Jika Anda dapat menerima untuk memilih secara manual jenis komentar yang ingin Anda gunakan, saya akan merekomendasikan tip ini .

Anda akan memiliki 4 kombinasi untuk diingat:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.