Идентификация идентичных блоков кода - PullRequest
1 голос
/ 31 августа 2009

Скажем, у меня есть несколько блоков следующего кода в файле (пробелы не нужны):

sdgfsdg dfg
dfgdfgf ddfg
dfgdfgdfg  dfgfdg

Как найти / выделить все вхождения?

В идеале я хочу визуально выбрать блок кода и нажать «Поиск», чтобы найти все вхождения.

Ответы [ 4 ]

2 голосов
/ 31 августа 2009

Попробуй это. Включите этот скрипт где-нибудь в ваш путь выполнения (см. :help runtimepath). Простой вариант - поместить его в свой vimrc. Визуально выберите то, что вы хотите найти, и нажмите ,/ (запятая, а затем косая черта).

" Search for other instances of the current visual range

" This works by:
" <ESC>                Cancel the visual range (it's location is remembered)
" /                    Start the search
" <C-R>=               Insert the result of an expression on
"                      the search line (see :help c_CTRL-R_= )
" GetVisualRange()<CR> Call the function created below
" <CR>                 Run the search
vmap ,/ <ESC>/<C-R>=GetVisualRange()<CR><CR>

" Create the function that extracts the contents of the visual range
function! GetVisualRange()
    " Get the start and end positions of the current range
    let StartPosition = getpos("'<")
    let EndPosition = getpos("'>")

    " Prefix the range with \V to disable "magic"
    " See :help \V
    let VisualRange = '\V'

    " If the start and end of the range are on the same line
    if StartPosition[1] == EndPosition[1]
        " Just extract the relevant part of the line
        let VisualRange .= getline(StartPosition[1])[StartPosition[2]-1:EndPosition[2]-1]
    else
        " Otherwise, get the end of the first line
        let VisualRange .= getline(StartPosition[1])[StartPosition[2]-1:]
        " Then the all of the intermediate lines
        for LineNum in range(StartPosition[1]+1, EndPosition[1]-1)
            let VisualRange .= '\n' . getline(LineNum)
        endfor
        " Then the start of the last line
        let VisualRange .= '\n' . getline(EndPosition[1])[:EndPosition[2]-1]
    endif
    " Replace legitimate backslashes with double backslashes to prevent
    " a literal \t being interpreted as a tab
    let VisualRange = substitute(VisualRange, '\\[nV]\@!', '\\\\', "g")

    " Return the result
    return VisualRange

endfunction
2 голосов
/ 31 августа 2009

Может быть, вы должны посмотреть на: Поиск визуально выделенного текста

Я взял это у здесь

1 голос
/ 04 сентября 2009

Быстрое и грязное частичное решение:

:set hlsearch
*

Опция hlsearch (включена по умолчанию в некоторых конфигурациях vim, но я всегда ее отключаю) заставляет vim подсвечивать все найденные экземпляры текущего поиска. Нажатие * в обычном режиме ищет слово под курсором. Так что это выделит все вхождения слова под курсором.

1 голос
/ 31 августа 2009

Текст для поиска сохраняется в регистре /. Вы не можете вытащить или удалить непосредственно в этот регистр, но вы можете присвоить ему, используя `let '.

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

  • Используйте визуальный режим, чтобы выделить код, который вы хотите найти
  • Введите "ay, чтобы вернуть выделенный выбор в регистр a
  • Введите :let @/ = @a, чтобы скопировать регистр a в регистр поиска /

На этом этапе весь код, соответствующий вашему выбору, будет выделен, и вы можете перемещаться по вхождениям, используя n / N, как при обычном поиске.

Конечно, вы можете использовать любой временный регистр вместо a. И это не должно быть слишком сложно, чтобы отобразить эту последовательность команд для легкого использования.

...