program tip

VI 편집기에서 중복 된 줄을 어떻게 표시 / 강조 표시 할 수 있습니까?

radiobox 2021. 1. 6. 08:00
반응형

VI 편집기에서 중복 된 줄을 어떻게 표시 / 강조 표시 할 수 있습니까?


다른 라인과 정확히 중복되는 버퍼의 모든 라인을 어떻게 표시 하시겠습니까? 그들을 표시하는 것은 그들을 강조하거나 캐릭터 또는 무언가를 추가하는 것을 의미합니다. 버퍼의 줄 순서를 유지하고 싶습니다.

전에:

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()

위의 답변 중 어느 것도 나를 위해 일하지 않았으므로 이것이 내가하는 일입니다.

  1. 다음을 사용하여 파일 정렬 :sort
  2. 명령 실행 :g/^\(.*\)$\n\1$/p

  1. :sort과에 저장합니다 file1.
  2. :sort u과에 저장합니다 file2.
  3. gvimdiff또는 tkdiff두 파일.

사용하지 않는 이유 :

V*

정상 모드에서.

단순히 현재 줄의 모든 일치 항목을 검색하여 강조 표시합니다 (설정이 활성화 된 경우 기본값이라고 생각합니다) 게다가 다음을 사용할 수 있습니다.

n

경기를 탐색하려면


Run through the list once, make a map of each string and how many times it occurs. Loop through it again, and append your * to any string that has a value of more than one in the map.


Try:

:%s:^\(.\+\)\n\1:\1*\r\1:

Hope this works.

Update: next try.

:%s:^\(.\+\)$\(\_.\+\)^\1$:\1\r\2\r\1*:

ReferenceURL : https://stackoverflow.com/questions/1268032/how-can-i-mark-highlight-duplicate-lines-in-vi-editor

반응형