我正在为 vim 创建配色方案并希望赋予if
其endif
不同的颜色。
我按照教程进行操作 vimcasts并有以下文件
"set 256 colors for gnome-terminal
if $COLORTERM == 'gnome-terminal'
set t_Co=256
endif
set background=dark
highlight clear
if exists("syntax_on")
syntax reset
endif
let g:colors_name = "my_color_scheme"
highlight guibg=#110117 ctermbg=233
highlight vimcommand guifg=#6792db ctermfg=68 guibg=NONE
highlight link number vimstring
highlight vimnotfunc guifg=#e6b13e ctermfg=179 guibg=NONE
最后几行改变了的颜色if
但没有改变endif
。
我使用代码片段来查找语法的名称
" Show syntax highlighting groups for word under cursor
nmap <C-S-P> :call <SID>SynStack()<CR>
function! <SID>SynStack()
if !exists("*synstack")
return
endif
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc
它显示['vimIsCommand', 'vimCommand']
。为其中任何一个设置 fg 颜色似乎不会改变突出显示。
我如何才能找到正确的组名?
答案1
首先,色彩方案仅提供(大多数是通用的)高亮组到特定颜色和文本属性的映射。语法脚本提供解析规则来识别语法元素。然后这些语法组(例如vimCommand
)被链接到通用高亮组(例如Statement
)。
虽然自定义配色方案确实可以为 提供特殊颜色,但vimCommand
这种情况并不常见。您可以在自己的配色方案中执行此操作,但也可以:hi link ...
在您的 中执行覆盖~/.vimrc
。
无论如何,你只能为分离语法组。
这SyntaxAttr.vim - 显示光标下字符的语法高亮属性插件类似于您问题中的代码片段。有了它,通过查看 中的语法定义$VIMRUNTIME/syntax/vim.vim
,我发现if
属于vimNotFunc
组(与elseif
、return
和 一起while
),而endif
与所有 Vimscript 命令一起放入vimCommand
。因此,任何颜色更改也会影响许多其他命令,这可能不是您想要的。
要解决这个问题,您需要调整语法规则本身,通过定义覆盖:syntax
命令并将它们放入~/.vim/after/syntax/vim.vim
。这是可能的,但很乏味(特别是考虑到您可能也希望对其他语言使用相同的方法)。我宁愿重新考虑您是否不喜欢预定义的分组。