lexima.vimでBetter vim-altercmdを再現する
altercmdはabbrev的なのをコマンドに対していい感じにやってくれるやつ、shellでいうaliasに近い感覚で使える
自分はmapを使って覚えておくほどじゃないけどたまにコマンドで呼び出したいようなものに使っている
mapは正確に覚えてないといけないけど、altercmd系だとabbrevに機能名を付けておいて先頭何文字かマッチで引っ張って来れたりするので個人的には楽
grep => Grepper cap\%[ture] => Capture gs => Gina status blame => Gina blame とか
leximaを使うメリットとして、altercmdではrangeを使った場合に展開できない問題が解消するというのがある
個人的にはQuickRunやGina browseの展開で特に有用
ただ、altercmdはcmdwinでの展開がオプションで有効化できるのに対して、leximaはこの設定だとcmdwinでは動作しない
最終的にできることとしては、例えばこんな設定をして
code:vim
LeximaAlterCommand ee e!
LeximaAlterCommand r\%un QuickRun LeximaAlterCommand bro\%wse Gina<Space>browse<Space>--exact<Space>: cmdlineでSpaceかCRを押下したときにこう展開される
\%[] の箇所は部分的に入力しても、全く入力しなくても動作する
code:text
:ee => :e!
:'<,'>r => :'<,'>QuickRun
:'<,'>brow => :'<,'>Gina browse --exact :
以下が関数とコマンドの実装、コマンドに渡した第1引数を第2引数の内容に置換するleximaのルールを定義している
code:vim
function! s:lexima_alter_command(original, altanative) abort
let input_space = '<C-w>' . a:altanative . '<Space>'
let input_cr = '<C-w>' . a:altanative . '<CR>'
let rule = {
\ 'mode': ':',
\ 'at': '^\(''<,''>\)\?' . a:original . '\%#$',
\ }
call lexima#add_rule(extend(rule, { 'char': '<Space>', 'input': input_space }))
call lexima#add_rule(extend(rule, { 'char': '<CR>', 'input': input_cr }))
endfunction
command! -nargs=+ LeximaAlterCommand call <SID>lexima_alter_command(<f-args>)