切换到另一个选项卡时从插入模式更改为正常模式?

时间:2011-07-06 08:05:39

标签: vim macvim

假设我在分屏中有多个带有多个缓冲区的标签。

当我在一个缓冲区中处于编辑模式并切换到另一个选项卡(ctrl-pageDown)时,我仍处于插入模式。

更改标签时有没有办法自动切换到普通模式?

更好的是,回到原始缓冲区时是否可以返回插入模式?

3 个答案:

答案 0 :(得分:7)

您可以尝试添加非常简单的内容,例如

autocmd TabEnter * stopinsert

到你的.vimrc。

答案 1 :(得分:3)

BufLeave中,您可以调用一个函数来检查您所处的模式并设置缓冲区变量,然后在BufEnter中检查它是否存在并转到该模式。

请参阅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

答案 2 :(得分:1)

我的.vimrc中有以下内容:

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

这使我在正常模式或插入模式下按 Ctrl + b 切换到备用缓冲区,但让我保持正常模式。

关于你的问题,你可以这样做:

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

这将让你在插入模式下点击 Ctrl + b 并切换到下一个缓冲区,当你到达那里时让你进入插入模式。

如果您发现自己在相同的两个缓冲区之间来回切换,我上面的原始映射可能会更有用。当然,如果你使用全部三个,你需要为最后一个使用不同的组合键。