是否可以为“ Todo”组分配标志?


9

每当行具有ToDo组(ToDo,FIXME ...)时,是否可以添加要在“符号”列中显示的符号。

调整颜色方案,我更改了Todo组的突出显示,但希望在符号栏中有一个指示符,例如Syntastic错误和警告。

Answers:


9

试试这个功能:

function! SignKeyword()

    silent! sign undefine todo

    sign define todo text=>> texthl=Search

    g/\v\C(<TODO>|<FIXME>)/execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

    nohlsearch

endfunction

现在在命令行上调用该函数:

:call SignKeyword()

或在您的地图中添加一个映射以~/.vimrc进行调用:

nnoremap <your mapping> :call SignKeyword()<cr>

或添加一个autocmd。例如,如果您希望在打开文件类型为markdown的文件时自动调用该函数:

autocmd FileType markdown call SignKeyword()

函数的第一行将silent! sign undefine todo删除待办事项(如果待办事项),因此,如果在删除或添加一行后您的标志放错了位置,则可以调用该函数以立即对其进行修复。


第二行定义一个标志,其名称为dodo,其文本为>>(您可以根据自己的喜好对其进行更改),并使用“搜索”突出显示组(相同的内容)。


第三行使用global命令:

:g/pattern/command

全局命令在与模式匹配的每一行上执行命令。

这里的模式是\v\C(<TODO>|<FIXME>),这意味着包含单词TODOFIXME的任何行。
正则表达式包含原子,\C因此搜索时会考虑大小写(无论您的“ ignorecase”选项是什么)。如果您希望搜索不区分大小写,请将其更改为\c

每当找到这样的行时,该函数就会执行以下行:

execute "sign place 9999 line=" . line('.')
    \ . " name=todo buffer=" . bufnr('')

它执行(使用:execute命令)以下字符串的内容:

"sign place 9999 line=" . line('.') . " name=todo buffer=" . bufnr('')

该字符串包括两个vim内置函数:line()bufnr()
line('.')全局命令找到匹配项时,返回当前行bufnr('.')的编号,并返回当前缓冲区的编号。

因此,例如,如果全局命令在缓冲区5的第10行找到匹配项,它将给出:

"sign place 9999 line=" . 10 . " name=todo buffer=" . 5

点将字符串连接起来,因此最终将得出:

"sign place 9999 line=10 name=todo buffer=5"

这是:sign在缓冲区5的第10行上放置一个符号的命令
。9999是为符号选择的随机ID(您可以选择另一个ID)。


函数的第四行:nohlsearch禁用匹配模式的突出显示。

编辑:我修复了正则表达式,原来是错误的。我写了,^[TODO|FIXME]但我认为应该是\v\C(<TODO>|<FIXME>)。抱歉给您带来不便,我仍在学习vimscript。


1
删除TODO评论后如何删除标志?

1
这不是我所期望的,因为这会删除所有todo符号,但是只是注意到删除该符号的行已删除,所以没关系

1
好吧,我已经添加了这一行,在函数的开头:silent! sign undefine todo。它会删除待办事项标志,如果它已经存在,那么如果在删除包含关键字TODO或FIXME的行后您的待办事项放置不正确,则可以调用该函数来立即对其进行修复。
saginaw

2
我输入了正则表达式是错误的,^[TODO|FIXME]但实际上应该是\v(TODO|FIXME)。新的正则表达式将匹配包含关键字之一但不包含行首的行,因为我想一行可能在注释之前包含一些代码,例如this some code # FIXME this line needs to be fixed。以前的正则表达式完全错误,对于给您带来的不便,我们深感抱歉,我仍在学习vimscript ...
saginaw

1
这种方法的问题是,如果您修改缓冲区,例如在TODO行上方添加另一行,它将很快变得不同步。
Christian Brabandt 2015年

6

您可以使用我的DynamicSigns插件。这允许类似于折叠表达式的所谓“ SignExpression”。

所以你可以简单地做 :SignExpression getline(v:lnum)=~'TODO'?'Warning':0

阅读帮助以获取更多示例说明。

使用我的插件的优点是,它跟踪缓冲区的变化并相应地调整符号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.