ku#mru.vimを書いてみた

何か期待されたので試しに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 以降にもすでに対応済みです。