" vim:foldmethod=marker:fen: scriptencoding utf-8 " Saving 'cpoptions' {{{ let s:save_cpo = &cpo set cpo&vim " }}} " Functions {{{ func! pummode#load() "{{{ " Dummy function to load this script " from your .vimrc. endfunc "}}} func! pummode#map(modes, options, remap_p, lhs, rhs) "{{{ for m in split(a:modes, '\zs') if !s:is_available_mode(m) echohl WarningMsg echomsg printf("mode '%s' is not supported.", m) echohl None continue endif call s:do_map(m, a:options, a:remap_p, a:lhs, a:rhs) endfor endfunc "}}} " Utilities func! s:stringf(fmt, ...) "{{{ return call('printf', [a:fmt] + map(copy(a:000), 'string(v:val)')) endfunc "}}} func! s:is_available_mode(mode) "{{{ return a:mode =~# '^[il]$' endfunc "}}} func! s:do_map(mode, options, remap_p, lhs, rhs) "{{{ " map lhs pumvisible() ? "rhs-keycode" : "lhs-keycode" execute \ printf('%s%smap', a:mode, (a:remap_p ? '' : 'nore')) \ '' . s:replace_options(a:options) \ a:lhs \ s:stringf('pumvisible() ? %s : %s', \ a:rhs, \ a:lhs) endfunc "}}} func! s:replace_options(options) "{{{ let table = { \ 'b' : '', \ 's' : '', \ 'u' : '', \} let uniqued = split(a:options, '\zs') return join(map(uniqued, 'get(opts, v:val, "")'), '') endfunc "}}} " For s:eval_key(). func! s:split_key(key) "{{{ let head = matchstr(a:key, '^[^<]\+') return [head, strpart(a:key, strlen(head))] endfunc "}}} " For s:eval_key(). func! s:split_special_key(key) "{{{ let head = matchstr(a:key, '^<[^>]\+>') return [head, strpart(a:key, strlen(head))] endfunc "}}} func! s:eval_key(key) "{{{ let key = a:key let evaled = '' while 1 let [left, key] = s:split_key(key) let evaled .= left if key == '' return evaled elseif key[0] ==# '<' && key[1] ==# '>' " '<>' let evaled .= strpart(key, 0, 2) let key = strpart(key, 2) elseif key[0] ==# '<' && key =~# '^<[^>]*$' " No '>' return evaled . key elseif tolower(key) =~# '^' " '' -> '<' let evaled .= '<' let key = strpart(key, strlen('')) elseif key[0] ==# '<' " Special key. let [sp_key, key] = s:split_special_key(key) let evaled .= eval(printf('"\%s"', sp_key)) else throw 'internal error' endif endwhile endfunc "}}} " }}} " Commands {{{ " TODO Comand macros " }}} " Restore 'cpoptions' {{{ let &cpo = s:save_cpo " }}}