Customizing Syntax Highlighting in Vim

前端 未结 2 1039
难免孤独
难免孤独 2021-01-03 07:08

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 t

相关标签:
2条回答
  • 2021-01-03 08:00

    I would expect the ~/.vim/after/syntax/vim.vim approach to work, but if the keyword (yellow) is already highlighted, you may need to change the matcher with something like:

    syn keyword yellow yellow containedin=ALL
    

    What is the file you're trying to highlight?

    Edit

    I've had a look at the java.vim file and it looks like there's a lot of overlapping syntax groups, which can make highlight customisation quite difficult. Here's what I did, in case it's helpful.

    A useful mapping is:

    " 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>
    

    You can then move the cursor over something you're interested in and press F3 to see what the current highlight group is. As a test, I opened java.vim in the syntax directory and went to line 52, which defines a javaStorageClass. I decided to highlight the word transient on that line (as yellow wasn't in the file anywhere and I needed something to work with).

    I moved the cursor over transient and pressed F3. Vim reported:

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

    It is obviously part of a vimSynKeyRegion, which one would guess from the name is a syn region. I decided to look at this further, so I interrogated the current highlighting configuration:

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

    This produces a file containing all of the syntax information. I searched for vimSynKeyRegion and found this line:

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

    The vimSynKeyRegion has been configured to contain items from the syntax cluster named vimSynKeyGroup. Therefore, we can highlight transient by making it a keyword in this group:

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

    Although this may not fit exactly into what you're wanting to do, hopefully it will give you something to work with. You may find some parts cannot be overridden (if they're matched with keywords or similar), but you can always redefine the highlighting to change the colour, e.g.

    :hi vimGroupName guifg=#ffff00
    

    Hope all of that helps.

    0 讨论(0)
  • 2021-01-03 08:12

    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:

    1. Create a new cluster, @vimHiCtermColors containing each of the groups in step 2.
    2. Add a new keyword for each color value.
    3. Modify the vimHiCtermFgBg definition to use @vimHiCtermColors instead of vimHiCtermColor.
    4. 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.

    0 讨论(0)
提交回复
热议问题