在vim中,我如何突出显示TODO:和FIXME:?

Pau*_*gar 44 vim syntax-highlighting editor

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

Cas*_*bel 54

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

语法匹配有三种基本类型:关键字,匹配和区域.关键字是固定的字符串,一般用于基本语言的关键字(int,double,...),并在你的情况下,对FIXME和TODO.我的意思是固定字符串; 与使用正则表达式的匹配和区域不同,它们必须是精确的和完整的单词.例如,从C语法:

syn keyword   cTodo   contained    TODO FIXME XXX
Run Code Online (Sandbox Code Playgroud)

它几乎都是内置的语法定义,只是使用不同的组名(cTodo).

iskeyword告诉vim一个给定的字符是否可以成为关键字的一部分.默认情况下,它不包括冒号,因此在查找关键字时,vim将"FIXME:"视为"FIXME",并忽略冒号.如果你使用冒号(set iskeyword+=:),你现在可以定义一个额外的突出显示:

syn keyword   myTodo   contained   TODO: FIXME:
Run Code Online (Sandbox Code Playgroud)

这取决于您希望如何将其用于现有的语法/突出显示组.如果它只适用于一种文件类型,您可以将其添加到该语法的待办事项组(例如cTodo).如果你想在任何地方使用它,你可以按照我的建议做"myTodo",然后将它直接链接到Todo突出显示组(hi def link myTodo Todo).

或者,您可以iskeyword单独留下(我可能会推荐这个),只需使用匹配:

syn match   myTodo   contained   "\<\(TODO\|FIXME\):"
hi def link myTodo Todo
Run Code Online (Sandbox Code Playgroud)

  • @ G33kx0r:这不是这场比赛的错; 它仍然有效.我怀疑你在vimrc运行的行之后启用语法(以这种或那种方式)*,当启用语法时,它首先清除旧语法然后加载适当的语法.您可以使用`:syn list myTodo`检查是否仍然存在该匹配.另见`:help syntax-loading`. (2认同)

blu*_*yed 14

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
Run Code Online (Sandbox Code Playgroud)

containedin将其添加到"注释"结尾的所有群体,再加上vimCommentTitle,其中" TODO: foo不至于太突出,否则作为MyTodo.

  • 用法说明:您可以将其添加到.vimrc中,如果只想突出显示单词而不是其后的冒号,则可以删除冒号(':')。我更喜欢突出显示为_NOTE_:而不是_NOTE:_。我有时也写NOTE或TODO,后跟冒号。 (2认同)
  • 如果您正在创建一个新的自动命令组“vimrc_todo”,那么“au!”(清除其他自动命令)是必要的吗?真诚地询问是因为我不确定,而不是尖酸刻薄。 (2认同)