Vim에서 선택한 텍스트의 cgn

4626 단어 Vimtech
커서 아래의 단어를 검색하고 한 번 되돌아온 후에 다음 일치gnc를 변경합니다.
모두가 알고 있는 것은 이 cgn 를 약간 중복하는 기술이다.
다음 매핑은 예입니다.
nnoremap <Space>d *N"_cgn
📝 레지스터_를 더럽히지 않기 위해 버리기
시각 모드에서 선택한 텍스트cgn를 더욱 통용적으로 사용할 수 있다.
xnoremap <expr> <Space>d "\<ESC>/\<C-r>=<SID>search()\<CR>\<CR>N\"_cgn"
function! s:search() abort
  " 選択範囲のテキストを正確に取るのが面倒で元の内容を一時退避してyしている
  let tmp = @"
  normal! gv""y
  let [text, @"] = [escape(@", '\/'), tmp]
  return '\V' .. substitute(text, "\n", '\\n', 'g')
endfunction
주문처럼 보이지만 검색 대상자cgn는 같다.
선택한 텍스트를 바꾸기 위해 도피 \V (very nomagic).
줄 바꾸기를 포함해도 즐겁다.
그나저나 vim-operator-replace로 대체c할 수도 있다.
nnoremap <Plug>(builtin-/) /
nnoremap <Plug>(builtin-N) N
onoremap <Plug>(builtin-gn) gn
xmap <expr> <Space>r "\<ESC><Plug>(builtin-/)\<C-r>=<SID>search()\<CR>\<CR><Plug>(builtin-N)<Plug>(operator-replace)<Plug>(builtin-gn)"
상당히 지루하게 썼다.<Plug>를 사용하기 때문에 xnoremap가 아니라 xmap가 필요합니다./,N,gn에 맵이 존재하면 이 맵은 호출되기 때문에 원시적인 맵을 만들어서 피한다.
(사용<Plug>회피는 예의에 어긋날 수 있음)
회피할 필요가 없다면"\<ESC>/\<C-r>=<SID>search()\<CR>\<CR>N<Plug>(operator-replace)gn".:s 아직 쓸 정도는 아니고 보고 싶은 텍스트를 바꾸고 싶을 때 사고를 멈출 수 있어 편리하다.

좋은 웹페이지 즐겨찾기