Невозможно найти повторные предложения в Vim - PullRequest
0 голосов
/ 19 апреля 2009

Я неудачно запускаю следующее в режиме поиска Vim

^(\1) (\2)

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

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

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

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

:sort u

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

Ответы [ 4 ]

2 голосов
/ 19 апреля 2009

Вы немного двусмысленны.

  • Если вы хотите найти строки, в которых второе слово является повторением первого слова, например,
      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'
    
    Обратите внимание, как четвертая строка в группе 'a b' ставится после первой, а вторая строка в группе «b b» ставится на первое место из-за ведущих пробелов. Это потому что :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                                 <i>"save your file</i>
      :sort /^\s*\zs\w\+\s\+\w\+/ r      <i>"sort it by the first two words</i>
      :w %.sorted                        <i>"save the sorted version in a new file with a .sorted extension</i>
      :undo                              <i>"undo your changes to the original</i>
      :vs %.sorted                       <i>"open the sorted version in a new window</i>
      :windo diffthis                    <i>"compare the two versions</i>
      
      Однако это может не дать вам очень полезной обратной связи.

    • Что может дать вам более полезную обратную связь, так это вместо того, чтобы вставлять номера строк перед сортировкой, чтобы вы могли видеть, какие номера строк в вашем исходном файле были расположены. Для этого попробуйте следующее:
      :%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'
      
      Итак, теперь вы знаете, откуда пришла линия.
1 голос
/ 19 апреля 2009

Я не могу найти решение для короткого стиля VIM для этого. Вот почему вот скрипт 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» и «N» для перемещения по интересующим вас строкам. Или с помощью команды «hls [earch]» вы можете выделить эти строки. 1007 *

1 голос
/ 19 апреля 2009

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

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

/ ^ (\ w +) \ 1

или более обычно

/ ^ (\ W +) \ s \ 1

1 голос
/ 19 апреля 2009

Возможно, вы имели в виду: удаление повторяющихся строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...