Vim, контекстно-зависимый комментарий / раскомментирование


9

Я редактирую много PHP-кода с помощью Vim, и я столкнулся с проблемой с некоторыми макросами в моем .vimrc.

В настоящее время я использую эти два макроса, чтобы комментировать / раскомментировать в стиле 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

И эти два комментировать / раскомментировать в стиле 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.