在 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 中突出显示任意行的主要内容,如果未能解决你的问题,请参考以下文章