More functions moved around
This commit is contained in:
parent
19e4cf90ef
commit
072ba175f7
@ -83,7 +83,7 @@ endfunction "}}}
|
||||
|
||||
"incrementation functions for the various kinds of numbers }}}
|
||||
|
||||
" utility function {{{
|
||||
"utility functions {{{
|
||||
|
||||
function! s:substitute_rx_in_line(lnum, pattern, new_string) "{{{
|
||||
call setline(a:lnum, substitute(getline(a:lnum), a:pattern, a:new_string,
|
||||
@ -109,8 +109,41 @@ else
|
||||
endfunction
|
||||
endif "}}}
|
||||
|
||||
function! vimwiki#lst#default_symbol() "{{{
|
||||
return g:vimwiki_list_markers[0]
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#get_list_margin() "{{{
|
||||
if VimwikiGet('list_margin') < 0
|
||||
return &sw
|
||||
else
|
||||
return VimwikiGet('list_margin')
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the column where the text of a line starts (possible list item
|
||||
"markers and checkboxes are skipped)
|
||||
function! s:text_begin(lnum) "{{{
|
||||
return s:string_length(matchstr(getline(a:lnum), g:vimwiki_rxListItem))
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: 2 if there is a marker and text
|
||||
" 1 for a marker and no text
|
||||
" 0 for no marker at all (empty line or only text)
|
||||
function! s:line_has_marker(lnum) "{{{
|
||||
if getline(a:lnum) =~# g:vimwiki_rxListItem.'\s*$'
|
||||
return 1
|
||||
elseif getline(a:lnum) =~# g:vimwiki_rxListItem.'\s*\S'
|
||||
return 2
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"utility functions }}}
|
||||
|
||||
"get properties of an item {{{
|
||||
|
||||
"Returns: the mainly used data structure in this file
|
||||
"An item represents a single list item and is a dictionary with the keys
|
||||
"lnum - the line number of the list item
|
||||
@ -166,6 +199,67 @@ function! s:get_level(lnum) "{{{
|
||||
return level
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: 1, a, i, A, I or ''
|
||||
"If in doubt if alphanumeric character or romanian
|
||||
"numeral, peek in the previous line
|
||||
function! s:guess_kind_of_numbered_item(item) "{{{
|
||||
if a:item.type != 2 | return '' | endif
|
||||
let number_chars = a:item.mrkr[:-2]
|
||||
let divisor = a:item.mrkr[-1:]
|
||||
|
||||
if number_chars =~ '\d\+'
|
||||
return '1'
|
||||
endif
|
||||
if number_chars =~# '\l\+'
|
||||
if number_chars !~# '^[ivxlcdm]\+' || index(s:number_kinds, 'i') == -1
|
||||
return 'a'
|
||||
else
|
||||
|
||||
let item_above = s:get_prev_list_item(a:item, 0)
|
||||
if item_above.type != 0
|
||||
if index(s:number_kinds, 'a') == -1 ||
|
||||
\ (item_above.mrkr[-1:] !=# divisor && number_chars =~# 'i\+') ||
|
||||
\ s:increment_i(item_above.mrkr[:-2]) ==# number_chars
|
||||
return 'i'
|
||||
else
|
||||
return 'a'
|
||||
endif
|
||||
else
|
||||
if number_chars =~# 'i\+' || index(s:number_kinds, 'a') == -1
|
||||
return 'i'
|
||||
else
|
||||
return 'a'
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
endif
|
||||
if number_chars =~# '\u\+'
|
||||
if number_chars !~# '^[IVXLCDM]\+' || index(s:number_kinds, 'I') == -1
|
||||
return 'A'
|
||||
else
|
||||
|
||||
let item_above = s:get_prev_list_item(a:item, 0)
|
||||
if item_above.type != 0
|
||||
if index(s:number_kinds, 'A') == -1 ||
|
||||
\ (item_above.mrkr[-1:] !=# divisor && number_chars =~# 'I\+') ||
|
||||
\ s:increment_I(item_above.mrkr[:-2]) ==# number_chars
|
||||
return 'I'
|
||||
else
|
||||
return 'A'
|
||||
endif
|
||||
else
|
||||
if number_chars =~# 'I\+' || index(s:number_kinds, 'A') == -1
|
||||
return 'I'
|
||||
else
|
||||
return 'A'
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
function! s:regexp_of_marker(item) "{{{
|
||||
if a:item.type == 1
|
||||
return vimwiki#u#escape(a:item.mrkr)
|
||||
@ -181,6 +275,10 @@ function! s:regexp_of_marker(item) "{{{
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"get properties of an item }}}
|
||||
|
||||
"functions for navigating between items {{{
|
||||
|
||||
"Returns: the list item after a:item or an empty item
|
||||
"If a:ignore_kind is 1, the markers can differ
|
||||
function! s:get_next_list_item(item, ignore_kind) "{{{
|
||||
@ -248,67 +346,6 @@ function! s:get_any_item_of_level(cur_ln, cur_lvl, org_lvl) "{{{
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: 1, a, i, A, I or ''
|
||||
"If in doubt if alphanumeric character or romanian
|
||||
"numeral, peek in the previous line
|
||||
function! s:guess_kind_of_numbered_item(item) "{{{
|
||||
if a:item.type != 2 | return '' | endif
|
||||
let number_chars = a:item.mrkr[:-2]
|
||||
let divisor = a:item.mrkr[-1:]
|
||||
|
||||
if number_chars =~ '\d\+'
|
||||
return '1'
|
||||
endif
|
||||
if number_chars =~# '\l\+'
|
||||
if number_chars !~# '^[ivxlcdm]\+' || index(s:number_kinds, 'i') == -1
|
||||
return 'a'
|
||||
else
|
||||
|
||||
let item_above = s:get_prev_list_item(a:item, 0)
|
||||
if item_above.type != 0
|
||||
if index(s:number_kinds, 'a') == -1 ||
|
||||
\ (item_above.mrkr[-1:] !=# divisor && number_chars =~# 'i\+') ||
|
||||
\ s:increment_i(item_above.mrkr[:-2]) ==# number_chars
|
||||
return 'i'
|
||||
else
|
||||
return 'a'
|
||||
endif
|
||||
else
|
||||
if number_chars =~# 'i\+' || index(s:number_kinds, 'a') == -1
|
||||
return 'i'
|
||||
else
|
||||
return 'a'
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
endif
|
||||
if number_chars =~# '\u\+'
|
||||
if number_chars !~# '^[IVXLCDM]\+' || index(s:number_kinds, 'I') == -1
|
||||
return 'A'
|
||||
else
|
||||
|
||||
let item_above = s:get_prev_list_item(a:item, 0)
|
||||
if item_above.type != 0
|
||||
if index(s:number_kinds, 'A') == -1 ||
|
||||
\ (item_above.mrkr[-1:] !=# divisor && number_chars =~# 'I\+') ||
|
||||
\ s:increment_I(item_above.mrkr[:-2]) ==# number_chars
|
||||
return 'I'
|
||||
else
|
||||
return 'A'
|
||||
endif
|
||||
else
|
||||
if number_chars =~# 'I\+' || index(s:number_kinds, 'A') == -1
|
||||
return 'I'
|
||||
else
|
||||
return 'A'
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
function! s:get_first_item_in_list(item, ignore_kind) "{{{
|
||||
let cur_item = a:item
|
||||
while 1
|
||||
@ -453,6 +490,95 @@ function! s:get_parent(item) "{{{
|
||||
return s:get_item(parent_line)
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the item above or the item below or an empty item
|
||||
function! s:get_a_neighbor_item(item) "{{{
|
||||
let prev_item = s:get_prev_list_item(a:item, 1)
|
||||
if prev_item.type != 0
|
||||
return prev_item
|
||||
else
|
||||
let next_item = s:get_next_list_item(a:item, 1)
|
||||
if next_item.type != 0
|
||||
return next_item
|
||||
endif
|
||||
endif
|
||||
return s:empty_item()
|
||||
endfunction "}}}
|
||||
|
||||
function! s:get_a_neighbor_item_in_column(lnum, column) "{{{
|
||||
let cur_ln = s:get_prev_line(a:lnum)
|
||||
while cur_ln >= 1
|
||||
if s:get_level(cur_ln) <= a:column
|
||||
return s:get_corresponding_item(cur_ln)
|
||||
endif
|
||||
let cur_ln = s:get_prev_line(cur_ln)
|
||||
endwhile
|
||||
return s:empty_item()
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the item if there is one in a:lnum
|
||||
"else the multiline item a:lnum belongs to
|
||||
function! s:get_corresponding_item(lnum) "{{{
|
||||
let item = s:get_item(a:lnum)
|
||||
if item.type != 0
|
||||
return item
|
||||
endif
|
||||
let org_lvl = s:get_level(a:lnum)
|
||||
let cur_ln = a:lnum
|
||||
while cur_ln > 0
|
||||
let cur_lvl = s:get_level(cur_ln)
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_lvl < org_lvl && cur_item.type != 0
|
||||
return cur_item
|
||||
endif
|
||||
if cur_lvl < org_lvl
|
||||
let org_lvl = cur_lvl
|
||||
endif
|
||||
let cur_ln = s:get_prev_line(cur_ln)
|
||||
endwhile
|
||||
return s:empty_item()
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the last line of a (possibly multiline) item, including all children
|
||||
function! s:get_last_line_of_item_incl_children(item) "{{{
|
||||
let cur_ln = a:item.lnum
|
||||
let org_lvl = s:get_level(a:item.lnum)
|
||||
while 1
|
||||
let next_line = s:get_next_line(cur_ln)
|
||||
if next_line == 0 || s:get_level(next_line) <= org_lvl
|
||||
return cur_ln
|
||||
endif
|
||||
let cur_ln = next_line
|
||||
endwhile
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the last line of a (possibly multiline) item
|
||||
"Note: there can be other list items inbetween the first and last lines
|
||||
function! s:get_last_line_of_item(item) "{{{
|
||||
if a:item.type == 0 | return 0 | endif
|
||||
let org_lvl = s:get_level(a:item.lnum)
|
||||
let last_corresponding_line = a:item.lnum
|
||||
|
||||
let cur_ln = s:get_next_line(a:item.lnum)
|
||||
while 1
|
||||
if cur_ln == 0 || s:get_level(cur_ln) <= org_lvl
|
||||
break
|
||||
endif
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_item.type == 0
|
||||
let last_corresponding_line = cur_ln
|
||||
let cur_ln = s:get_next_line(cur_ln)
|
||||
else
|
||||
let cur_ln = s:get_next_line(
|
||||
\ s:get_last_line_of_item_incl_children(cur_item))
|
||||
endif
|
||||
endwhile
|
||||
|
||||
return last_corresponding_line
|
||||
endfunction "}}}
|
||||
|
||||
"functions for navigating between items }}}
|
||||
|
||||
"renumber list items {{{
|
||||
"Renumbers the current list from a:item on downwards
|
||||
"Returns: the last item that was adjusted
|
||||
function! s:adjust_numbered_list_below(item, recursive) "{{{
|
||||
@ -533,6 +659,33 @@ function! s:adjust_numbered_list(item, ignore_kind, recursive) "{{{
|
||||
endwhile
|
||||
endfunction "}}}
|
||||
|
||||
"Renumbers the list the cursor is in
|
||||
"also update its parents checkbox state
|
||||
function! vimwiki#lst#adjust_numbered_list() "{{{
|
||||
let cur_item = s:get_corresponding_item(line('.'))
|
||||
if cur_item.type == 0 | return | endif
|
||||
call s:adjust_numbered_list(cur_item, 1, 0)
|
||||
call s:update_state(s:get_parent(cur_item))
|
||||
endfunction "}}}
|
||||
|
||||
"Renumbers all lists of the buffer
|
||||
"of course, this might take some seconds
|
||||
function! vimwiki#lst#adjust_whole_buffer() "{{{
|
||||
let cur_ln = 1
|
||||
while 1
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_item.type != 0
|
||||
let cur_item = s:adjust_numbered_list(cur_item, 0, 1)
|
||||
endif
|
||||
let cur_ln = s:get_next_line(cur_item.lnum, 1)
|
||||
if cur_ln <= 0 || cur_ln > line('$')
|
||||
return
|
||||
endif
|
||||
endwhile
|
||||
endfunction "}}}
|
||||
|
||||
"renumber list items }}}
|
||||
|
||||
"checkbox stuff {{{
|
||||
|
||||
"Returns: the rate of checkboxed list item in percent
|
||||
@ -657,113 +810,6 @@ function! s:remove_cb(item) "{{{
|
||||
return item
|
||||
endfunction "}}}
|
||||
|
||||
"checkbox stuff }}}
|
||||
|
||||
"Returns: the item if there is one in a:lnum
|
||||
"else the multiline item a:lnum belongs to
|
||||
function! s:get_corresponding_item(lnum) "{{{
|
||||
let item = s:get_item(a:lnum)
|
||||
if item.type != 0
|
||||
return item
|
||||
endif
|
||||
let org_lvl = s:get_level(a:lnum)
|
||||
let cur_ln = a:lnum
|
||||
while cur_ln > 0
|
||||
let cur_lvl = s:get_level(cur_ln)
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_lvl < org_lvl && cur_item.type != 0
|
||||
return cur_item
|
||||
endif
|
||||
if cur_lvl < org_lvl
|
||||
let org_lvl = cur_lvl
|
||||
endif
|
||||
let cur_ln = s:get_prev_line(cur_ln)
|
||||
endwhile
|
||||
return s:empty_item()
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the last line of a (possibly multiline) item, including all children
|
||||
function! s:get_last_line_of_item_incl_children(item) "{{{
|
||||
let cur_ln = a:item.lnum
|
||||
let org_lvl = s:get_level(a:item.lnum)
|
||||
while 1
|
||||
let next_line = s:get_next_line(cur_ln)
|
||||
if next_line == 0 || s:get_level(next_line) <= org_lvl
|
||||
return cur_ln
|
||||
endif
|
||||
let cur_ln = next_line
|
||||
endwhile
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the last line of a (possibly multiline) item
|
||||
"Note: there can be other list items inbetween the first and last lines
|
||||
function! s:get_last_line_of_item(item) "{{{
|
||||
if a:item.type == 0 | return 0 | endif
|
||||
let org_lvl = s:get_level(a:item.lnum)
|
||||
let last_corresponding_line = a:item.lnum
|
||||
|
||||
let cur_ln = s:get_next_line(a:item.lnum)
|
||||
while 1
|
||||
if cur_ln == 0 || s:get_level(cur_ln) <= org_lvl
|
||||
break
|
||||
endif
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_item.type == 0
|
||||
let last_corresponding_line = cur_ln
|
||||
let cur_ln = s:get_next_line(cur_ln)
|
||||
else
|
||||
let cur_ln = s:get_next_line(
|
||||
\ s:get_last_line_of_item_incl_children(cur_item))
|
||||
endif
|
||||
endwhile
|
||||
|
||||
return last_corresponding_line
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the column where the text of a line starts (possible list item
|
||||
"markers and checkboxes are skipped)
|
||||
function! s:text_begin(lnum) "{{{
|
||||
return s:string_length(matchstr(getline(a:lnum), g:vimwiki_rxListItem))
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: 2 if there is a marker and text
|
||||
" 1 for a marker and no text
|
||||
" 0 for no marker at all (empty line or only text)
|
||||
function! s:line_has_marker(lnum) "{{{
|
||||
if getline(a:lnum) =~# g:vimwiki_rxListItem.'\s*$'
|
||||
return 1
|
||||
elseif getline(a:lnum) =~# g:vimwiki_rxListItem.'\s*\S'
|
||||
return 2
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"Renumbers the list the cursor is in
|
||||
"also update its parents checkbox state
|
||||
function! vimwiki#lst#adjust_numbered_list() "{{{
|
||||
let cur_item = s:get_corresponding_item(line('.'))
|
||||
if cur_item.type == 0 | return | endif
|
||||
call s:adjust_numbered_list(cur_item, 1, 0)
|
||||
call s:update_state(s:get_parent(cur_item))
|
||||
endfunction "}}}
|
||||
|
||||
"Renumbers all lists of the buffer
|
||||
"of course, this might take some seconds
|
||||
function! vimwiki#lst#adjust_whole_buffer() "{{{
|
||||
let cur_ln = 1
|
||||
while 1
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_item.type != 0
|
||||
let cur_item = s:adjust_numbered_list(cur_item, 0, 1)
|
||||
endif
|
||||
let cur_ln = s:get_next_line(cur_item.lnum, 1)
|
||||
if cur_ln <= 0 || cur_ln > line('$')
|
||||
return
|
||||
endif
|
||||
endwhile
|
||||
endfunction "}}}
|
||||
|
||||
"Toggles checkbox between [ ] and [X] or creates one
|
||||
"in the lines of the given range
|
||||
function! vimwiki#lst#toggle_cb(line1, line2) "{{{
|
||||
@ -816,6 +862,205 @@ function! vimwiki#lst#toggle_cb(line1, line2) "{{{
|
||||
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#remove_cb(first_line, last_line) "{{{
|
||||
let first_item = s:get_corresponding_item(a:first_line)
|
||||
let last_item = s:get_corresponding_item(a:last_line)
|
||||
|
||||
if first_item.type == 0 || last_item.type == 0
|
||||
return
|
||||
endif
|
||||
|
||||
let parent_items_of_lines = []
|
||||
let cur_ln = first_item.lnum
|
||||
while 1
|
||||
if cur_ln <= 0 || cur_ln > last_item.lnum | break | endif
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_item.type != 0
|
||||
let cur_item = s:remove_cb(cur_item)
|
||||
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
|
||||
let cur_ln = s:get_next_line(cur_ln)
|
||||
endwhile
|
||||
for parent_item in parent_items_of_lines
|
||||
call s:update_state(parent_item)
|
||||
endfor
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#remove_cb_in_list() "{{{
|
||||
let first_item = s:get_first_item_in_list(
|
||||
\ s:get_corresponding_item(line('.')), 0)
|
||||
|
||||
let cur_item = first_item
|
||||
while 1
|
||||
let next_item = s:get_next_list_item(cur_item, 0)
|
||||
let cur_item = s:remove_cb(cur_item)
|
||||
if next_item.type == 0
|
||||
break
|
||||
else
|
||||
let cur_item = next_item
|
||||
endif
|
||||
endwhile
|
||||
|
||||
call s:update_state(s:get_parent(first_item))
|
||||
endfunction "}}}
|
||||
|
||||
"checkbox stuff }}}
|
||||
|
||||
"change the level of list items {{{
|
||||
|
||||
function! s:set_indent(lnum, new_indent) "{{{
|
||||
if &expandtab
|
||||
let indentstring = repeat(' ', a:new_indent)
|
||||
else
|
||||
let indentstring = repeat('\t', a:new_indent / &tabstop) .
|
||||
\ repeat(' ', a:new_indent % &tabstop)
|
||||
endif
|
||||
call s:substitute_rx_in_line(a:lnum, '^\s*', indentstring)
|
||||
endfunction "}}}
|
||||
|
||||
function! s:decrease_level(item) "{{{
|
||||
let removed_indent = 0
|
||||
if VimwikiGet('syntax') == 'media' && a:item.type == 1 &&
|
||||
\ index(s:multiple_bullet_chars, s:first_char(a:item.mrkr)) > -1
|
||||
if s:string_length(a:item.mrkr) >= 2
|
||||
call s:substitute_string_in_line(a:item.lnum,
|
||||
\ s:first_char(a:item.mrkr), '')
|
||||
let removed_indent = -1
|
||||
endif
|
||||
else
|
||||
let old_indent = indent(a:item.lnum)
|
||||
if &shiftround
|
||||
let new_indent = (old_indent - 1) / &shiftwidth * &shiftwidth
|
||||
else
|
||||
let new_indent = old_indent - &shiftwidth
|
||||
endif
|
||||
call s:set_indent(a:item.lnum, new_indent)
|
||||
let removed_indent = new_indent - old_indent
|
||||
endif
|
||||
return removed_indent
|
||||
endfunction "}}}
|
||||
|
||||
function! s:increase_level(item) "{{{
|
||||
let additional_space = 0
|
||||
if VimwikiGet('syntax') == 'media' && a:item.type == 1 &&
|
||||
\ index(s:multiple_bullet_chars, s:first_char(a:item.mrkr)) > -1
|
||||
call s:substitute_string_in_line(a:item.lnum, a:item.mrkr, a:item.mrkr .
|
||||
\ s:first_char(a:item.mrkr))
|
||||
let additional_indent = 1
|
||||
else
|
||||
let old_indent = indent(a:item.lnum)
|
||||
if &shiftround
|
||||
let new_indent = (old_indent / &shiftwidth + 1) * &shiftwidth
|
||||
else
|
||||
let new_indent = old_indent + &shiftwidth
|
||||
endif
|
||||
call s:set_indent(a:item.lnum, new_indent)
|
||||
let additional_indent = new_indent - old_indent
|
||||
endif
|
||||
return additional_indent
|
||||
endfunction "}}}
|
||||
|
||||
"adds a:indent_by to the current indent
|
||||
"a:indent_by can be negative
|
||||
function! s:indent_line_by(lnum, indent_by) "{{{
|
||||
let item = s:get_item(a:lnum)
|
||||
if VimwikiGet('syntax') == 'media' && item.type == 1 &&
|
||||
\ index(s:multiple_bullet_chars, s:first_char(item.mrkr)) > -1
|
||||
if a:indent_by > 0
|
||||
call s:substitute_string_in_line(a:lnum, item.mrkr,
|
||||
\ item.mrkr . s:first_char(item.mrkr))
|
||||
elseif a:indent_by < 0
|
||||
call s:substitute_string_in_line(a:lnum, s:first_char(item.mrkr), '')
|
||||
endif
|
||||
else
|
||||
call s:set_indent(a:lnum, indent(a:lnum) + a:indent_by)
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"changes lvl of lines in selection
|
||||
function! s:change_level(from_line, to_line, direction, plus_children) "{{{
|
||||
let from_item = s:get_corresponding_item(a:from_line)
|
||||
if from_item.type == 0
|
||||
if a:direction == 'increase' && a:from_line == a:to_line &&
|
||||
\ empty(getline(a:from_line))
|
||||
"that's because :> doesn't work on an empty line
|
||||
normal! gi
|
||||
else
|
||||
execute a:from_line.','.a:to_line.(a:direction == 'increase' ? '>' : '<')
|
||||
endif
|
||||
return
|
||||
endif
|
||||
if a:from_line == a:to_line
|
||||
if a:plus_children
|
||||
let to_line = s:get_last_line_of_item_incl_children(from_item)
|
||||
else
|
||||
let to_line = s:get_last_line_of_item(from_item)
|
||||
endif
|
||||
else
|
||||
let to_line = a:to_line
|
||||
endif
|
||||
|
||||
if from_item.type == 0 || to_line == 0
|
||||
return
|
||||
endif
|
||||
|
||||
let to_be_adjusted = s:get_a_neighbor_item(from_item)
|
||||
let old_parent = s:get_parent(from_item)
|
||||
let first_line_level = s:get_level(from_item.lnum)
|
||||
let more_than_one_level_concerned = 0
|
||||
|
||||
let first_line_indented_by =
|
||||
\ (a:direction == 'increase') ?
|
||||
\ s:increase_level(from_item) : s:decrease_level(from_item)
|
||||
|
||||
let cur_ln = s:get_next_line(from_item.lnum)
|
||||
while cur_ln > 0 && cur_ln <= to_line
|
||||
if !more_than_one_level_concerned &&
|
||||
\ s:get_level(cur_ln) != first_line_level &&
|
||||
\ s:get_item(cur_ln).type != 0
|
||||
let more_than_one_level_concerned = 1
|
||||
endif
|
||||
call s:indent_line_by(cur_ln, first_line_indented_by)
|
||||
let cur_ln = s:get_next_line(cur_ln, 1)
|
||||
endwhile
|
||||
|
||||
if a:from_line == a:to_line
|
||||
call s:adjust_mrkr(from_item)
|
||||
endif
|
||||
call s:update_state(old_parent)
|
||||
let from_item = s:get_item(from_item.lnum)
|
||||
if from_item.cb != ''
|
||||
call s:update_state(from_item)
|
||||
call s:update_state(s:get_parent(from_item))
|
||||
endif
|
||||
|
||||
if more_than_one_level_concerned
|
||||
call vimwiki#lst#adjust_whole_buffer()
|
||||
else
|
||||
call s:adjust_numbered_list(from_item, 0, 0)
|
||||
call s:adjust_numbered_list(to_be_adjusted, 0, 0)
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#change_level(from_line, to_line, direction, plus_children) "{{{
|
||||
let cur_col = col('$') - col('.')
|
||||
call s:change_level(a:from_line, a:to_line, a:direction, a:plus_children)
|
||||
call cursor('.', col('$') - cur_col)
|
||||
endfunction "}}}
|
||||
|
||||
"indent line a:lnum to be the continuation of a:prev_item
|
||||
function! s:indent_multiline(prev_item, lnum) "{{{
|
||||
if a:prev_item.type != 0
|
||||
call s:set_indent(a:lnum, s:text_begin(a:prev_item.lnum))
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"change the level of list items }}}
|
||||
|
||||
"change markers of list items {{{
|
||||
"Returns: the position of a marker in g:vimwiki_list_markers
|
||||
function! s:get_idx_list_markers(item) "{{{
|
||||
if a:item.type == 1
|
||||
@ -917,51 +1162,6 @@ function! vimwiki#lst#change_marker(line1, line2, new_mrkr, mode) "{{{
|
||||
call cursor('.', col('$') - cur_col_from_eol)
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#remove_cb(first_line, last_line) "{{{
|
||||
let first_item = s:get_corresponding_item(a:first_line)
|
||||
let last_item = s:get_corresponding_item(a:last_line)
|
||||
|
||||
if first_item.type == 0 || last_item.type == 0
|
||||
return
|
||||
endif
|
||||
|
||||
let parent_items_of_lines = []
|
||||
let cur_ln = first_item.lnum
|
||||
while 1
|
||||
if cur_ln <= 0 || cur_ln > last_item.lnum | break | endif
|
||||
let cur_item = s:get_item(cur_ln)
|
||||
if cur_item.type != 0
|
||||
let cur_item = s:remove_cb(cur_item)
|
||||
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
|
||||
let cur_ln = s:get_next_line(cur_ln)
|
||||
endwhile
|
||||
for parent_item in parent_items_of_lines
|
||||
call s:update_state(parent_item)
|
||||
endfor
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#remove_cb_in_list() "{{{
|
||||
let first_item = s:get_first_item_in_list(
|
||||
\ s:get_corresponding_item(line('.')), 0)
|
||||
|
||||
let cur_item = first_item
|
||||
while 1
|
||||
let next_item = s:get_next_list_item(cur_item, 0)
|
||||
let cur_item = s:remove_cb(cur_item)
|
||||
if next_item.type == 0
|
||||
break
|
||||
else
|
||||
let cur_item = next_item
|
||||
endif
|
||||
endwhile
|
||||
|
||||
call s:update_state(s:get_parent(first_item))
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#change_marker_in_list(new_mrkr) "{{{
|
||||
let cur_item = s:get_corresponding_item(line('.'))
|
||||
let first_item = s:get_first_item_in_list(cur_item, 0)
|
||||
@ -977,90 +1177,6 @@ function! vimwiki#lst#change_marker_in_list(new_mrkr) "{{{
|
||||
|
||||
call s:adjust_numbered_list(s:get_item(first_item_line), 0, 0)
|
||||
endfunction "}}}
|
||||
|
||||
function! s:set_indent(lnum, new_indent) "{{{
|
||||
if &expandtab
|
||||
let indentstring = repeat(' ', a:new_indent)
|
||||
else
|
||||
let indentstring = repeat('\t', a:new_indent / &tabstop) .
|
||||
\ repeat(' ', a:new_indent % &tabstop)
|
||||
endif
|
||||
call s:substitute_rx_in_line(a:lnum, '^\s*', indentstring)
|
||||
endfunction "}}}
|
||||
|
||||
function! s:decrease_level(item) "{{{
|
||||
let removed_indent = 0
|
||||
if VimwikiGet('syntax') == 'media' && a:item.type == 1 &&
|
||||
\ index(s:multiple_bullet_chars, s:first_char(a:item.mrkr)) > -1
|
||||
if s:string_length(a:item.mrkr) >= 2
|
||||
call s:substitute_string_in_line(a:item.lnum,
|
||||
\ s:first_char(a:item.mrkr), '')
|
||||
let removed_indent = -1
|
||||
endif
|
||||
else
|
||||
let old_indent = indent(a:item.lnum)
|
||||
if &shiftround
|
||||
let new_indent = (old_indent - 1) / &shiftwidth * &shiftwidth
|
||||
else
|
||||
let new_indent = old_indent - &shiftwidth
|
||||
endif
|
||||
call s:set_indent(a:item.lnum, new_indent)
|
||||
let removed_indent = new_indent - old_indent
|
||||
endif
|
||||
return removed_indent
|
||||
endfunction "}}}
|
||||
|
||||
function! s:increase_level(item) "{{{
|
||||
let additional_space = 0
|
||||
if VimwikiGet('syntax') == 'media' && a:item.type == 1 &&
|
||||
\ index(s:multiple_bullet_chars, s:first_char(a:item.mrkr)) > -1
|
||||
call s:substitute_string_in_line(a:item.lnum, a:item.mrkr, a:item.mrkr .
|
||||
\ s:first_char(a:item.mrkr))
|
||||
let additional_indent = 1
|
||||
else
|
||||
let old_indent = indent(a:item.lnum)
|
||||
if &shiftround
|
||||
let new_indent = (old_indent / &shiftwidth + 1) * &shiftwidth
|
||||
else
|
||||
let new_indent = old_indent + &shiftwidth
|
||||
endif
|
||||
call s:set_indent(a:item.lnum, new_indent)
|
||||
let additional_indent = new_indent - old_indent
|
||||
endif
|
||||
return additional_indent
|
||||
endfunction "}}}
|
||||
|
||||
"adds a:indent_by to the current indent
|
||||
"a:indent_by can be negative
|
||||
function! s:indent_line_by(lnum, indent_by) "{{{
|
||||
let item = s:get_item(a:lnum)
|
||||
if VimwikiGet('syntax') == 'media' && item.type == 1 &&
|
||||
\ index(s:multiple_bullet_chars, s:first_char(item.mrkr)) > -1
|
||||
if a:indent_by > 0
|
||||
call s:substitute_string_in_line(a:lnum, item.mrkr,
|
||||
\ item.mrkr . s:first_char(item.mrkr))
|
||||
elseif a:indent_by < 0
|
||||
call s:substitute_string_in_line(a:lnum, s:first_char(item.mrkr), '')
|
||||
endif
|
||||
else
|
||||
call s:set_indent(a:lnum, indent(a:lnum) + a:indent_by)
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"Returns: the item above or the item below or an empty item
|
||||
function! s:get_a_neighbor_item(item) "{{{
|
||||
let prev_item = s:get_prev_list_item(a:item, 1)
|
||||
if prev_item.type != 0
|
||||
return prev_item
|
||||
else
|
||||
let next_item = s:get_next_list_item(a:item, 1)
|
||||
if next_item.type != 0
|
||||
return next_item
|
||||
endif
|
||||
endif
|
||||
return s:empty_item()
|
||||
endfunction "}}}
|
||||
|
||||
"sets kind of the item depending on neighbor items and the parent item
|
||||
function! s:adjust_mrkr(item) "{{{
|
||||
if a:item.type == 0 || VimwikiGet('syntax') == 'media'
|
||||
@ -1088,77 +1204,6 @@ function! s:adjust_mrkr(item) "{{{
|
||||
call s:adjust_numbered_list(a:item, 0, 1)
|
||||
endfunction "}}}
|
||||
|
||||
"changes lvl of lines in selection
|
||||
function! s:change_level(from_line, to_line, direction, plus_children) "{{{
|
||||
let from_item = s:get_corresponding_item(a:from_line)
|
||||
if from_item.type == 0
|
||||
if a:direction == 'increase' && a:from_line == a:to_line &&
|
||||
\ empty(getline(a:from_line))
|
||||
"that's because :> doesn't work on an empty line
|
||||
normal! gi
|
||||
else
|
||||
execute a:from_line.','.a:to_line.(a:direction == 'increase' ? '>' : '<')
|
||||
endif
|
||||
return
|
||||
endif
|
||||
if a:from_line == a:to_line
|
||||
if a:plus_children
|
||||
let to_line = s:get_last_line_of_item_incl_children(from_item)
|
||||
else
|
||||
let to_line = s:get_last_line_of_item(from_item)
|
||||
endif
|
||||
else
|
||||
let to_line = a:to_line
|
||||
endif
|
||||
|
||||
if from_item.type == 0 || to_line == 0
|
||||
return
|
||||
endif
|
||||
|
||||
let to_be_adjusted = s:get_a_neighbor_item(from_item)
|
||||
let old_parent = s:get_parent(from_item)
|
||||
let first_line_level = s:get_level(from_item.lnum)
|
||||
let more_than_one_level_concerned = 0
|
||||
|
||||
let first_line_indented_by =
|
||||
\ (a:direction == 'increase') ?
|
||||
\ s:increase_level(from_item) : s:decrease_level(from_item)
|
||||
|
||||
let cur_ln = s:get_next_line(from_item.lnum)
|
||||
while cur_ln > 0 && cur_ln <= to_line
|
||||
if !more_than_one_level_concerned &&
|
||||
\ s:get_level(cur_ln) != first_line_level &&
|
||||
\ s:get_item(cur_ln).type != 0
|
||||
let more_than_one_level_concerned = 1
|
||||
endif
|
||||
call s:indent_line_by(cur_ln, first_line_indented_by)
|
||||
let cur_ln = s:get_next_line(cur_ln, 1)
|
||||
endwhile
|
||||
|
||||
if a:from_line == a:to_line
|
||||
call s:adjust_mrkr(from_item)
|
||||
endif
|
||||
call s:update_state(old_parent)
|
||||
let from_item = s:get_item(from_item.lnum)
|
||||
if from_item.cb != ''
|
||||
call s:update_state(from_item)
|
||||
call s:update_state(s:get_parent(from_item))
|
||||
endif
|
||||
|
||||
if more_than_one_level_concerned
|
||||
call vimwiki#lst#adjust_whole_buffer()
|
||||
else
|
||||
call s:adjust_numbered_list(from_item, 0, 0)
|
||||
call s:adjust_numbered_list(to_be_adjusted, 0, 0)
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#change_level(from_line, to_line, direction, plus_children) "{{{
|
||||
let cur_col = col('$') - col('.')
|
||||
call s:change_level(a:from_line, a:to_line, a:direction, a:plus_children)
|
||||
call cursor('.', col('$') - cur_col)
|
||||
endfunction "}}}
|
||||
|
||||
function! s:clone_marker_from_to(from, to) "{{{
|
||||
let item_from = s:get_item(a:from)
|
||||
if item_from.type == 0 | return | endif
|
||||
@ -1176,13 +1221,39 @@ function! s:clone_marker_from_to(from, to) "{{{
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"indent line a:lnum to be the continuation of a:prev_item
|
||||
function! s:indent_multiline(prev_item, lnum) "{{{
|
||||
if a:prev_item.type != 0
|
||||
call s:set_indent(a:lnum, s:text_begin(a:prev_item.lnum))
|
||||
function! s:remove_mrkr(item) "{{{
|
||||
let item = a:item
|
||||
if item.cb != ''
|
||||
let item = s:remove_cb(item)
|
||||
let parent_item = s:get_parent(item)
|
||||
else
|
||||
let parent_item = s:empty_item()
|
||||
endif
|
||||
call s:substitute_rx_in_line(item.lnum, vimwiki#u#escape(item.mrkr).'\s*', '')
|
||||
call remove(item, 'mrkr')
|
||||
call remove(item, 'cb')
|
||||
let item.type = 0
|
||||
call s:update_state(parent_item)
|
||||
return item
|
||||
endfunction "}}}
|
||||
|
||||
function! s:create_marker(lnum) "{{{
|
||||
let new_sibling = s:get_corresponding_item(a:lnum)
|
||||
if new_sibling.type == 0
|
||||
let new_sibling = s:get_a_neighbor_item_in_column(a:lnum, virtcol('.'))
|
||||
endif
|
||||
if new_sibling.type != 0
|
||||
call s:clone_marker_from_to(new_sibling.lnum, a:lnum)
|
||||
else
|
||||
let cur_item = s:get_item(a:lnum)
|
||||
call s:set_new_mrkr(cur_item, g:vimwiki_list_markers[0])
|
||||
call s:adjust_numbered_list(cur_item, 0, 0)
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
"change markers of list items }}}
|
||||
|
||||
"handle keys {{{
|
||||
function! vimwiki#lst#kbd_o() "{{{
|
||||
let fold_end = foldclosedend('.')
|
||||
let lnum = (fold_end == -1) ? line('.') : fold_end
|
||||
@ -1209,47 +1280,6 @@ function! vimwiki#lst#kbd_O() "{{{
|
||||
startinsert!
|
||||
endfunction "}}}
|
||||
|
||||
function! s:remove_mrkr(item) "{{{
|
||||
let item = a:item
|
||||
if item.cb != ''
|
||||
let item = s:remove_cb(item)
|
||||
let parent_item = s:get_parent(item)
|
||||
else
|
||||
let parent_item = s:empty_item()
|
||||
endif
|
||||
call s:substitute_rx_in_line(item.lnum, vimwiki#u#escape(item.mrkr).'\s*', '')
|
||||
call remove(item, 'mrkr')
|
||||
call remove(item, 'cb')
|
||||
let item.type = 0
|
||||
call s:update_state(parent_item)
|
||||
return item
|
||||
endfunction "}}}
|
||||
|
||||
function! s:get_a_neighbor_item_in_column(lnum, column) "{{{
|
||||
let cur_ln = s:get_prev_line(a:lnum)
|
||||
while cur_ln >= 1
|
||||
if s:get_level(cur_ln) <= a:column
|
||||
return s:get_corresponding_item(cur_ln)
|
||||
endif
|
||||
let cur_ln = s:get_prev_line(cur_ln)
|
||||
endwhile
|
||||
return s:empty_item()
|
||||
endfunction "}}}
|
||||
|
||||
function! s:create_marker(lnum) "{{{
|
||||
let new_sibling = s:get_corresponding_item(a:lnum)
|
||||
if new_sibling.type == 0
|
||||
let new_sibling = s:get_a_neighbor_item_in_column(a:lnum, virtcol('.'))
|
||||
endif
|
||||
if new_sibling.type != 0
|
||||
call s:clone_marker_from_to(new_sibling.lnum, a:lnum)
|
||||
else
|
||||
let cur_item = s:get_item(a:lnum)
|
||||
call s:set_new_mrkr(cur_item, g:vimwiki_list_markers[0])
|
||||
call s:adjust_numbered_list(cur_item, 0, 0)
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
function! s:cr_on_empty_list_item(lnum, behavior) "{{{
|
||||
if a:behavior == 1
|
||||
"just make a new list item
|
||||
@ -1411,18 +1441,9 @@ function! vimwiki#lst#toggle_list_item() "{{{
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#default_symbol() "{{{
|
||||
return g:vimwiki_list_markers[0]
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#get_list_margin() "{{{
|
||||
if VimwikiGet('list_margin') < 0
|
||||
return &sw
|
||||
else
|
||||
return VimwikiGet('list_margin')
|
||||
endif
|
||||
endfunction "}}}
|
||||
"handle keys }}}
|
||||
|
||||
"misc stuff {{{
|
||||
function! vimwiki#lst#setup_marker_infos() "{{{
|
||||
let s:rx_bullet_chars = '['.join(keys(g:vimwiki_bullet_types), '').']\+'
|
||||
|
||||
@ -1494,9 +1515,7 @@ fun! vimwiki#lst#fold_level(lnum) "{{{
|
||||
return 's1'
|
||||
endif
|
||||
endif
|
||||
return '='
|
||||
endfu
|
||||
|
||||
|
||||
return '='
|
||||
endf "}}}
|
||||
|
||||
"misc stuff }}}
|
||||
|
Loading…
Reference in New Issue
Block a user