Vim 关于默认命令超时的行为

mol*_*lok 5 vim

我试图取消映射这是执行( )<C-w>o的默认命令,所以我尝试的第一件事是::only:help :only

nmap <c-w>o <nop>
Run Code Online (Sandbox Code Playgroud)

这种工作是有效的,除非我按<c-w>,等待超过timeoutlen毫秒,然后按o:only被呼叫。

我不明白为什么<c-w>-prefixed 和其他默认命令在毫秒后不会超时timeoutlen,恕我直言,这是意外的。

以前我有 ZoomWin 插件定义了自己的映射:<c-w>o有效地覆盖:only命令,我无法理解为什么有时:only command会调用 ZoomWin 插件而不是 ZoomWin 插件,我意识到当插件映射超时(timeoutlen毫秒后)时它会被调用并且然后我按下o,调用默认<c-w>o命令。

那么,是否可以像自定义映射一样使默认命令超时?

ZyX*_*ZyX 2

你不应该考虑<C-w>o成为一个命令,你应该考虑<C-w>像 \xe2\x80\x9cstart 窗口操作子模式\xe2\x80\x9d:像任何其他多键 vim 正常模式命令<C-w>{smth}(也g*,,,z*Z*不只是免疫超时,<C-w>%( <C-w>{any-key-not-mentioned-in-help}) 不会执行任何操作(可能会发出蜂鸣声,但在我的系统上,我可以 \xe2\x80\x99t 看到(使用 \'visualbell\')或听到蜂鸣声),不会切换到相应的括号(这是默认的%)。

\n\n

您仍然可以通过以下方式<C-w>o重新映射来禁用它:<C-w>

\n\n
function s:CtrlW()\n    let char=getchar()\n    if type(char)==type(0) | let char=nr2char(char) | endif\n\n    if char is# \'o\'\n        return \'\'\n    endif\n    return "\\<C-w>".char\nendfunction\nnnoremap <expr> <C-w> <SID>CtrlW()\n
Run Code Online (Sandbox Code Playgroud)\n