何か期待されたので試しにku#mru.vimを書いてみた。まだ最低限の機能しか載ってません。とりあえずNYSLってことにしとく。
ku#file.vimをベースにした。actionのあたりはまんま残ってる。fuzzyfinder.vimも大いに参考にさせて頂きました。
" Settings "{{{1 let s:time_format = '(%x %H:%M:%S)' let s:cache = [] function! ku#mru#mru_file(file) "{{{2 let s:mru_file = expand(a:file) endfunction call ku#mru#mru_file('~/.vimru') function! ku#mru#time_format(format) "{{{2 let s:time_format = a:format endfunction function! ku#mru#init() "{{{2 augroup KuMru autocmd! autocmd BufEnter * call s:update() autocmd BufWritePost * call s:update() augroup END call s:load() endfunction " Interface "{{{1 function! ku#mru#event_handler(event, ...) "{{{2 if a:event ==# 'SourceEnter' call ku#mru#init() return else return call('ku#default_event_handler', [a:event] + a:000) endif endfunction function! ku#mru#action_table() "{{{2 return { \ 'default': 'ku#mru#action_open', \ 'open!': 'ku#mru#action_open_x', \ 'open': 'ku#mru#action_open', \ } endfunction function! ku#mru#key_table() "{{{2 return { \ "\<C-o>": 'open', \ 'O': 'open!', \ 'o': 'open', \ } endfunction function! ku#mru#gather_items(pattern) "{{{2 return map(copy(s:cache), '{"word" : fnamemodify(v:val.path, ":~:."), \ "menu" : strftime(s:time_format, v:val.time)}') endfunction " Misc "{{{1 function! s:open(bang, item) "{{{2 execute 'edit'.a:bang fnameescape(a:item.word) endfunction function! s:update() "{{{2 let path = expand('%:p') if filereadable(path) && empty(&buftype) call insert(filter(s:cache, 'v:val.path != path'), \ {'path' : path, 'time' : localtime()} ) call s:save() endif endfunction function! s:save() "{{{2 call writefile(map(copy(s:cache), 'string(v:val)'), s:mru_file) endfunction function! s:load() "{{{2 if filereadable(s:mru_file) let s:cache = filter(map(readfile(s:mru_file), 'eval(v:val)'), \ 'filereadable(v:val.path)') endif endfunction " Actions "{{{2 function! ku#mru#action_open(item) "{{{3 call s:open('', a:item) endfunction function! ku#mru#action_open_x(item) "{{{3 call s:open('!', a:item) endfunction " __END__ "{{{1 " vim: foldmethod=marker
書いてみて思ったこと。
- Vim開始時の初期化ができない
- 任意のソートができない?
- ~/.vimruってこの名前はないよな
mruは性質上Vim起動時にautocmdを登録する必要がある。現状、autoloadのみでは難しかったので仕方なくvimrcからku#mru#init()を呼ぶことにした。本体側が呼ぶ機能が追加されるのを期待。
mruだったら当然最近開いた順になっててくれてほしいんだけど、任意キーでソートする方法がわからなかった(もしくはない)。priorityが設定できるだけでいいのだけれど…こっちも期待。
今回はここに貼ってみたけど、今後もこれだと面倒だなぁ。ここはgithubのアカウントとってforkとかした方が良いのかな?
2009/05/09 追記
ものすごく今更ですが最新版は github に置いてあります。
http://github.com/thinca/vim-ku_source/tree/master
仕様が変わった ku 0.2.0 以降にもすでに対応済みです。