我使用 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 代码块,然后应用正确的注释行为?
编辑:我知道我可以手动设置文件类型,并且有可用的插件,我希望了解有关编写更好的宏的更多信息。
答案1
为了做你想做的事,确实没有办法绕过编写一个函数并将其映射到你的首选键。
首先,: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>
答案2
如果您可以接受手动选择要使用的评论类型,我会推荐这个提示。
您需要记住 4 种组合:
C-style:
,* comment
,c uncomment
HTML style:
,< comment
,d uncomment