Vim,上下文敏感的注释/取消注释行为


9

我用Vim编辑了许多PHP代码,但遇到了一些宏.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是否有办法检测它是否正在处理PHP文件中的HTML代码块,然后应用正确的注释行为?

编辑:我知道我可以手动设置文件类型,并且有为此可用的插件,我希望了解有关编写更好的宏的更多信息。


Answers:


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.