Permalink
Browse files

Version 0.9.9

* NEW: Diary. Help in making daily notes. See ':h vimwiki-diary'. Now you
  can really easy add information into vimwiki that should be sorted out
  later.
* NEW: Tables are redesigned. Syntax is changed. Now they are
  auto-formattable. You can navigate them with <tab> and <cr> in insert
  mode. See 'vimwiki-syntax-tables' and 'vimwiki-tables' for more details.
* NEW: Keyword STARTED: is added.
* NEW: Words TODO:, DONE:, STARTED:, XXX:, FIXME:, FIXED: are highlighed
  inside headers.
* FIX: Export to html external links with 'file://' protocol. Ex:
  '[file:///home/user1/book.pdf my book]'.
* FIX: Menu is corrupted if wiki's path contains spaces.
* FIX: Settings 'wrap' and 'linebreak' are removed from ftplugin. Add them
  into your personal settings file '.vim/after/ftplugin/vimwiki.vim' if
  needed.
* NEW: Headers are highlighted in different colors by default.  See ':h
  g:vimwiki_hl_headers' to turn it off.
* FIX: Issue 40: Links with russian subdirs don't work.
* NEW: It is now possible to generate HTML files automatically on page
  save. See ':h vimwiki-option-auto_export'.
  • Loading branch information...
1 parent 74160d8 commit bb1f5b3c469aa08deb94387aa4e40eedcc6b85e5 @habamax habamax committed with Feb 23, 2010
Showing with 1,178 additions and 183 deletions.
  1. +41 −18 autoload/vimwiki.vim
  2. +216 −0 autoload/vimwiki_diary.vim
  3. +84 −60 autoload/vimwiki_html.vim
  4. +335 −0 autoload/vimwiki_tbl.vim
  5. +376 −79 doc/vimwiki.txt
  6. +29 −6 ftplugin/vimwiki.vim
  7. +79 −10 plugin/vimwiki.vim
  8. +18 −10 syntax/vimwiki.vim
