book1
아래 텍스트에서 및 를 로 book2
바꾸 려면 2행과 3행의 시작 부분으로 이동하여 클릭하면 pen
됩니다 . pen
(점)은 단어를 대체합니다.
pen;
book1;
book2;
book3;
하지만 여러 단어를 가져온 텍스트로 바꾸는 방법은 무엇입니까? 예를 들어, 나는 book 1
and 를 book 2
다음으로 바꾸고 싶습니다.pen
앞으로:
pen;
book 1;
book 2;
book 3;
뒤쪽에:
pen;
pen;
pen;
book 3;
단어를 두 번 당기지 않고 교체 book 1
하고 교체할 수 있습니까 ? 키 바인딩이 좋을 것 같나요?book 2
pen
답변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(와 같은 것을 입력하면 가장 가까운 대괄호 쌍 내의 텍스트가 기본 레지스터의 내용으로 대체됩니다.