今天想弄一下VIM的函数高亮,结果搞了一个下午,才终于搞定。
首先是按照下面这个网址写了一个 ~/.vim/syntax/c.vim
http://blog.csdn.net/wooin/article/details/1858917
"========================================================
" Highlight All Function
"========================================================
syn match cFunction "/<[a-zA-Z_][a-zA-Z0-9]/>[^()])("me=e-2
syn match cFunction "/<[a-zA-Z][a-zA-Z_0-9]/>/s("me=e-1
hi cFunction gui=NONE guifg=#B5A1FF
"========================================================
" Highlight All Math Operator
"========================================================
" C math operators
syn match cMathOperator display "[-+/*/%=]"
" C pointer operators
syn match cPointerOperator display "->/|/."
" C logical operators - boolean results
syn match cLogicalOperator display "[!<>]=/="
syn match cLogicalOperator display "=="
" C bit operators
syn match cBinaryOperator display "/(&/||/|/^/|<>/)=/="
syn match cBinaryOperator display "/~"
syn match cBinaryOperatorError display "/~="
" More C logical operators - highlight in preference to binary
syn match cLogicalOperator display "&&/|||"
syn match cLogicalOperatorError display "/(&&/|||/)="
" Math Operator
hi cMathOperator guifg=#3EFFE2
hi cPointerOperator guifg=#3EFFE2
hi cLogicalOperator guifg=#3EFFE2
hi cBinaryOperator guifg=#3EFFE2
hi cBinaryOperatorError guifg=#3EFFE2
hi cLogicalOperator guifg=#3EFFE2
hi cLogicalOperatorError guifg=#3EFFE2
但是非常悲剧的是这个用起来没有作用而且还报错。结果在下面的评论中才发现原来所有的 '/' 都
应该是 '\'。
按照下面这个网址改了一下,但是还是悲剧。虽然不报错了,但是函数还是没有高亮。
http://www.cppblog.com/besterChen/archive/2010/02/21/108124.aspx
然后找到另外一个网址,内容如下:
"highlight Functions
syn match cFuntions display "[a-zA-Z_]{-1,}\s{-0,}({1}"ms=s,me=e-1
hi def link cFuntions Title
就是先定义一个语法匹配,然后将匹配的高亮设为Title(深红色的函数高亮,很像Visual Asist)。当然也可以设为其他的高亮定义,自己定义颜色也行。
- 使用下面的命令来获得颜色组的完整列表:
so $VIMRUNTIME/syntax/hitest.vim
我把颜色的那一句改为hi def link cFuntions Title,终于有变化了,这个原因我继续向下找。
在下面这个网址我找到了部分线索。
首先使用VIM和VI的非兼容模式,在~/.vimrc中使用 set cp
- 然后打开一个 c文件
- set cp?
就可以知道现在是否兼容.
然后在 ~/.vimrc 中加入下面的内容
代码:
nnoremap :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"
这个是解除 ctrl+h 绑定 光标左移的功能
- 目的是为了确认到底是没有成功设置颜色组还是没有成功设置颜色。
- 代码:
- set ft
确认文件类型是 c 或者 cpp,然后把光标移到应该高亮但没有高亮的地方按下 Ctrl-H,看看能不能显示出你自己定义的高亮组名。
经过检查发现我是成功绑定了组,但就是不能成功高亮。
在下面的网址中,我得到了关键线索
Vim中对颜色(包括字体等其他样式)的设置是用hightlight命令,可简写为hi。例如对函数名的设置:
highlight Function cterm=bold,underline ctermbg=red ctermfg=green
这条命令可使函数名的字体改为粗体/有下划线/绿色/红色背景。除了Function关键字,还有String/Number/Float/Label,还有针对某门编程语言的关键字如:phpFunctions/phpType/phpFloat等。
这下就搞明白了。我是在字符界面使用vim的,cterm 这个不就是字符终端的意思么。 那么可以推测 gui 是在窗口界面下使用vim 或则 gvim 才能起作用的。
下面这个命令让我确定了我的想法。
官方原版的设置既有cterm 也有 gui。
- 查看所有的已有设置
直接执行highlight命令即可,不带任何参数。
下面是一些标签页的设置
1) 对tab标签样式的设置
每种主题都会有美中不足,比如我一直喜欢用的torte,它的默认样式下tab标签是黑底白字有下划线,选中状态为无下划线,看起来非常费眼睛。我进行了如下设置:
highlight TabLine term=underline cterm=bold ctermfg=9 ctermbg=4
highlight TabLineSel term=bold cterm=bold ctermbg=Red ctermfg=yellow
这里涉及到两个标签:TabLine(普通标签样式)/TabLineSel(选中状态标签的样式)。
(2) 对自动补全提示样式的设置
我使用的提示插件是。
highlight Pmenu ctermbg=darkred
highlight PmenuSel ctermbg=red ctermfg=yellow
但是这样还是有些问题,我继续寻找,终于在另外一个老外的网页上面发现了,自己新建的最好放在
~/.vim/after/syntax/c/fun.vim
after 意思是在加载完原来的设置的基础上,在加载下面的设置
c C语言的设置,打开C相关的文件的时候会加载这个文件目录下面的设置
这里是我最终修改好的设置
可以完美实现我的需要
"====================================================
" Highlight All Function
" ===================================================
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]>[^()])("me=e-2
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]>\s("me=e-1
hi cFunction cterm=bold ctermfg=blue
"===================================================
" Highlight All Class Name
" ==================================================
syn match cClassName "\<[a-zA-Z_][a-zA-Z_0-9]>\:"me=e-1
hi cClassName cterm=bold ctermfg=yellow
"====================================================
" Highlight All Math Operator
" ===================================================
" c math operators
syn match cMathOperator display "[-+*\%=]"
" c opinter operators
syn match cPointerOperator display "->|.|\:\:"
" c logical operators - boolean results
syn match cLogicalOperator display "[!<>]=\="
syn match cLogicalOperator display "=="
" c bit operators
syn match cBinaryOperator display "(&|||\^|<<|>>)=\="
syn match cBinaryOperator display "\~"
syn match cBinaryOperatorError display "\~="
" More c logical operators - highlight in preference to binary
syn match cLogicalOperator display "&&|||"
syn match cLogicalOperatorError display "(&&|||)="
" more c priority operators -highlight in preference to binary
syn match cPriorityOpreator display "(|)|[|]|{|}"
" match operator
hi cMathOperator ctermfg=blue
hi cPointerOperator ctermfg=red
hi cLogicalOperator ctermfg=yellow
hi cBinaryOperator ctermfg=5
hi cBinaryOperatorError ctermfg=red
hi cLogicalOperator ctermfg=yellow
hi cLogicalOperatorError ctermfg=yellow
hi cPriorityOpreator ctermfg=6