【问题标题】:Highlight text defined by pattern突出显示由模式定义的文本
【发布时间】:2012-04-17 09:39:40
【问题描述】:

我想突出显示光标之前的某些文本部分和光标之后的某些文本部分。 光标前后的部分将由某种模式(如正则表达式)定义。这种模式不应受线的限制。 突出显示的区域会随着光标的移动而改变。

这可以在 vim 设置或脚本中实现吗?

【问题讨论】:

  • “...会随着光标移动而改变”是什么意思?如果它基于正则表达式突出显示,那么光标在哪里都没有关系。还是我完全误解了你的意思?
  • 假设光标 this 字符串中,并且您想要突出显示由两点定义的子字符串 1) 光标前最接近的大写字母 2) 光标后最接近的点。句子“它不仅存在了五个世纪,而且还跨越了电子排版,基本保持不变。”将突出显示。当您移动光标时,另一个句子将突出显示。
  • 请注意,突出显示的字符串分布在多行(这里是两行)。

标签: regex highlighting vim


【解决方案1】:

理论上,以下两个命令都应该有效:

match Error /\v\u\_\U{-}%#\_.{-}\./
syn match Error /\v\u\_\U{-}%#\_.{-}\./

。最终,使用这两个命令我发现了一个错误:在我点击<C-l> 之前,突出显示没有正确更新。更多,:syn match 有时会突出显示两个不同句子的两个不同部分,所以第一个更受欢迎(另见:h matchadd():h 2match 因为:match 突出显示可能会消失,因为它也被其他东西使用) .

更新:尽管由于上述错误,我不建议将其添加到 vimrc,但您可以使用以下内容:

augroup vimrcSentenceMatch
    autocmd!
    autocmd WinEnter * : if !exists('w:sentence_match') 
                     \ |     let w:sentence_match=matchadd('Error', '\v\u\_\U{-}%#\_.{-}\.')
                     \ | endif
augroup END

【讨论】:

  • 这里的模式是什么?正如我在问题下的评论中提到的那样,可能是一个简单的模式吗?
  • @xralf。这正是您在评论中提到的:“由两点定义的子字符串 1)光标前最接近的大写字母 2)光标后最接近的点”。第一点是\u\_\U{-},第二点是\_.{-}\.%# 表示“光标位置”,\v 使我能够省略一些反斜杠(“非常神奇”模式),\_ 在两个表达式中都扩展了字符类(\u 是大写拉丁字母,\U 是一切,除了换行符或大写拉丁字母,. 只是换行符以外的任何字符)和换行符。
  • 注意:没有代表“大写字母”的vim atom,仅代表“大写latin字母”。
  • 我将代码添加到我的 .vimrc 但它什么也没做(我看不到没有效果)。
  • @xralf 哪几行?试试augroup vimrcSentenceMatch+autocmd!+autocmd WinEnter * if !exists('w:sentence_match') | let w:sentence_match=matchadd('Error', '\v\u\_\U{-}%#\_.{-}\.') | endif+augroup END(每个都在自己的行上)(可能还有doautocmd vimrcSentenceMatch WinEnter)。 syntax 语句将被为给定文件加载的任何语法覆盖,match 是窗口本地的,因此应该为每个新窗口定义。这两行都是为了在缓冲区加载后手动或映射启动,而不是添加到 vimrc。
猜你喜欢
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2011-08-31
  • 1970-01-01
相关资源
最近更新 更多