" 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