2012-09-19 1 views
2

나는 이것이 단순해야 함을 알고 있습니다.vim에서 visual 명령을 사용하여 실행

괄호 vnoremap <leader>rl di[<esc>pa] 랩 선택한 텍스트를 수행하지만 이유 :

vnoremap <leader>rl :call VisAddRefLink()<CR> 

function! VisAddRefLink() 
    execute "normal! di[\<esc>pa]" 
endfunction 

하지 않습니다!

도움을 주셨습니다.

답변

2

이 시도 :

vnoremap <leader>rl :<C-u>call VisAddRefLink()<CR> 

function! VisAddRefLink() 
    execute "normal! gvdi[\<esc>pa]" 
endfunction 

call 앞의 <C-u> 맵핑이 앞의 시각 범위 '<,'> 삽입 것을 피한다 범위 내의 모든 행에 대해 한 번만 호출하는 것이 아니라 한 번만 호출하는 함수를 원합니다.

기능을 사용하려면 먼저 시각적 선택을 다시 설정해야합니다. gv은 그렇게합니다.

+0

마찬가지로 다른 예제와 같이': '대신' :'을 사용할 수 있습니다. 나는 아마 물건을 복잡하게했다! :) – Conner

+0

우수, 대단히 감사합니다. 잘 작동한다. – Simon

2

함수를 범위로 처리해야합니다. 이를 수행하는 한 가지 방법은 다음과 같습니다.

vnoremap <leader>rl :call VisAddRefLink()<CR> 

function! VisAddRefLink() range 
    exe a:firstline . "normal! ^i[" 
    exe a:lastline . "normal! $a]" 
endfunction 

예가 작동하지 않는 이유는 exe가 말에 따라 시각적으로 선택되지 않기 때문입니다. 예를 들어, 시각적으로 항목을 선택하고 :norm d을 실행합니다. 삭제되지 않는 것을 알 수 있습니다. :help function-range-example과 같은 함수에 범위를 추가하면 유사한 방식 (라인 단위)으로 작업하여 시각적 선택에 도움이됩니다. 그러나 여전히 진정한 시각적 선택은 아닙니다. 범위를 추가하면 a:firstlinea:lastline 개의 변수를 사용할 수 있습니다.이 변수를 사용하여이를 수행 할 수 있습니다. 또한이 방식에서처럼 하나에이를 수

vnoremap <leader>rl <esc>:norm! '<^x2Phr['>$x2pr]<cr> 

이 제 시각적 선택을 종료 <esc>를 이용한다. 그런 다음 한 번만 실행되는 일반 명령을 실행합니다. 시각적 선택이 없으면 시각적 선택의 각 행에 대해 한 번씩 실행됩니다. 일단 실행되면

'<^은 시각적 선택의 첫 번째 행과 그 행의 첫 번째 비어 있지 않은 공백으로 점프합니다.

x2Phr[

는 앞에 두 배 문자, 페이스트를 삭제 우리가 새로운 문자 이상있어 너무 왼쪽으로 이동하고, 개방과의 마지막 행의 마지막 문자 [

'>$ 이동을 대체합니다 이전하지만 반대 방향 평소처럼

같이

x2pr] 같은 시각적 인 선택은, 특히 vim 스크립트와 함께, 고양이 피부 하나 개 이상의 방법이있다. 더 많이 배울수록 일을 성취 할 수있는 많은 가능성을 알 수 있습니다.

+0

대단히 Conner의 의견을 받아 주셔서 감사합니다. Ingo의 솔루션을 조금 더 간단하게 사용 했으므로 작동합니다. – Simon

관련 문제