2009-04-19 3 views
0

Я бегу следующий неудачно в режиме поиска Vim вНевозможно найти повторяющиеся фразы в Vim

^(\1) (\2) 

Я пытаюсь найти строки, которые первые два слова являются одинаковыми в моем .vimrc.

Как вы можете найти эти строки в Vim?

[править после первого ответа]

Я нашел удобный инструмент

:sort u 

Как я могу сравнить мой первый вариант и последующая версия после команды?

ответ

2

Ты становишься немного неоднозначный.

  • Если вы хотите найти строки, где второе слово является повторением первого слова, например.
     
        dog dog this line 
        dog cat not this line 
        cat cat this line 
        cat dog not this line 
    
    Затем используйте следующее регулярное выражение:
     
        /^\s*\(\w\+\)\s\+\1 
    
    Первого слова захватывается \(\w\+\), и соответствие снова по обратной ссылке \1

  • Если вы хотите, чтобы сгруппировать строки их первых двух слов, например

     
        a a is the first line in group 'a a' 
        a b is the first line in group 'a b' 
        a b is the second line in group 'a b' 
        -------------nogroup--------------- 
        a b is the third line in group 'a b' 
        b b is the first line in group 'b b' 
        a b is the fourth line in group 'a b' 
         b b is the second line in group 'b b' 
    
    затем :sort - твой друг. Однако, если вы только запустили :sort, вы получите следующее:
     
         b b is the second line in group 'b b' 
        -------------nogroup--------------- 
        a a is the first line in group 'a a' 
        a b is the first line in group 'a b' 
        a b is the fourth line in group 'a b' 
        a b is the second line in group 'a b' 
        a b is the third line in group 'a b' 
        b b is the first line in group 'b b' 
    
    Обратите внимание, что четвертая строка в группе «ab» помещается после первой, а вторая строка в группе «bb» помещается первой, из-за ведущих пространств , Это связано с тем, что по умолчанию :sort, использует всю строку. Чтобы получить его для сортировки только по первым двум словам и для сохранения закажите иначе, используйте :sort /^\s*\zs\w\+\s\+\w\+/ r
     
        -------------nogroup--------------- 
        a a is the first line in group 'a a' 
        a b is the first line in group 'a b' 
        a b is the second line in group 'a b' 
        a b is the third line in group 'a b' 
        a b is the fourth line in group 'a b' 
        b b is the first line in group 'b b' 
         b b is the second line in group 'b b' 
    
    . ^\s*\zs сообщает ему игнорировать ведущие пробелы, а \w\+\s\+\w\+ сообщает ему использовать первые два слова в качестве ключа сортировки. Параметр r указывает :sort использовать данный шаблон в качестве ключа сортировки. Подробнее см. :help :sort.

    Если вы хотите увидеть, что изменилось, есть две тактики, которые я могу думать о том, чтобы помочь вам:

    • Вы можете сохранить файл, отсортировать строки, а затем сохранить копию под другим именем, то используйте возможности vim, встроенные в diff, чтобы сравнить их:
       
      :w         "save your file 
      :sort /^\s*\zs\w\+\s\+\w\+/ r  "sort it by the first two words 
      :w %.sorted      "save the sorted version in a new file with a .sorted extension 
      :undo        "undo your changes to the original 
      :vs %.sorted      "open the sorted version in a new window 
      :windo diffthis     "compare the two versions 
      
      Однако это может не дать вам очень полезной обратной связи.

    • Что может дать вам более полезную обратную связь - вместо этого вставить номера строк перед сортировкой, чтобы вы могли видеть, какие номера строк в вашем исходном файле пошли туда. Для этого попробуйте выполнить следующее:
       
      :%s/^/\=line('.') . ' ' 
      :sort /^\d\+\s*\zs\w\+\s\+\w\+/ r 
      
      %s/^/\=line('.') . ' ' вставляет номер строки в начале каждой строки. Тогда сортировка (слегка измененная, чтобы игнорировать номер строки) делает свою вещь. В приведенном выше примере это дает:
       
      4 -------------nogroup--------------- 
      1 a a is the first line in group 'a a' 
      2 a b is the first line in group 'a b' 
      3 a b is the second line in group 'a b' 
      5 a b is the third line in group 'a b' 
      7 a b is the fourth line in group 'a b' 
      6 b b is the first line in group 'b b' 
      8  b b is the second line in group 'b b' 
      
      Итак, теперь вы знаете, какая строка появилась.
+0

Спасибо за ваш ответ! Матч: sort/^ \ s * \ zs \ w \ + \ s \ + \ w \ +/r почти идеально. Знаете ли вы, как игнорировать совпадения, которые начинаются с if и заканчиваются на endif? –

+0

Мои комментарии кажутся проблемой в моем vimrc по адресу http://dpaste.com/35562/. Мне нужно как-то связать их с соответствующими кодами. –

1

вы имели в виду: removing duplicate lines

+0

Я не имею в виду это точно. Я хочу найти строки, у которых два первых слова одинаковы. –

1

Я не могу найти решение короткий ВИМ стиль для этого. Вот почему вот сценарий vim.

function! s:escape(line) 
    return escape(a:line, '[]*') 
endfunction 

function! s:highlight_similar(pattern, extraction) 
    let sorted = sort(getline(1, '$')) 
    let matched_lines = {} 

    let pattern = '^\s*\(\w\+\)\s\+\(\w\+\).*$' 
    let previous_part = '' 
    let previous_line = '' 

    for i in range(0, line('$') - 1) 
     let line = sorted[i] 
     if line !~ a:pattern 
      continue 
     endif 
     let part = substitute(line, a:pattern, a:extraction, '') 
     if empty(part) 
      continue 
     endif 
     if part == previous_part 
      let matched_lines[s:escape(line)] = i 
      let matched_lines[s:escape(previous_line)] = i 
     else 
      let previous_part = part 
      let previous_line = line 
     endif 
    endfor 
    let @/ = join(keys(matched_lines), '\|') 
endfunction 

И команды определение, которое должно быть в том же файле

command! -nargs=0 HighlightTwoWords 
     \call <SID>highlight_similar('^\s*\(\w\+\)\s\+\(\w\+\).*$', '\1 \2') 
command! -nargs=0 HighlightTwoRows 
     \call <SID>highlight_similar('^\s*\(.*\)\s*$', '\1') 

И затем после использования команды «HighlightTwoWords» вы будете иметь возможность использовать «п» и «N», чтобы перемещаться по линии вы вас интересует. Или, используя команду «hls [earch]», вы можете выделить эти строки.

+0

У меня есть две линии. $ 1: set history = 1000 "comment и $ 2: set history = 1000. Он не может найти эти дубликаты. –

+0

Возможно, вам просто нужно изменить \ w на [^ \ s], если ваши слова могут состоять из чего угодно, кроме пробелов (не уверен, как это будет отформатировано в VIM, но я уверен, что кто-то может помочь) – cmptrgeekken

+0

@cmptrgeekken: Первый комментарий к первой версии ответа. Эта версия обрабатывает вещи. –

1

Вы хотите: найти любую строку, для которой первые два слова идентичны?

Попробуйте это:

/^ (\ W +) \ 1

или в более общем

/^ (\ W +) \ s \ 1

+0

он имел в виду строки, идентичные в первых двух словах –

Смежные вопросы