【问题标题】:In vim, how do I highlight TODO: and FIXME:?在 vim 中,如何突出显示 TODO: 和 FIXME:?
【发布时间】:2011-05-05 01:53:49
【问题描述】:

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

【问题讨论】:

  • 这很奇怪;我的亮点有或没有冒号。我认为,语法突出显示是在单独的语法中定义的 - 这是否发生在某些特定的文件类型中?
  • @Jefromi:我认为它发生在每个文件类型中。
  • :verbose set iskeyword? 告诉我们什么?
  • @Benoit:太棒了。我能够追踪到一些乳胶设置,上面写着:set iskeyword+=:。我不确定这意味着什么(并且内置的帮助没有多大用处)。所以现在 TODO: 突出显示 TODO 部分,而不是冒号。我不确定我想要哪个,但我不介意测试后者。是否也可以突出显示冒号?
  • 是的。你必须做一些:syntax match cTodo /\<TODO:/

标签: vim editor syntax-highlighting todo


【解决方案1】:

嗯,您已经找到了问题所在,但原因如下。

语法匹配有三种基本类型:关键字、匹配和区域。关键字是固定字符串,通常用于基本语言关键字(intdouble、...),在您的情况下,也用于 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

【讨论】:

  • +1 @Jefromi,但是,我认为这种同步匹配不起作用。我把它放在我的 .vimrc 中,如果我将 FIXME 更改为其他内容,它不会突出显示。
  • @G33kx0r:不是这场比赛的错;如果它仍然存在,它就可以工作。我怀疑您在 vimrc 运行中 行之后启用语法(一种或另一种方式),并且当启用语法时,它首先清除旧语法然后加载适当的语法。您可以使用:syn list myTodo 检查该匹配是否仍然存在。另见:help syntax-loading
  • 在我的vimrc 文件和hi! def link myTodo Todo 中先设置syntax on,然后设置syn match myTodo contained "\&lt;\(TODO\|FIXME\):",这对我不起作用。另一方面,如果我这样做,例如,au BufNewFile,BufRead *.tex syn match texTodo "\&lt;\(TODO\|FIXME\):" 生成的tex 文件会正确突出显示。有没有通用的解决方案?
  • 不再工作:syn keyword cTodo contained TODO FIXME XXX; highlight cTODO ctermbg=red ctermfg=yellow term=bold,italic
【解决方案2】:
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 会将其添加到以“评论”结尾的所有组中,另外 vimCommentTitle,否则" TODO: foo 不会突出显示为 MyTodo。

【讨论】:

  • 使用说明:你可以将它添加到你的 .vimrc 中,如果你只想突出显示单词而不是它后面的冒号,则删除冒号 (':')。我更喜欢突出显示阅读 NOTE:,而不是 NOTE: 。我有时也会写 NOTE 或 TODO,后面不跟冒号。
  • 我增加了一行:hi def link MyTodo pythonTodo。工作。
  • 如果你正在创建一个新的自动命令组“vimrc_todo”,au!(清除其他自动命令)是必要的吗?真诚地问是因为我不确定,而不是刻薄。
  • 这是我的方法。它做得更多,但您对其突出显示的内容的控制更少:pastebin.com/raw/5JnXcsfx
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 2014-07-25
    • 1970-01-01
    • 2011-08-18
    • 2011-01-22
    • 2010-12-03
    • 2016-06-28
    • 2015-11-26
    相关资源
    最近更新 更多