Подтвердить что ты не робот

Маркировка повторяющихся строк

Как бы вы отметили все строки в буфере, которые являются точными дубликатами других строк? Помечая их, я имею в виду выделить их или добавить персонажа или что-то еще. Я хочу сохранить порядок строк в буфере.

До:

foo
bar
foo
baz

После:

foo*
bar
foo*
baz
4b9b3361

Ответ 1

Как один однострочный:

: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 non-regex метод, вероятно, быстрее:

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

Ответ 2

Ни один из вышеперечисленных ответов не работал у меня, так вот что я делаю:

  • Сортировка файла с помощью :sort
  • Выполнить команду :g/^\(.*\)$\n\1$/p

Ответ 3

Запустите список один раз, сделайте карту каждой строки и сколько раз она происходит. Прокрутите его снова и добавьте * к любой строке, которая имеет значение более одного на карте.

Ответ 4

Почему бы не использовать:

V*

в нормальном режиме.

Он просто ищет все совпадения текущей строки, тем самым выделяя их (если параметр включен, что, по моему мнению, является значением по умолчанию) Кроме того, вы можете использовать

n

Чтобы перемещаться по совпадениям

Ответ 5

Try:

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

Надеюсь, что это сработает.

Обновление: следующая попытка.

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

Ответ 6

  • :sort и сохраните его в file1.
  • :sort u и сохраните его в file2.
  • gvimdiff или tkdiff два файла.