Version 1.2
= Note = Remove previous version of vimwiki before install - files in autoload dir is moved/renamed to autoload/vimwiki dir. = Changelog = * Issue 70: Table spanning cell support. * Issue 72: Do not convert again for unchanged file. |:VimwikiAll2HTML| converts only changed wiki files. * Issue 117: |VimwikiDiaryIndex| command that opens diary index wiki page. * Issue 120: Links in headers are not highlighted in vimwiki but are highlighted in HTML. * Issue 138: Added possibility to remap table-column move bindings. See |:VimwikiTableMoveColumnLeft| and |:VimwikiTableMoveColumnRight| commands. For remap instructions see |vimwiki_<A-Left>| and |vimwiki_<A-Right>|. * Issue 125: Problem with 'o' command given while at the of the file. * Issue 131: FileType is not set up when GUIEnter autocommand is used in vimrc. Use 'nested' in 'au GUIEnter * nested VimwikiIndex' * Issue 132: Link to perl (or any non-wiki) file in vimwiki subdirectory doesn't work as intended. * Issue 135: %title and %toc used together cause TOC to appear in an unexpected place in HTML. * Issue 139: |:VimwikiTabnewLink| command is added. * Fix of g:vimwiki_stripsym = '' (i.e. an empty string) -- it removes bad symbols from filenames. * Issue 145: With modeline 'set ft=vimwiki' links are not correctly highlighted when open wiki files. * Issue 146: Filetype difficulty with ".txt" as a vimwiki extension. * Issue 148: There are no mailto links. * Issue 151: Use location list instead of quickfix list for :VimwikiSearch command result. Use :lopen instead of :copen, :lnext instead of :cnext etc. * Issue 152: Add the list of HTML files that would not be deleted after |:VimwikiAll2HTML|. * Issue 153: Delete HTML files that has no corresponding wiki ones with |:VimwikiAll2HTML|. * Issue 156: Add multiple HTML templates. See |vimwiki-option-template_path|. Options html_header and html_footer are no longer exist. * Issue 173: When virtualedit=all option is enabled the 'o' command behave strange. * Issue 178: Problem with alike wikie's paths. * Issue 182: Browser command does not quote url. * Issue 183: Spelling error highlighting is not possible with nested syntaxes. * Issue 184: Wrong foldlevel in some cases. * Issue 195: Page renaming issue. * Issue 196: vim: modeline bug -- syn=vim doesn't work. * Issue 199: Generated HTML for sublists is invalid. * Issue 200: Generated HTML for todo lists does not show completion status the fix relies on CSS, thus your old stylesheets need to be updated!; may not work in obsolete browsers or font-deficient systems. * Issue 205: Block code: highlighting differs from processing. Inline code block {{{ ... }}} is removed. Use `...` instead. * Issue 208: Default highlight colors are problematic in many colorschemes. Headers are highlighted as |hl-Title| by default, use |g:vimwiki_hl_headers| to restore previous default Red, Green, Blue or custom header colors. Some other changes in highlighting. * Issue 209: Wild comments slow down html generation. Comments are changed, use %% to comment out entire line. * Issue 210: HTML: para enclose header. * Issue 214: External links containing Chinese characters get trimmed. * Issue 218: Command to generate HTML file and open it in webbrowser. See |:Vimwiki2HTMLBrowse|(bind to <leader>whh) * NEW: Added <Leader>wh mapping to call |:Vimwiki2HTML|
This commit is contained in:
369
autoload/vimwiki/lst.vim
Normal file
369
autoload/vimwiki/lst.vim
Normal file
@ -0,0 +1,369 @@
|
||||
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79
|
||||
" Vimwiki autoload plugin file
|
||||
" Todo lists related stuff here.
|
||||
" Author: Maxim Kim <habamax@gmail.com>
|
||||
" Home: http://code.google.com/p/vimwiki/
|
||||
|
||||
if exists("g:loaded_vimwiki_list_auto") || &cp
|
||||
finish
|
||||
endif
|
||||
let g:loaded_vimwiki_lst_auto = 1
|
||||
|
||||
" Script variables {{{
|
||||
let s:rx_li_box = '\[.\?\]'
|
||||
" }}}
|
||||
|
||||
" Script functions {{{
|
||||
|
||||
" Get checkbox regexp
|
||||
function! s:rx_li_symbol(rate) "{{{
|
||||
let result = ''
|
||||
if a:rate == 100
|
||||
let result = g:vimwiki_listsyms[4]
|
||||
elseif a:rate == 0
|
||||
let result = g:vimwiki_listsyms[0]
|
||||
elseif a:rate >= 67
|
||||
let result = g:vimwiki_listsyms[3]
|
||||
elseif a:rate >= 34
|
||||
let result = g:vimwiki_listsyms[2]
|
||||
else
|
||||
let result = g:vimwiki_listsyms[1]
|
||||
endif
|
||||
|
||||
return '\['.result.'\]'
|
||||
endfunction "}}}
|
||||
|
||||
" Get regexp of the list item.
|
||||
function! s:rx_list_item() "{{{
|
||||
return '\('.g:vimwiki_rxListBullet.'\|'.g:vimwiki_rxListNumber.'\)'
|
||||
endfunction "}}}
|
||||
|
||||
" Get regexp of the list item with checkbox.
|
||||
function! s:rx_cb_list_item() "{{{
|
||||
return s:rx_list_item().'\s*\zs\[.\?\]'
|
||||
endfunction "}}}
|
||||
|
||||
" Get level of the list item.
|
||||
function! s:get_level(lnum) "{{{
|
||||
if VimwikiGet('syntax') == 'media'
|
||||
let level = vimwiki#base#count_first_sym(getline(a:lnum))
|
||||
else
|
||||
let level = indent(a:lnum)
|
||||
endif
|
||||
return level
|
||||
endfunction "}}}
|
||||
|
||||
" Get previous list item.
|
||||
" Returns: line number or 0.
|
||||
function! s:prev_list_item(lnum) "{{{
|
||||
let c_lnum = a:lnum - 1
|
||||
while c_lnum >= 1
|
||||
let line = getline(c_lnum)
|
||||
if line =~ s:rx_list_item()
|
||||
return c_lnum
|
||||
endif
|
||||
if line =~ '^\s*$'
|
||||
return 0
|
||||
endif
|
||||
let c_lnum -= 1
|
||||
endwhile
|
||||
return 0
|
||||
endfunction "}}}
|
||||
|
||||
" Get next list item in the list.
|
||||
" Returns: line number or 0.
|
||||
function! s:next_list_item(lnum) "{{{
|
||||
let c_lnum = a:lnum + 1
|
||||
while c_lnum <= line('$')
|
||||
let line = getline(c_lnum)
|
||||
if line =~ s:rx_list_item()
|
||||
return c_lnum
|
||||
endif
|
||||
if line =~ '^\s*$'
|
||||
return 0
|
||||
endif
|
||||
let c_lnum += 1
|
||||
endwhile
|
||||
return 0
|
||||
endfunction "}}}
|
||||
|
||||
" Find next list item in the buffer.
|
||||
" Returns: line number or 0.
|
||||
function! s:find_next_list_item(lnum) "{{{
|
||||
let c_lnum = a:lnum + 1
|
||||
while c_lnum <= line('$')
|
||||
let line = getline(c_lnum)
|
||||
if line =~ s:rx_list_item()
|
||||
return c_lnum
|
||||
endif
|
||||
let c_lnum += 1
|
||||
endwhile
|
||||
return 0
|
||||
endfunction "}}}
|
||||
|
||||
" Set state of the list item on line number "lnum" to [ ] or [x]
|
||||
function! s:set_state(lnum, rate) "{{{
|
||||
let line = getline(a:lnum)
|
||||
let state = s:rx_li_symbol(a:rate)
|
||||
let line = substitute(line, s:rx_li_box, state, '')
|
||||
call setline(a:lnum, line)
|
||||
endfunction "}}}
|
||||
|
||||
" Get state of the list item on line number "lnum"
|
||||
function! s:get_state(lnum) "{{{
|
||||
let state = 0
|
||||
let line = getline(a:lnum)
|
||||
let opt = matchstr(line, s:rx_cb_list_item())
|
||||
if opt =~ s:rx_li_symbol(100)
|
||||
let state = 100
|
||||
elseif opt =~ s:rx_li_symbol(0)
|
||||
let state = 0
|
||||
elseif opt =~ s:rx_li_symbol(25)
|
||||
let state = 25
|
||||
elseif opt =~ s:rx_li_symbol(50)
|
||||
let state = 50
|
||||
elseif opt =~ s:rx_li_symbol(75)
|
||||
let state = 75
|
||||
endif
|
||||
return state
|
||||
endfunction "}}}
|
||||
|
||||
" Returns 1 if there is checkbox on a list item, 0 otherwise.
|
||||
function! s:is_cb_list_item(lnum) "{{{
|
||||
return getline(a:lnum) =~ s:rx_cb_list_item()
|
||||
endfunction "}}}
|
||||
|
||||
" Returns start line number of list item, 0 if it is not a list.
|
||||
function! s:is_list_item(lnum) "{{{
|
||||
let c_lnum = a:lnum
|
||||
while c_lnum >= 1
|
||||
let line = getline(c_lnum)
|
||||
if line =~ s:rx_list_item()
|
||||
return c_lnum
|
||||
endif
|
||||
if line =~ '^\s*$'
|
||||
return 0
|
||||
endif
|
||||
if indent(c_lnum) > indent(a:lnum)
|
||||
return 0
|
||||
endif
|
||||
let c_lnum -= 1
|
||||
endwhile
|
||||
return 0
|
||||
endfunction "}}}
|
||||
|
||||
" Returns char column of checkbox. Used in parent/child checks.
|
||||
function! s:get_li_pos(lnum) "{{{
|
||||
return stridx(getline(a:lnum), '[')
|
||||
endfunction "}}}
|
||||
|
||||
" Returns list of line numbers of parent and all its child items.
|
||||
function! s:get_child_items(lnum) "{{{
|
||||
let result = []
|
||||
let lnum = a:lnum
|
||||
let p_pos = s:get_level(lnum)
|
||||
|
||||
" add parent
|
||||
call add(result, lnum)
|
||||
|
||||
let lnum = s:next_list_item(lnum)
|
||||
while lnum != 0 && s:is_list_item(lnum) && s:get_level(lnum) > p_pos
|
||||
call add(result, lnum)
|
||||
let lnum = s:next_list_item(lnum)
|
||||
endwhile
|
||||
|
||||
return result
|
||||
endfunction "}}}
|
||||
|
||||
" Returns list of line numbers of all items of the same level.
|
||||
function! s:get_sibling_items(lnum) "{{{
|
||||
let result = []
|
||||
let lnum = a:lnum
|
||||
let ind = s:get_level(lnum)
|
||||
|
||||
while lnum != 0 && s:get_level(lnum) >= ind
|
||||
if s:get_level(lnum) == ind && s:is_cb_list_item(lnum)
|
||||
call add(result, lnum)
|
||||
endif
|
||||
let lnum = s:next_list_item(lnum)
|
||||
endwhile
|
||||
|
||||
let lnum = s:prev_list_item(a:lnum)
|
||||
while lnum != 0 && s:get_level(lnum) >= ind
|
||||
if s:get_level(lnum) == ind && s:is_cb_list_item(lnum)
|
||||
call add(result, lnum)
|
||||
endif
|
||||
let lnum = s:prev_list_item(lnum)
|
||||
endwhile
|
||||
|
||||
return result
|
||||
endfunction "}}}
|
||||
|
||||
" Returns line number of the parent of lnum item
|
||||
function! s:get_parent_item(lnum) "{{{
|
||||
let lnum = a:lnum
|
||||
let ind = s:get_level(lnum)
|
||||
|
||||
let lnum = s:prev_list_item(lnum)
|
||||
while lnum != 0 && s:is_list_item(lnum) && s:get_level(lnum) >= ind
|
||||
let lnum = s:prev_list_item(lnum)
|
||||
endwhile
|
||||
|
||||
if s:is_cb_list_item(lnum)
|
||||
return lnum
|
||||
else
|
||||
return a:lnum
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
" Creates checkbox in a list item.
|
||||
function! s:create_cb_list_item(lnum) "{{{
|
||||
let line = getline(a:lnum)
|
||||
let m = matchstr(line, s:rx_list_item())
|
||||
if m != ''
|
||||
let li_content = substitute(strpart(line, len(m)), '^\s*', '', '')
|
||||
let line = substitute(m, '\s*$', ' ', '').'[ ] '.li_content
|
||||
call setline(a:lnum, line)
|
||||
endif
|
||||
endfunction "}}}
|
||||
|
||||
" Tells if all of the sibling list items are checked or not.
|
||||
function! s:all_siblings_checked(lnum) "{{{
|
||||
let result = 0
|
||||
let cnt = 0
|
||||
let siblings = s:get_sibling_items(a:lnum)
|
||||
for lnum in siblings
|
||||
let cnt += s:get_state(lnum)
|
||||
endfor
|
||||
let result = cnt/len(siblings)
|
||||
return result
|
||||
endfunction "}}}
|
||||
|
||||
" Creates checkbox on a list item if there is no one.
|
||||
function! s:TLI_create_checkbox(lnum) "{{{
|
||||
if a:lnum && !s:is_cb_list_item(a:lnum)
|
||||
if g:vimwiki_auto_checkbox
|
||||
call s:create_cb_list_item(a:lnum)
|
||||
endif
|
||||
return 1
|
||||
endif
|
||||
return 0
|
||||
endfunction "}}}
|
||||
|
||||
" Switch state of the child list items.
|
||||
function! s:TLI_switch_child_state(lnum) "{{{
|
||||
let current_state = s:get_state(a:lnum)
|
||||
if current_state == 100
|
||||
let new_state = 0
|
||||
else
|
||||
let new_state = 100
|
||||
endif
|
||||
for lnum in s:get_child_items(a:lnum)
|
||||
call s:set_state(lnum, new_state)
|
||||
endfor
|
||||
endfunction "}}}
|
||||
|
||||
" Switch state of the parent list items.
|
||||
function! s:TLI_switch_parent_state(lnum) "{{{
|
||||
let c_lnum = a:lnum
|
||||
while s:is_cb_list_item(c_lnum)
|
||||
let parent_lnum = s:get_parent_item(c_lnum)
|
||||
if parent_lnum == c_lnum
|
||||
break
|
||||
endif
|
||||
call s:set_state(parent_lnum, s:all_siblings_checked(c_lnum))
|
||||
|
||||
let c_lnum = parent_lnum
|
||||
endwhile
|
||||
endfunction "}}}
|
||||
|
||||
function! s:TLI_toggle(lnum) "{{{
|
||||
if !s:TLI_create_checkbox(a:lnum)
|
||||
call s:TLI_switch_child_state(a:lnum)
|
||||
endif
|
||||
call s:TLI_switch_parent_state(a:lnum)
|
||||
endfunction "}}}
|
||||
|
||||
" Script functions }}}
|
||||
|
||||
" Toggle list item between [ ] and [X]
|
||||
function! vimwiki#lst#ToggleListItem(line1, line2) "{{{
|
||||
let line1 = a:line1
|
||||
let line2 = a:line2
|
||||
|
||||
if line1 != line2 && !s:is_list_item(line1)
|
||||
let line1 = s:find_next_list_item(line1)
|
||||
endif
|
||||
|
||||
let c_lnum = line1
|
||||
while c_lnum != 0 && c_lnum <= line2
|
||||
let li_lnum = s:is_list_item(c_lnum)
|
||||
|
||||
if li_lnum
|
||||
let li_level = s:get_level(li_lnum)
|
||||
if c_lnum == line1
|
||||
let start_li_level = li_level
|
||||
endif
|
||||
|
||||
if li_level <= start_li_level
|
||||
call s:TLI_toggle(li_lnum)
|
||||
let start_li_level = li_level
|
||||
endif
|
||||
endif
|
||||
|
||||
let c_lnum = s:find_next_list_item(c_lnum)
|
||||
endwhile
|
||||
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#kbd_cr() "{{{
|
||||
" This function is heavily relies on proper 'set comments' option.
|
||||
let cr = "\<CR>"
|
||||
if getline('.') =~ s:rx_cb_list_item()
|
||||
let cr .= '[ ] '
|
||||
endif
|
||||
return cr
|
||||
endfunction "}}}
|
||||
|
||||
function! vimwiki#lst#kbd_oO(cmd) "{{{
|
||||
" cmd should be 'o' or 'O'
|
||||
|
||||
let l:count = v:count1
|
||||
while l:count > 0
|
||||
|
||||
let beg_lnum = foldclosed('.')
|
||||
let end_lnum = foldclosedend('.')
|
||||
if end_lnum != -1 && a:cmd ==# 'o'
|
||||
let lnum = end_lnum
|
||||
let line = getline(beg_lnum)
|
||||
else
|
||||
let line = getline('.')
|
||||
let lnum = line('.')
|
||||
endif
|
||||
|
||||
" let line = substitute(m, '\s*$', ' ', '').'[ ] '.li_content
|
||||
let m = matchstr(line, s:rx_list_item())
|
||||
let res = ''
|
||||
if line =~ s:rx_cb_list_item()
|
||||
let res = substitute(m, '\s*$', ' ', '').'[ ] '
|
||||
elseif line =~ s:rx_list_item()
|
||||
let res = substitute(m, '\s*$', ' ', '')
|
||||
elseif &autoindent || &smartindent
|
||||
let res = matchstr(line, '^\s*')
|
||||
endif
|
||||
|
||||
if a:cmd ==# 'o'
|
||||
call append(lnum, res)
|
||||
call cursor(lnum + 1, col('$'))
|
||||
else
|
||||
call append(lnum - 1, res)
|
||||
call cursor(lnum, col('$'))
|
||||
endif
|
||||
|
||||
let l:count -= 1
|
||||
endwhile
|
||||
|
||||
startinsert!
|
||||
|
||||
endfunction "}}}
|
||||
|
Reference in New Issue
Block a user