51

在 vim 中,FIXME 和 TODO 被突出显示,但我无法让 FIXME: 和 TODO:(注意关键字后面的冒号)突出显示?我应该在我的 .vimrc 中添加什么来实现这一点?

4

3 回答 3

61

好吧,您已经发现了问题,但这就是原因。

语法匹配有三种基本类型:关键字、匹配和区域。关键字是固定字符串,通常用于基本语言关键字(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
于 2010-11-04T14:17:10.250 回答
16
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。

于 2015-05-30T23:39:36.090 回答
2

如果你自己制作环境,make syntax file (not .vimrc)

  • 全局语法文件位于 vim 目录(例如 /usr/share/vim/vim72/syntax/c.vim)

  • 如果你制作 ~/.vim/syntax/c.vim,那么你可以为自己添加语法。(覆盖)

只需在该文件中添加其他语法。(@Jefromi 的方式)

于 2014-11-15T05:22:08.627 回答