From 8625978e9955c43a8135751a21da262b0e0d8af4 Mon Sep 17 00:00:00 2001 From: Hugues Hiegel Date: Tue, 23 Dec 2014 17:00:28 +0100 Subject: [plugins] VimWiki + Todo Power --- ftplugin/vimwiki.vim | 539 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 539 insertions(+) create mode 100644 ftplugin/vimwiki.vim (limited to 'ftplugin') diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim new file mode 100644 index 0000000..6b03bd1 --- /dev/null +++ b/ftplugin/vimwiki.vim @@ -0,0 +1,539 @@ +" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" Vimwiki filetype plugin file +" Author: Maxim Kim +" Home: http://code.google.com/p/vimwiki/ + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 " Don't load another plugin for this buffer + +" UNDO list {{{ +" Reset the following options to undo this plugin. +let b:undo_ftplugin = "setlocal ". + \ "suffixesadd< isfname< comments< ". + \ "formatoptions< foldtext< ". + \ "foldmethod< foldexpr< commentstring< " +" UNDO }}} + +" MISC STUFF {{{ + +setlocal commentstring=%%%s + +if g:vimwiki_conceallevel && exists("+conceallevel") + let &l:conceallevel = g:vimwiki_conceallevel +endif + +" MISC }}} + +" GOTO FILE: gf {{{ +execute 'setlocal suffixesadd='.VimwikiGet('ext') +setlocal isfname-=[,] +" gf}}} + +" Autocreate list items {{{ +" for list items, and list items with checkboxes +setlocal formatoptions+=tnro +setlocal formatoptions-=cq +if VimwikiGet('syntax') == 'default' + setl comments=b:*,b:#,b:- + setl formatlistpat=^\\s*[*#-]\\s* +elseif VimwikiGet('syntax') == 'markdown' + setlocal comments=fb:*,fb:-,fb:+,nb:> commentstring=\ >\ %s + setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+j +else + setl comments=n:*,n:# +endif + +if !empty(&langmap) + " Valid only if langmap is a comma separated pairs of chars + let l_o = matchstr(&langmap, '\C,\zs.\zeo,') + if l_o + exe 'nnoremap '.l_o.' :call vimwiki#lst#kbd_oO("o")a' + endif + + let l_O = matchstr(&langmap, '\C,\zs.\zeO,') + if l_O + exe 'nnoremap '.l_O.' :call vimwiki#lst#kbd_oO("O")a' + endif +endif + +" COMMENTS }}} + +" FOLDING for headers and list items using expr fold method. {{{ + +" Folding list items using expr fold method. {{{ + +function! s:get_base_level(lnum) "{{{ + let lnum = a:lnum - 1 + while lnum > 0 + if getline(lnum) =~ g:vimwiki_rxHeader + return vimwiki#u#count_first_sym(getline(lnum)) + endif + let lnum -= 1 + endwhile + return 0 +endfunction "}}} + +function! s:find_forward(rx_item, lnum) "{{{ + let lnum = a:lnum + 1 + + while lnum <= line('$') + let line = getline(lnum) + if line =~ a:rx_item + \ || line =~ '^\S' + \ || line =~ g:vimwiki_rxHeader + break + endif + let lnum += 1 + endwhile + + return [lnum, getline(lnum)] +endfunction "}}} + +function! s:find_backward(rx_item, lnum) "{{{ + let lnum = a:lnum - 1 + + while lnum > 1 + let line = getline(lnum) + if line =~ a:rx_item + \ || line =~ '^\S' + break + endif + let lnum -= 1 + endwhile + + return [lnum, getline(lnum)] +endfunction "}}} + +function! s:get_li_level(lnum) "{{{ + if VimwikiGet('syntax') == 'media' + let level = vimwiki#u#count_first_sym(getline(a:lnum)) + else + let level = (indent(a:lnum) / &sw) + endif + return level +endfunction "}}} + +function! s:get_start_list(rx_item, lnum) "{{{ + let lnum = a:lnum + while lnum >= 1 + let line = getline(lnum) + if line !~ a:rx_item && line =~ '^\S' + return nextnonblank(lnum + 1) + endif + let lnum -= 1 + endwhile + return 0 +endfunction "}}} + +function! VimwikiFoldListLevel(lnum) "{{{ + let line = getline(a:lnum) + + "" XXX Disabled: Header/section folding... + "if line =~ g:vimwiki_rxHeader + " return '>'.vimwiki#u#count_first_sym(line) + "endif + + "let nnline = getline(a:lnum+1) + + "" Unnecessary? + "if nnline =~ g:vimwiki_rxHeader + " return '<'.vimwiki#u#count_first_sym(nnline) + "endif + "" Very slow when called on every single line! + "let base_level = s:get_base_level(a:lnum) + + "FIXME does not work correctly + let base_level = 0 + + if line =~ g:vimwiki_rxListItem + let [nnum, nline] = s:find_forward(g:vimwiki_rxListItem, a:lnum) + let level = s:get_li_level(a:lnum) + let leveln = s:get_li_level(nnum) + let adj = s:get_li_level(s:get_start_list(g:vimwiki_rxListItem, a:lnum)) + + if leveln > level + return ">".(base_level+leveln-adj) + " check if multilined list item + elseif (nnum-a:lnum) > 1 + \ && (nline =~ g:vimwiki_rxListItem || nnline !~ '^\s*$') + return ">".(base_level+level+1-adj) + else + return (base_level+level-adj) + endif + else + " process multilined list items + let [pnum, pline] = s:find_backward(g:vimwiki_rxListItem, a:lnum) + if pline =~ g:vimwiki_rxListItem + if indent(a:lnum) >= indent(pnum) && line !~ '^\s*$' + let level = s:get_li_level(pnum) + let adj = s:get_li_level(s:get_start_list(g:vimwiki_rxListItem, pnum)) + return (base_level+level+1-adj) + endif + endif + endif + + return base_level +endfunction "}}} +" Folding list items }}} + +" Folding sections and code blocks using expr fold method. {{{ +function! VimwikiFoldLevel(lnum) "{{{ + let line = getline(a:lnum) + + " Header/section folding... + if line =~ g:vimwiki_rxHeader + return '>'.vimwiki#u#count_first_sym(line) + " Code block folding... + elseif line =~ '^\s*'.g:vimwiki_rxPreStart + return 'a1' + elseif line =~ '^\s*'.g:vimwiki_rxPreEnd.'\s*$' + return 's1' + else + return "=" + endif + +endfunction "}}} + +" Constants used by VimwikiFoldText {{{ +" use \u2026 and \u21b2 (or \u2424) if enc=utf-8 to save screen space +let s:ellipsis = (&enc ==? 'utf-8') ? "\u2026" : "..." +let s:ell_len = strlen(s:ellipsis) +let s:newline = (&enc ==? 'utf-8') ? "\u21b2 " : " " +let s:tolerance = 5 +" }}} + +function! s:shorten_text_simple(text, len) "{{{ unused + let spare_len = a:len - len(a:text) + return (spare_len>=0) ? [a:text,spare_len] : [a:text[0:a:len].s:ellipsis, -1] +endfunction "}}} + +" s:shorten_text(text, len) = [string, spare] with "spare" = len-strlen(string) +" for long enough "text", the string's length is within s:tolerance of "len" +" (so that -s:tolerance <= spare <= s:tolerance, "string" ends with s:ellipsis) +function! s:shorten_text(text, len) "{{{ returns [string, spare] + let spare_len = a:len - strlen(a:text) + if (spare_len + s:tolerance >= 0) + return [a:text, spare_len] + endif + " try to break on a space; assumes a:len-s:ell_len >= s:tolerance + let newlen = a:len - s:ell_len + let idx = strridx(a:text, ' ', newlen + s:tolerance) + let break_idx = (idx + s:tolerance >= newlen) ? idx : newlen + return [a:text[0:break_idx].s:ellipsis, newlen - break_idx] +endfunction "}}} + +function! VimwikiFoldText() "{{{ + let line = getline(v:foldstart) + let main_text = substitute(line, '^\s*', repeat(' ',indent(v:foldstart)), '') + let fold_len = v:foldend - v:foldstart + 1 + let len_text = ' ['.fold_len.'] ' + if line !~ '^\s*'.g:vimwiki_rxPreStart + let [main_text, spare_len] = s:shorten_text(main_text, 50) + return main_text.len_text + else + " fold-text for code blocks: use one or two of the starting lines + let [main_text, spare_len] = s:shorten_text(main_text, 24) + let line1 = substitute(getline(v:foldstart+1), '^\s*', ' ', '') + let [content_text, spare_len] = s:shorten_text(line1, spare_len+20) + if spare_len > s:tolerance && fold_len > 3 + let line2 = substitute(getline(v:foldstart+2), '^\s*', s:newline, '') + let [more_text, spare_len] = s:shorten_text(line2, spare_len+12) + let content_text .= more_text + endif + return main_text.len_text.content_text + endif +endfunction "}}} + +" Folding sections and code blocks }}} +" FOLDING }}} + +" COMMANDS {{{ +command! -buffer Vimwiki2HTML + \ silent w + \ let res = vimwiki#html#Wiki2HTML(expand(VimwikiGet('path_html')), + \ expand('%')) + \ + \ if res != '' | echo 'Vimwiki: HTML conversion is done.' | endif +command! -buffer Vimwiki2HTMLBrowse + \ silent w + \ call vimwiki#base#system_open_link(vimwiki#html#Wiki2HTML( + \ expand(VimwikiGet('path_html')), + \ expand('%'))) +command! -buffer VimwikiAll2HTML + \ call vimwiki#html#WikiAll2HTML(expand(VimwikiGet('path_html'))) + +command! -buffer VimwikiNextLink call vimwiki#base#find_next_link() +command! -buffer VimwikiPrevLink call vimwiki#base#find_prev_link() +command! -buffer VimwikiDeleteLink call vimwiki#base#delete_link() +command! -buffer VimwikiRenameLink call vimwiki#base#rename_link() +command! -buffer VimwikiFollowLink call vimwiki#base#follow_link('nosplit') +command! -buffer VimwikiGoBackLink call vimwiki#base#go_back_link() +command! -buffer VimwikiSplitLink call vimwiki#base#follow_link('split') +command! -buffer VimwikiVSplitLink call vimwiki#base#follow_link('vsplit') + +command! -buffer -nargs=? VimwikiNormalizeLink call vimwiki#base#normalize_link() + +command! -buffer VimwikiTabnewLink call vimwiki#base#follow_link('tabnew') + +command! -buffer -range VimwikiToggleListItem call vimwiki#lst#ToggleListItem(, ) + +command! -buffer VimwikiGenerateLinks call vimwiki#base#generate_links() + +command! -buffer -nargs=0 VimwikiBacklinks call vimwiki#base#backlinks() +command! -buffer -nargs=0 VWB call vimwiki#base#backlinks() + +exe 'command! -buffer -nargs=* VimwikiSearch lvimgrep '. + \ escape(VimwikiGet('path').'**/*'.VimwikiGet('ext'), ' ') + +exe 'command! -buffer -nargs=* VWS lvimgrep '. + \ escape(VimwikiGet('path').'**/*'.VimwikiGet('ext'), ' ') + +command! -buffer -nargs=1 VimwikiGoto call vimwiki#base#goto("") + + +" list commands +command! -buffer -nargs=* VimwikiListChangeLevel call vimwiki#lst#change_level() + +" table commands +command! -buffer -nargs=* VimwikiTable call vimwiki#tbl#create() +command! -buffer VimwikiTableAlignQ call vimwiki#tbl#align_or_cmd('gqq') +command! -buffer VimwikiTableAlignW call vimwiki#tbl#align_or_cmd('gww') +command! -buffer VimwikiTableMoveColumnLeft call vimwiki#tbl#move_column_left() +command! -buffer VimwikiTableMoveColumnRight call vimwiki#tbl#move_column_right() + +" diary commands +command! -buffer VimwikiDiaryNextDay call vimwiki#diary#goto_next_day() +command! -buffer VimwikiDiaryPrevDay call vimwiki#diary#goto_prev_day() + +" COMMANDS }}} + +" KEYBINDINGS {{{ +if g:vimwiki_use_mouse + nmap + nmap + nnoremap <2-LeftMouse> :call vimwiki#base#follow_link("nosplit", "\2-LeftMouse>") + nnoremap :VimwikiSplitLink + nnoremap :VimwikiVSplitLink + nnoremap :VimwikiGoBackLink +endif + + +if !hasmapto('Vimwiki2HTML') + nmap wh Vimwiki2HTML +endif +nnoremap