56 calendar.vim (3-2) howm-mode.vim との連携

45 3-1 で書いてから、放置しっぱなしだった calendar.vim について書く。

目標は日付上で ENTER でその日付前後の予定を表示すること。49 2-26 の修正を利用する

ENTERで独自の動作をさせるためには g:calendar_action に関数を指定してやればいいらしいが、よくわからない。とりあえず、テストをしてみる。

let g:calendar_action = 'CalendarActionHowm'
function! CalendarActionHowm(day, month, year, week, dir)
  let query = a:year . '-' . a:month . '-' . a:day
  echo query
endfunction

日付のフォーマットが気になる感じ。そこを修正して再テスト

let g:calendar_action = 'CalendarActionHowm'
function! CalendarActionHowm(day, month, year, week, dir)
  let query = printf('%04d-%02d-%02d', a:year, a:month, a:day)
  echo query
endfunction

OK 。次は実際に検索してみる。例の howm 側に追加した :ShowSchedule を使う。

let g:calendar_action = 'CalendarActionHowm'
function! CalendarActionHowm(day, month, year, week, dir)
  let query = printf('%04d-%02d-%02d', a:year, a:month, a:day)
  " echo query
  execute ':HowmSchedule' query
endfunction

一応、検索はできたが、開く位置といい、開いたあとのカレンダーといい、気持ちが悪い。そこで、一旦カレンダーを閉じて、再度開き直してやる。

let g:calendar_action = 'CalendarActionHowm'
function! CalendarActionHowm(day, month, year, week, dir)
  let query = printf('%04d-%02d-%02d', a:year, a:month, a:day)
  " echo query
  only | enew
  execute ':HowmSchedule' query
  let cmd = ':Calendar'
  if a:dir != 'V' | let cmd .= 'H' | endif
  execute cmd a:year a:month
endfunction

どの日付を叩いても、カレンダーの今日にフォーカスが行く。どこを検索しているのかわからず、イライラする。カーソル位置を変更してやる。 g:calendar_sign を使って、目印をつけておいて、そこに移動する。

let g:calendar_action = 'CalendarActionHowm'
function! CalendarActionHowm(day, month, year, week, dir)
  let g:calendar_focus = {'year': a:year, 'month': a:month, 'day': a:day}
  let query = printf('%04d-%02d-%02d', a:year, a:month, a:day)
  " echo query
  only | enew
  execute ':HowmSchedule ' query
  let cmd = ':Calendar'
  if a:dir != 'V' | let cmd .= 'H' | endif
  execute cmd a:year a:month
  call cursor(1, 1)
  let [lnum, col] = searchpos('+', 'n')
  if ((lnum != 0) && (col != 0))
    call cursor(lnum, col)
  else
    let [lnum, col] = searchpos('*', 'n')
    if ((lnum != 0) && (col != 0))
      call cursor(lnum, col)
    endif
  endif
endfunction
let g:calendar_sign = 'CalendarSignHowm'
function! CalendarSignHowm(day,month,year)
  if !exists('g:calendar_focus') | return 0 | endif
  if a:year == g:calendar_focus['year'] &&
        \ a:month == g:calendar_focus['month'] && 
        \ a:day == g:calendar_focus['day']
    return 1
  else
    return 0
  endif
endfunction

これで一応の完成。量が増えてきたので別ファイルに分離(別に fold でも良かったか)。vimrc であんまりかさばられても困るしね。念のため、チェック用のコードを追加しておく。あとせっかくなので g:howm_date_pattern を使う形に。

so ~/vimfiles/calendar_action.vim
scriptencoding utf-8

let g:calendar_action = 'CalendarActionHowm'
function! CalendarActionHowm(day, month, year, week, dir)
  if exists(':HowmSchedule') != 2 | return | endif
  if exists(':Calendar') != 2 || exists(':CalendarH') != 2 | return  | endif
  let g:calendar_focus = {'year': a:year, 'month': a:month, 'day': a:day}
  let query = g:howm_date_pattern
  let query = substitute(query, '%Y', printf('%04d', a:year), 'g')
  let query = substitute(query, '%m', printf('%02d', a:month), 'g')
  let query = substitute(query, '%d', printf('%02d', a:day), 'g')
  " echo query
  only | enew
  execute ':HowmSchedule ' query
  let cmd = ':Calendar'
  if a:dir != 'V' | let cmd .= 'H' | endif
  execute cmd a:year a:month
  call cursor(1, 1)
  let [lnum, col] = searchpos('+', 'n')
  if ((lnum != 0) && (col != 0))
    call cursor(lnum, col)
  else
    let [lnum, col] = searchpos('*', 'n')
    if ((lnum != 0) && (col != 0))
      call cursor(lnum, col)
    endif
  endif
endfunction

let g:calendar_sign = 'CalendarSignHowm'
function! CalendarSignHowm(day,month,year)
  if !exists('g:calendar_focus') | return 0 | endif
  if a:year == g:calendar_focus['year'] &&
        \ a:month == g:calendar_focus['month'] && 
        \ a:day == g:calendar_focus['day']
    return 1
  else
    return 0
  endif
endfunction

できたー。使用条件は Vim7 && howm-mode.vim ( 狙えパッチ適用版 ) && calendar.vim 。公開しとくので、使いたい方適当にどうぞ。

calendar_action.vim

http://d.hatena.ne.jp/eclipse-a/20080315/1205586936 で問題点修正とかしたよ!あと上記の公開URLは古いよ!