Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
区分Vim中两次击键之间修改器键的保持和释放_Vim_Key Bindings - Fatal编程技术网

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

区分Vim中两次击键之间修改器键的保持和释放,vim,key-bindings,Vim,Key Bindings,我想在Vim中创建一个映射,以便CtrlTab切换到上一个缓冲区(:b#),但如果再次按下Tab而不释放Ctrl,则切换到下一个缓冲区(:bn) 这类似于MS Windows中的AltTab函数的工作方式。有没有办法达到这个效果? 我似乎在其他任何地方都找不到这个问题。Vim只处理完整的按键操作;在和之间只有一点语义上的区别。您需要以某种方式将按键和弦处理为不同的、单独的按键(可能是一些未使用的按键?),然后可以:map将其映射到Vim中。在Windows上,将允许您实现这一点 或者,您可以:n

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

这类似于MS Windows中的AltTab函数的工作方式。有没有办法达到这个效果?

我似乎在其他任何地方都找不到这个问题。

Vim只处理完整的按键操作;在
之间只有一点语义上的区别。您需要以某种方式将按键和弦处理为不同的、单独的按键(可能是一些未使用的
按键?),然后可以
:map
将其映射到Vim中。在Windows上,将允许您实现这一点


或者,您可以
:nmap
,并检查上一次调用是否仅在最近发生(使用
localtime()
)。这将为您提供一些实际工作所需的东西。

这是我编写的vimscript,供感兴趣的人使用。我使用自动热键将Ctrl的释放映射到F13。(见Ingo Karkat的回答)

让g:ctrl\u保持=0
设g:prev_buf=1
功能!Ctrltab()
如果g:ctrl\u保持==0
让cmd=“:b”.g:prev\u buf.\”
如果g:prev_buf==bufnr(“”)
let cmd=“:bn\”
恩迪夫
设g:prev_buf=bufnr(“”)
设g:ctrl_=1
返回指令
其他的
返回“:bn\”
恩迪夫
端功能
nmap Ctrltab()
nmap:设g:ctrl\u=0

我通过自动热键映射
~Ctrl-up::send{F13}
和一个映射和的小vimscript找到了一个相当优雅的解决方案。谢谢你的建议!是的,看起来不错,这就是我的想法。感谢您发布完整的解决方案;其他人也可能对此感兴趣!
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>