在Vim中自定义语法突出显示

时间:2010-03-17 17:53:58

标签: vim override customization vim-syntax-highlighting

如何保留文件类型的所有当前格式,但添加功能

我想突出显示.vim文件中的颜色,以便突出显示终端将如何解析它的每种颜色。

我创建了一个包含以下内容的vim.vim文件:

syn keyword yellow yellow containedin=All                                                    
highlight yellow ctermfg=yellow                                                              

syn keyword red red containedin=all                                                          
highlight red ctermfg=red                                                                    

并将其放入~/.vim/after/syntax/vim.vim

根据建议here

这没有效果。


更新

事实上,当我说我的改变没有效果时,我错了。如果您在一行上单独键入yellow,它将突出显示为黄色。不幸的是,这并没有解决我的问题。

我添加了Al描述的F3功能。

当我f3过黄色时(在上下文ctermfg=yellow中)它返回:

hi<vimHiCtermColor> trans<vimHiCtermColor> lo<vimHiCtermColor> FG:-1 BG:-1

然后:syn list vimHiCtermColor返回:

--- Syntax items ---
vimHiCtermColor xxx contained lightmagenta darkgray lightgrey darkgrey lightgreen lightgray darkmagenta gray white red grey darkred brown darkblue darkgreen lightblue yellow cyan
                   contained lightcyan lightred black blue green magenta darkcyan darkyellow

我检查了:syn list darkgray(我尚未定义的内容)以查看它是否存在:

--- Syntax items ---
E28: No such highlight group name: darkgray
Hit ENTER or type command to continue

我应该从哪里出发?

2 个答案:

答案 0 :(得分:6)

解决方案

这是一个直接的答案,只用黄色一词着色。

syn cluster vimHiCtermColors contains=vimHiCtermColorYellow
syn keyword vimHiCtermColorYellow yellow contained

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,vimHiCtermColor,@vimHiCtermColors,vimFgBgAttrib,vimHiCtermError

highlight vimHiCtermColorYellow ctermfg=yellow

这是一个为所有彩色终端名称着色的解决方案。它们仅在终端(不是GUI)中着色,并且其他属性(256色终端,GUI颜色,诸如粗体的属性)根本不突出显示。为了进一步扩展这一点,您可能需要某种脚本来迭代所有可能的值。

syn cluster vimHiCtermColors contains=vimHiCtermColorBlack,vimHiCtermColorBlue,vimHiCtermColorBrown,vimHiCtermColorCyan,vimHiCtermColorDarkBlue,vimHiCtermColorDarkcyan,vimHiCtermColorDarkgray,vimHiCtermColorDarkgreen,vimHiCtermColorDarkgrey,vimHiCtermColorDarkmagenta,vimHiCtermColorDarkred,vimHiCtermColorDarkyellow,vimHiCtermColorGray,vimHiCtermColorGreen,vimHiCtermColorGrey,vimHiCtermColorLightblue,vimHiCtermColorLightcyan,vimHiCtermColorLightgray,vimHiCtermColorLightgreen,vimHiCtermColorLightgrey,vimHiCtermColorLightmagenta,vimHiCtermColorLightred,vimHiCtermColorMagenta,vimHiCtermColorRed,vimHiCtermColorWhite,vimHiCtermColorYellow

syn keyword vimHiCtermColorBlack black contained
syn keyword vimHiCtermColorBlue blue contained
syn keyword vimHiCtermColorBrown brown contained
syn keyword vimHiCtermColorCyan cyan contained
syn keyword vimHiCtermColorDarkBlue darkBlue contained
syn keyword vimHiCtermColorDarkcyan darkcyan contained
syn keyword vimHiCtermColorDarkgray darkgray contained
syn keyword vimHiCtermColorDarkgreen darkgreen contained
syn keyword vimHiCtermColorDarkgrey darkgrey contained
syn keyword vimHiCtermColorDarkmagenta darkmagenta contained
syn keyword vimHiCtermColorDarkred darkred contained
syn keyword vimHiCtermColorDarkyellow darkyellow contained
syn keyword vimHiCtermColorGray gray contained
syn keyword vimHiCtermColorGreen green contained
syn keyword vimHiCtermColorGrey grey contained
syn keyword vimHiCtermColorLightblue lightblue contained
syn keyword vimHiCtermColorLightcyan lightcyan contained
syn keyword vimHiCtermColorLightgray lightgray contained
syn keyword vimHiCtermColorLightgreen lightgreen contained
syn keyword vimHiCtermColorLightgrey lightgrey contained
syn keyword vimHiCtermColorLightmagenta lightmagenta contained
syn keyword vimHiCtermColorLightred lightred contained
syn keyword vimHiCtermColorMagenta magenta contained
syn keyword vimHiCtermColorRed red contained
syn keyword vimHiCtermColorWhite white contained
syn keyword vimHiCtermColorYellow yellow contained

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,@vimHiCtermColors,vimFgBgAttrib,vimHiCtermError

