2009-08-12 11 views

Odpowiedz

60

Jako ex jedną wkładką:

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

używa grupę Repeat aby wyróżnić powtarzające się linie.

złamanie go:

  • syn clear Repeat :: usunąć dowolny poprzednio znalezionych powtórzenia
  • g/^\(.*\)\n\ze\%(.*\n\)*\1$/ :: dla każdej linii, który jest powtarzany później w pliku
    • regex
      • ^\(.*\)\n :: pełna linia
      • \ze :: Koniec meczu - sprawdza resztę wzór, ale nie zużywają dopasowany tekst (pozytywny uprzedzona)
      • \%(.*\n\)* :: dowolną liczbę pełnych linii
      • \1$ :: pełną linię powtórzenie dopasowane pełna linia
    • exe 'syn match Repeat "^' . escape(getline('.'), '".\^$*[]') . '$"' :: dodaj pełne linie, które pasują do tego celu grupy Repeat składni
      • exe :: wykonać dany ciąg jako polecenia ex
      • getline('.') :: zawartość bieżącej linii dopasowane g//
      • escape(..., '".\^$*[]') :: uciec podane znaki z ukośniki dokonać legit regex
      • syn match Repeat "^...$" :: dodaj dany ciąg do grupy Repeat składni
  • nohlsearch :: usunąć podkreślenie z wyszukiwania wykonanej dla g//
Metoda nie regex

Justina jest prawdopodobnie szybciej:

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

Metoda bez regex działa błyskawicznie! całkiem dobry scenariusz, dzięki! – Hassek

+0

to jest naprawdę niesamowite! – pymarco

+0

Nie mogę tego uruchomić. umieściłem funkcję w moim ~/.vimrc, ale po uruchomieniu ": wywołaj funkcję HighlightRepeats()" pojawia się błąd: wykryto błąd podczas przetwarzania funkcji HighlightRepeats: wiersz 10: E28: Brak takiej nazwy grupy punktów wyróżnienia: Powtórz – Daps0l

3

Run listę raz, zrobić mapę każdej struny i ile razy występuje. Ponownie przeprowadź przez nią pętlę i dopisz swój * do dowolnego ciągu, który ma wartość więcej niż jeden na mapie.

+2

Czy istnieje szansa na uzyskanie kodu? – technomalogical

2

Spróbuj:

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

Nadzieja to działa.

Aktualizacja: następna próba.

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

Spowoduje to wykrycie sąsiednich zduplikowanych linii i będzie oznaczać tylko pierwszą, a nie drugą. – rampion

+0

Masz rację. Spróbowałem jeszcze raz. –

3

Dlaczego nie używać:

V* 

w trybie normalnym.

To po prostu przeszukuje wszystkie mecze bieżącej linii, a tym samym ich zaznaczania (jeżeli opcja jest włączona, co moim zdaniem jest to ustawienie domyślne) Poza tym, można następnie wykorzystać

n 

Aby poruszać się po meczach

+0

Tryb wizualny domyślnie nie obsługuje *. Prawdopodobnie jest to funkcja, którą masz w swoim .vimrc. Coś takiego: ZRN *: cal VisualSearch() / ZRN #: cal VisualSearch() ? Zabawa! s: VisualSearch() let old = @ "| norm! gvy let @/= '\ V'.substitute (escape (@",' \ '),' \ n ',' \\ n ',' g ') let @ "= stary endf) – Michael

+0

Arg, formatowanie zawiedione. Oto co miałem na myśli: http://pastebin.com/f2ee37c92 – Michael

+0

Tak, masz rację :) – Lonecat

27

Żadna z powyższych odpowiedzi pracował dla mnie więc to, co robię:

  1. sortować za pomocą pliku :sort
  2. wykonania polecenia :g/^\(.*\)$\n\1$/p
+0

Dziękuję, czuję, że to jest lepsze podejście.Dzięki temu możemy znaleźć duplikaty linii, a także dostosować się do wymaganej długości – harsha

1
  1. :sort i zapisać go w file1.
  2. :sort u i zapisz w file2.
  3. gvimdiff lub tkdiff dwa pliki.
Powiązane problemy