在插入模式下映射字母序列


11

我已经可以在插入模式下映射组合键:

:inoremap abc <do stuff>

但是,这有一些缺点:

  • 在键入序列的部分版本(例如)时ab,实际上不会在短时间内显示字符,因为这是在“等待”以查看是否要键入完整命令。这是不可取的。如果要输入字母的部分子字符串,我想映射一个字母链而不暂停。

  • 如果键入ab,则暂停(并等待直到字符实际上如上述指出那样出现),然后键入c,命令将不会执行。我希望无论等待多长时间都可以执行命令。

我会使用iab,但是那是行不通的,因为:

  1. 它需要在字符串后输入一个空格
  2. 我不能用它执行任意命令,只能插入文本字符串。

如果在插入模式下输入了某个字符串而没有使用映射,是否有任何方法可以执行命令或击键(映射会在每次键入an时烦人地暂停a,而等待时间过长则无法工作)?


这些缺点也适用于:cnoremap abc <do stuff>
马丁·图尔诺伊

1
当您这样做时没有延迟ab<any key>
romainl 2015年

Answers:


10

这是一种方法:

let s:inputBuffer = ''

augroup _silentInsertTrigger
    autocmd!
    autocmd InsertCharPre * call <sid>OnPreEnterChar()
    autocmd InsertLeave * call <sid>OnInsertLeave()
augroup END

function! s:OnPreEnterChar()
    let s:inputBuffer .= v:char

    if s:inputBuffer[-3:] ==# 'abc'
        echo '<do stuff>'
    endif

    return v:char
endfunction

function! s:OnInsertLeave()
    let s:inputBuffer = ''
endfunction
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.