2

I'd like to make a mapping in Vim so that CtrlTab switches to the previous buffer (:b#), but then if Tab is pressed again without releasing Ctrl, switches to the next buffer (:bn) instead.

This is similar to how the AltTab function in MS Windows works. Is there any way to achieve this effect?
I can't seem to find this question asked anywhere else.

4

2 回答 2

2

Vim 只处理完整的按键;<LeftMouse>与.之间只有轻微的语义差异<LeftRelease>。您需要以某种方式将键和弦处理成不同的、单独的击键(可能是一些未使用的<F13>键?),然后:map可以在 Vim 中进行处理。在 Windows 上,AutoHotkey 工具可让您实现这一目标。

或者,您可以:nmap <C-Tab>, 并检查上一次调用是否最近才发生(使用localtime())。这应该会给你一些你想要的东西。

于 2013-05-15T12:12:19.127 回答
0

这是我写的vimscript,给感兴趣的人。我使用 AutoHotkey 将发布映射CtrlF13. (见 Ingo Karkat 的回答)

let g:ctrl_held = 0
let g:prev_buf = 1
function! Ctrltab()
   if g:ctrl_held == 0
      let cmd = ":b".g:prev_buf."\<CR>"
      if g:prev_buf == bufnr('')
         let cmd = ":bn\<CR>"
      endif
      let g:prev_buf = bufnr('') 
      let g:ctrl_held = 1
      return cmd
   else
      return ":bn\<CR>"
   endif
endfunction
nmap <expr> <C-Tab> Ctrltab()
nmap <silent> <F13> :let g:ctrl_held = 0<CR>
于 2013-05-15T15:33:55.317 回答