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

在vim中,如何突出显示TODO:和FIXME:?,vim,editor,syntax-highlighting,todo,Vim,Editor,Syntax Highlighting,Todo,在vim中,FIXME和TODO被高亮显示,但我无法让FIXME:和TODO:(注意关键字后面的冒号)高亮显示?我应该在.vimrc中添加什么来实现这一点呢?好吧,您已经发现了问题,但下面是原因 语法匹配有三种基本类型:关键字、匹配项和区域。关键字是固定字符串,通常用于基本语言关键字(int,double,…),在您的例子中,也用于FIXME和TODO。我真的是指固定的字符串;与使用正则表达式的匹配项和区域不同,它们必须是精确和完整的单词。例如,从C语法: syn keyword cTodo

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

好吧,您已经发现了问题,但下面是原因

语法匹配有三种基本类型:关键字、匹配项和区域。关键字是固定字符串,通常用于基本语言关键字(
int
double
,…),在您的例子中,也用于FIXME和TODO。我真的是指固定的字符串;与使用正则表达式的匹配项和区域不同,它们必须是精确和完整的单词。例如,从C语法:

syn keyword   cTodo   contained    TODO FIXME XXX
在几乎所有的内置语法定义中都是这样,只是使用了不同的组名(cTodo)

iskeyword
告诉vim给定的字符是否可以是关键字的一部分。默认情况下,它不包含冒号,因此在查找关键字时,vim将“FIXME:”视为“FIXME”,并忽略冒号。如果您在冒号上加上图钉(
设置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

syn match myTodo包含“\如果您创建自己的环境,
make syntax file(not.vimrc)

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

  • 如果生成~/.vim/syntax/c.vim,那么可以为 拥有(覆盖)

只需在该文件中添加额外的语法即可。(@Jefromi的做法)

augroupvimrc\u-todo
哎呀!

au Syntax*syn match MyTodo/\v这很奇怪;我的突出显示有冒号或没有冒号。我想,这种语法突出显示是在单独的语法中定义的-这是在某个特定的文件类型中发生的吗?@Jefromi:我想它发生在每个文件类型中。
:verbose设置了什么iskeyword?
告诉?@Benoit:Brilliant。我能够跟踪到一些latex设置说:
设置iskeyword+=:
。但我不确定这意味着什么(而且内置的帮助没有多大用处).所以现在TODO:突出显示TODO部分,但不是冒号。我不确定我想要哪个,但我不介意测试后者。是否也可以突出显示冒号?是的。你必须做一些
:语法匹配cTodo/\+1@Jefromi,但是,我认为这个syn匹配不起作用。我在我的.vimrc中添加了它,如果我将FIXME更改为其他内容,它就会被删除未突出显示。@G33kx0r:这不是此匹配的错误;如果它仍然存在,则会起作用。我怀疑您正在启用语法(某种方式)在vimrc中的行运行之后,当启用语法时,它首先清除旧语法,然后加载相应的语法。您可以使用
:syn list myTodo
检查匹配是否仍然存在。另请参见
:help syntax load
。先设置
语法,然后设置
syn match myTodo contained
\用法说明:您可以将其添加到.vimrc中,如果您只想突出显示单词,而不是后面的冒号,则可以删除冒号(“:”)。我更喜欢突出显示的内容是注释:,而不是注释:。我有时也写便条或TODO,后面不跟冒号。我又加了一行:
hi-def link MyTodo-pythonTodo
。如果你正在创建一个新的自动命令组,“vimrc_todo”就是
au(清除其他自动命令)是否需要?真诚地问,因为我不确定,不尖刻。这是我的方法。它做得更多,但你对它突出显示的内容控制得更少:
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