区分Vim中两次击键之间的修改键的保持和释放

时间:2013-05-15 11:51:56

标签: vim key-bindings

我想在Vim中进行映射,以便 Ctrl Tab 切换到上一个缓冲区(:b#),但是如果再次按下Tab 而不释放 Ctrl ,切换到下一个缓冲区(:bn)。

这类似于MS Windows中的 Alt Tab 功能。有没有办法达到这个效果?
我似乎无法在其他任何地方找到这个问题。

2 个答案:

答案 0 :(得分:1)

Vim仅处理完整的按键操作; <LeftMouse><LeftRelease>之间只有轻微的语义差异。你不知何故需要将关键的chording处理成不同的,单独的键击(可能是一些未使用的<F13>键?),然后可以在Vim内部:map。在Windows上,AutoHotkey tool可以让您实现这一目标。

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

答案 1 :(得分:0)

这是我写的vimscript,对任何感兴趣的人。我使用AutoHotkey将 Ctrl 的发布映射到 F13 。 (见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>