突出显示 VIM 中的任意行

Highlighting arbitrary lines in VIM

在一个程序的执行过程中,我一般会插入很多追加代码行,主要是打印命令,帮助我理解和调试执行的程序。不幸的是,我常常忘记哪些行来自代码,哪些行是附加的,应该在一段时间后删除。这个问题在大型程序中变得最严重。

好吧,我发现这个 article 教如何使任意用户选择的行保持突出显示(请参阅部分:光标移动后保持突出显示 )。文章给出的解决方案是在.vimrc中包含如下代码:

:nnoremap <silent> <Leader>l ml:execute 'match Search /\%'.line('.').'l/'<CR>

因此,每次当我按下 \l 时,当前行都会高亮显示并保持不变,而前一个高亮显示的行(如果有)则不会高亮显示。

这不是我想要的行为。相反,我希望能够根据需要突出显示任意多行,而不会取消突出显示先前突出显示的行。如果可能的话,使用像 \l.

这样的独特命令

有人知道这个的解决方案吗?

提前致谢。

编辑:

yolenoyer提出的命令解决了最初的问题。但是,现在出现了其他问题。以下命令:

:call clearmatches()

建议清除突出显示的行会清除所有行,我希望能够清除特定突出显示的行,而不是一次清除所有行。可能吗?

:match 只接受一个匹配项。

改用matchadd({highlight-group}, {pattern})函数,例如:

nnoremap <silent> <leader>l :call matchadd('Search', '\%'.line('.').'l')<cr>

要清除您添加的匹配项,运行 :call clearmatches()

我经常用 C 编程,调试时往往会在代码中添加调试打印。

我使用vim命令

:syntax match Error /\<debug_printf\>/

确保单词 'debug_printf' 在特定配色方案的默认 'Error' 颜色中突出显示。

这不能帮助您为一系列行添加书签,但为此您应该查看 'bookmark' 插件,它允许您在整个文件中创建和删除书签。

VIM Bookmarks Plugin

我认为你的第一段解释了你的问题,与vim无关,所以也许你不需要使用vim来解决你的问题。

不是使用常规打印语句调试,而是使用包装打印的函数呢?这将非常容易搜索程序范围和文件范围(只需使用 *# 搜索所有出现的调试打印功能)。

我用这里的答案想出了这个组合,我觉得很不错:

" \l to highlight a line
nnoremap <silent> <leader>l :call matchadd('Search', '\%'.line('.').'l')<CR>

" \L to remove highlighted line
nnoremap <silent> <leader>L :
  \for m in filter(getmatches(), { i, v -> has_key(l:v, 'pattern') && l:v.pattern is? '\%'.line('.').'l'} )
  \<BAR>           :call matchdelete(m.id)
  \<BAR> :endfor<CR>