gpt4 book ai didi

vim - 如何在 VI 编辑器中标记/突出显示重复行?

转载 作者:行者123 更新时间:2023-12-01 23:31:00 32 4
gpt4 key购买 nike

您将如何标记缓冲区中与其他行完全相同的所有行?通过标记它们,我的意思是突出显示它们或添加字符或其他东西。我想保留缓冲区中行的顺序。

之前:

foo
bar
foo
baz

之后:

foo*
bar
foo*
baz

最佳答案

作为一名前单行者:

:syn clear Repeat | g/^\(.*\)\n\ze\%(.*\n\)*\1$/exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"' | nohlsearch

这使用Repeat组来突出显示重复的行。

分解:

  • syn clear Repeat::删除之前发现的任何重复
  • g/^\(.*\)\n\ze\%(.*\n\)*\1$/::用于文件中稍后重复的任何行
    • 正则表达式
      • ^\(.*\)\n::整行
      • \ze::匹配结束 - 验证模式的其余部分,但不消耗匹配的文本(正向前瞻)
      • \%(.*\n\)*::任意数量的整行
      • \1$::匹配整行的整行重复
    • exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"'::添加与此匹配的完整行到 Repeat 语法组
      • exe::将给定字符串作为 ex 命令执行
      • getline('.')::与 g// 匹配的当前行的内容
      • escape(..., '".\^$*[]')::使用反斜杠转义给定字符以生成合法的正则表达式
      • syn match Repeat "^...$"::将给定字符串添加到 Repeat 语法组
  • nohlsearch::从 g// 的搜索中删除突出显示

Justin 的非正则表达式方法可能更快:

function! HighlightRepeats() range
let lineCounts = {}
let lineNum = a:firstline
while lineNum <= a:lastline
let lineText = getline(lineNum)
if lineText != ""
let lineCounts[lineText] = (has_key(lineCounts, lineText) ? lineCounts[lineText] : 0) + 1
endif
let lineNum = lineNum + 1
endwhile
exe 'syn clear Repeat'
for lineText in keys(lineCounts)
if lineCounts[lineText] >= 2
exe 'syn match Repeat "^' . escape(lineText, '".\^$*[]') . '$"'
endif
endfor
endfunction

command! -range=% HighlightRepeats <line1>,<line2>call HighlightRepeats()

关于vim - 如何在 VI 编辑器中标记/突出显示重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268032/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com