Vim, контекстно-залежна коментована поведінка


9

Я редагую багато PHP-коду з Vim, і я наткнувся на корч з деякими макросами у своєму .vimrc.

Зараз я використовую ці два макроси для коментарів / коментарів у стилі С

"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

І це двоє для коментарів / коментарів у стилі 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

Ці макроси прекрасно працюють, коли застосовуються до призначеного типу файлу, але оскільки у файлі PHP часто вбудований HTML, стиль коментування PHP марний.

Чи є спосіб Vim виявити, чи працює він на фрагменті HTML-коду всередині файлу PHP, а потім застосувати правильну поведінку коментування?

Редагувати: Я знаю, що я можу вручну встановити тип файлу, і що для цього є плагіни, я хотів дізнатися більше про написання кращих макросів.


2
Таким чином, ви начебто шукаєте аналог Vim до режиму MMM Emacs , що призводить до vim.wikia.com/wiki/…
перестаньте бути злим"

Відповіді:


2

Робити те, що ви хочете, насправді немає можливості обійтись написанням функції та відображенням її бажаних клавіш.

Для початку :echo synIDattr(synID(line("."), col("."), 1), "name")надрукуйте під курсором назву групи виділення для поточного слова.

Ви можете використовувати цю інформацію, щоб визначити, який стиль коментаря використовувати.

Прикладний приклад для початку роботи:

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

Якщо ви можете прийняти вручну вибрати тип коментаря, який ви хочете використовувати, я рекомендую цю пораду .

Вам слід запам'ятати 4 комбінації:

C-style:
,* comment  
,c uncomment

HTML style: 
,< comment 
,d uncomment
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.