在 vim 中,FIXME 和 TODO 被突出显示,但我无法让 FIXME: 和 TODO:(注意关键字后面的冒号)突出显示?我应该在我的 .vimrc 中添加什么来实现这一点?
3 回答
好吧,您已经发现了问题,但这就是原因。
语法匹配有三种基本类型:关键字、匹配和区域。关键字是固定字符串,通常用于基本语言关键字(int
, double
, ...),在您的情况下,也用于 FIXME 和 TODO。我的意思是固定字符串;与使用正则表达式的匹配和区域不同,它们必须是准确的完整单词。例如,从 C 语法:
syn keyword cTodo contained TODO FIXME XXX
在几乎所有内置语法定义中看起来都是这样,只是组名不同(cTodo)。
iskeyword
告诉 vim 给定字符是否可以是关键字的一部分。默认情况下,它不包含冒号,因此在查找关键字时,vim 将 "FIXME:" 视为 "FIXME",并忽略冒号。如果添加冒号 ( set iskeyword+=:
),现在可以定义额外的突出显示:
syn keyword myTodo contained TODO: FIXME:
由您决定如何将其用于现有的语法/突出显示组。如果它只用于一种文件类型,您可以将它添加到该语法的 todo 组(例如 cTodo)。如果您想要它无处不在,您可以按照我的建议执行“myTodo”,然后将其直接链接到 Todo 突出显示组 ( hi def link myTodo Todo
)。
或者,您可以不理iskeyword
会(我可能会推荐这个),只需使用匹配:
syn match myTodo contained "\<\(TODO\|FIXME\):"
hi def link myTodo Todo
augroup vimrc_todo
au!
au Syntax * syn match MyTodo /\v<(FIXME|NOTE|TODO|OPTIMIZE|XXX):/
\ containedin=.*Comment,vimCommentTitle
augroup END
hi def link MyTodo Todo
containedin
会将其添加到以“Comment”结尾的所有组,加上 vimCommentTitle,否则" TODO: foo
不会突出显示为 MyTodo。
如果你自己制作环境,make syntax file (not .vimrc)
全局语法文件位于 vim 目录(例如 /usr/share/vim/vim72/syntax/c.vim)
如果你制作 ~/.vim/syntax/c.vim,那么你可以为自己添加语法。(覆盖)
只需在该文件中添加其他语法。(@Jefromi 的方式)