From 339377490424d21b20174f0b768e399b99308b25 Mon Sep 17 00:00:00 2001 From: Maxim Kim Date: Wed, 20 Jan 2010 00:00:00 +0000 Subject: [PATCH] Version 0.9.8 * NEW: Rename g:vimwiki_fold_empty_lines to g:vimwiki_fold_trailing_empty_lines. * NEW: One can use - along with * to start unordered list item. * NEW: List items could be started from the first column. As a result some limitations appeared: * a space after *, - or # for a list item is mandatory. * g:vimwiki_fold_trailing_empty_lines if set to 0 folds one trailing empty line. * NEW: Folding is off by default. Use g:vimwiki_folding to enable it. * NEW: Speed up vimwiki's folding a bit. Should lag a bit less in a long todo lists. * NEW: Centered headers. Start header with at least one space to make it html centered. * NEW: Change in default css: header's colors. * NEW: Vimwiki is aware of GetLatestVimScripts now. * FIX: Use tag instead of custom in html. * FIX: There are no text styling in htmlized quoted text. * FIX: set default value of g:vimwiki_fold_lists to 0 as written in this help. * FIX: Issue 33: Folded list items have wrong indentation when 'tabs' are used. * FIX: Issue 34: vimwiki#subdir got wrong dir when VimwikiGet('path') is a symbolic link. Thanks lilydjwg for the patch. * FIX: Issue 28: todo-list auto-indent enhancement. New item should always be unchecked. * FIX: Issue 36: Change the name of the :Search command to :VimwikiSearch as it conflicts with MultipleSearch. Alias :VWS is also available. * NEW: You can generate 'Table of contents' of your wiki page. See :h vimwiki-toc for details. --- autoload/vimwiki.vim | 676 ++++++ autoload/vimwiki_html.vim | 1099 +++++++++ autoload/vimwiki_lst.vim | 361 +++ doc/vimwiki.txt | 1547 +++++++++++++ ftplugin/vimwiki.vim | 299 +++ plugin/vimwiki.vim | 336 +++ syntax/vimwiki.vim | 141 ++ syntax/vimwiki_default.vim | 76 + syntax/vimwiki_media.vim | 58 + vimwiki_0_9_701.vba | 4361 ------------------------------------ 10 files changed, 4593 insertions(+), 4361 deletions(-) create mode 100644 autoload/vimwiki.vim create mode 100644 autoload/vimwiki_html.vim create mode 100644 autoload/vimwiki_lst.vim create mode 100644 doc/vimwiki.txt create mode 100644 ftplugin/vimwiki.vim create mode 100644 plugin/vimwiki.vim create mode 100644 syntax/vimwiki.vim create mode 100644 syntax/vimwiki_default.vim create mode 100644 syntax/vimwiki_media.vim delete mode 100644 vimwiki_0_9_701.vba diff --git a/autoload/vimwiki.vim b/autoload/vimwiki.vim new file mode 100644 index 0000000..10c36b2 --- /dev/null +++ b/autoload/vimwiki.vim @@ -0,0 +1,676 @@ +" Vimwiki autoload plugin file +" Author: Maxim Kim +" Home: http://code.google.com/p/vimwiki/ + +if exists("g:loaded_vimwiki_auto") || &cp + finish +endif +let g:loaded_vimwiki_auto = 1 + +if has("win32") + let s:os_sep = '\' +else + let s:os_sep = '/' +endif + +let s:badsymbols = '['.g:vimwiki_badsyms.g:vimwiki_stripsym.'<>|?*:"]' + +" MISC helper functions {{{ + +" This function is double defined. +" TODO: refactor common functions into new module. +function! s:chomp_slash(str) "{{{ + return substitute(a:str, '[/\\]\+$', '', '') +endfunction "}}} + +function! vimwiki#mkdir(path) "{{{ + let path = expand(a:path) + if !isdirectory(path) && exists("*mkdir") + let path = s:chomp_slash(path) + call mkdir(path, "p") + endif +endfunction +" }}} + +function! vimwiki#safe_link(string) "{{{ + return substitute(a:string, s:badsymbols, g:vimwiki_stripsym, 'g') +endfunction +"}}} + +function! vimwiki#unsafe_link(string) "{{{ + return substitute(a:string, g:vimwiki_stripsym, s:badsymbols, 'g') +endfunction +"}}} + +function! vimwiki#subdir(path, filename)"{{{ + let path = expand(a:path) + let filename = expand(a:filename) + let idx = 0 + while path[idx] == filename[idx] + let idx = idx + 1 + endwhile + + let p = split(strpart(filename, idx), '[/\\]') + let res = join(p[:-2], s:os_sep) + if len(res) > 0 + let res = res.s:os_sep + endif + return res +endfunction"}}} + +function! vimwiki#current_subdir()"{{{ + return vimwiki#subdir(VimwikiGet('path'), expand('%:p')) +endfunction"}}} + +function! s:filename(link) "{{{ + let result = vimwiki#safe_link(a:link) + if a:link =~ '|' + let result = vimwiki#safe_link(split(a:link, '|')[0]) + elseif a:link =~ '][' + let result = vimwiki#safe_link(split(a:link, '][')[0]) + endif + return result +endfunction +" }}} + +function! s:is_wiki_word(str) "{{{ + if a:str =~ g:vimwiki_word1 && a:str !~ '[[:space:]\\/]' + return 1 + endif + return 0 +endfunction +" }}} + +function! s:edit_file(command, filename) "{{{ + let fname = escape(a:filename, '% ') + call vimwiki#mkdir(fnamemodify(a:filename, ":p:h")) + execute a:command.' '.fname +endfunction +" }}} + +function! s:search_word(wikiRx, cmd) "{{{ + let match_line = search(a:wikiRx, 's'.a:cmd) + if match_line == 0 + echomsg "vimwiki: Wiki link not found." + endif +endfunction +" }}} + +function! s:get_word_at_cursor(wikiRX) "{{{ + let col = col('.') - 1 + let line = getline('.') + let ebeg = -1 + let cont = match(line, a:wikiRX, 0) + while (ebeg >= 0 || (0 <= cont) && (cont <= col)) + let contn = matchend(line, a:wikiRX, cont) + if (cont <= col) && (col < contn) + let ebeg = match(line, a:wikiRX, cont) + let elen = contn - ebeg + break + else + let cont = match(line, a:wikiRX, contn) + endif + endwh + if ebeg >= 0 + return strpart(line, ebeg, elen) + else + return "" + endif +endf "}}} + +function! s:strip_word(word) "{{{ + let result = a:word + if strpart(a:word, 0, 2) == "[[" + " get rid of [[ and ]] + let w = strpart(a:word, 2, strlen(a:word)-4) + + if w =~ '|' + " we want "link" from [[link|link desc]] + let w = split(w, "|")[0] + elseif w =~ '][' + " we want "link" from [[link][link desc]] + let w = split(w, "][")[0] + endif + + let result = vimwiki#safe_link(w) + endif + return result +endfunction +" }}} + +function! s:is_link_to_non_wiki_file(word) "{{{ + " Check if word is link to a non-wiki file. + " The easiest way is to check if it has extension like .txt or .html + if a:word =~ '\.\w\{1,4}$' + return 1 + endif + return 0 +endfunction +" }}} + +function! s:print_wiki_list() "{{{ + let idx = 0 + while idx < len(g:vimwiki_list) + if idx == g:vimwiki_current_idx + let sep = ' * ' + echohl PmenuSel + else + let sep = ' ' + echohl None + endif + echo (idx + 1).sep.VimwikiGet('path', idx) + let idx += 1 + endwhile + echohl None +endfunction +" }}} + +function! s:wiki_select(wnum)"{{{ + if a:wnum < 1 || a:wnum > len(g:vimwiki_list) + return + endif + let b:vimwiki_idx = g:vimwiki_current_idx + let g:vimwiki_current_idx = a:wnum - 1 +endfunction +" }}} + +function! s:update_wiki_link(fname, old, new) " {{{ + echo "Updating links in ".a:fname + let has_updates = 0 + let dest = [] + for line in readfile(a:fname) + if !has_updates && match(line, a:old) != -1 + let has_updates = 1 + endif + call add(dest, substitute(line, a:old, escape(a:new, "&"), "g")) + endfor + " add exception handling... + if has_updates + call rename(a:fname, a:fname.'#vimwiki_upd#') + call writefile(dest, a:fname) + call delete(a:fname.'#vimwiki_upd#') + endif +endfunction +" }}} + +function! s:update_wiki_links_dir(dir, old_fname, new_fname) " {{{ + let old_fname = substitute(a:old_fname, '[/\\]', '[/\\\\]', 'g') + let new_fname = a:new_fname + + if !s:is_wiki_word(new_fname) + let new_fname = '[['.new_fname.']]' + endif + if !s:is_wiki_word(old_fname) + let old_fname = '\[\['.vimwiki#unsafe_link(old_fname). + \ '\%(|.*\)\?\%(\]\[.*\)\?\]\]' + else + let old_fname = '\<'.old_fname.'\>' + endif + let files = split(glob(VimwikiGet('path').a:dir.'*'.VimwikiGet('ext')), '\n') + for fname in files + call s:update_wiki_link(fname, old_fname, new_fname) + endfor +endfunction +" }}} + +function! s:tail_name(fname) "{{{ + let result = substitute(a:fname, ":", "__colon__", "g") + let result = fnamemodify(result, ":t:r") + let result = substitute(result, "__colon__", ":", "g") + return result +endfunction "}}} + +function! s:update_wiki_links(old_fname, new_fname) " {{{ + let old_fname = s:tail_name(a:old_fname) + let new_fname = s:tail_name(a:new_fname) + + let subdirs = split(a:old_fname, '[/\\]')[: -2] + + " TODO: Use Dictionary here... + let dirs_keys = [''] + let dirs_vals = [''] + if len(subdirs) > 0 + let dirs_keys = [''] + let dirs_vals = [join(subdirs, '/').'/'] + let idx = 0 + while idx < len(subdirs) - 1 + call add(dirs_keys, join(subdirs[: idx], '/').'/') + call add(dirs_vals, join(subdirs[idx+1 :], '/').'/') + let idx = idx + 1 + endwhile + call add(dirs_keys,join(subdirs, '/').'/') + call add(dirs_vals, '') + endif + + let idx = 0 + while idx < len(dirs_keys) + let dir = dirs_keys[idx] + let new_dir = dirs_vals[idx] + call s:update_wiki_links_dir(dir, + \ new_dir.old_fname, new_dir.new_fname) + let idx = idx + 1 + endwhile +endfunction +" }}} + +function! s:get_wiki_buffers() "{{{ + let blist = [] + let bcount = 1 + while bcount<=bufnr("$") + if bufexists(bcount) + let bname = fnamemodify(bufname(bcount), ":p") + if bname =~ VimwikiGet('ext')."$" + let bitem = [bname, getbufvar(bname, "vimwiki_prev_word")] + call add(blist, bitem) + endif + endif + let bcount = bcount + 1 + endwhile + return blist +endfunction +" }}} + +function! s:open_wiki_buffer(item) "{{{ + call s:edit_file('e', a:item[0]) + if !empty(a:item[1]) + call setbufvar(a:item[0], "vimwiki_prev_word", a:item[1]) + endif +endfunction +" }}} + +" }}} + +" SYNTAX highlight {{{ +function! vimwiki#WikiHighlightWords() "{{{ + " search all wiki files in 'path' and its subdirs. + let subdir = vimwiki#current_subdir() + let wikies = glob(VimwikiGet('path').subdir.'**/*'.VimwikiGet('ext')) + + " remove .wiki extensions + let wikies = substitute(wikies, '\'.VimwikiGet('ext'), "", "g") + let g:vimwiki_wikiwords = split(wikies, '\n') + + " remove backup files (.wiki~) + call filter(g:vimwiki_wikiwords, 'v:val !~ ''.*\~$''') + + " remove paths + let rem_path = escape(expand(VimwikiGet('path')).subdir, '\') + call map(g:vimwiki_wikiwords, 'substitute(v:val, rem_path, "", "g")') + + " Links with subdirs should be highlighted for linux and windows separators + " Change \ or / to [/\\] + let os_p = '[/\\]' + let os_p2 = escape(os_p, '\') + call map(g:vimwiki_wikiwords, 'substitute(v:val, os_p, os_p2, "g")') + + for word in g:vimwiki_wikiwords + if g:vimwiki_camel_case && + \ word =~ g:vimwiki_word1 && !s:is_link_to_non_wiki_file(word) + execute 'syntax match VimwikiWord /\%(^\|[^!]\)\@<=\<'.word.'\>/' + endif + execute 'syntax match VimwikiWord /\[\[\<'. + \ vimwiki#unsafe_link(word). + \ '\>\%(|\+.*\)*\]\]/' + execute 'syntax match VimwikiWord /\[\[\<'. + \ vimwiki#unsafe_link(word). + \ '\>\]\[.\+\]\]/' + endfor + execute 'syntax match VimwikiWord /\[\[.\+\.\%(jpg\|png\|gif\)\%(|\+.*\)*\]\]/' + execute 'syntax match VimwikiWord /\[\[.\+\.\%(jpg\|png\|gif\)\]\[.\+\]\]/' +endfunction +" }}} + +function! vimwiki#hl_exists(hl)"{{{ + if !hlexists(a:hl) + return 0 + endif + redir => hlstatus + exe "silent hi" a:hl + redir END + return (hlstatus !~ "cleared") +endfunction +"}}} + +function! vimwiki#nested_syntax(filetype, start, end, textSnipHl) abort "{{{ +" From http://vim.wikia.com/wiki/VimTip857 + let ft=toupper(a:filetype) + let group='textGroup'.ft + if exists('b:current_syntax') + let s:current_syntax=b:current_syntax + " Remove current syntax definition, as some syntax files (e.g. cpp.vim) + " do nothing if b:current_syntax is defined. + unlet b:current_syntax + endif + + " Some syntax files set up iskeyword which might scratch vimwiki a bit. + " Let us save and restore it later. + " let b:skip_set_iskeyword = 1 + let is_keyword = &iskeyword + + execute 'syntax include @'.group.' syntax/'.a:filetype.'.vim' + try + execute 'syntax include @'.group.' after/syntax/'.a:filetype.'.vim' + catch + endtry + + let &iskeyword = is_keyword + + if exists('s:current_syntax') + let b:current_syntax=s:current_syntax + else + unlet b:current_syntax + endif + execute 'syntax region textSnip'.ft.' + \ matchgroup='.a:textSnipHl.' + \ start="'.a:start.'" end="'.a:end.'" + \ contains=@'.group +endfunction "}}} + +"}}} + +" WIKI functions {{{ +function! vimwiki#WikiNextWord() "{{{ + call s:search_word(g:vimwiki_rxWikiWord.'\|'.g:vimwiki_rxWeblink, '') +endfunction +" }}} + +function! vimwiki#WikiPrevWord() "{{{ + call s:search_word(g:vimwiki_rxWikiWord.'\|'.g:vimwiki_rxWeblink, 'b') +endfunction +" }}} + +function! vimwiki#WikiFollowWord(split) "{{{ + if a:split == "split" + let cmd = ":split " + elseif a:split == "vsplit" + let cmd = ":vsplit " + else + let cmd = ":e " + endif + + let word = s:strip_word(s:get_word_at_cursor(g:vimwiki_rxWikiWord)) + if word == "" + let weblink = s:strip_word(s:get_word_at_cursor(g:vimwiki_rxWeblink)) + if weblink != "" + call VimwikiWeblinkHandler(weblink) + else + execute "normal! \n" + endif + return + endif + + if s:is_link_to_non_wiki_file(word) + call s:edit_file(cmd, word) + else + let vimwiki_prev_word = [expand('%:p'), getpos('.')] + let subdir = vimwiki#current_subdir() + call s:edit_file(cmd, VimwikiGet('path').subdir.word.VimwikiGet('ext')) + let b:vimwiki_prev_word = vimwiki_prev_word + endif +endfunction +" }}} + +function! vimwiki#WikiGoBackWord() "{{{ + if exists("b:vimwiki_prev_word") + " go back to saved WikiWord + let prev_word = b:vimwiki_prev_word + execute ":e ".substitute(prev_word[0], '\s', '\\\0', 'g') + call setpos('.', prev_word[1]) + endif +endfunction +" }}} + +function! vimwiki#WikiGoHome(index) "{{{ + call s:wiki_select(a:index) + call vimwiki#mkdir(VimwikiGet('path')) + + try + execute ':e '.fnameescape( + \ VimwikiGet('path').VimwikiGet('index').VimwikiGet('ext')) + catch /E37/ " catch 'No write since last change' error + " this is really unsecure!!! + execute ':'.VimwikiGet('gohome').' '. + \ VimwikiGet('path'). + \ VimwikiGet('index'). + \ VimwikiGet('ext') + catch /E325/ " catch 'ATTENTION' error (:h E325) + endtry +endfunction +"}}} + +function! vimwiki#WikiDeleteWord() "{{{ + "" file system funcs + "" Delete WikiWord you are in from filesystem + let val = input('Delete ['.expand('%').'] (y/n)? ', "") + if val != 'y' + return + endif + let fname = expand('%:p') + try + call delete(fname) + catch /.*/ + echomsg 'vimwiki: Cannot delete "'.expand('%:t:r').'"!' + return + endtry + execute "bdelete! ".escape(fname, " ") + + " reread buffer => deleted WikiWord should appear as non-existent + if expand('%:p') != "" + execute "e" + endif +endfunction +"}}} + +function! vimwiki#WikiRenameWord() "{{{ + "" Rename WikiWord, update all links to renamed WikiWord + let subdir = vimwiki#current_subdir() + let old_fname = subdir.expand('%:t') + + " there is no file (new one maybe) + if glob(expand('%:p')) == '' + echomsg 'vimwiki: Cannot rename "'.expand('%:p'). + \'". It does not exist! (New file? Save it before renaming.)' + return + endif + + let val = input('Rename "'.expand('%:t:r').'" (y/n)? ', "") + if val!='y' + return + endif + + let new_link = input('Enter new name: ', "") + + if new_link =~ '[/\\]' + " It is actually doable but I do not have free time to do it. + echomsg 'vimwiki: Cannot rename to a filename with path!' + return + endif + + let new_link = subdir.new_link + + " check new_fname - it should be 'good', not empty + if substitute(new_link, '\s', '', 'g') == '' + echomsg 'vimwiki: Cannot rename to an empty filename!' + return + endif + if s:is_link_to_non_wiki_file(new_link) + echomsg 'vimwiki: Cannot rename to a filename with extension (ie .txt .html)!' + return + endif + + let new_link = s:strip_word(new_link) + let new_fname = VimwikiGet('path').s:filename(new_link).VimwikiGet('ext') + + " do not rename if word with such name exists + let fname = glob(new_fname) + if fname != '' + echomsg 'vimwiki: Cannot rename to "'.new_fname. + \ '". File with that name exist!' + return + endif + " rename WikiWord file + try + echomsg "Renaming ".VimwikiGet('path').old_fname." to ".new_fname + let res = rename(expand('%:p'), expand(new_fname)) + if res != 0 + throw "Cannot rename!" + end + catch /.*/ + echomsg 'vimwiki: Cannot rename "'.expand('%:t:r').'" to "'.new_fname.'"' + return + endtry + + let &buftype="nofile" + + let cur_buffer = [expand('%:p'), + \getbufvar(expand('%:p'), "vimwiki_prev_word")] + + let blist = s:get_wiki_buffers() + + " save wiki buffers + for bitem in blist + execute ':b '.escape(bitem[0], ' ') + execute ':update' + endfor + + execute ':b '.escape(cur_buffer[0], ' ') + + " remove wiki buffers + for bitem in blist + execute 'bwipeout '.escape(bitem[0], ' ') + endfor + + let setting_more = &more + setlocal nomore + + " update links + call s:update_wiki_links(old_fname, new_link) + + " restore wiki buffers + for bitem in blist + if bitem[0] != cur_buffer[0] + call s:open_wiki_buffer(bitem) + endif + endfor + + call s:open_wiki_buffer([new_fname, + \ cur_buffer[1]]) + " execute 'bwipeout '.escape(cur_buffer[0], ' ') + + echomsg old_fname." is renamed to ".new_fname + + let &more = setting_more +endfunction +" }}} + +function! vimwiki#WikiUISelect()"{{{ + call s:print_wiki_list() + let idx = input("Select Wiki (specify number): ") + if idx == "" + return + endif + call vimwiki#WikiGoHome(idx) +endfunction +"}}} + +" }}} + +" TEXT OBJECTS functions {{{ + +function! vimwiki#TO_header(inner, visual) "{{{ + if !search('^\(=\+\)[^=]\+\1\s*$', 'bcW') + return + endif + + let sel_start = line("'<") + let sel_end = line("'>") + let block_start = line(".") + let advance = 0 + + let level = vimwiki#count_first_sym(getline('.')) + + let is_header_selected = sel_start == block_start + \ && sel_start != sel_end + + if a:visual && is_header_selected + if level > 1 + let level -= 1 + call search('^\(=\{'.level.'\}\)[^=]\+\1\s*$', 'bcW') + else + let advance = 1 + endif + endif + + normal! V + + if a:visual && is_header_selected + call cursor(sel_end + advance, 0) + endif + + if search('^\(=\{1,'.level.'}\)[^=]\+\1\s*$', 'W') + call cursor(line('.') - 1, 0) + else + call cursor(line('$'), 0) + endif + + if a:inner && getline(line('.')) =~ '^\s*$' + let lnum = prevnonblank(line('.') - 1) + call cursor(lnum, 0) + endif +endfunction +"}}} + +function! vimwiki#count_first_sym(line) "{{{ + let first_sym = matchstr(a:line, '\S') + return len(matchstr(a:line, first_sym.'\+')) +endfunction "}}} + +function! vimwiki#AddHeaderLevel() "{{{ + let lnum = line('.') + let line = getline(lnum) + + if line =~ '^\s*$' + return + endif + + if line =~ '^\s*\(=\+\).\+\1\s*$' + let level = vimwiki#count_first_sym(line) + if level < 6 + let line = substitute(line, '\(=\+\).\+\1', '=&=', '') + call setline(lnum, line) + endif + else + let line = substitute(line, '^\s*', '&= ', '') + let line = substitute(line, '\s*$', ' =&', '') + call setline(lnum, line) + endif +endfunction +"}}} + +function! vimwiki#RemoveHeaderLevel() "{{{ + let lnum = line('.') + let line = getline(lnum) + + if line =~ '^\s*$' + return + endif + + if line =~ '^\s*\(=\+\).\+\1\s*$' + let level = vimwiki#count_first_sym(line) + let old = repeat('=', level) + let new = repeat('=', level - 1) + + let chomp = line =~ '=\s' + + let line = substitute(line, old, new, 'g') + + if level == 1 && chomp + let line = substitute(line, '^\s', '', 'g') + let line = substitute(line, '\s$', '', 'g') + endif + call setline(lnum, line) + endif +endfunction +" }}} + +" }}} diff --git a/autoload/vimwiki_html.vim b/autoload/vimwiki_html.vim new file mode 100644 index 0000000..a5d90ee --- /dev/null +++ b/autoload/vimwiki_html.vim @@ -0,0 +1,1099 @@ +" Vimwiki autoload plugin file +" Export to HTML +" Author: Maxim Kim +" Home: http://code.google.com/p/vimwiki/ + +" Load only once {{{ +if exists("g:loaded_vimwiki_html_auto") || &cp + finish +endif +let g:loaded_vimwiki_html_auto = 1 +"}}} + +" SCRIPT VARS "{{{ +" Warn if html header or html footer do not exist only once. +let s:warn_html_header = 0 +let s:warn_html_footer = 0 +"}}} + +" UTILITY "{{{ +function! s:root_path(subdir) "{{{ + return repeat('../', len(split(a:subdir, '[/\\]'))) +endfunction "}}} + +function! s:syntax_supported() " {{{ + return VimwikiGet('syntax') == "default" +endfunction " }}} + +function! s:remove_blank_lines(lines) " {{{ + while a:lines[-1] =~ '^\s*$' + call remove(a:lines, -1) + endwhile +endfunction "}}} + +function! s:is_web_link(lnk) "{{{ + if a:lnk =~ '^\%(https://\|http://\|www.\|ftp://\)' + return 1 + endif + return 0 +endfunction "}}} + +function! s:is_img_link(lnk) "{{{ + if a:lnk =~ '\.\%(png\|jpg\|gif\|jpeg\)$' + return 1 + endif + return 0 +endfunction "}}} + +function! s:is_non_wiki_link(lnk) "{{{ + " TODO: Add more file extensions here + if a:lnk =~ '.\+\.\%(pdf\|txt\|doc\|rtf\|xls\)$' + return 1 + endif + return 0 +endfunction "}}} + +function! s:has_abs_path(fname) "{{{ + if a:fname =~ '\(^.:\)\|\(^/\)' + return 1 + endif + return 0 +endfunction "}}} + +function! s:create_default_CSS(path) " {{{ + let path = expand(a:path) + let css_full_name = path.VimwikiGet('css_name') + if glob(css_full_name) == "" + call vimwiki#mkdir(fnamemodify(css_full_name, ':p:h')) + let lines = [] + + call add(lines, 'body {font-family: Arial, sans-serif; margin: 1em 2em 1em 2em; font-size: 100%; line-height: 130%;}') + call add(lines, 'h1, h2, h3, h4, h5, h6 {font-family: Trebuchet MS, serif; margin-top: 1.5em; margin-bottom: 0.5em;}') + call add(lines, 'h1 {font-size: 2.0em; color: #a77070;}') + call add(lines, 'h2 {font-size: 1.6em; color: #779977;}') + call add(lines, 'h3 {font-size: 1.3em; color: #555577;}') + call add(lines, 'h4 {font-size: 1.2em; color: #222244;}') + call add(lines, 'h5 {font-size: 1.1em; color: #222244;}') + call add(lines, 'h6 {font-size: 1.0em; color: #222244;}') + call add(lines, 'p, pre, blockquote, table, ul, ol, dl {margin-top: 1em; margin-bottom: 1em;}') + call add(lines, 'ul ul, ul ol, ol ol, ol ul {margin-top: 0.5em; margin-bottom: 0.5em;}') + call add(lines, 'li {margin: 0.3em auto;}') + call add(lines, 'ul {margin-left: 2em; padding-left: 0.5em;}') + call add(lines, 'dt {font-weight: bold;}') + call add(lines, 'img {border: none;}') + call add(lines, 'pre {border-left: 1px solid #ccc; margin-left: 2em; padding-left: 0.5em;}') + call add(lines, 'blockquote {padding: 0.4em; background-color: #f6f5eb;}') + call add(lines, 'td {border: 1px solid #ccc; padding: 0.3em;}') + call add(lines, 'hr {border: none; border-top: 1px solid #ccc; width: 100%;}') + call add(lines, 'del {text-decoration: line-through; color: #777777;}') + call add(lines, '.toc li {list-style-type: none;}') + call add(lines, '.todo {font-weight: bold; background-color: #f0ece8; color: #a03020;}') + call add(lines, '.justleft {text-align: left;}') + call add(lines, '.justright {text-align: right;}') + call add(lines, '.justcenter {text-align: center;}') + + call writefile(lines, css_full_name) + echomsg "Default style.css is created." + endif +endfunction "}}} + +function! s:get_html_header(wikifile, subdir, charset) "{{{ + let lines=[] + + let title = fnamemodify(a:wikifile, ":t:r") + + if VimwikiGet('html_header') != "" && !s:warn_html_header + try + let lines = readfile(expand(VimwikiGet('html_header'))) + call map(lines, 'substitute(v:val, "%title%", "'. title .'", "g")') + call map(lines, 'substitute(v:val, "%root_path%", "'. + \ s:root_path(a:subdir) .'", "g")') + return lines + catch /E484/ + let s:warn_html_header = 1 + echomsg 'vimwiki: Header template '.VimwikiGet('html_header'). + \ ' does not exist!' + endtry + endif + + let css_name = expand(VimwikiGet('css_name')) + let css_name = substitute(css_name, '\', '/', 'g') + if !s:has_abs_path(css_name) + " Relative css file for deep links: [[dir1/dir2/dir3/filename]] + let css_name = s:root_path(a:subdir).css_name + endif + + " if no VimwikiGet('html_header') set up or error while reading template + " file -- use default header. + call add(lines, '') + call add(lines, '') + call add(lines, '') + call add(lines, ''.title.'') + call add(lines, '') + call add(lines, '') + call add(lines, '') + + return lines +endfunction "}}} + +function! s:get_html_footer() "{{{ + let lines=[] + + if VimwikiGet('html_footer') != "" && !s:warn_html_footer + try + let lines = readfile(expand(VimwikiGet('html_footer'))) + return lines + catch /E484/ + let s:warn_html_footer = 1 + echomsg 'vimwiki: Footer template '.VimwikiGet('html_footer'). + \ ' does not exist!' + endtry + endif + + " if no VimwikiGet('html_footer') set up or error while reading template + " file -- use default footer. + call add(lines, "") + call add(lines, '') + call add(lines, '') + + return lines +endfunction "}}} + +function! s:safe_html(line) "{{{ + "" change dangerous html symbols: < > & + + let line = substitute(a:line, '&', '\&', 'g') + let line = substitute(line, '<', '\<', 'g') + let line = substitute(line, '>', '\>', 'g') + return line +endfunction "}}} + +function! s:delete_html_files(path) "{{{ + let htmlfiles = split(glob(a:path.'**/*.html'), '\n') + for fname in htmlfiles + try + call delete(fname) + catch + echomsg 'vimwiki: Cannot delete '.fname + endtry + endfor +endfunction "}}} + +function! s:remove_comments(lines) "{{{ + let res = [] + let multiline_comment = 0 + + let idx = 0 + while idx < len(a:lines) + let line = a:lines[idx] + let idx += 1 + + if multiline_comment + let col = matchend(line, '-->',) + if col != -1 + let multiline_comment = 0 + let line = strpart(line, col) + else + continue + endif + endif + + if !multiline_comment && line =~ '' + let line = substitute(line, '', '', 'g') + if line =~ '^\s*$' + continue + endif + endif + + if !multiline_comment + let col = match(line, ' is a comment. +Ex: > + +< + +============================================================================== +6. Folding/Outline *vimwiki-folding* + +Vimwiki can fold or outline headers and list items. + +Example: += My current task = + * [ ] Do stuff 1 + * [ ] Do substuff 1.1 + * [ ] Do substuff 1.2 + * [ ] Do substuff 1.2.1 + * [ ] Do substuff 1.2.2 + * [ ] Do substuff 1.3 + * [ ] Do stuff 2 + * [ ] Do stuff 3 + +Hit |zM| : += My current task = [8] --------------------------------------~ + +Hit |zr| : += My current task =~ + * [ ] Do stuff 1 [5] --------------------------------------~ + * [ ] Do stuff 2~ + * [ ] Do stuff 3~ + +Hit |zr| one more time: += My current task =~ + * [ ] Do stuff 1~ + * [ ] Do substuff 1.1~ + * [ ] Do substuff 1.2 [2] -------------------------------~ + * [ ] Do substuff 1.3~ + * [ ] Do stuff 2~ + * [ ] Do stuff 3~ + +NOTE: Whether you use default syntax, folding on list items should work +properly only if all of them are indented using current |shiftwidth|. +For MediaWiki * or # should be in the first column. + +To turn folding on/off check |g:vimwiki_folding|. + +============================================================================== +7. Placeholders *vimwiki-todo-lists* + +------------------------------------------------------------------------------ +7.1. Table of Contents *vimwiki-toc* *vimwiki-table-of-contents* + +You can add 'table of contents' to your html page generated from wiki one. +Just place > + +%toc + +into your wiki page. +You can also add caption to your 'toc': > + +%toc Table of Contents + +or > + +%toc Whatever + + +============================================================================== +8. Todo lists *vimwiki-todo-lists* + +You can have todo lists -- lists of items you can check/uncheck. + +Consider the following example: += Toggleable list of todo items = + * [X] Toggle list item on/off. + * [X] Simple toggling between [ ] and [X]. + * [X] All list's subitems should be toggled on/off appropriately. + * [X] Toggle child subitems only if current line is list item + * [X] Parent list item should be toggled depending on it's child items. + * [X] Make numbered list items toggleable too + * [X] Add highlighting to list item boxes + * [X] Add [ ] to the next created with o, O and list item. + + +Pressing on the first list item will toggle it and all of it's child +items: += Toggleable list of todo items = + * [ ] Toggle list item on/off. + * [ ] Simple toggling between [ ] and [X]. + * [ ] All list's subitems should be toggled on/off appropriately. + * [ ] Toggle child subitems only if current line is list item + * [ ] Parent list item should be toggled depending on it's child items. + * [X] Make numbered list items toggleable too + * [X] Add highlighting to list item boxes + * [X] Add [ ] to the next created with o, O and list item. + +Pressing on the third list item will toggle it and all of it's +parent items: += Toggleable list of todo items = + * [.] Toggle list item on/off. + * [ ] Simple toggling between [ ] and [X]. + * [X] All list's subitems should be toggled on/off appropriately. + * [ ] Toggle child subitems only if current line is list item + * [ ] Parent list item should be toggled depending on it's child items. + * [ ] Make numbered list items toggleable too + * [ ] Add highlighting to list item boxes + * [ ] Add [ ] to the next created with o, O and list item. + +Parent items could be toggled by its child items. Symbol inside [ ] depends on +percentage of toggled child items(see also |g:vimwiki_listsyms|): > + [ ] -- 0% + [.] -- 1-33% + [o] -- 34-66% + [O] -- 67-99% + [X] -- 100% + +It is possible to toggle several list items using visual mode. + +============================================================================== +9. Options *vimwiki-options* + +There are global and per wiki(local) options available to tune vimwiki. +All global options are set using the following template: > + let g:option_name=option_value + +All per wiki options are |Dictionary|'s pairs in a list of wikies +(dictionaries). See |g:vimwiki_list| option for more details. + +------------------------------------------------------------------------------ +*g:vimwiki_list* *vimwiki-multiple-wikies* + +Each item in g:vimwiki_list is a |Dictionary| that holds all customization +available for a wiki represented by that item. It is in form of > + {'option1': 'value1', 'option2: 'value2', ...} + +Consider the following example: > + let g:vimwiki_list = [{'path': '~/my_site/', 'path_html': '~/public_html/'}] + +It gives us one wiki located at ~/my_site/ that could be htmlized to +~/public_html/ + +The next example: > + let g:vimwiki_list = [{'path': '~/my_site/', 'path_html': '~/public_html/'}, + \ {'path': '~/my_docs/', 'ext': '.mdox'}] +gives us 2 wikies, first wiki as in previous example, second one is located in +~/my_docs/ and its files have .mdox extension. + +Empty |Dictionary| in the g:vimwiki_list is the wiki with default options: > + let g:vimwiki_list = [{}, + \ {'path': '~/my_docs/', 'ext': '.mdox'}] + +< + + +Per wiki options + +*vimwiki-option-path* +--------------------- +Key Default value~ +path ~/vimwiki/ + +Description~ +Wiki files location: > + let g:vimwiki_list = [{'path': '~/my_site/'}] +< + +*vimwiki-option-path_html* +-------------------------- +Key Default value~ +path_html ~/vimwiki_html/ + +Description~ +HTML files converted from wiki files location: > + let g:vimwiki_list = [{'path': '~/my_site/', + \ 'path_html': '~/my_site_html/'}] + +If you omit this option path_html would be path - '/' + '_html/': > + let g:vimwiki_list = [{'path': '~/okidoki/'}] + +ie, path_html = '~/okidoki_html/' + + +*vimwiki-option-index* +---------------------- +Key Default value~ +index index + +Description~ +Name of wiki index file: > + let g:vimwiki_list = [{'path': '~/my_site/', 'index': 'main'}] + +NOTE: Do not add extension. + + +*vimwiki-option-ext* +-------------------- +Key Default value~ +ext .wiki + +Description~ +Extension of wiki files: > + let g:vimwiki_list = [{'path': '~/my_site/', + \ 'index': 'main', 'ext': '.document'}] + +< +*vimwiki-option-syntax* +----------------------- +Key Default value Values~ +syntax default default, media + +Description~ +Wiki syntax. +You can use different markup languages (currently default vimwiki and +MediaWiki) but only vimwiki's default markup could be converted to HTML at the +moment. +To use MediaWiki's wiki markup: > + let g:vimwiki_list = [{'path': '~/my_site/', 'syntax': 'media'}] +< + +*vimwiki-option-html_header* +---------------------------- +Key Default value~ +html_header + +Description~ +Set up file name for html header template: > + let g:vimwiki_list = [{'path': '~/my_site/', + \ 'html_header': '~/public_html/header.tpl'}] + +This header.tpl could look like: > + + + + %title% + + + +
+ +where + %title% is replaced by a wiki page name + %root_path% is replaced by a count of ../ for pages buried in subdirs: + if you have wikilink [[dir1/dir2/dir3/my page in a subdir]] then + %root_path% is replaced by '../../../'. + + +*vimwiki-option-html_footer* +---------------------------- +Key Default value~ +html_footer + +Description~ +Set up file name for html footer template: > + let g:vimwiki_list = [{'path': '~/my_site/', + \ 'html_footer': '~/public_html/footer.tpl'}] + +This footer.tpl could look like: > +
+ + +< + +*vimwiki-option-css_name* +------------------------- +Key Default value~ +css_name style.css + +Description~ +Set up css file name: > + let g:vimwiki_list = [{'path': '~/my_pages/', + \ 'css_name': 'main.css'}] +< +or even > + let g:vimwiki_list = [{'path': '~/my_pages/', + \ 'css_name': 'css/main.css'}] +< + +*vimwiki-option-gohome* +----------------------- +Key Default value Values~ +gohome split split, vsplit, tabe + +Description~ +This option controls the way |:VimwikiGoHome| command works. +For instance you have 'No write since last change' buffer. After ww +(or :VimwikiGoHome) vimwiki index file will be splitted with it. Or vertically +splitted. Or opened in a new tab. +Ex: > + let g:vimwiki_list = [{'path': '~/my_site/', 'gohome': 'vsplit'}] +< + +*vimwiki-option-maxhi* +---------------------- +Key Default value Values~ +maxhi 1 0, 1 + +Description~ +Non-existent WikiWord highlighting could be quite slow and if you don't want +it set maxhi to 0: > + let g:vimwiki_list = [{'path': '~/my_site/', 'maxhi': 0}] + +This disables filesystem checks for WikiWords. + + +*vimwiki-option-nested_syntaxes* +-------------------------------- +Key Default value Values~ +nested_syntaxes {} pairs of highlight keyword and vim filetype + +Description~ +You can make preformatted text to be highlighted with a different syntaxes +available for vim. +For example the following setup: > + let wiki = {} + let wiki.path = '~/my_site/' + let wiki.nested_syntaxes = {'python': 'python', 'c++': 'cpp'} + let vimwiki_list = [wiki] + +would give you python and c++ highlighting in: > + {{{class="brush: python" + for i in range(1, 5): + print(i) + }}} + + {{{class="brush: c++" + #include "helloworld.h" + int helloworld() + { + printf("hello world"); + } + }}} + +or in: > + {{{c++ + #include "helloworld.h" + int helloworld() + { + printf("hello world"); + } + }}} + + {{{python + for i in range(1, 5): + print(i) + }}} + + + +Global options +Use: > + let g:option_name=option_value +to set them. + +------------------------------------------------------------------------------ +*g:vimwiki_hl_headers* + +Highlight headers with =Reddish=, ==Greenish==, ===Blueish=== colors. + +Value Description~ +1 Use predefined colors to highlight different header levels. +0 Use |hl-Title| or VimwikiHeader1-VimwikiHeader6 (if defined + in a colorscheme) + +Default: 0 + + +------------------------------------------------------------------------------ +*g:vimwiki_hl_cb_checked* + +Checked list items could be highlighted with a color: + + * [X] the whole line could be highlighted with the option set to 1. + * [ ] I wish vim could use strikethru. + +Value Description~ +1 Highlight checked [X] check box with |group-name| "Comment". +0 Don't. + +Default: 0 + + +------------------------------------------------------------------------------ +*g:vimwiki_global_ext* *vimwiki-temporary-wiki* + +If a file with a registered wiki extension is opened in a dir that is not +listed in |g:vimwiki_list| then: + +Value Description~ +1 make a temporary wiki in that dir. +0 don't make temporary wiki it that dir. + +Default: 1 + + +------------------------------------------------------------------------------ +*g:vimwiki_upper* *g:vimwiki_lower* + +This affects WikiWord detection. +By default WikiWord detection uses English and Russian letters. +You can set up your own: > + let g:vimwiki_upper = "A-Z\u0410-\u042f" + let g:vimwiki_lower = "a-z\u0430-\u044f" + + +------------------------------------------------------------------------------ +*g:vimwiki_auto_checkbox* + +if on, creates checkbox while toggling list item. + +Value Description~ +0 Do not create checkbox. +1 Create checkbox. + +Default: 1 + +Ex: +Press (|:VimwikiToggleListItem|) on a list item without checkbox to +create it: > + * List item +result: > + * [ ] List item + + +------------------------------------------------------------------------------ +*g:vimwiki_menu* + +GUI menu of available wikies to select. + +Value Description~ +'' No menu +'Vimwiki' Top level menu "Vimwiki" +'Plugin.Vimwiki' "Vimwiki" submenu of top level menu "Plugin" +etc. + +Default: 'Vimwiki' + +------------------------------------------------------------------------------ +*g:vimwiki_stripsym* + +Change strip symbol -- in Windows you cannot use /*?<>:" in file names so +vimwiki replaces them with neutral symbol (_ is default): > + let g:vimwiki_stripsym = '_' + +You can change it to a for example: > + let g:vimwiki_stripsym = ' ' + +------------------------------------------------------------------------------ +*g:vimwiki_badsyms* + +Consider you do not like spaces in filenames (as some vimwiki users do). +In that case you can set up bad symbols that would be converted to +|g:vimwiki_stripsym|: > + let g:vimwiki_badsyms = ' ' + +Now files for all [[links with spaces]] would be created like +'links_with_spaces'. + +This option is a complement one to |g:vimwiki_stripsym|. + +------------------------------------------------------------------------------ +*g:vimwiki_listsyms* + +String of 5 symbols for list items with checkboxes. +Default value is ' .oOX'. + +g:vimwiki_listsyms[0] is for 0% done items. +g:vimwiki_listsyms[4] is for 100% done items. + +------------------------------------------------------------------------------ +*g:vimwiki_use_mouse* + +Use local mouse mappings from |vimwiki-local-mappings|. + +Value Description~ +0 Do not use mouse mappings. +1 Use mouse mappings. + +Default: 0 + +------------------------------------------------------------------------------ +*g:vimwiki_folding* + +Enable/disable vimwiki's folding/outline. Folding in vimwiki is using 'expr' +foldmethod which is very flexible but really slow. + +Value Description~ +0 Disable folding. +1 Enable folding. + +Default: 0 + +------------------------------------------------------------------------------ +*g:vimwiki_fold_lists* + +Enable/disable folding of list subitems. + +Value Description~ +0 Disable list subitem's folding. +1 Enable list subitem's folding. + +Default: 0 + +------------------------------------------------------------------------------ +*g:vimwiki_fold_trailing_empty_lines* + +Fold or do not fold empty lines between folded headers. + +Value Description~ +0 Fold only one empty line. The rest empty lines are unfolded. +1 Fold in all empty lines. + +Default: 0 + +------------------------------------------------------------------------------ +*g:vimwiki_camel_case* + +If you do not want WikiWord to be a link this setting is just for you. + +Value Description~ +0 Do not make links from CamelCased words. +1 Make links from CamelCased words. + +Default: 1 + +------------------------------------------------------------------------------ +*g:vimwiki_list_ignore_newline* + +This is HTML related. +Convert newlines to
s in multiline list items. + +Value Description~ +0 Newlines in a list item are converted to
s. +1 Ignore newlines. + +Default: 1 + +------------------------------------------------------------------------------ +*g:vimwiki_browsers* *VimwikiWeblinkHandler* + +You can open external weblinks in a webbrowser. Webbrowsers are listed in +|g:vimwiki_browsers|. + +For win32 it is: chrome, opera, firefox and explorer. +For other OSes it is: opera, firefox and konqueror. + +The first available browser from the list is used to open weblink. +If you have opera and firefox and want weblinks to be opened in the latter +just: > + let g:vimwiki_browsers=['C:\Program Files\Firefox\firefox.exe'] + +or redefine VimwikiWeblinkHandler function: > + function! VimwikiWeblinkHandler(weblink) + let browser = 'C:\Program Files\Firefox\firefox.exe' + execute '!start "'.browser.'" ' . a:weblink + endfunction + + +============================================================================== +10. Help *vimwiki-help* + +As you could see I am not native English speaker (not a writer as well). +Please send me correct phrases instead of that incorrect stuff I have used +here. + +Any help is really appreciated! + +============================================================================== +11. Author *vimwiki-author* + +I live in Moscow and you may believe me -- there are no polar bears (no brown +too) here in the streets. + +I do not do programming for a living. So don't blame me for an ugly +ineffective code. Improvements are welcome. + +Many thanks to all of you for voting vimwiki up on www.vim.org. I do vimwiki +in my spare time I could use to dance argentine tango with beautiful women. +Your votes are kind of a good replacement. ;) + +Sincerely yours, +Maxim Kim . + +Vimwiki's website: http://code.google.com/p/vimwiki/ +Vim plugins website: http://www.vim.org/scripts/script.php?script_id=2226 + +============================================================================== +12. Changelog *vimwiki-changelog* + +0.9.8~ + * NEW: Rename |g:vimwiki_fold_empty_lines| to + |g:vimwiki_fold_trailing_empty_lines|. + * NEW: One can use '-' along with '*' to start unordered list item. + * NEW: List items could be started from the first column. + As a result some limitations appeared: + - a space after *, - or # for a list item is mandatory. + - |g:vimwiki_fold_trailing_empty_lines| if set to 0 folds one trailing + empty line. + * NEW: Folding is off by default. Use |g:vimwiki_folding| to enable it. + * NEW: Speed up vimwiki's folding a bit. Should lag a bit less in a long + todo lists. + * NEW: Centered headers. Start header with at least one space to make it + html centered. + * NEW: Change in default css: header's colors. + * NEW: Vimwiki is aware of |GetLatestVimScripts| now. + * FIX: Use tag instead of custom in html. + * FIX: There are no text styling in htmlized quoted text. + * FIX: set default value of g:vimwiki_fold_lists to 0 as written in this + help. + * FIX: Issue 33: Folded list items have wrong indentation when 'tabs' are + used. + * FIX: Issue 34: vimwiki#subdir got wrong dir when VimwikiGet('path') is a + symbolic link. Thanks lilydjwg for the patch. + * FIX: Issue 28: todo-list auto-indent enhancement. New item should always + be unchecked. + * Issue 36: Change the name of the Search command to VimwikiSearch as it + conflicts with MultipleSearch. Alias :VWS is also available. + * NEW: You can generate 'Table of contents' of your wiki page. See + |vimwiki-toc| for details. + +0.9.701~ + * FIX: Issue 30: Highlighting doesn't work for checked list item. + +0.9.7~ + * NEW: Default checkbox symbols are changed to [ ], [.], [o], [O], [X]. + You can change them using |g:vimwiki_listsyms| variable. + * NEW: Color group names are renamed from wikiBold, wikiItalic, etc to + VimwikiBold, VimwikiItalic, etc. + * NEW: Open external links in a browser. There are default browsers + defined in |g:vimwiki_browsers| list. You can also redefine + |VimwikiWeblinkHandler| function to open weblinks in other programs. + * NEW: Issue 25: Toggle the states of multiple TODO list items at a time + (in VISUAL and in VISUAL LINE modes) + * NEW: Issue 26: Highlight code snippets in vimwiki's pre. See + |vimwiki-option-nested_syntaxes|. Thanks kriomant. + * NEW: Issue 27: Automatic garbage deletion from html directory. + * NEW: Save all open vimwiki buffers before export to html. + * NEW: Issue 29: Custom :Search command. + * NEW: Header text objects are now expandable in VISUAL mode. Tap 'vah' to + select a header. Tap again 'ah' to expand selection further. Thanks Andy + Wokula. + * FIX: Folding settings are reset to vim defaults in a new tab (think of + \wt) so you cannot hide things in folds. + * FIX: https links in form of [https://hello.world.com] are not exported + into html. Thanks Saurabh Sarpal for the patch. + +0.9.6~ + * NEW: You can have multiline list items. See |vimwiki-syntax-lists|. + * NEW: You can ignore newlines in multiline list items when do export to + html. See |g:vimwiki_list_ignore_newline| option. + * NEW: Different checkbox symbols [.], [:], [o] are added. See + |vimwiki-todo-lists|. + * NEW: Now there is no longer syntax of preformatted text that is started + by a whitespace. + * NEW: Blockquotes. See |vimwiki-syntax-blockquote|. + * NEW: Per wiki folding option (vimwiki-option-folding) is removed. Global + |g:vimwiki_folding| and |g:vimwiki_fold_lists| are added. + * NEW: Due to being quite slow folding of list items is off by default. + Use |g:vimwiki_fold_lists| to turn it on. + * NEW: If you want replace some symbols in a wikifilename use + |g:vimwiki_badsyms| option (Andreas Baldeau). + * FIX: Command |:VimwikiToggleListItem| doesn't work for one of the two + wikies opened at the same time with different syntaxes. + * FIX: Command |:VimwikiToggleListItem| do not switch parent checkboxes if + there are non-checkbox list items available. + * FIX: Issue 24: Link error in html when write [[one.two.three]]. + * FIX: Rename WikiWord to something with a colon (:) does nasty things. + * FIX: Command |:VimwikiToggleListItem| do not switch right if there are + list items without checkboxes in the list. + +0.9.5~ + * NEW: Added |g:vimwiki_global_ext| to control creation of temporary + wikies in dirs that are not listed in |g:vimwiki_list|. + * NEW: Added |g:vimwiki_hl_headers| to highlight headers with different + predefined colors. + * NEW: Checked [X] items are not highlighted with Comment syntax group by + default. Use |g:vimwiki_hl_cb_checked| to turn it on. + * NEW: Added new syntax for links: [[link address][link description]]. + * NEW: Added allias of mapping for *nix systems. + * NEW: Added |g:vimwiki_camel_case|. Set it to 0 if you do not want + CamelCased WikiWords to be linkified. + * FIX: Links with g:vimwiki_stripsym (default '_') [[My_Link|Text]] are + not highlighted when created. + * FIX: indent/vimwiki.vim is obsolete. If you upgrade from previous + versions remove it. It causes wrong list indentation if noexpandtab is + set. + * FIX: If tabs and spaces are used to indent list items html export gives + error. Thanks Klaus Ethgen for report. + * FIX: Some html export fixes. + +0.9.4~ + * NEW: Links with directories: [[dir1/dir2/Link|Text]]. Thanks Jie Wu. + * NEW: Added %root_path% template variable to get relative root dir of + path_html. See |vimwiki-option-html_header|. + * FIX: Indent is incorrect for vim without "float" compile option. Thanks + Julian Kooij. + * FIX: Convert to html doesn't work right with links like [[foo::bar]]. + * FIX: Rename wikiword doesn't work right when rename WikiWord to + [[WikiWord blablabla]]. + * FIX: Renaming of links with description doesn't work. + * FIX: Weblinks with commas are not highlighted. + * MISC: Some changes in default css file. + +0.9.3~ + * NEW: g:vimwiki_menu option is a string which is menu path. So one can + use let g:vimwiki_menu = 'Plugin.Vimwiki' to set the menu to the right + place. + * NEW: g:vimwiki_fold_empty_lines -- don't or do fold in empty lines + between headers. See |g:vimwiki_fold_empty_lines| + * FIX: Encoding error when running vimwiki in Windows XP Japanese. + Thanks KarasAya. + +0.9.2c~ + * FIX: Regression: Export HTML link error with [[Link|Text]]. + +0.9.2b~ + * FIX: Installation on Linux doesn't work. (Dos line endings in Vimball + archive file). + * FIX: Clear out FlexWiki ftplugin's setup. Now you don't have to hack + filetype.vim to get rid of unexpected ':setlocal bomb' from FlexWiki's + ftplugin. + * FIX: When write done: it will show another done: in html file. + +0.9.2a~ + * FIX: Installation on Linux doesn't work. (Dos line endings in + autoload/vimwiki_lst.vim and indent/vimwiki.vim). + +0.9.2~ + * NEW: Option 'folding' added to turn folding on/off. + * NEW: Header text object. See |vimwiki-text-objects|. + * NEW: Add/remove Header levels with '=' and '-'. See |vimwiki_=|. + * NEW: Vimwiki GUI menu to select available wikies. See |g:vimwiki_menu|. + * NEW: You can specify the name of your css file now. See + |vimwiki-option-css_name| + * NEW: You can add styles to image links, see |vimwiki-syntax-links|. + * FIX: History doesn't work after |VimwikiRenameWord|. + * FIX: Some of wikipedia links are not correctly highlighted. Links with + parentheses. + * MISC: Renamed vimwiki_gtd to vimwiki_lst. + +0.9.1~ + * NEW: HTML Table cell text alignment, see |vimwiki-syntax-tables| + * NEW: Wikipage history simplified. Each vimwiki buffer now holds + b:vimwiki_prev_word which is list of [PrevWord, getpos()]. + * NEW: If highlight for groups wikiHeader1..wikiHeader6 exist (defined in + a colorscheme) -- use it. Otherwise use Title highlight for all Headers. + * FIX: Warn only once if 'html_header' or 'html_footer' does not exist. + * FIX: Wrong folding for the text after the last nested list item. + * FIX: Bold and Italic aren't highlighted in tables without spaces + between || and * or _. ||*bold*||_asdf_ || (Thanks Brett Stahlman) + +0.9.0~ + * NEW: You can add classes to 'pre' tag -- |vimwiki-syntax-preformatted|. + This might be useful for coloring some programming code with external js + tools like google syntax highlighter. + * NEW: !WikiPage is not highlighted. It is just a plain word WikiPage in + HTML, without exclamation mark + * NEW: Definition lists, see |vimwiki-syntax-lists|. + * NEW: New implementation of |:VimwikiRenameWord|. CAUTION: It was tested + on 2 computers only, backup your wiki before use it. Email me if it + doesn't work for you. + * FIX: Less than 3 symbols are not highlighted in Bold and Italic. + * FIX: Added vimwiki autocmd group to avoid clashes with user defined + autocmds. + * FIX: Pressing ESC while |:VimwikiUISelect| opens current wiki index + file. Should cancel wiki selection. + +0.8.3~ + * NEW: on a list item creates checkbox. + * FIX: With * in the first column, shouldn't insert more * (default + syntax). + * FIX: With MediaWiki's ** [ ], should insert it on the next line. + * FIX: HTML export should use 'fileencoding' instead of 'encoding'. + * FIX: Code cleanup. + +0.8.2~ + * DEL: Removed google syntax file. + * NEW: Default vimwiki syntax is a subset of google's one. Header's has + been changed from !Header to =Header=. It is easier to maintain only 2 + syntaxes. See |vimwiki-syntax-headers|. + * NEW: Multiline paragraphs -- less longlines. + * NEW: Comments. See |vimwiki-syntax-comments|. + * DEL: Removed setlocal textwidth = 0 from ftplugin. + * FIX: New regexps for bold, italic, bolditalic. + * FIX: The last item in List sometimes fold-in incorrectly. + * FIX: Minor tweaks on default css. + +0.8.1~ + * NEW: Vimwiki's foldmethod changed from syntax to expr. Foldtext is + changed to be nicer with folded list items. + * NEW: Fold/outline list items. + * NEW: It is possible now to edit wiki files in arbitrary directories + which is not in g:vimwiki_list's paths. New WikiWords are created in the + path of the current WikiWord. + * NEW: User can remap Vimwiki's built in mappings. + * NEW: Added |g:vimwiki_use_mouse|. It is off by default. + * FIX: Removed mapping. + +0.8.0~ + * NEW: Multiple wikies support. A lot of options have been changed, see + |vimwiki-options| + * NEW: Auto create directories. + * NEW: Checked list item highlighted as comment. + * FIX: Multiple 'set ft=vimwiki' for each buffer disabled. Vimwiki should + load its buffers a bit faster now. + +0.7.1~ + * NEW: VimwikiToggleListItem added to be able to remap to + anything user prefers more. + * FIX: Toggleable list items do not work with MediaWiki markup. + * FIX: Changing g:vimwiki_home_html to path with ~ while vimwiki is + loaded gives errors for HTML export. + * DEL: Command :VimwikiExploreHome. + +0.7.0~ + * NEW: GTD stuff -- toggleable list items. See |vimwiki-todo-lists|. + * FIX: Headers do not fold inner headers. (Thanks Brett Stahlman) + * FIX: Remove last blank lines from preformatted text at the end of file. + * DEL: Removed g:vimwiki_smartCR option. + +0.6.2~ + * NEW: [[link|description]] is available now. + * FIX: Barebone links (ie: http://bla-bla-bla.org/h.pl?id=98) get extra + escaping of ? and friends so they become invalid in HTML. + * FIX: In linux going to [[wiki with whitespaces]] and then pressing BS + to go back to prev wikipage produce error. (Thanks Brendon Bensel for + the fix) + * FIX: Remove setlocal encoding and fileformat from vimwiki ftplugin. + * FIX: Some tweaks on default style.css + +0.6.1~ + * FIX: [blablabla bla] shouldn't be converted to a link. + * FIX: Remove extra annoing empty strings from PRE tag made from + whitespaces in HTML export. + * FIX: Moved functions related to HTML converting to new autoload module + to increase a bit vimwiki startup time. + +0.6~ + * NEW: Header and footer templates. See|g:vimwiki_html_header| and + |g:vimwiki_html_footer|. + * FIX: |:Vimwiki2HTML| does not recognize ~ as part of a valid path. + +0.5.3~ + * FIX: Fixed |:VimwikiRenameWord|. Error when g:vimwiki_home had + whitespaces in path. + * FIX: |:VimwikiSplitWord| and |:VimwikiVSplitWord| didn't work. + +0.5.2~ + * NEW: Added |:VimwikiGoHome|, |:VimwikiTabGoHome| and + |:VimwikiExploreHome| commands. + * NEW: Added wt mapping to open vimwiki index file in a new tab. + * NEW: Added g:vimwiki_gohome option that controls how|:VimwikiGoHome| + works when current buffer is changed. (Thanks Timur Zaripov) + * FIX: Fixed |:VimwikiRenameWord|. Very bad behaviour when autochdir + isn't set up. + * FIX: Fixed commands :Wiki2HTML and :WikiAll2HTML to be available only + for vimwiki buffers. + * FIX: Renamed :Wiki2HTML and :WikiAll2HTML to |:Vimwiki2HTML| and + |:VimwikiAll2HTML| commands. + * FIX: Help file corrections. + +0.5.1~ + * NEW: This help is created. + * NEW: Now you can fold headers. + * NEW: VimwikiGoHome and VimwikiExploreHome were added. + * FIX: Bug with {{{HelloWikiWord}}} export to HTML is fixed. + * DEL: Sync option removed from: Syntax highlighting for preformatted + text {{{ }}}. + +0.5~ + * NEW: vimwiki default markup to HTML conversion improved. + * NEW: Added basic GoogleWiki and MediaWiki markup languages. + * NEW: Chinese [[complex wiki words]]. + +0.4~ + * NEW: vimwiki=>HTML converter in plain Vim language. + * NEW: Plugin autoload. + +0.3.4~ + * FIX: Backup files (.wiki~) caused a bunch of errors while opening wiki + files. + +0.3.3~ + * FIX: [[wiki word with dots at the end...]] didn't work. + * NEW: Added error handling for delete wiki word function. + * NEW: Added keybindings o and O for list items when g:vimwiki_smartCR=1. + * NEW: Added keybinding wh to visit wiki home directory. + +0.3.2~ + * FIX: Renaming -- error if complex wiki word contains %. + * FIX: Syntax highlighting for preformatted text {{{ }}}. Sync option + added. + * FIX: smartCR bug fix. + +0.3.1~ + * FIX: Renaming -- [[hello world?]] to [[hello? world]] links are not + updated. + * FIX: Buffers menu is a bit awkward after renaming. + * NEW: Use mouse to follow links. Left double-click to follow WikiWord, + Rightclick then Leftclick to go back. + +0.3~ + * NEW: Highlight non-existent WikiWords. + * NEW: Delete current WikiWord (wd). + * NEW: g:vimwiki_smartCR=2 => use Vim comments (see :h comments :h + formatoptions) feature to deal with list items. (thx -- Dmitry + Alexandrov) + * NEW: Highlight TODO:, DONE:, FIXED:, FIXME:. + * NEW: Rename current WikiWord -- be careful on Windows you cannot rename + wikiword to WikiWord. After renaming update all links to that renamed + WikiWord. + * FIX: Bug -- do not duplicate WikiWords in wiki history. + * FIX: After renaming [[wiki word]] twice buffers are not deleted. + * FIX: Renaming from [[wiki word]] to WikiWord result is [[WikiWord]] + * FIX: More than one complex words on one line is bugging each other when + try go to one of them. [[bla bla bla]] [[dodo dodo dodo]] becomes bla + bla bla]] [[dodo dodo dodo. + + +0.2.2~ + * NEW: Added keybinding -- split WikiWord + * NEW: Added keybinding -- vertical split WikiWord + +0.2.1~ + * NEW: Install on Linux now works. + +0.2~ + * NEW: Added part of Google's Wiki syntax. + * NEW: Added auto insert # with ENTER. + * NEW: On/Off auto insert bullet with ENTER. + * NEW: Strip [[complex wiki name]] from symbols that cannot be used in + file names. + * NEW: Links to non-wiki files. Non wiki files are files with extensions + ie [[hello world.txt]] or [[my homesite.html]] + +0.1~ + * First public version. + +============================================================================== +13. License *vimwiki-license* + +The MIT Licence +http://www.opensource.org/licenses/mit-license.php + +Copyright (c) 2009 Maxim Kim + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + + vim:tw=78:ts=8:ft=help diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim new file mode 100644 index 0000000..dea1fac --- /dev/null +++ b/ftplugin/vimwiki.vim @@ -0,0 +1,299 @@ +" 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 wrap< linebreak< ". + \ "suffixesadd< isfname< comments< ". + \ "autowriteall< ". + \ "formatoptions< foldtext< ". + \ "foldmethod< foldexpr< commentstring< " +" UNDO }}} + +" MISC STUFF {{{ + +setlocal wrap +setlocal linebreak +setlocal autowriteall +setlocal commentstring= +" MISC }}} + +" GOTO FILE: gf {{{ +execute 'setlocal suffixesadd='.VimwikiGet('ext') +setlocal isfname-=[,] +" gf}}} + +" Autocreate list items {{{ +" for list items, and list items with checkboxes +if VimwikiGet('syntax') == 'default' + setl comments=b:*,b:#,b:- + setl formatlistpat=^\\s*[*#-]\\s* +else + setl comments=n:*,n:# +endif +setlocal formatoptions=tnro + +inoremap vimwiki_lst#insertCR() +nnoremap o :call vimwiki_lst#insertOo('o')a +nnoremap O :call vimwiki_lst#insertOo('O')a + +" COMMENTS }}} + +" FOLDING for headers and list items using expr fold method. {{{ +if g:vimwiki_folding == 1 + setlocal fdm=expr + setlocal foldexpr=VimwikiFoldLevel(v:lnum) + setlocal foldtext=VimwikiFoldText() +endif + +function! VimwikiFoldLevel(lnum) "{{{ + let line = getline(a:lnum) + + " Header folding... + if line =~ g:vimwiki_rxHeader + let n = vimwiki#count_first_sym(line) + return '>'.n + endif + + if g:vimwiki_fold_trailing_empty_lines == 0 + if line =~ '^\s*$' + let nnline = getline(nextnonblank(a:lnum + 1)) + if nnline =~ g:vimwiki_rxHeader + let n = vimwiki#count_first_sym(nnline) + return '<'.n + endif + endif + endif + + " List item folding... + if g:vimwiki_fold_lists + let base_level = s:get_base_level(a:lnum) + + let rx_list_item = '\('. + \ g:vimwiki_rxListBullet.'\|'.g:vimwiki_rxListNumber. + \ '\)' + + + if line =~ rx_list_item + let [nnum, nline] = s:find_forward(rx_list_item, 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(rx_list_item, a:lnum)) + + if leveln > level + return ">".(base_level+leveln-adj) + else + return (base_level+level-adj) + endif + else + " process multilined list items + let [pnum, pline] = s:find_backward(rx_list_item, a:lnum) + if pline =~ rx_list_item + if indent(a:lnum) > indent(pnum) + let level = s:get_li_level(pnum) + let adj = s:get_li_level(s:get_start_list(rx_list_item, pnum)) + + let [nnum, nline] = s:find_forward(rx_list_item, a:lnum) + if nline =~ rx_list_item + let leveln = s:get_li_level(nnum) + if leveln > level + return (base_level+leveln-adj) + endif + endif + + return (base_level+level-adj) + endif + endif + endif + + return base_level + endif + + return -1 +endfunction "}}} + +function! s:get_base_level(lnum) "{{{ + let lnum = a:lnum - 1 + while lnum > 0 + if getline(lnum) =~ g:vimwiki_rxHeader + return vimwiki#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#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! VimwikiFoldText() "{{{ + let line = substitute(getline(v:foldstart), '\t', + \ repeat(' ', &tabstop), 'g') + return line.' ['.(v:foldend - v:foldstart).']' +endfunction "}}} + +" FOLDING }}} + +" COMMANDS {{{ +command! -buffer Vimwiki2HTML + \ call vimwiki_html#Wiki2HTML(expand(VimwikiGet('path_html')), + \ expand('%')) +command! -buffer VimwikiAll2HTML + \ call vimwiki_html#WikiAll2HTML(expand(VimwikiGet('path_html'))) + +command! -buffer VimwikiNextWord call vimwiki#WikiNextWord() +command! -buffer VimwikiPrevWord call vimwiki#WikiPrevWord() +command! -buffer VimwikiDeleteWord call vimwiki#WikiDeleteWord() +command! -buffer VimwikiRenameWord call vimwiki#WikiRenameWord() +command! -buffer VimwikiFollowWord call vimwiki#WikiFollowWord('nosplit') +command! -buffer VimwikiGoBackWord call vimwiki#WikiGoBackWord() +command! -buffer VimwikiSplitWord call vimwiki#WikiFollowWord('split') +command! -buffer VimwikiVSplitWord call vimwiki#WikiFollowWord('vsplit') + +command! -buffer -range VimwikiToggleListItem call vimwiki_lst#ToggleListItem(, ) + +exe 'command! -buffer -nargs=* VimwikiSearch vimgrep '. + \ escape(VimwikiGet('path').'**/*'.VimwikiGet('ext'), ' ') + +exe 'command! -buffer -nargs=* VWS vimgrep '. + \ escape(VimwikiGet('path').'**/*'.VimwikiGet('ext'), ' ') + +" COMMANDS }}} + +" KEYBINDINGS {{{ +if g:vimwiki_use_mouse + nmap + nmap + noremap <2-LeftMouse> :VimwikiFollowWord + noremap :VimwikiSplitWord + noremap :VimwikiVSplitWord + noremap :VimwikiGoBackWord +endif + +if !hasmapto('VimwikiFollowWord') + nmap VimwikiFollowWord +endif +noremap