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 。公開しとくので、使いたい方適当にどうぞ。
http://d.hatena.ne.jp/eclipse-a/20080315/1205586936 で問題点修正とかしたよ!あと上記の公開URLは古いよ!