每当行具有ToDo组(ToDo,FIXME ...)时,是否可以添加要在“符号”列中显示的符号。
调整颜色方案,我更改了Todo组的突出显示,但希望在符号栏中有一个指示符,例如Syntastic错误和警告。
每当行具有ToDo组(ToDo,FIXME ...)时,是否可以添加要在“符号”列中显示的符号。
调整颜色方案,我更改了Todo组的突出显示,但希望在符号栏中有一个指示符,例如Syntastic错误和警告。
Answers:
试试这个功能:
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>)
,这意味着包含单词TODO或FIXME的任何行。
正则表达式包含原子,\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。
silent! sign undefine todo
。它会删除待办事项标志,如果它已经存在,那么如果在删除包含关键字TODO或FIXME的行后您的待办事项放置不正确,则可以调用该函数来立即对其进行修复。
^[TODO|FIXME]
但实际上应该是\v(TODO|FIXME)
。新的正则表达式将匹配包含关键字之一但不包含行首的行,因为我想一行可能在注释之前包含一些代码,例如this some code # FIXME this line needs to be fixed
。以前的正则表达式完全错误,对于给您带来的不便,我们深感抱歉,我仍在学习vimscript ...
您可以使用我的DynamicSigns插件。这允许类似于折叠表达式的所谓“ SignExpression”。
所以你可以简单地做 :SignExpression getline(v:lnum)=~'TODO'?'Warning':0
阅读帮助以获取更多示例说明。
使用我的插件的优点是,它跟踪缓冲区的变化并相应地调整符号。
TODO
评论后如何删除标志?