" hypermap.vim " It provides non-blocking mapping at insert mode " Original idea from https://thinca.hatenablog.com/entry/20120716/1342374586 " Usage: " hypermap#map(from, to[, {options}]) " " options: " "eval": evaluate to if true(same as ``) " "mapmode": map to mode(default: ic) let s:mapmode = {'ic': 'noremap!', 'i': 'inoremap', 'c': 'cnoremap'} let s:maps = {} " マッピングを分割することでの評価前にを適用する " こうしないと処理落ち等で先行入力が結合されてしまった場合に正常動作しない " 詳しくは:h map-exprを参照 noremap! (hypermap) hypermap#resolve(nr2char(getchar())) function! hypermap#map(from, to, ...) abort let key = a:from[-1:] let prefix = list2str(reverse(str2list(a:from[:-2]))) let opt = get(a:000, 0, {}) let buffer = get(opt, 'buffer', v:false) if buffer let b:maps = get(b:, 'maps', {}) let map = get(b:maps, key, {}) let b:maps[key] = map else let map = get(s:maps, key, {}) let s:maps[key] = map endif let newopt = extend({'mapto': a:to, 'mapmode': 'ic', 'eval': v:false}, opt) let map[prefix] = newopt execute s:mapmode[newopt.mapmode] (buffer ? '' : '') '