2016-10-24 24 views
1

視覚ブロックモードでは、<S-i>I)で複数の行に挿入することができますが、関数で同じ効果を達成したいと思います三つのサブのビジュアルモードを以下のように(visual-charactervisual-linevisual-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'モードで' I'を打ったように、選択した行に何かを挿入することができます。 – j5shi

答えて

2

ビジュアルモードのマッピングは、視覚範囲('<,'>)自動的に挿入を有することになります。 :callの場合は、選択された行につきの関数が1回呼び出されます。つまり、です。あなたは繰り返しの質問を通して気づいたはずです。

これを避けるには、<C-u>をマッピングに挿入します。範囲をクリアします。 経由で、の選択を再作成する必要があります(コマンドラインモードのビジュアルモードを覚えていますか?覚えていますか?) そして、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

関連する問題