2016-10-24 2 views
1

시각적 블럭 모드에서 <S-i> (I)으로 여러 줄을 삽입 할 수 있습니다. 그러나 함수에 의해 동일한 효과를 얻고 싶습니다. 함수가 있다고 가정 해 봅시다. 세 개의 하위 시각적 모드는 다음과 같이 (visual-character, visual-line, visual-block),Vim 명령을 사용하여 여러 줄에 텍스트 삽입

function! VisualMappingSpace() 
    let m = visualmode() 
    if m ==# 'v' 
     echo 'character-wise visual' 
    elseif m == 'V' 
     echo 'line-wise visual' 
    elseif m == "\<C-V>" 
     echo 'block-wise visual' 
    endif 
endfunction 

다음과 같이 내가 시도했지만 작동하지 않습니다 말할 수있다. visual-block 모드에서 <space>을 눌렀을 때 내가 선택한 라인에 잡음을 삽입하고 싶습니다.

function! VisualMappingSpace() 
    let m = visualmode() 
    if m ==# 'v' 
     exec "normal y" 
    elseif m == 'V' 
     exec "normal y" 
    elseif m == "\<C-V>" 
     let g:block_insert_content = input("") 
     exec "normal I ".g:block_insert_content 
    endif 
endfunction 
vnoremap <silent> <Space> :call VisualMappingSpace()<CR> 
+0

"exec"normal y "는"normal y "여야합니다. 어쨌든, 당신은 무엇을 기대합니까? 대신 당신은 무엇을 얻습니까? – romainl

+0

사실 내가 기대 한 것은''을 치면'visual-character '와'visual-line'모드로,''을 치면'visual-block' 모드로 바뀐다. 내가 선택한 선에 뭔가를 삽입 할 수 있습니다. 마치'visual-block '모드에서'I'를 치는 것과 같습니다. – j5shi

답변

2

시각 범위 ('<,'>)를 자동으로 삽입 것이다 : 통해 명령 라인 모드로 진입 시각적 모드 매핑. :call을 사용하면에 대해 함수가 한 번 호출됩니다. 반복 쿼리를 통해 알아 차렸을 것입니다.

이렇게하려면 <C-u>을 매핑에 삽입하십시오. 범위를 지 웁니다.

두 번째 문제 : 당신은 쿼리 텍스트를 삽입 할 때 당신이 gv를 통해 선택을 (? 당신의 매핑 기억, 명령 줄 모드에 대한 시각적 모드를 왼쪽) 다시 작성해야합니다; 다음, I 작동합니다 :

또한
function! VisualMappingSpace() 
    let m = visualmode() 
    if m ==# 'v' 
     exec "normal y" 
    elseif m == 'V' 
     exec "normal y" 
    elseif m == "\<C-V>" 
     let g:block_insert_content = input("") 
     exec "normal gvI ".g:block_insert_content 
    endif 
endfunction 
vnoremap <silent> <Space> :<C-u>call VisualMappingSpace()<CR> 

이 쿼리 텍스트 앞에 추가 공백 문자가 있습니다; gvI ".

+1

나는이 대답이 놀랍다 고 말할 것입니다! 감사! – j5shi

관련 문제