View
@@ -23,10 +23,17 @@ function! s:chomp_slash(str) "{{{
return substitute(a:str, '[/\\]\+$', '', '')
endfunction "}}}
+function! s:is_windows()
+ return has("win32") || has("win64") || has("win95") || has("win16")
+endfunction
+
function! vimwiki#mkdir(path) "{{{
let path = expand(a:path)
if !isdirectory(path) && exists("*mkdir")
let path = s:chomp_slash(path)
+ if s:is_windows() && !empty(g:vimwiki_w32_dir_enc)
+ let path = iconv(path, &enc, g:vimwiki_w32_dir_enc)
+ endif
call mkdir(path, "p")
endif
endfunction
@@ -62,6 +69,25 @@ function! vimwiki#current_subdir()"{{{
return vimwiki#subdir(VimwikiGet('path'), expand('%:p'))
endfunction"}}}
+function! vimwiki#open_link(cmd, link, ...) "{{{
+ if s:is_link_to_non_wiki_file(a:link)
+ call s:edit_file(a:cmd, a:link)
+ else
+ if a:0
+ let vimwiki_prev_link = [a:1, []]
+ elseif &ft == 'vimwiki'
+ let vimwiki_prev_link = [expand('%:p'), getpos('.')]
+ endif
+
+ call s:edit_file(a:cmd, VimwikiGet('path').a:link.VimwikiGet('ext'))
+
+ if exists('vimwiki_prev_link')
+ let b:vimwiki_prev_link = vimwiki_prev_link
+ endif
+ endif
+endfunction
+" }}}
+
function! s:filename(link) "{{{
let result = vimwiki#safe_link(a:link)
if a:link =~ '|'
@@ -165,11 +191,13 @@ function! s:print_wiki_list() "{{{
endfunction
" }}}
-function! s:wiki_select(wnum)"{{{
+function! vimwiki#select(wnum)"{{{
if a:wnum < 1 || a:wnum > len(g:vimwiki_list)
return
endif
- let b:vimwiki_idx = g:vimwiki_current_idx
+ if &ft == 'vimwiki'
+ let b:vimwiki_idx = g:vimwiki_current_idx
+ endif
let g:vimwiki_current_idx = a:wnum - 1
endfunction
" }}}
@@ -260,7 +288,7 @@ function! s:get_wiki_buffers() "{{{
if bufexists(bcount)
let bname = fnamemodify(bufname(bcount), ":p")
if bname =~ VimwikiGet('ext')."$"
- let bitem = [bname, getbufvar(bname, "vimwiki_prev_word")]
+ let bitem = [bname, getbufvar(bname, "vimwiki_prev_link")]
call add(blist, bitem)
endif
endif
@@ -273,7 +301,7 @@ 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])
+ call setbufvar(a:item[0], "vimwiki_prev_link", a:item[1])
endif
endfunction
" }}}
@@ -388,8 +416,8 @@ function! vimwiki#WikiFollowWord(split) "{{{
let cmd = ":e "
endif
- let word = s:strip_word(s:get_word_at_cursor(g:vimwiki_rxWikiWord))
- if word == ""
+ let link = s:strip_word(s:get_word_at_cursor(g:vimwiki_rxWikiWord))
+ if link == ""
let weblink = s:strip_word(s:get_word_at_cursor(g:vimwiki_rxWeblink))
if weblink != ""
call VimwikiWeblinkHandler(weblink)
@@ -399,29 +427,24 @@ function! vimwiki#WikiFollowWord(split) "{{{
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
+ let subdir = vimwiki#current_subdir()
+ call vimwiki#open_link(cmd, subdir.link)
+
endfunction
" }}}
function! vimwiki#WikiGoBackWord() "{{{
- if exists("b:vimwiki_prev_word")
+ if exists("b:vimwiki_prev_link")
" go back to saved WikiWord
- let prev_word = b:vimwiki_prev_word
+ let prev_word = b:vimwiki_prev_link
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#select(a:index)
call vimwiki#mkdir(VimwikiGet('path'))
try
@@ -523,7 +546,7 @@ function! vimwiki#WikiRenameWord() "{{{
let &buftype="nofile"
let cur_buffer = [expand('%:p'),
- \getbufvar(expand('%:p'), "vimwiki_prev_word")]
+ \getbufvar(expand('%:p'), "vimwiki_prev_link")]
let blist = s:get_wiki_buffers()
View
@@ -0,0 +1,216 @@
+" Vimwiki autoload plugin file
+" Desc: Handle diary notes
+" Author: Maxim Kim <habamax@gmail.com>
+" Home: http://code.google.com/p/vimwiki/
+
+" Load only once {{{
+if exists("g:loaded_vimwiki_diary_auto") || &cp
+ finish
+endif
+let g:loaded_vimwiki_diary_auto = 1
+"}}}
+
+function! s:prefix_zero(num) "{{{
+ if a:num < 10
+ return '0'.a:num
+ endif
+ return a:num
+endfunction "}}}
+
+function! s:desc(d1, d2) "{{{
+ return a:d1 == a:d2 ? 0 : a:d1 < a:d2 ? 1 : -1
+endfunction "}}}
+
+function! s:get_date_link(fmt) "{{{
+ return strftime(a:fmt)
+endfunction "}}}
+
+function! s:link_exists(lines, link) "{{{
+ let link_exists = 0
+ for line in a:lines
+ if line =~ escape(a:link, '[]\')
+ let link_exists = 1
+ break
+ endif
+ endfor
+ return link_exists
+endfunction "}}}
+
+function! s:diary_path() "{{{
+ return VimwikiGet('path').VimwikiGet('diary_rel_path')
+endfunction "}}}
+
+function! s:diary_index() "{{{
+ return s:diary_path().VimwikiGet('diary_index').VimwikiGet('ext')
+endfunction "}}}
+
+function! s:get_diary_range(lines, header) "{{{
+ let rx = '\[\[\d\{4}-\d\d-\d\d\]\]'
+ let idx = 0
+ let ln_start = -1
+ let ln_end = -1
+ for line in a:lines
+ if ln_start != -1
+ if line =~ '^\s*\(=\)\+.*\1\s*$' || (line !~ rx && line !~ '^\s*$')
+ break
+ endif
+ endif
+ if line =~ '^\s*\(=\)\+\s*'.a:header.'\s*\1\s*$'
+ let ln_start = idx + 1
+ endif
+ let idx += 1
+ endfor
+
+ let ln_end = idx - 1
+ return [ln_start, ln_end]
+endfunction "}}}
+
+function! s:diary_date_link() "{{{
+ return s:get_date_link(VimwikiGet('diary_link_fmt'))
+endfunction "}}}
+
+function! s:get_file_contents(file_name) "{{{
+ let lines = []
+ let bufnr = bufnr(expand(a:file_name))
+ if bufnr != -1
+ let lines = getbufline(bufnr, 1, '$')
+ else
+ try
+ let lines = readfile(expand(a:file_name))
+ catch
+ endtry
+ endif
+ return [lines, bufnr]
+endfunction "}}}
+
+function! s:get_links() "{{{
+ let rx = '\d\{4}-\d\d-\d\d'
+ let s_links = glob(VimwikiGet('path').VimwikiGet('diary_rel_path').'*.wiki')
+
+ "let s_links = substitute(s_links, '\'.VimwikiGet('ext'), "", "g")
+ let s_links = substitute(s_links, '\.wiki', "", "g")
+ let links = split(s_links, '\n')
+
+ " remove backup files (.wiki~)
+ call filter(links, 'v:val !~ ''.*\~$''')
+
+ " remove paths
+ call map(links, 'fnamemodify(v:val, ":t")')
+
+ call filter(links, 'v:val =~ "'.escape(rx, '\').'"')
+ call map(links, '"[[".v:val."]]"')
+ return links
+endfunction "}}}
+
+function! s:format_links(links) "{{{
+ let lines = []
+ let line = '| '
+ let idx = 0
+ let trigger = 0
+ while idx < len(a:links)
+ if idx/VimwikiGet('diary_link_count') > trigger
+ let trigger = idx/VimwikiGet('diary_link_count')
+ call add(lines, substitute(line, '\s\+$', '', ''))
+ let line = '| '
+ endif
+ let line .= a:links[idx].' | '
+ let idx += 1
+ endwhile
+ call add(lines, substitute(line, '\s\+$', '', ''))
+ call extend(lines, [''])
+
+ return lines
+endfunction "}}}
+
+function! s:add_link(page, header, link) "{{{
+ let [lines, bufnr] = s:get_file_contents(a:page)
+
+ let [ln_start, ln_end] = s:get_diary_range(lines, a:header)
+
+ let link = '[['.a:link.']]'
+
+ let link_exists = s:link_exists(lines[ln_start : ln_end], link)
+
+ if !link_exists
+
+ if ln_start == -1
+ call insert(lines, '= '.a:header.' =')
+ let ln_start = 1
+ endif
+
+ " removing 'old' links
+ let idx = ln_end - ln_start
+ while idx > 0
+ call remove(lines, ln_start)
+ let idx -= 1
+ endwhile
+
+ " get all diary links from filesystem
+ let links = s:get_links()
+
+ " add current link
+ if index(links, link) == -1
+ call add(links, link)
+ endif
+
+ let links = sort(links, 's:desc')
+ call extend(lines, s:format_links(links), ln_start)
+
+ if bufnr != -1
+ exe 'buffer '.bufnr
+ if !&readonly
+ 1,$delete _
+ call append(1, lines)
+ 1,1delete _
+ endif
+ else
+ call writefile(lines, expand(a:page))
+ endif
+ endif
+endfunction "}}}
+
+function! s:make_date_link(...) "{{{
+ if a:0
+ let link = a:1
+ else
+ let link = s:diary_date_link()
+ endif
+ let header = VimwikiGet('diary_header')
+ call s:add_link(s:diary_index(), header, link)
+ return VimwikiGet('diary_rel_path').link
+endfunction "}}}
+
+function! vimwiki_diary#make_note(index, ...) "{{{
+ call vimwiki#select(a:index)
+ call vimwiki#mkdir(VimwikiGet('path').VimwikiGet('diary_rel_path'))
+ if a:0
+ let link = s:make_date_link(a:1)
+ else
+ let link = s:make_date_link()
+ endif
+ call vimwiki#open_link(':e ', link, s:diary_index())
+endfunction "}}}
+
+" Calendar.vim callback.
+function! vimwiki_diary#calendar_action(day, month, year, week, dir) "{{{
+ let day = s:prefix_zero(a:day)
+ let month = s:prefix_zero(a:month)
+
+ let link = a:year.'-'.month.'-'.day
+ if winnr('#') == 0
+ if a:dir == 'V'
+ vsplit
+ else
+ split
+ endif
+ else
+ wincmd p
+ if !&hidden && &modified
+ new
+ endif
+ endif
+
+ " Create diary note for a selected date in default wiki.
+ call vimwiki_diary#make_note(1, link)
+endfunction
+
Oops, something went wrong.

0 comments on commit bb1f5b3

Please sign in to comment.