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

问题描述 投票:0回答:3

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

vim editor syntax-highlighting todo
3个回答
62
投票

好吧,你已经发现了问题,但原因如下。

语法匹配有三种基本类型:关键字、匹配和区域。关键字是固定字符串,通常用于基本语言关键字(

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:

由您决定如何将其融入现有语法/突出显示组中。如果它仅适用于一种文件类型,您可以将其添加到该语法的待办事项组中(例如 cTodo)。如果您希望它随处可见,您可以按照我的建议执行“myTodo”,然后将其直接链接到 Todo 突出显示组 (

hi def link myTodo Todo
)。

或者,您可以单独保留

iskeyword
(我可能会推荐这样做),而只需使用匹配项:

syn match   myTodo   contained   "\<\(TODO\|FIXME\):"
hi def link myTodo Todo

17
投票
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。


2
投票

如果您创建自己的环境,请创建一个语法文件(不是

.vimrc

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

  • 用户语法文件,例如

    ~/.vim/syntax/c.vim
    ,覆盖全局的

只需在该文件中添加其他语法即可。 (就像@Jefromi 所做的那样)

© www.soinside.com 2019 - 2024. All rights reserved.