2011-07-06 25 views
3

私は分割画面で複数のバッファを持つ複数のタブがあるとします。別のタブに切り替えると、挿入モードから通常モードに切り替わりますか?

1つのバッファで編集モードになり、別のタブ(ctrl-pageDown)に切り替えると、私はまだ挿入モードです。

タブを変更すると自動的に通常モードに切り替える方法はありますか?

さらに元のバッファに戻ったときに挿入モードに戻ることは可能ですか?

+0

テキストを編集する場合にのみ挿入モードを使用してください。これはVimモダリティが設計したものです。テキストの編集を中止しました - 挿入モードを終了しました。 – ZyX

+0

グレッグの答えは簡単な「挿入モードから抜け出す」ことができます。私の答えは、「より良い」原型復帰モードを提供します。 –

+2

私はZyXにもっと同意できませんでした。私の答えは質問に答えるためだった。私は実際にあなたがあなたが問題を解決する編集をしたすぐにインサートモードを残すために自分自身を訓練することをお勧めします。 gt以外にも、CTRL-pgdnを使うよりもはるかに速いです。 –

答えて

3

BufLeaveでは、どのモードに入っているかを確認してバッファ変数を設定して、それが存在するかどうかを確認してそのモードに移行する関数を呼び出すことができます。

mode()b:varのヘルプを参照してください。

.vimrcのサンプルがあります。今のところこの目的のために書いたので、私はそれを自分で使い始めました。それは役に立つと思います。

au BufLeave * call ModeSelectBufLeave() 
au BufEnter * call ModeSelectBufEnter() 

function! ModeSelectBufLeave() 
    let b:mode_select_mode = mode() 
    " A more complex addition you could make: if mode() == v, V, <C-V>, s, S, or <C-S>, store the selection and restore it in ModeSelectBufEnter 
endfunction 

function! ModeSelectBufEnter() 
    let l:mode = mode() 
    stopinsert " First, go into normal mode 
    if (l:mode == "i" || l:mode == "R" || l:mode == "Rv") && 
    \  (!exists('b:mode_select_mode') || 
    \  b:mode_select_mode == "n" || 
    \  b:mode_select_mode == "v" || 
    \  b:mode_select_mode == "V" || 
    \  b:mode_select_mode == "\<C-V>" || 
    \  b:mode_select_mode == "s" || 
    \  b:mode_select_mode == "S" || 
    \  b:mode_select_mode == "\<C-S>") 
     normal l 
     " Compensate for the left cursor shift in stopinsert if going from an 
     " insert mode to a normal mode 
    endif 
    if !exists('b:mode_select_mode') 
     return 
    elseif b:mode_select_mode == "i" 
     startinsert 
    elseif b:mode_select_mode == "R" 
     startreplace 
    elseif b:mode_select_mode == "Rv" 
     startgreplace 
    endif 
endfunction 
7

あなたの.vimrcに

autocmd TabEnter * stopinsert 

のような非常にシンプルなものを追加してみてください可能性があります。

+0

彼は 'TabEnter'ではなく' BufEnter'を望んでいます。 –

1

私は自分の.vimrcに以下があります。

nmap <C-b> :b#<CR> 
imap <C-b> <ESC>:b#<CR> 

これは私が別のバッファに切り替えるが、通常モードで私を残すために、通常または挿入モードではCtrl + Bヒットすることができます。

imap <C-b> <ESC>:bnext<CR>i 

これができるようになりますが、あなたがたときに挿入モードではCtrl + Bをヒットし、あなたがそこに着くとき、挿入モードであなたを入れて次のバッファに切り替える:

あなたの質問については、あなたはこれを行うことができます。

同じ2つのバッファ間を行き来する場合は、元のマッピングを使用する方が便利です。もちろん、3つすべてを使用する場合は、最後に別のキーの組み合わせが必要です。

+0

vimrcマッピングの数が増えるにつれて奇妙な問題に直面したくない場合は、 'inoremap' /' nnoremap'を使うべきです。 – ZyX

+0

@ZyX - マッピングのrhsに ''を使用すると問題になると思います。たとえば、* Nに*のマッピングをしました。その場合は、 'noremap * * N'を使用しました。それでも、あなたは有効なポイントを作る。ありがとう。 – david

+0

コマンドモードに入るために ';'を使い、インライン検索を繰り返すために ':'を使いたいと思ったら(例えば)問題になります。{rhs}に{lhs}を持つことは、{rhs}に他のマッピングの{lhs}を持つことと比べてもそれほど問題はありません。 – ZyX

関連する問題