挿入モードで一連の文字をマッピングする


11

挿入モードですでにキーの組み合わせをマッピングできます。

:inoremap abc <do stuff>

ただし、これにはいくつかの欠点があります。

  • などのシーケンスの部分的なバージョンを入力する場合ab、完全なコマンドを入力するかどうかを確認するために「待機」しているため、文字は実際には短時間表示されません。これは望ましくありません。チェーンの部分的な部分文字列が入力された場合、一時停止せずに文字のチェーンをマッピングしたい。

  • 「」と入力してabから一時停止し(上記のポイントで説明したように文字が実際に表示されるまで待ちます)、「」と入力するcと、コマンドは実行されません。待機時間に関係なくコマンドを実行したい。

私はを使用しますがiab、次の理由で機能しません:

  1. 文字列の後にスペースを入力する必要があります
  2. それで任意のコマンドを実行することはできません。テキストの文字列を挿入するだけです。

マップを使用せずに、挿入モードで特定の文字列が入力された場合にコマンドまたはキーストロークを実行する方法はありますaか?


これらのドローバックは:cnoremap abc <do stuff>...にも当てはまります
Martin Tournoij、2015

1
あなたがするときに遅延はありませんab<any key>
romainl 2015

回答:


10

これを行う1つの方法を次に示します。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.