vim-忽略某些键映射宏的timoutlen

vim-忽略某些键映射宏的timoutlen,vim,Vim,我在Vim中制作了两个简单的nmaps,通过按Alt-z和Alt-z将光标左右移动10次 这几乎可以正常工作,并且遵循vim操作逻辑,然后光标移动 不幸的是,如果我在d之后不快速按Altz或Altz,它就会超时。 我觉得这很奇怪,因为我没有将任何东西映射到d。如果我在d之后按w或w,我可以想等多久就等多久 我知道内置地图有一个特别的地方,比如addw和dw 对于我的问题:有没有办法让我自己的nmaps接受按键之间的长时间延迟?您是对的,默认情况下,'timeoutlen'(默认1s)适用于映射键

我在Vim中制作了两个简单的
nmap
s,通过按Alt-z和Alt-z将光标左右移动10次

这几乎可以正常工作,并且遵循vim操作逻辑,然后光标移动

不幸的是,如果我在d之后不快速按Altz或Altz,它就会超时。 我觉得这很奇怪,因为我没有将任何东西映射到d。如果我在d之后按w或w,我可以想等多久就等多久

我知道内置地图有一个特别的地方,比如ad
dw
dw


对于我的问题:有没有办法让我自己的
nmap
s接受按键之间的长时间延迟?

您是对的,默认情况下,
'timeoutlen'
(默认1s)适用于映射键。我发现这很有用,但是如果您真的希望启动的映射无限期地等待,则必须仅在第一个键上定义映射,然后自己查询并处理剩余的键

function! MapOrDefault()
    let c = nr2char(getchar())
    return c == "\<A-z>" ? '10x' : 'd' . c
endfunction
nnoremap <expr> d MapOrDefault()
函数!MapOrDefault()
设c=nr2char(getchar())

返回c=="\; 它使映射不受重新映射和递归的影响。

在映射中,你有
z
,但在文本中你说
Alt-z
。你用哪一个?那是一样的
Alt-z
发送一个
Esc
,后跟一个
z
谢谢。这是有用的。唯一的问题是这是两个字符,但我一次只能解析一个字符;它只是一个字符,由键输入序列
+
z
表示。至少在我的GVIM中,它是作为一个整体正确处理的。如果没有,则需要检测
,然后使用另一个
getchar()
获取下一个。
nmap d<ESC>z 10x
nmap d<ESC>Z 10X
function! MapOrDefault()
    let c = nr2char(getchar())
    return c == "\<A-z>" ? '10x' : 'd' . c
endfunction
nnoremap <expr> d MapOrDefault()