くふんを狙え(vimグループ) このページをアンテナに追加 RSSフィード

くふんを狙え

 | 

2008-07-13

「俺メモプラギンに~取ることにしたの続き」の続き

13:17 | 「俺メモプラギンに~取ることにしたの続き」の続き - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - 「俺メモプラギンに~取ることにしたの続き」の続き - くふんを狙え(vimグループ) 「俺メモプラギンに~取ることにしたの続き」の続き - くふんを狙え(vimグループ) のブックマークコメント

予定の表示・予定の追加ができるようになったけど、それらを「いつやるのか」がはっきりしていないので、それを入力できるように修正した。omemo#dateinput()を使って、日付を入力できるようにしただけ。あと、赤ペン先生を参考に、微妙に修正を加えた。イナフなあれとか、newなそれとか。

別に、偉いわけじゃないけど、引数をとったときのnewとsplitの違いがわからんのです(設定引き継がれたりとかがあるのかな)。

まとめると、以下のような感じ。いいかげんな関数書いて、大槍とおやにマッピングして、くふん、と。

function! s:add_schedule()
  let input = omemo#dateinput()
  if input != ''
    let bufname = expand('%:p:~')
    let lnum = line('.')
    let list = [bufname . ' ' . lnum , ' ' . input . ' '. getline('.'), '']
    new ~/schedule.ommo
    call append(0, list)
    call cursor(1, 1)
  endif
endfunction
nnoremap <silent> \oyl :<C-u>new ~/schedule.ommo<CR>
nnoremap <silent> \oya :<C-u>call <SID>add_schedule()<CR>

あー、あと俺メモのプレフィクスが「omemo」なのは回文みたいで気持ちいいからですよ。パッと見「おメモ」になってしまっていて、声に出して読んだり、文字で改めて書くと恥ずかしいですけど。

「日付を変更するための入力を求める関数 omemo#dateinput()」の続き。

12:41 | 「日付を変更するための入力を求める関数 omemo#dateinput()」の続き。 - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - 「日付を変更するための入力を求める関数 omemo#dateinput()」の続き。 - くふんを狙え(vimグループ) 「日付を変更するための入力を求める関数 omemo#dateinput()」の続き。 - くふんを狙え(vimグループ) のブックマークコメント

日付を変更するための入力を求める関数 omemo#dateinput() - くふんを狙え(vimグループ) - vimグループの続き。

赤ペン先生を参考に修正。

  • 可変長引数の処理。a:0よりはa:1の方が直感的だと感じるので、これはそのまま。
  • inputのフォーマットチェック。最初にはじくのを忘れてた。最初にチェックを入れて、念のため else も入れた。
  • eval()よりstr2nr()。ふむふむ。「マイナスの処理が面倒だなあ」と思いつつも、eval()はなるべく避けるべきだとは思うので修正。
  • yymmddの解析。言われたとおり(?)になるよう修正。確かに条件分岐削れてスッキリ。

Vimスクリプトに限らない修正ばっかりだなあと、そんな気がします。

function! omemo#dateinput(...)
  let format = exists('a:1') ? a:1 : '%Y-%m-%d'
  let time = exists('a:2') ? a:2 : localtime()
  let input = input(strftime(format, time) .
        \ ' +num (shift), yymmdd (set), . (today): ')
  if input !~# '^\%([+-]\?\d\+\)\|\%(\d\{1,6}\)\|\%(\.\)$' | return '' | endif
  let f = format
  let d = time
  if input =~ '^\d\{1,6}$'
    let date = []
    for dummy in split(strftime('%d %m %y', time), ' ')
      call add(date, str2nr(get(matchlist(input, '\d\{1,2}$'), 0, dummy)))
      let input = substitute(input, '\d\{1,2}$', '', '')
    endfor
    let [y, m, d] = reverse(date)
    if 38 < y && y < 70
      return ''
    elseif y >= 70
      let y = y + 1900
    elseif y <= 38
      let y = y + 2000
    endif
    if index(range(1, 12), m) == -1 | return '' | endif
    if index(range(1, 31), d) == -1 | return '' | endif
    let f = substitute(f, '%Y', printf('%04d', y), 'g')
    let f = substitute(f, '%m', printf('%02d', m), 'g')
    let f = substitute(f, '%d', printf('%02d', d), 'g')
  elseif input =~ '^[+-]\d\+$'
    " shift +num
    let d = (input =~ '^-' ? -1 : 1)
    let d = d * str2nr(substitute(input, '^[+-]', '', '')) * 86400 + time
  elseif input =~ '^\.$'
    " today .
    let d = localtime()
  else
    " 念のため
    return ''
  endif
  return strftime(f, d)
endfunction

あと、これformatとか指定できるけど %Y %m %d しか使えないじゃん、使えねえ、とかおもた。

トラックバック - http://vim.g.hatena.ne.jp/eclipse-a/20080713
 | 
最近のコメント
最近のトラックバック
カレンダー
<< 2008/07 >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
カウンター
237306