假设我在分屏中有多个带有多个缓冲区的标签。
当我在一个缓冲区中处于编辑模式并切换到另一个选项卡(ctrl-pageDown)时,我仍处于插入模式。
更改标签时有没有办法自动切换到普通模式?
更好的是,回到原始缓冲区时是否可以返回插入模式?
答案 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 并切换到下一个缓冲区,当你到达那里时让你进入插入模式。
如果您发现自己在相同的两个缓冲区之间来回切换,我上面的原始映射可能会更有用。当然,如果你使用全部三个,你需要为最后一个使用不同的组合键。