自动突出显示相同的行文本


13

我前不久看到一个熟练的vim忍者这样做,但我不知道该如何开始。

A)有没有一种方法可以设置Vims背景色,使内容相同的连续行突出显示。

B)如果有人知道该怎么做,那么如果高亮显示在连续的行中而只考虑第一个单词(而不是整个行),则可以对它进行一个很好的调整。

如果高亮显示可以配置为不同的颜色,则根据匹配行数(或取决于AB的单词处于活动状态)使用第二个调整。因此,我们只有两个连续的行匹配,然后匹配绿色,连续3-5个行匹配橙色,然后再匹配6+个红色。


Answers:


10

以下match设置似乎适用于(A):

:syn match Low /\v(.+)\n(\1\n)/
:syn match Medium /\v(.+)\n(\1\n){2,4}/
:syn match Critical /\v(.+)\n(\1\n){5,}/
:hi Critical  ctermfg=red
:hi Medium  ctermfg=yellow
:hi Low  ctermfg=green

在这里看来顺序很关键。如果LowMedium匹配之后Critical,则被这些宽松的要求所包含,并且对于Lowwrt也是如此Medium

加完第3条或第6条重复线后,突出显示的内容不会立即显示,而是在添加完后稍微移动一下。我不确定是什么触发的。

对于B,我想您可以将regex替换为:

/\v(\S+).*\n(\1.*\n)/

一般来说,更换全部(.*)(\S+).*,并\1\1.*,或任何构成词你。


我给这个答案打了勾,因为对我来说,它是如何进行我需要的突出显示(由问题表示)。@Matts正则表达式很好,但不能回答我问的实际问题(更改突出显示)。
马丁·约克

8

首先,这是一个匹配重复行的搜索模式(忽略前导空白的更改):

              \zs                marks start of the pattern. Everything before here will not be highlighted
 ^                               start of the line
  \s*                            leading whitespace
       .\+                       match 1 or more non-newline characters
     \(   \)                     and use parens to capture this in match group 1

            \n                   match the newline character
                 \(        \)\+  1 or more
                      \1         copies of what was in the match group 1
                   \s*  \n       with leading whitespace followed by a newline
/^\s*\(.\+\)\n\zs\(\s*\1\n\)\+   the full regex

:help pattern 将提供有关如何制作正则表达式的更多信息

:help syntax 将向您展示如何使用此正则表达式并将其转换为突出显示的内容

学习编写语法脚本可能很困难,因此一个不错的短期解决方案是通过“ 'incsearch'设置”以确保突出显示搜索并映射键以进行上述搜索,从而“即时”执行此操作,即nnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


有没有像这样自动分发正则表达式的方法?它提供了这样清晰的描述。
muru 2015年

1
我一直在手工做。在vim中,最简单的快速方法是yy10p使用完整的正则表达式执行类似的操作,然后选择要删除并点击的部分r<space>。也许我会添加一条命令“用空格替换此行上的选择内容以外的所有内容”,以加快速度。
马特·博姆

哇!那是相当的努力!
muru 2015年

1
我制作了一个(确实很丑)的vim函数来使其更快一些:gist.github.com/mattboehm/da63a48eedf6f14375aa。选择一条线,单击,r然后<space>在普通/可视模式下将线连接在一起。
马特·博姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.