本节所用命令的帮助入口:
:help syn-enable :help :colorscheme :help :highlight :help highlight-groups :help 2html.vim
看到标题,也许你就知道本文准备讲vim的色彩机制了。
vim并不是只有黑色两色。正相反,它提供了非常灵活的机制允许用户自定义色彩。运行在终端中的vim,由于终端本身的限制,只能使用若干种固定的颜色;但对于gvim来讲,你可以根据你的喜好调出任意的颜色。
首先,把下面的Ex命令加入你的vimrc,打开vim的语法高亮功能:
syntax enable
这条命令,实际上是执行$vimRUNTIME/syntax/syntax.vim脚本。如果你还没有打开文件类型检测功能,在这个脚本里会把它打开,因为要语法高亮,首先需要知道是什么文件类型。然后它会安装Filetype自动命令,在检测到文件类型时,设置syntax选项。而对syntax选项进行设置,又会触发Syntax自动命令,这条自动命令会在runtimepath的syntax子目录搜寻该类型的语法文件,并使用缺省的配色方案进行染色。
所谓语法文件,就是定义某种类型文件的语法。以C语言为例,它的语法文件定义了什么应该做为关键字来高亮,什么被做为注释来高亮,等等。vim将根据语法文件的定义,把关键字以一种颜色高亮出来,把注释以另一种颜色高亮出来。具备使用什么样的颜色,则由配色方案(colorscheme)来决定,缺省使用default配色方案。
现在,你的世界已经亮起来了:注释、关键字、常数、字符串等等都以不同的颜色显示出来,读程序轻松多了。可是你不太喜欢default配色方案的设置,可不可以换用其它的配色方案呢?
当然没可以!如果你使用的是gvim,在”编辑”菜单中选择”配色方案”,你就可以在多个配色方案中切换了。也可以使用colorscheme命令来改变你的配色方案。例如,我喜欢的GUI配色方案是darkblue,因此我在vimrc中加入这样一句话:
colorscheme darkblue
这样,进入vim之后,我所用的就是darkblue方案了。
在http://www.vim.org/上还有更多的配色方案,你可以在
http://www.vim.org/scripts/script.php?script_id=625
下载截止到2005年3月所有colorscheme的汇总,你可以在其中找到一个自己喜欢的。安装colorscheme时,只需要把它们拷贝到.vim/color目录下就行了。
有一个名为Color Scheme Explorer的插件,可以帮助你快速浏览你所安装的color scheme,在这里下载:
http://www.vim.org/scripts/script.php?script_id=1298
选择了喜欢的colorscheme后,在vimrc中加入一条colorscheme命令,以后vim就会使用你选定的配色方案了。
如果对配色方案某些颜色不太满意,那么你可以在原来配色方案的基础上,修改其中的一些定义。例如,我把desert.vim拷到.vim/color目录,重命名为darkblue_my.vim。然后做如下更改(只列出改变的内容):
let colors_name = "darkblue_my" hi Normal guifg=#c0c0c0 guibg=#294d4a ctermfg=gray ctermbg=black ...... "Omni menu colors hi Pmenu guibg=#444444 hi PmenuSel ctermfg=7 ctermbg=4 guibg=#555555 guifg=#ffffff " Matched brackets hi MatchParen ctermfg=7 ctermbg=4
首先改变colors_name,vim在某此情况会根据这个名字重新载入color scheme。
接下来我重新设置了GUI的背景色,在前面的抓图中大家看到过这个颜色。
接下来的Pmenu和PmenuSel用来设置vim下拉菜单的颜色,我们在使用lookupfile插件中看到过下拉菜单。
vim 7中,当光标移到括号上时,vim会高亮与之匹配的括号,所使用的颜色就是MatchParen,我在这里也更改这个颜色。
Pmenu、PmenuSel,以及MatchParen,都是vim定义的缺省高亮组的名字,你可以用”:help highlight-groups“命令查看有这些高亮组及其含义。
如果你打算在终端及GUI界面中使用不同的colorscheme,可以这样设:
" color scheme if has("gui_running") colorscheme darkblue_my else colorscheme desert_my endif " has
这里的darkblue_my和desert_my都是我自已改过的colorscheme。
vim还提供了一个脚本,可以把你的文件按当前的颜色定义转化成HTML/XML文件,试试”:TOhtml“命令吧,更多信息请”:help 2html.vim“。
记得Source Insight中有一个功能,按SHIFT+F8可以把光标下的词高亮出来,在看代码时非常有用。vim下也有一个插件可以完成此功能,而且比Source Insight的这个功能强大多了。
这个插件由Yuheng Xie所写,对这个插件有什么疑问,可以水木社区的vim版找到他(http://www.newsmth.net/bbsdoc.php?board=vim)。在这里下载此插件。
把此插件直接拷贝到你的.vim/plugin目录就行了。
我在vimrc中这样设置:
"""""""""""""""""""""""""""""" " mark setting """""""""""""""""""""""""""""" nmap <silent> <leader>hl <Plug>MarkSet vmap <silent> <leader>hl <Plug>MarkSet nmap <silent> <leader>hh <Plug>MarkClear vmap <silent> <leader>hh <Plug>MarkClear nmap <silent> <leader>hr <Plug>MarkRegex vmap <silent> <leader>hr <Plug>MarkRegex
这样,当我输入”,hl“时,就会把光标下的单词高亮,在此单词上按”,hh“会清除该单词的高亮。如果在高亮单词外输入”,hh“,会清除所有的高亮。
你也可以使用virsual模式选中一段文本,然后按”,hl“,会高亮你所选中的文本;或者你可以用”,hr“来输入一个正则表达式,这会高亮所有符合这个正则表达式的文本。
你可以在高亮文本上使用”,#“或”,*“来上下搜索高亮文本。在使用了”,#“或”,*“后,就可以直接输入”#“或”*“来继续查找该高亮文本,直到你又用”#“或”*“查找了其它文本。
如果你在启动vim后重新执行了colorscheme命令,或者载入了会话文件,那么mark插件的颜色就会被清掉,解决的办法是重新source一下mark插件。或者像我一样,把mark插件定义的highlight组加入到你自己的colorscheme文件中。例如,把下面的语句加到desert_my.vim及darkblue_my.vim中:
" For mark plugin hi MarkWord1 ctermbg=Cyan ctermfg=Black guibg=#8CCBEA guifg=Black hi MarkWord2 ctermbg=Green ctermfg=Black guibg=#A4E57E guifg=Black hi MarkWord3 ctermbg=Yellow ctermfg=Black guibg=#FFDB72 guifg=Black hi MarkWord4 ctermbg=Red ctermfg=Black guibg=#FF7272 guifg=Black hi MarkWord5 ctermbg=Magenta ctermfg=Black guibg=#FFB3FF guifg=Black hi MarkWord6 ctermbg=Blue ctermfg=Black guibg=#9999FF guifg=Black
不知道为什么,我的vim 7.0在切换到其它缓冲区然后再切换回来时,原来被标记的文本会失去高亮。而作者说他并不存在此问题。如果你存在类似的问题,可以打上我所加的补丁:
--- easwy/mark.vim 2006-12-01 13:02:18.000000000 +0800 +++ plugin/mark.vim 2007-03-23 10:22:02.000000000 +0800 @@ -440,6 +440,43 @@ endif endfunction +" easwy add +" return the mark string under the cursor. multi-lines marks not supported +function! <SID>RedoMarkWord() + " define variables if they don't exist + call s:InitMarkVariables() + + let i = 1 + while i <= g:mwCycleMax + if b:mwWord{i} != "" + " quote regexp with / etc. e.g. pattern => /pattern/ + let quote = "/?~!@#$%^&*+-=,.:" + let j = 0 + while j < strlen(quote) + if stridx(b:mwWord{i}, quote[j]) < 0 + let quoted_regexp = quote[j] . b:mwWord{i} . quote[j] + break + endif + let j = j + 1 + endwhile + if j >= strlen(quote) + return -1 + endif + + " highlight the word + exe "syntax clear MarkWord" . i + exe "syntax match MarkWord" . i . " " . quoted_regexp . " containedin=ALL" + endif + let i = i + 1 + endwhile +endfunction + +augroup markword + autocmd! + autocmd BufWinEnter * call <SID>RedoMarkWord() +augroup END +" easwy end + " Restore previous 'cpo' value let &cpo = s:save_cpo
用法:
- 保存该patch到某一目录,例如:/tmp/mark.vim.patch
- cd到你的.vim目录:cd ~/.vim
- 运行命令:cat /tmp/mark.vim.patch | patch -p0
[参考文档]
- vim手册
- vim中文手册
博主您好,我的gvim 如果分屏然后:E 的话,enter新开的文件就没有高亮了,必须重新so 一次语法高亮文件才行。。。不知道有没有什么好方法????谢谢!能给我回个邮件么?
你是用:E进入文件浏览器然后再打开文件吗?似乎是你的filetype plugin没发生作用?比较奇怪
博主你好:
我想自定义高亮运算符,比如:+ – * / == != &&
我在网上查到在~/.vim/syntax/c.vim文件,但是,我这么做之后为什么没有效果呢?
你的博客,大部分都看了,不知道博主知不知道,如何将自己定义的宏或者是类型也高亮显示出来,想source insght 里一样呢,现在实现函数的高亮显示了。
vim的语法高亮是通过语法高亮文件实现的,实现你所说的功能比较麻烦,可能也会有效率问题
@rzzmh
这是因为文件类型没正确检测出来。。你可以用”:set ft”命令自己设置一下文件类型。
@rzzmh
折腾了一下已经自己解决了,通过修改syntax中syncolor.vim
SynColor Error的默认输出(将red设置成none就可以了)。
博主好,这几天都在研究你得博客配置vim。现在遇到一个小问题,在配置vim之前用的都是安装自带的example里的vimrc,按照你得博客安装了一些插件之后发现用vim或者gvim打开纯文本文件的时候(没有后缀名),所有的文字都会被红色渲染,看着很不舒服,有没有办法可以解决的?(PS:如果加了后缀名,比如.py,是可以正常syntax highlight的)。。。
@nope
你要看看你用vim编辑文件时所用的编码是什么,和你在终端里用的编码要一致才行
当然,你的终端必须要能支持中文
请教您啦,那可否再请教您下,我再ubuntu10.10下,用vim编了C程序,为什么在vim里面写出来的中文,在终端下编译执行./a.out后,为什么中文就成了一大堆乱码呢?我知道是编码的问题,但是不知道怎么改–谢谢了
@bobbygang
不太理解你的问题
在GUI中,你自己可以定义任意颜色(:help gui-colors)
在终端中颜色的种类比较少,你看看这个手册:
:help cterm-colors
请问怎么看VIM的颜色库,我指的不是配色方案,而是基础颜色
@rainfish
呵,你直接读一下语法文件不就行了
不好意思,博主,还有个问题向您请教,请问怎么把函数名、宏,变量之类的显示成别的颜色呢?
@embob
我也遇到过这种问题,不过原因和你不太一样,我当时是使用了变宽字体,改成定宽字体就好了。
查了下帮助文档,原来是set gfn的格式不对:
For the GTK+ 2 GUI the font name looks like this: >
:set guifont=Courier\ New\ 12
如有遇到同样的朋友可以查看:help guifont和help setting-guifont
再请教一个字体设置的问题:
我这样设置:set gfn=Courier_New\ 12,出来的效果是这样的:” s e t g f n = C o u r i e r。。。变的很宽,而且明显不是courier_new字体,而设置set gfn=Courier\ 12时则是正常的。
不知楼主遇到过这样的情况没有?
我的系统:Ubuntu8.04,gvim-full版本