2013-01-07 3 views
0

Ruby begin-rescue 블록에서 현재 선택된 행 (비주얼 모드)을 감싸는 vimscript 함수를 작성하고 있습니다. 나는 이상한 행동을하고있다. 여기 제 기능입니다 :vimscript를 사용하여 텍스트 블록을 래핑하는 방법은 무엇입니까?

function! BeginRescueWrap() 
    execute "normal! gvd" 
    let head = "begin\<CR>" 
    let body = @" 
    let tail = "rescue StandardError =>e\<CR>binding.pry\<CR>end\<CR>" 
    execute "normal! i" . head . "\<CR>" . body . "\<CR>" . tail 
endfunction 

그것은 거의 그냥 어떤 이유로 머리와 꼬리의 두 복사본을 생성 works--. 이 텍스트를 선택하면 예를 들어, 기능을 실행 :

Oh lord won't you buy me a Mercedes Benz 
My friends all drive Porsches, I must make amends 

이 출력을 생성합니다 : 나는 들여 쓰기 걱정하지 않는다

begin 

    begin 

    rescue StandardError =>e 
    binding.pry 
    end 

    Oh lord won't you buy me a Mercedes Benz 
    My friends all drive Porsches, I must make amends 

    rescue StandardError =>e 
    binding.pry 
    end 

(나중에 해결할 수 있습니다). 빈 내부 겹침과 대상 행을 포함하는 외부 줄 바꿈이 있음을 주목하십시오. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

두 줄로 실행되는 것 같습니다. – romainl

답변

4

두 줄을 선택했기 때문에 Vim은 두 번 메서드를 실행할 것입니다. 당신은 한 번만 실행됩니다 방법에 range 매개 변수를 추가, 당신은 당신의 원하는 효과가 경우 :

function! BeginRescueWrap() range 
    execute "normal! gvd" 
    let head = "begin\<CR>" 
    let body = @" 
    let tail = "rescue StandardError =>e\<CR>binding.pry\<CR>end\<CR>" 
    execute "normal! i" . head . "\<CR>" . body . "\<CR>" . tail 
endfunction 

참고이 특정 목적을 위해,이 같은 매핑이 아마 더 간결 것이지만 :

,q에 대한
vnoremap ,q sbegin<cr><C-R>1rescue StandardError =>e<cr>binding.pry<cr>end<cr> 

이 매핑 은 현재 선택된 텍스트를 제거 begin 문을 기록, 그럼 그냥 삭제 된 것을두고, 다음 끝나는 결말을 기록합니다.

+0

환상적입니다. 고맙습니다. –

관련 문제