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