vim - 여러 단어를 가져온 텍스트로 여러 번 교체

vim - 여러 단어를 가져온 텍스트로 여러 번 교체

book1아래 텍스트에서 및 를 로 book2바꾸 려면 2행과 3행의 시작 부분으로 이동하여 클릭하면 pen됩니다 . pen(점)은 단어를 대체합니다.

pen;
book1;
book2;
book3;

하지만 여러 단어를 가져온 텍스트로 바꾸는 방법은 무엇입니까? 예를 들어, 나는 book 1and 를 book 2다음으로 바꾸고 싶습니다.pen

앞으로:

pen;
book 1;
book 2;
book 3;

뒤쪽에:

pen;
pen;
pen;
book 3;

단어를 두 번 당기지 않고 교체 book 1하고 교체할 수 있습니까 ? 키 바인딩이 좋을 것 같나요?book 2pen

답변1

이 기능이 너무 자주 필요해서 이를 단순화하고 최대 속도를 허용하는 플러그인을 작성했습니다.레지스터로 교체.

플러그인은 gr{모션}/텍스트 개체, 전체 줄 또는 현재 선택 항목에 포함된 텍스트를 레지스터의 내용으로 대체하는 2-in-1 명령을 제공합니다. 이전 텍스트는 블랙홀 레지스터에서 삭제됩니다. 즉, 사라진다. 많은 엣지 케이스를 투명하게 처리하고 .표준 명령을 통해 빠른 반복을 허용합니다. 마음에 들지 않으면 해당 페이지에 대안에 대한 링크가 있습니다. (@s1n7az의 코드 조각처럼 작동하지만 플러그인으로서는 더 복잡하고 강력합니다.)

답변2

이 Reddit 댓글내가 얻은 최고의 솔루션입니다. 매우 간단합니다.

기본 레지스터를 변경하지 않고 텍스트를 바꾸는 명령을 정의했습니다. 어쩌면 이것이 당신에게도 도움이 될 것입니다. 아마도 이것저것을 기반으로 한 것 같은데, 어디서 아이디어를 얻었는지는 잘 기억나지 않지만, 구현하기 전에 어디선가 본 것 같습니다.

nnoremap <silent> cp :let g:substitutemotion_reg = v:register
            \ <bar> set opfunc=SubstituteMotion<CR>g@

" substitute {motion} text with contents of a register function!
SubstituteMotion(type, ...)
    let l:reg = g:substitutemotion_reg
    if a:0
        " visual mode, use '< and '> marks
        silent exe "normal! `<" . a:type . "`>\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'line'
        " linewise
        silent exe "normal! '[V']\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'block'
        " blockwise-visual
        silent exe "normal! `[\<C-V>`]\"_c\<c-r>" . l:reg . "\<esc>"
    else
        " characterwise
        silent exe "normal! `[v`]\"_c\<c-r>" . l:reg . "\<esc>"
    endif endfunction 

이를 사용하려면 cpi(와 같은 것을 입력하면 가장 가까운 대괄호 쌍 내의 텍스트가 기본 레지스터의 내용으로 대체됩니다.

관련 정보