Инкрементальный поиск VIM, как скопировать соответствующую строку под курсором? - PullRequest
5 голосов
/ 01 января 2012

В VIM вы можете искать указанную строку. Затем вы можете нажать n или N для перехода к следующему или предыдущему совпадению. Когда вы нажимаете n или N , курсор перемещается на соответствующий текст. У меня вопрос, как быстро скопировать соответствующий текст под курсором?


Редактировать:

Мне нужно текущее совпадение под курсором, а не все совпадения в документе.

Спасибо

Ответы [ 4 ]

7 голосов
/ 01 января 2012

Вы хотите выполнить следующее

y//e

Обзор:

Основная идея заключается в том, что после поиска или нажатия n или N курсор будет находиться в начале сопоставленного текста. Затем вы тянете к концу последнего поиска.

Объяснение

  • y выдернет из текущей позиции следующим движением
  • // поиск с использованием последнего шаблона поиска.
  • //e Флаг e поместит курсор в конец сопоставленного текста

В качестве предупреждающего слова это изменит текущий шаблон поиска, поскольку добавляет флаг /e. Поэтому следующие n и / или N переместят курсор в конец матча.

Это очень похоже на следующий post .

3 голосов
/ 02 января 2012

Можно написать функцию, извлекающую совпадение последнего шаблона поиска вокруг курсора, и создать отображение для его вызова.

nnoremap <silent> <leader>y :call setreg('"', MatchAround(@/), 'c')<cr>
function! MatchAround(pat)
    let [sl, sc] = searchpos(a:pat, 'bcnW')
    let [el, ec] = searchpos(a:pat, 'cenW')
    let t = map(getline(sl ? sl : -1, el), 'v:val."\n"')
    if len(t) > 0
        let t[0] = t[0][sc-1:]
        let ec -= len(t) == 1 ? sc-1 : 0
        let t[-1] = t[-1][:matchend(t[-1], '.', ec-1)-1]
    end
    return join(t, '')
endfunction

Функция выше определяет начальную и конечную позиции совпадения итщательно извлекает соответствующий текст, правильно обрабатывая многострочные шаблоны и многобайтовые символы.

Другой вариант - создание сопоставлений текстовых объектов (см. :help text-object) для работы с последним совпадением шаблона поиска под курсором.

vnoremap <silent> i/ :<c-u>call SelectMatch()<cr>
onoremap <silent> i/ :call SelectMatch()<cr>
function! SelectMatch()
    if search(@/, 'bcW')
        norm! v
        call search(@/, 'ceW')
    else
        norm! gv
    endif
endfunction

Чтобы скопировать текущее совпадение, используя эти сопоставления, используйте yi/.Что касается других текстовых объектов, также возможно, например, визуально выделить его с помощью vi/ или удалить с помощью di/.

0 голосов
/ 01 января 2012

Полагаю, это должно быть сделано:

command! -register CopyExactMatchUnderCursor call s:CopyExactMatchUnderCursor('<reg>')

function! s:CopyExactMatchUnderCursor(reg)
    let cpos = getpos('.')
    let line = cpos[1]
    let idx = cpos[2] - 1
    let txt = getline(line)

    let mend = matchend(txt, @/, idx)

    if mend > idx
        let sel = strpart(txt, idx, mend - idx)

        let reg = empty(a:reg) ? '"' : a:reg
        execute 'let @' . reg . ' = sel . "\n"'
    end
endfunction

Сначала захватывает позицию курсора с помощью getpos, затем ищет конец совпадения (начиная со столбца, в котором курсор использует matchend), а затем возвращает подстроку в указанном регистре - по умолчанию " используется.

Все необходимые методы были в основном в ответе @eckes.

0 голосов
/ 01 января 2012

Нажмите y , и текст под курсором будет скопирован в неиспользованный регистр по умолчанию, затем вы можете нажать p для вставки.

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