突出显示 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无关,所以也许你不需要使用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>
在一个程序的执行过程中,我一般会插入很多追加代码行,主要是打印命令,帮助我理解和调试执行的程序。不幸的是,我常常忘记哪些行来自代码,哪些行是附加的,应该在一段时间后删除。这个问题在大型程序中变得最严重。
好吧,我发现这个 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无关,所以也许你不需要使用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>