inoremap:变量超时
inoremap: variable timeoutlen
我的 .vimrc 中有两个用于插入模式的重新映射:
inoremap jk <ESC>
inoremap {<CR> {<CR>}
第一个重新映射应该有一个简短的 timeoutlen
,而后者应该根本没有超时。原因:第一次重新映射需要超时,因为 jk
可能用作常规字符。另一方面,后者是代码完成,超时没有意义。
是否可以为不同的重新映射分配不同的 timeoutlen
?谢谢 & BR
延长第二个映射超时的一种方法是实际上仅映射 <CR>
,然后使用表达式检查它是否在 {
字符后键入。
该行为与双字符映射有些不同,因为如果您在已经存在的 {
之后键入 <CR>
,映射也将起作用,这可能是可以接受的给你(或者甚至可能正是你想要的。)
由于您正在使用表达式进行检查,因此您可以进行额外的检查,例如仅在您在行尾键入 <CR>
时才应用映射(因此如果您正在使用它来拆分现有的长线。)
一个可能的实现是:
inoremap <expr> <CR>
\ col('.') ==# col('$')
\ && getline('.')[col('.')-2] ==# '{'
\ ? "\<CR>}\<C-O>O"
\ : "\<CR>"
我们在这里使用三元运算符根据条件是否成立来产生不同的输出。如果没有,我们只需映射回击键本身,这样它就可以像在所有其他上下文中一样正常工作。
对于插入右大括号的部分,我也在末尾添加了一个CTRL-O O
,所以插入大括号后,它会在它之前添加一个新行并将光标留在缩进列中块内。我希望这对您有所帮助,但如果这不是您真正想要的,请随时忽略该部分。
我的 .vimrc 中有两个用于插入模式的重新映射:
inoremap jk <ESC>
inoremap {<CR> {<CR>}
第一个重新映射应该有一个简短的 timeoutlen
,而后者应该根本没有超时。原因:第一次重新映射需要超时,因为 jk
可能用作常规字符。另一方面,后者是代码完成,超时没有意义。
是否可以为不同的重新映射分配不同的 timeoutlen
?谢谢 & BR
延长第二个映射超时的一种方法是实际上仅映射 <CR>
,然后使用表达式检查它是否在 {
字符后键入。
该行为与双字符映射有些不同,因为如果您在已经存在的 {
之后键入 <CR>
,映射也将起作用,这可能是可以接受的给你(或者甚至可能正是你想要的。)
由于您正在使用表达式进行检查,因此您可以进行额外的检查,例如仅在您在行尾键入 <CR>
时才应用映射(因此如果您正在使用它来拆分现有的长线。)
一个可能的实现是:
inoremap <expr> <CR>
\ col('.') ==# col('$')
\ && getline('.')[col('.')-2] ==# '{'
\ ? "\<CR>}\<C-O>O"
\ : "\<CR>"
我们在这里使用三元运算符根据条件是否成立来产生不同的输出。如果没有,我们只需映射回击键本身,这样它就可以像在所有其他上下文中一样正常工作。
对于插入右大括号的部分,我也在末尾添加了一个CTRL-O O
,所以插入大括号后,它会在它之前添加一个新行并将光标留在缩进列中块内。我希望这对您有所帮助,但如果这不是您真正想要的,请随时忽略该部分。