在 VIM 中突出显示任意行

Posted

技术标签:

【中文标题】在 VIM 中突出显示任意行【英文标题】:Highlighting arbitrary lines in VIM 【发布时间】:2016-08-17 05:51:24 【问题描述】:

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

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

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

所以,每次我按 \l 时,当前行都会突出显示并保持不变,而上一个突出显示的行(如果有的话)不会突出显示。

这不是我想要的行为。相反,我希望能够突出显示任意数量的行,而不会取消突出显示先前突出显示的行。如果可能的话,使用像 \l 这样的独特命令。

有人知道解决办法吗?

提前致谢。

已编辑

yolenoyer 提出的命令解决了最初的问题。但是,现在又提出了另一个问题。以下命令:

:call clearmatches()

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

【问题讨论】:

【参考方案1】:

:match 只接受一个匹配项。

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

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

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

【讨论】:

像魔术一样工作。命令 :call clearmatches 清除所有突出显示的行。是否可以让命令只清理特定用户选择的行? 是的,请参阅 :h matchdelete():h matchadd()【参考方案2】:

我经常使用 C 编程,并且在调试时倾向于在代码中添加调试打印。

我使用vim命令

:syntax match Error /\<debug_printf\>/

确保单词“debug_printf”以特定颜色方案的默认“错误”颜色突出显示。

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

VIM Bookmarks Plugin

【讨论】:

【参考方案3】:

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

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

【讨论】:

这将是伟大的...我会寻找它。如果您对我应该从哪里开始有任何建议,我会全力以赴。 @Randerson 您使用的是哪种语言?例如,如果您使用的是 Python,则可以只执行 def myprint(*msgs): print("\n".join(map(str, msgs))) 并使用 myprint("some debug stuff") 并从终端(至少在 Linux/OSX 上):grep -Re my_folder_with_code_in_it '\bmyprint\b'。这是一个非常粗略的解决方案,但它应该使它既适用于您,也适用于那些在不使用 vim 的情况下使用/查看您的代码的人,也适用于您在另一台没有 vim 设置的计算机上。【参考方案4】:

我使用这里的答案想出了这个组合,我认为这很好:

" \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>

【讨论】:

以上是关于在 VIM 中突出显示任意行的主要内容,如果未能解决你的问题,请参考以下文章

为什么行突出显示在vim中不起作用?

在 Vim 中突出显示搜索而不是替换?

在vim中使用find指令后如何关闭突出显示

如何使 vim 语法突出显示整行?

VIM 中突出显示的随机括号

像在 NetBeans 中一样在 Vim 中突出显示光标下的变量