【发布时间】:2012-11-25 12:48:22
【问题描述】:
在 Vim 中有一些没有超时的内置复合命令,例如:g 永远等待下一次击键。我想创建我的自定义复合绑定以使其行为类似。但是,最好不要影响其他绑定(我暗示在这里使用set notimeout 设置的可能性)。如果对于特定绑定无法实现,那么我想我必须退回到set notimeout 设置。那么有什么建议吗?
【问题讨论】:
标签: vim binding timeout mapping command
在 Vim 中有一些没有超时的内置复合命令,例如:g 永远等待下一次击键。我想创建我的自定义复合绑定以使其行为类似。但是,最好不要影响其他绑定(我暗示在这里使用set notimeout 设置的可能性)。如果对于特定绑定无法实现,那么我想我必须退回到set notimeout 设置。那么有什么建议吗?
【问题讨论】:
标签: vim binding timeout mapping command
如果您对不工作 showcmd 并且光标位于右下角同时等待下一个字符感到满意,请使用 getchar():
nnoremap <Plug>PluginAction-a do-something-here-for-key-a
function s:Getchar()
let char=getchar()
if type(char)==type(0)
return nr2char(char)
endif
return char
endfunction
nmap <expr> \g "<Plug>PluginAction-".<SID>Getchar()
.
【讨论】:
nnoremap <Plug>PluginAction-a do-something-here-for-key-a 和nmap <expr> \g "<Plug>PluginAction-".<SID>Getchar()。更具体地说,例如我希望l 什么都不做,而是永远等待下一次中风。所以li、lo 会做点什么。您能否更新您的答案,以便我可以看到它应该如何适合我的情况。谢谢。
nmap 中将\g 替换为l。添加nnoremap <Plug>PluginAction-i … 和nnoremap <Plug>PluginAction-o …(分别对应li 和lo)。见:h :map-expression 和:h :map,这里没有魔法。
只要不与内置命令重叠,您就可以只创建到复合映射的第一个键的映射,并通过 getchar() 使用复合映射的所有后续键(无限期等待key),然后根据输入的键的完整序列分派到相应的处理程序。
这当然不如直接映射那么舒服,但应该可以解决问题。尽管我真的会认真思考'timeoutlen' 的良好价值是否还不能解决您的问题;至少我从来没有认为这是一个问题。
【讨论】: