如何将选项卡保持为本地模式?

时间:2014-03-13 20:16:20

标签: vim

如果我在插入模式下有一个标签,并且在我上次查看时切换到另一个处于正常模式的标签,则它会更改为插入模式。这让我失望了。如何更改选项卡的本地更改模式?

2 个答案:

答案 0 :(得分:1)

如何切换到其他标签?用鼠标点击标签行(这是我可以重现的唯一方法)?!你应该避免在Vim中使用鼠标,但这会改变行为:

:autocmd TabEnter * stopinsert

要使用键盘切换标签,通常可以通过普通模式中的gt命令来完成,因此您已经离开了插入模式(只需使用<Esc>,不是<C-O>)。

对于更类似浏览器的行为,我有以下键映射:

" CTRL-Tab      next tab
noremap <C-Tab> :<C-U>tabnext<CR>
inoremap <C-Tab> <C-\><C-N>:tabnext<CR>
cnoremap <C-Tab> <C-C>:tabnext<CR>
" CTRL-SHIFT-Tab    previous tab
noremap <C-S-Tab> :<C-U>tabprevious<CR>
inoremap <C-S-Tab> <C-\><C-N>:tabprevious<CR>
cnoremap <C-S-Tab> <C-C>:tabprevious<CR>

答案 1 :(得分:0)

Vim的当前模式是编辑范围的。你不能强迫它跟随标签或缓冲区或窗口或任何东西。

你可以做的事情是,当你离开标签时,它会以当前模式存储,并在你进入标签时恢复它。

这可以在正常模式和任何一种插入/替换模式之间切换;但是在插入/替换模式之间切换似乎不会出于某种原因:

augroup TAB_MODES
  au!
  autocmd TabLeave * let t:lastmode = mode(1)
  autocmd TabEnter * if !exists('t:lastmode') | let t:lastmode = 'n' | endif
  autocmd TabEnter * if t:lastmode ==# 'n'  | stopinsert    | endif
  autocmd TabEnter * if t:lastmode ==# 'i'  | startinsert   | endif
  autocmd TabEnter * if t:lastmode ==# 'R'  | startreplace  | endif
  autocmd TabEnter * if t:lastmode ==# 'Rv' | startgreplace | endif
augroup END

这使用tab-local变量在您离开文件时存储当前模式,并在您重新进入选项卡时使用它来启动正确的插入或替换模式(或停止插入模式)。这里不包括一些模式;例如,我无法使用可视模式(我尝试了多种方式调用gv但没有成功)。