Customizing Syntax Highlighting in Vim
customization, overriding, vim, vim-syntax-highlighting
Solution
Solution
Here's a direct answer for coloring just the word yellow.
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
And here's a solution for coloring all the color terminal names. They are only colored in the terminal (not the GUI), and other attributes (256-color terminal, GUI colors, attributes such as bold) are not highlighted at all. To extend this further, you'd probably want some sort of script to iterate over all the possible values.
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
Explanation
If you look in colors/vim.vim and search for `cterm`, you'll see a line
syn match vimHiCtermFgBg contained "\ccterm[fb]g="he=e-1 nextgroup=vimNumber,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
This says that, when `ctermfg=` or `ctermbg=` is encountered, highlight the next word as `vimNumber`, `vimHiCtermColor`, `vimFgBgAttrib`, or `vimHiCtermError`. Looking at `vimHiCtermColor` (a few lines above), we see
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
This lists all of the color terminal names, and they are highlighted as keywords with the same syntax group. So, instead of highlighting them all together, we can highlight them separately. The four lines of the first solution above describe the steps:
- Create a new cluster, `@vimHiCtermColors` containing each of the groups in step 2.
- Add a new keyword for each color value.
- Modify the `vimHiCtermFgBg` definition to use `@vimHiCtermColors` instead of `vimHiCtermColor`.
- Highlight each keyword as you wish.
The reason why what you tried did not work is twofold. First, the syntax groups specified in the `nextgroup` are preferred over general groups (your `yellow` group, in particular). But, you may say, "What about `containedin=ALL`?" This is the second point. Keywords are individual units and cannot contain anything else. The original `vimHiCtermColor` group was all keywords, so your `containedin=ALL` could not override it. If `vimHiCtermColor` had been a match instead of a keyword, it may have worked.
Problem
How I can keep all the current formatting for a file type but add functionality. I would like to highlight colors in .vim files so that each color is highlighted how the terminal will resolve it. I created a vim.vim file containing: ``` syn keyword yellow yellow containedin=All highlight yellow ctermfg=yellow syn keyword red red containedin=all highlight red ctermfg=red ``` and put it into `~/.vim/after/syntax/vim.vim` As suggested here. This has no effect. Update In fact I was mistaken when I said my changes had no effect. If you type `yellow` by itself on a line it will be highlighted yellow. Unfortunately this does not solve my problem. I added the F3 functionality described by Al. When I f3 over yellow (in the context `ctermfg=yellow`) it returns: ``` hi<vimHiCtermColor> trans<vimHiCtermColor> lo<vimHiCtermColor> FG:-1 BG:-1 ``` Then `:syn list vimHiCtermColor` returns: ``` --- 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 ``` I checked `:syn list darkgray` (something I have not defined) to see if it exists: ``` --- Syntax items --- E28: No such highlight group name: darkgray Hit ENTER or type command to continue ``` Where should I go from here?