From d2732d24689189f02d1b3680b5c560a678321564 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 8 Sep 2020 06:14:51 +0900 Subject: Add .vim --- .vim/my/ftplugin/todolist.vim | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .vim/my/ftplugin/todolist.vim (limited to '.vim/my/ftplugin/todolist.vim') diff --git a/.vim/my/ftplugin/todolist.vim b/.vim/my/ftplugin/todolist.vim new file mode 100644 index 0000000..e65faa3 --- /dev/null +++ b/.vim/my/ftplugin/todolist.vim @@ -0,0 +1,71 @@ +scriptencoding utf-8 + + +if exists('b:did_ftplugin_todolist') + finish +endif + + + +inoremap checkbox(0, ' ') +inoremap x checkbox(1, 'x') + +nnoremap (todolist-toggle-checkbox) :call toggle_checkbox() +nnoremap (todolist-toggle-checkbox-rec) :call toggle_checkbox_rec() + + +function! s:checkbox(check, char) + let line = getline('.') + if line =~# '^\s*$' && len(line) % shiftwidth() == 0 + if a:check + return '[x] ' + else + return '[ ] ' + endif + else + return a:char + endif +endfunction + + +function! s:toggle_checkbox() + call s:toggle_checkbox_internal(line('.'), -1) +endfunction + + +function! s:toggle_checkbox_rec() + let checked = s:toggle_checkbox_internal(line('.'), -1) + if checked == -1 + return + endif + if line('.') == line('$') + return + endif + + let indent_lv = indent('.') + for l in range(line('.') + 1, line('$')) + if indent(l) <= indent_lv + break + end + call s:toggle_checkbox_internal(l, checked) + endfor +endfunction + + +function! s:toggle_checkbox_internal(line_num, ck_force) + let line = getline(a:line_num) + let match = matchlist(line, '^\(\s*\)\[\([x ]\)\]\(.*\)') + if empty(match) + return -1 + endif + + let [whole, spaces, ck, rest; _] = match + let checked = a:ck_force == -1 ? ck == 'x' : a:ck_force + let line = spaces . '[' . (checked ? ' ' : 'x') . ']' . rest + call setline(a:line_num, line) + return checked +endfunction + + + +let b:did_ftplugin_todolist = 1 -- cgit v1.2.3-70-g09d2