Vim で ToDo リストを書くための Tips (改)

Vim で ToDo リストを書きやすくするために vimでtodoリストを書くためのtips - Qiita を使わせてもらっていたのですが、もう少しなんとかしたいと思い、少し書き換えてみました。べんり。

変更前

変更後

  1. 完了した際に自動的に時刻を挿入する
    タスクが完了した際に時刻を行末に自動的に挿入するようにしました。未完了に戻したときは時刻を削除するようにもなっています。
  2. 未完了時は「赤」、完了時は「緑」にハイライトを設定
    視認性向上のために。
  3. foldmethod を変更
    インデントでの折りたたみでは子だけが折りたたまれていました。期待では親から折りたたんでほしかったのでそのように変更しています。
  4. foldtext を変更
    デフォルトの foldtext ではチェックボックスの表示が折りたたまれていない上下のタスクとズレるため変更しています。

フォーク元と同じく ~/.vim/ftplugin/markdown.vim として保存して使ってください。他のファイルタイプで使いたければ必要に応じて変更してください。

" forked from http://qiita.com/naoty_k/items/56eddc9b76fe630f9be7

" todoリストを簡単に入力する
abbreviate tl - [ ]

" 入れ子のリストを折りたたむ
setlocal foldmethod=expr foldexpr=MkdCheckboxFold(v:lnum) foldtext=MkdCheckboxFoldText()
function! MkdCheckboxFold(lnum)
    let line = getline(a:lnum)
    let next = getline(a:lnum + 1)
    if MkdIsNoIndentCheckboxLine(line) && MkdHasIndentLine(next)
        return 1
    elseif (MkdIsNoIndentCheckboxLine(next) || next =~ '^$') && !MkdHasIndentLine(next)
        return '<1'
    endif
    return '='
endfunction
function! MkdIsNoIndentCheckboxLine(line)
    return a:line =~ '^- \[[ x]\] '
endfunction
function! MkdHasIndentLine(line)
    return a:line =~ '^[[:blank:]]\+'
endfunction
function! MkdCheckboxFoldText()
    return getline(v:foldstart) . ' (' . (v:foldend - v:foldstart) . ' lines) '
endfunction

" todoリストのon/offを切り替える
nnoremap <buffer> <Leader><Leader> :call ToggleCheckbox()<CR>
vnoremap <buffer> <Leader><Leader> :call ToggleCheckbox()<CR>

" 選択行のチェックボックスを切り替える
function! ToggleCheckbox()
  let l:line = getline('.')
  if l:line =~ '\-\s\[\s\]'
    " 完了時刻を挿入する
    let l:result = substitute(l:line, '-\s\[\s\]', '- [x]', '') . ' [' . strftime("%Y/%m/%d (%a) %H:%M") . ']'
    call setline('.', l:result)
  elseif l:line =~ '\-\s\[x\]'
    let l:result = substitute(substitute(l:line, '-\s\[x\]', '- [ ]', ''), '\s\[\d\{4}.\+]$', '', '')
    call setline('.', l:result)
  end
endfunction

syn match MkdCheckboxMark /-\s\[x\]\s.\+/ display containedin=ALL
hi MkdCheckboxMark ctermfg=green
syn match MkdCheckboxUnmark /-\s\[\s\]\s.\+/ display containedin=ALL
hi MkdCheckboxUnmark ctermfg=red