모션 매핑


12

매핑 내에서 후속 동작으로 연산자를 사용하는 방법을 이해하려고합니다. 예를 들면 다음과 같습니다.

nmap /c c{here we pending for a motion}/<C-r>"<CR>

지도는 다음을 수행해야합니다.

  1. c운영자를 활성화 하고 다음 동작을 청취하십시오.
  2. 예를 들어 여기 t,에 입력 하여 다음 쉼표 앞에있는 모든 것을 변경할 수 있습니다 .
  3. 커서와 쉼표 사이의 모든 것을 삭제하는 삽입 모드로 이동하십시오.
  4. 삭제 된 텍스트는 패턴으로 자동 검색됩니다

간단히 말해서, 모션 텍스트가 제거 된 후에는 삭제 된 텍스트가 강조 표시되는 삽입 모드를 유지합니다. 누군가 내가이 사건을 해결하도록 도와 주면 매우 감사 할 것입니다.

최신 정보

대답은 거의 내가 원하는 것입니다. 그러나! 나는 누르면 /cw입력 뭔가 대신의 말씀을 누른 다음을 누릅니다 <Esc>. 다음 발생과 똑같이 할 것으로 예상됩니다. 그러나 n(다음 발생으로 이동) 및 .(마지막 명령 반복) 후에는 마지막으로 입력 한 텍스트를 바꾸지 않고 앞에 추가합니다. 매핑의 주요 목표는 그것을 사용 n/N하고 .반복한다. 내가 놓친 것이 있습니까?

답변:


9

vim은 operator-mapping을 지원합니다 :h map-operator.

필요한 것은 operatorfunc및 매핑입니다. 귀하의 필요에 따라 다음 코드가 작동합니다. 글쎄, 그것은 단지 예일뿐입니다.

nmap  <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
    silent exec 'normal! `[v`]d'    
    silent exec 'let @/=@"' 
    startinsert
endfunction

그 주 exec 'let @/=@"'만 버퍼에 코드를 강조합니다. 강조 표시를 즉시보고 싶지 않다면let @/=@"


질문을 업데이트했습니다. 귀하의 답변이 내 요구에 가장 가까운 것 같지만 다음 번에는 그렇게하지 않습니다. 그래서 질문에 그 순간을 설명했습니다.
Timur Fayzrakhmanov 2016

두 개의 연산자 ( /ci)가 vim의 .마지막 연산자를 반복합니다. 확장하려면 repeat플러그인을 확인하십시오 . @TimurFayzrakhmanov도 있습니다 :g:s명령, 당신도 도움이 될 수 있습니다.
Kent

이상한 거기에 "코드에서 'let @/=@""'? 예를 들어 silent exec 'normal! [v ]c'와 같이 가능하다고 생각했습니다. c연산자는 변경된 텍스트를 검색 패턴에 추가하지 않는 것을 제외하고는 내가 기대하는 것을 수행 하기 때문 입니다.
Timur Fayzrakhmanov 2016

1
@TimurFayzrakhmanov는 "" 오타였습니다. 수정했습니다 .. 나도 생각해 c냈지만 모드 변경이 있기 때문에 공간이 추가되었습니다 n-i-n-i... 몇 가지 테스트를하십시오.
Kent

@TimurFayzrakhmanov 당신은 변경하여 어떤 플러그인없이 반복 할 수 있습니다 dystartinsertcall feedkeys("cgn", 'n')(내 대답은 아래 참조)
제롬 Dalbert

4

함수를 사용하여 복잡한 매핑을 구현하고 문서화하는 것이 더 쉽습니다.

function! DoMagic()
   execute "normal! d".input("enter motion: ")
   let @/=@"
   startinsert
endfunction

그런 다음 매핑을 해당 함수로 호출하십시오.

nmap /c :call DoMagic()<CR>

편집하다:

많은 장소에서 검색 및 교체를 수행하려는 경우 대체 명령을 시도해야합니다 :s. 시각적 선택 항목을 검색 패턴에 복사하도록 매핑을 변경할 수 있습니다.

function! DoMagic2()
   normal! gv"ay
   return @a
endfunction

vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>

1
이것은 "좋은"UI에서도 가능하며 OP의 필요에 따라 작동하며 입력 한 것에 따라 예상보다 "더 많을"수 있습니다. 예를 들어 enter motion:, 그는 다음과 같이 말했습니다 : t,ggVGJZZ ^ _ ^ 그것은 명령 연결에 대한 일반적인 문제입니다
Kent

거의 내가 원하는 것입니다. 예 :을 누른 /cw다음 단어 대신 무언가를 입력 한 다음을 누릅니다 <Esc>. 다음 발생과 똑같이하고 싶습니다. 그러나 n(다음 발생으로 이동) 및 .(마지막 명령 반복) 후에는 마지막으로 입력 한 텍스트를 바꾸지 않고 앞에 추가합니다. 매핑의 주요 목표는 그것을 사용 n/N하고 .반복한다. 내가 놓친 것이 있습니까?
Timur Fayzrakhmanov 2016

1
이 함수는 복잡한 매핑에 문제가있을 때 함수 사용에 대한 아이디어를 명확히하기위한 것입니다. 필요에 맞게 변경해야합니다. Kent의 조언에 .따라 명령을 반복하십시오.
mMontu

답변 감사합니다. 유용하지만 @Kent를 받아들입니다. 입력 한 직후 ( <CR>에서 보류하지 않고) 모션을 수행하기 때문 input()입니다.
Timur Fayzrakhmanov

1
@TimurFayzrakhmanov 당신은 또한 업데이트에서 설명한대로 대체를 시도 할 수 있습니다.
mMontu

1

이 솔루션은 "마지막 명령 반복"(일명 .) 과 함께 작동합니다 .

nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@

function! ChangeOccurence(type)
  exec 'normal! `[v`]y'
  let @/ = @"
  call feedkeys('cgn', 'n')
endfunction

반복 할 때도 사용할 필요가 없으며 더 빨리 가고 싶다면 다음 항목을 직접 가져 와서 바꾸는 데 n사용할 .수 있습니다.

당신이 일치하는 단어의 하이라이트를 가진 좋아하는 경우에 선택적으로, 당신은 대체 할 수 있습니다 'cgn''n``cgn'.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.