From f60993249a06e01710992934492d4dfea52d6851 Mon Sep 17 00:00:00 2001 From: EinfachToll Date: Sat, 17 Feb 2018 21:05:06 +0100 Subject: [PATCH] Cherry-pick the changes from dev -- part5 --- autoload/vimwiki/lst.vim | 82 ++++++++++++++++++++++++++++++++-------- doc/vimwiki.txt | 15 +++++++- ftplugin/vimwiki.vim | 19 ++++++++++ 3 files changed, 99 insertions(+), 17 deletions(-) diff --git a/autoload/vimwiki/lst.vim b/autoload/vimwiki/lst.vim index b959b75..3832ba9 100644 --- a/autoload/vimwiki/lst.vim +++ b/autoload/vimwiki/lst.vim @@ -813,6 +813,67 @@ function! s:remove_cb(item) "{{{ return item endfunction "}}} +"Change state of checkbox +"in the lines of the given range +function! s:change_cb(from_line, to_line, new_rate) "{{{ + let from_item = s:get_corresponding_item(a:from_line) + if from_item.type == 0 + return + endif + + let parent_items_of_lines = [] + + for cur_ln in range(from_item.lnum, a:to_line) + let cur_item = s:get_item(cur_ln) + if cur_item.type != 0 && cur_item.cb != '' + call s:set_state_plus_children(cur_item, a:new_rate) + let cur_parent_item = s:get_parent(cur_item) + if index(parent_items_of_lines, cur_parent_item) == -1 + call insert(parent_items_of_lines, cur_parent_item) + endif + endif + endfor + + for parent_item in parent_items_of_lines + call s:update_state(parent_item) + endfor + +endfunction "}}} + +"Decrement checkbox between [ ] and [X] +"in the lines of the given range +function! vimwiki#lst#decrement_cb(from_line, to_line) "{{{ + let from_item = s:get_corresponding_item(a:from_line) + if from_item.type == 0 + return + endif + + "if from_line has CB, decrement it and set all siblings to the same new state + let rate_first_line = s:get_rate(from_item) + let n = len(vimwiki#vars#get_syntaxlocal('listsyms_list')) + let new_rate = max([rate_first_line - 100/(n-1)-1, 0]) + + call s:change_cb(a:from_line, a:to_line, new_rate) + +endfunction "}}} + +"Increment checkbox between [ ] and [X] +"in the lines of the given range +function! vimwiki#lst#increment_cb(from_line, to_line) "{{{ + let from_item = s:get_corresponding_item(a:from_line) + if from_item.type == 0 + return + endif + + "if from_line has CB, increment it and set all siblings to the same new state + let rate_first_line = s:get_rate(from_item) + let n = len(vimwiki#vars#get_syntaxlocal('listsyms_list')) + let new_rate = min([rate_first_line + 100/(n-1)+1, 100]) + + call s:change_cb(a:from_line, a:to_line, new_rate) + +endfunction "}}} + "Toggles checkbox between [ ] and [X] or creates one "in the lines of the given range function! vimwiki#lst#toggle_cb(from_line, to_line) "{{{ @@ -821,8 +882,6 @@ function! vimwiki#lst#toggle_cb(from_line, to_line) "{{{ return endif - let parent_items_of_lines = [] - if from_item.cb == '' "if from_line has no CB, make a CB in every selected line @@ -839,29 +898,20 @@ function! vimwiki#lst#toggle_cb(from_line, to_line) "{{{ endif endfor + for parent_item in parent_items_of_lines + call s:update_state(parent_item) + endfor + else "if from_line has CB, toggle it and set all siblings to the same new state let rate_first_line = s:get_rate(from_item) let new_rate = rate_first_line == 100 ? 0 : 100 - for cur_ln in range(from_item.lnum, a:to_line) - let cur_item = s:get_item(cur_ln) - if cur_item.type != 0 && cur_item.cb != '' - call s:set_state_plus_children(cur_item, new_rate) - let cur_parent_item = s:get_parent(cur_item) - if index(parent_items_of_lines, cur_parent_item) == -1 - call insert(parent_items_of_lines, cur_parent_item) - endif - endif - endfor + call s:change_cb(a:from_line, a:to_line, new_rate) endif - for parent_item in parent_items_of_lines - call s:update_state(parent_item) - endfor - endfunction "}}} function! vimwiki#lst#remove_cb(first_line, last_line) "{{{ diff --git a/doc/vimwiki.txt b/doc/vimwiki.txt index 2cc2c4e..6d150a4 100644 --- a/doc/vimwiki.txt +++ b/doc/vimwiki.txt @@ -351,6 +351,16 @@ gL Remove checkboxes from all sibling list items. :map VimwikiRemoveSingleCB :map VimwikiRemoveCBInList < + *vimwiki_gln* *vimwiki_glp* +gln Increase the "done" status of a list checkbox, i.e. + from [ ] to [.] to [o] etc. See |vimwiki-todo-lists|. +glp Decrease the "done" status. + To remap: > + :nmap VimwikiIncrementListItem + :vmap VimwikiIncrementListItem + :nmap VimwikiDecrementListItem + :vmap VimwikiDecrementListItem + *vimwiki_gll* *vimwiki_gLl* gll Increase the level of a list item. gLl Increase the level of a list item and all child items. @@ -1542,7 +1552,7 @@ See |vimwiki_glstar|, |vimwiki_gl#| |vimwiki_gl-|, |vimwiki_gl-|, |vimwiki_gl1|, |vimwiki_gla|, |vimwiki_glA|, |vimwiki_gli|, |vimwiki_glI| -Use glr and gLr, if the numbers of a numbered list are mixed up. See +Use glr and gLr if the numbers of a numbered list are mixed up. See |vimwiki_glr| and |vimwiki_gLr|. @@ -1595,6 +1605,9 @@ child items (see also |g:vimwiki_listsyms|): > [O] -- 67-99% [X] -- 100% +You can use |vimwiki_gln| and |vimwiki_glp| to change the "done" status of a +checkbox without a childitem. + It is possible to toggle several list items using visual mode. But note that instead of toggling every item individually, all items get checked if the first item is unchecked and all items get unchecked if the first item is diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim index b3a0aa1..9cce366 100644 --- a/ftplugin/vimwiki.vim +++ b/ftplugin/vimwiki.vim @@ -289,6 +289,8 @@ command! -buffer -range -nargs=1 VimwikiListChangeSymbolI command! -buffer -nargs=1 VimwikiChangeSymbolInListTo \ call vimwiki#lst#change_marker_in_list() command! -buffer -range VimwikiToggleListItem call vimwiki#lst#toggle_cb(, ) +command! -buffer -range VimwikiIncrementListItem call vimwiki#lst#increment_cb(, ) +command! -buffer -range VimwikiDecrementListItem call vimwiki#lst#decrement_cb(, ) command! -buffer -range -nargs=+ VimwikiListChangeLvl \ call vimwiki#lst#change_level(, , ) command! -buffer -range VimwikiRemoveSingleCB call vimwiki#lst#remove_cb(, ) @@ -440,6 +442,23 @@ nnoremap