highlight vimHiCtermColorBlack ctermfg=black
highlight vimHiCtermColorBlue ctermfg=blue
highlight vimHiCtermColorBrown ctermfg=brown
highlight vimHiCtermColorCyan ctermfg=cyan
highlight vimHiCtermColorDarkBlue ctermfg=darkBlue
highlight vimHiCtermColorDarkcyan ctermfg=darkcyan
highlight vimHiCtermColorDarkgray ctermfg=darkgray
highlight vimHiCtermColorDarkgreen ctermfg=darkgreen
highlight vimHiCtermColorDarkgrey ctermfg=darkgrey
highlight vimHiCtermColorDarkmagenta ctermfg=darkmagenta
highlight vimHiCtermColorDarkred ctermfg=darkred
highlight vimHiCtermColorDarkyellow ctermfg=darkyellow
highlight vimHiCtermColorGray ctermfg=gray
highlight vimHiCtermColorGreen ctermfg=green
highlight vimHiCtermColorGrey ctermfg=grey
highlight vimHiCtermColorLightblue ctermfg=lightblue
highlight vimHiCtermColorLightcyan ctermfg=lightcyan
highlight vimHiCtermColorLightgray ctermfg=lightgray
highlight vimHiCtermColorLightgreen ctermfg=lightgreen
highlight vimHiCtermColorLightgrey ctermfg=lightgrey
highlight vimHiCtermColorLightmagenta ctermfg=lightmagenta
highlight vimHiCtermColorLightred ctermfg=lightred
highlight vimHiCtermColorMagenta ctermfg=magenta
highlight vimHiCtermColorRed ctermfg=red
highlight vimHiCtermColorWhite ctermfg=white
highlight vimHiCtermColorYellow ctermfg=yellow

说明

如果您查看 colors / vim.vim 并搜索cterm,您会看到一行

syn match  vimHiCtermFgBg   contained   "\ccterm[fb]g="he=e-1   nextgroup=vimNumber,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError

这表示,遇到ctermfg=ctermbg=时,请将下一个字词突出显示为vimNumbervimHiCtermColorvimFgBgAttrib或{{1} }。看vimHiCtermError(上面几行),我们看到了

vimHiCtermColor

列出所有颜色终端名称,并将它们突出显示为具有相同语法组的关键字。因此,我们可以单独突出显示它们,而不是一起突出显示它们。上面第一个解决方案的四行描述了步骤:

  1. 在步骤2中创建一个包含每个组的新群集syn keyword vimHiCtermColor contained black blue brown cyan darkBlue darkcyan darkgray darkgreen darkgrey darkmagenta darkred darkyellow gray green grey lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightred magenta red white yellow
  2. 为每个颜色值添加一个新关键字。
  3. 修改@vimHiCtermColors定义以使用vimHiCtermFgBg代替@vimHiCtermColors
  4. 根据需要突出显示每个关键字。
  5. 你尝试过的东西不起作用的原因有两个。首先,vimHiCtermColor中指定的语法组优先于一般组(特别是您的nextgroup组)。但是,你可能会说,“yellow怎么样?”这是第二点。关键字是单个单位,不能包含任何其他内容。原始containedin=ALL组是所有关键字,因此您的vimHiCtermColor无法覆盖它。如果containedin=ALL是匹配而不是关键字,则可能有效。

答案 1 :(得分:4)

我希望~/.vim/after/syntax/vim.vim方法有效,但如果关键字(黄色)已经突出显示,您可能需要更改匹配器,如:

syn keyword yellow yellow containedin=ALL

您要突出显示的文件是什么?

修改

我已经查看了java.vim文件,看起来有很多重叠的语法组,这可能会使高亮度自定义变得非常困难。这就是我所做的,如果它有用的话。

有用的映射是:

" What is the current syntax highlighting group?
map <F3> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">" . " FG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"fg#") . " BG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"bg#")<CR>

然后,您可以将光标移动到您感兴趣的内容上,然后按 F3 查看当前的高亮显示组是什么。作为测试,我在语法目录中打开java.vim并转到第52行,它定义了一个javaStorageClass。我决定在该行上突出显示transient一词(由于yellow不在任何地方的文件中,我需要处理一些内容)。

我将光标移到transient上并按 F3 。 Vim报道:

hi<vimSynKeyRegion> trans<vimSynKeyRegion> lo<vimSynKeyRegion> FG: BG:

它显然是vimSynKeyRegion的一部分,人们会从名称中猜出是syn region。我决定进一步研究这个,所以我询问了当前的突出显示配置:

:redir @a>
:silent syn list
:redir END
:vnew
"ap

这会生成一个包含所有语法信息的文件。我搜索了vimSynKeyRegion并找到了这一行:

vimSynKeyRegion xxx matchgroup=vimGroupName start=/\k\+/ skip=/\\\\\|\\|/ matchgroup=vimSep end=/|\|$/  contained oneline keepend contains=@vimSynKeyGroup 

vimSynKeyRegion已配置为包含名为vimSynKeyGroup的语法群集中的项目。因此,我们可以通过在此组中将其设为关键字来突出显示transient

:syn keyword MyNewGroup transient
:hi MyNewGroup guifg=#ff00ff
:syn cluster vimSynKeyGroup add=MyNewGroup

虽然这可能不适合您想要做的事情,但希望它能为您提供一些合作机会。您可能会发现某些部分无法覆盖(如果它们与关键字或类似部分匹配),但您始终可以重新定义突出显示以更改颜色,例如

:hi vimGroupName guifg=#ffff00

希望所有这一切都有帮助。