smartchrを試してみた

キーを押す回数で挿入文字が変わるというvimプラグインを試してみました。


設定を見れば分かりやすいと思うのですが
例えば下記のようにvimrcに書くと

inoremap <buffer> <expr> = smartchr#loop(' = ', ' == ', '=')

=1回で「 = 」(スペース有りイコール)
=2回で「 == 」(スペース有りイコール2つ)
=3回で「=」(スペース無しイコール)
というように挿入されます。
しかもループされるので、4回押すと「 = 」となります。


お試し方法

インストール

githubにも置かれているので、submoduleで入れます。

git submodule add https://github.com/kana/vim-smartchr.git vim/bundle/vim-smartchr
git submodule init
git submodule status


submoduleの管理はこちら。
vimプラグインをgitのsubmoduleで管理 - うんたらかんたら日記
vimプラグインの管理 - うんたらかんたら日記

設定

とりあえず下記設定にしました。

"smartchr
inoremap <buffer> <expr> = smartchr#loop(' = ', ' == ', '=')
inoremap <buffer> <expr> <S-=> smartchr#loop(' + ', '+')
inoremap <buffer> <expr> - smartchr#loop(' - ', '-')
inoremap <buffer> <expr> , smartchr#loop(', ', ',')
inoremap <buffer> <expr> . smartchr#loop('.', '<%=  %>', '<%  %>')

カスタマイズしたい

最後のとこerb修正時に楽にならないかと思って追加したんだけど

inoremap <buffer> <expr> . smartchr#loop('.', '<%=  %>', '<%  %>')


カーソル位置を戻したいと思って
こんな感じで書けないかと思ったがダメだった。

inoremap <buffer> <expr> . smartchr#loop('.', '<%=  %><LEFT><LEFT><LEFT>', '<%  %><LEFT><LEFT><LEFT>')


じゃ、カスタマイズするかとチャレンジしてみましたが挫折。vimscript難しいなぁ。

#.vim/bundle/vim-smartchr/autoload/smartchr.vim
function! smartchr#_expand(loop_p, args)  "{{{2
  let last_arg = a:args[-1]
  if s:context_p(last_arg)
    let context = last_arg
    let _literals = a:args[:-2]
  else
    let context = s:DEFAULT_CONTEXT
    let _literals = a:args
  endif

  if a:loop_p
    let literals = _literals + [_literals[0]]
  else
    let literals = _literals
  endif

  if s:in_valid_context_p(context)
    for i in range(len(literals) - 1, 1, -1)
      let literal1 = literals[i]
      let literal2 = literals[i-1]

      if s:cursor_preceded_with_p(literal2)
        return (pumvisible() ? "\<C-e>" : '')
             \ . repeat("\<BS>", len(literal2))
             \ . literal1
      endif
    endfor

    return literals[0]
  else
    return get(context, 'fallback', _literals[-1])
  endif
endfunction

\する回数をlenで算出してるので
\をsubstituteで1文字の文字列に置換できないかと
試行錯誤してみましたがvimscriptに疎いので、できませんでした。


いい方法があれば、どなたか教えてください。