Merge branch 'dev' into path-handling

Conflicts:
	autoload/vimwiki/base.vim
	autoload/vimwiki/diary.vim
	autoload/vimwiki/vars.vim
	ftplugin/vimwiki.vim
This commit is contained in:
EinfachToll 2019-01-28 07:30:08 +01:00
commit 86289a8493
12 changed files with 739 additions and 377 deletions

46
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,46 @@
# Filing a bug
Before filing a bug or starting to write a patch, check the latest development version from
https://github.com/vimwiki/vimwiki/tree/dev to see if your problem is already fixed.
Issues can be filed at https://github.com/vimwiki/vimwiki/issues/ .
# Creating a pull request
If you want to provide a pull request on GitHub, please start from the `dev` branch, not from the
`master` branch. (Caution, GitHub shows `master` as the default branch from which to start a PR.)
# More info for (aspiring) core developers
## Git branching model
- there are two branches with eternal lifetime:
- `dev`: This is where the main development happens. Tasks which are done in one or only a few
commits go here directly. Always try to keep this branch in a working state, that is, if the
task you work on requires multiple commits, make sure intermediate commits don't make Vimwiki
unusable (or at least push these commits at one go).
- `master`: This branches is for released states only. Whenever a reasonable set of changes has
piled up in the `dev` branch, a [release is done](#Preparing a release). After a release,
`dev` has been merged into `master` and `master` got exactly one additional commit in which
the version number in `plugin/vimwiki.vim` is updated. Apart from these commits and the merge
commit from `dev`, nothing happens on `master`. Never should `master` merge into `dev`. When
the users ask, we should recommend this branch for them to use.
- Larger changes which require multiple commits are done in feature branches. They are based on
`dev` and merge into `dev` when the work is done.
## Preparing a release
1. `git checkout dev`
2. Update the changelog in the doc, nicely grouped, with a new version number and release date.
3. Update the list of contributors.
4. Update the version number at the top of the doc file.
5. If necessary, update the Readme and the home page.
6. `git checkout master && git merge dev`
7. Update the version number at the top of plugin/vimwiki.vim.
8. Set a tag with the version number in Git: `git tag vX.Y`
9. `git push --tags`
10. In GitHub, go to _Releases_ -> _Draft a new release_ -> choose the tag, convert the changelog from the
doc to markdown and post it there. Make plans to build an automatic converter and immediately
forget this plan.
11. Tell the world.
%% vim:tw=99

View File

@ -105,6 +105,19 @@ Commands
* `:Vimwiki2HTML` -- Convert current wiki link to HTML * `:Vimwiki2HTML` -- Convert current wiki link to HTML
* `:VimwikiAll2HTML` -- Convert all your wiki links to HTML * `:VimwikiAll2HTML` -- Convert all your wiki links to HTML
* `:help vimwiki-commands` -- list all commands * `:help vimwiki-commands` -- list all commands
* `:help vimwiki` -- General vimwiki help docs
Changing Wiki Syntax
------------------------------------------------------------------------------
Vimwiki currently ships with 3 syntaxes: Vimwiki (default), Markdown (markdown), and MediaWiki (media)
If you would prefer to use either Markdown or MediaWiki syntaxes, set the following option in your .vimrc:
```
let g:vimwiki_list = [{'path': '~/vimwiki/',
\ 'syntax': 'markdown', 'ext': '.md'}]
```
Installation Installation
@ -135,6 +148,15 @@ Installation using [Pathogen](http://www.vim.org/scripts/script.php?script_id=23
cd bundle cd bundle
git clone https://github.com/vimwiki/vimwiki.git git clone https://github.com/vimwiki/vimwiki.git
Installation using [Vim-Plug](https://github.com/junegunn/vim-plug)
------------------------------------------------------------------------------
Add the following to the plugin-configuration in your vimrc:
Plug 'vimwiki/vimwiki', { 'branch': 'dev' }
Then run `:PlugInstall`.
Installation using [Vundle](https://github.com/VundleVim/Vundle.vim) Installation using [Vundle](https://github.com/VundleVim/Vundle.vim)
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
@ -146,6 +168,14 @@ Or download the [zip archive](https://github.com/vimwiki/vimwiki/archive/master.
Then launch Vim, run `:Helptags` and then `:help vimwiki` to verify it was installed. Then launch Vim, run `:Helptags` and then `:help vimwiki` to verify it was installed.
Getting help
==============================================================================
Have a question? Visit the IRC channel `#vimwiki` on Freenode ([webchat](https://webchat.freenode.net/?channels=#vimwiki))
or post to the [mailing list](https://groups.google.com/forum/#!forum/vimwiki).
---- ----
\* Screenshots made with the [solarized colorscheme](https://github.com/altercation/vim-colors-solarized) \* Screenshots made with the [solarized colorscheme](https://github.com/altercation/vim-colors-solarized)
and [lightline](https://github.com/itchyny/lightline.vim) and [lightline](https://github.com/itchyny/lightline.vim)

View File

@ -46,14 +46,20 @@ endfunction
" Returns: the number of the wiki a file belongs to or -1 if it doesn't belong " Returns: the number of the wiki a file belongs to or -1 if it doesn't belong
" to any registered wiki. " to any registered wiki.
function! vimwiki#base#find_wiki(file) function! vimwiki#base#find_wiki(file)
let bestmatch = -1
let bestlen = 0
for idx in range(vimwiki#vars#number_of_wikis()) for idx in range(vimwiki#vars#number_of_wikis())
if vimwiki#path#is_file_in_dir(a:file, vimwiki#vars#get_wikilocal('path', idx)) let wiki_path = expand(vimwiki#vars#get_wikilocal('path', idx))
return idx let common_prefix = vimwiki#path#path_common_pfx(wiki_path, a:file)
if vimwiki#path#is_equal(common_prefix, wiki_path)
if len(common_prefix) > bestlen
let bestlen = len(common_prefix)
let bestmatch = idx
endif
endif endif
endfor endfor
" an orphan page has been detected return bestmatch
return -1
endfunction endfunction
@ -71,14 +77,9 @@ function! vimwiki#base#resolve_link(link_text, ...)
let link_text = a:link_text let link_text = a:link_text
" if link is schemeless add wikiN: scheme
if link_text !~# vimwiki#vars#get_global('rxSchemeUrl')
let link_text = 'wiki'.source_wiki.':'.link_text
endif
let link_infos = { let link_infos = {
\ 'index': -1, \ 'index': 0,
\ 'scheme': '', \ 'scheme': '',
\ 'is_file': 0, " 1 for a file, 0 for a URL (e.g. when the link was [[http://foo.bar]]), \ 'is_file': 0, " 1 for a file, 0 for a URL (e.g. when the link was [[http://foo.bar]]),
\ " -1 if the whole link was malformed \ " -1 if the whole link was malformed
@ -86,24 +87,29 @@ function! vimwiki#base#resolve_link(link_text, ...)
\ 'anchor': '', \ 'anchor': '',
\ } \ }
if link_text == ''
" extract scheme
let link_infos.scheme = matchstr(link_text, vimwiki#vars#get_global('rxSchemeUrlMatchScheme'))
if link_infos.scheme == '' || link_text == ''
let link_infos.is_file = -1 let link_infos.is_file = -1
return link_infos return link_infos
endif endif
if link_infos.scheme !~# '\mwiki\d\+\|diary\|local\|file'
" unknown scheme, may be a weblink let scheme = matchstr(link_text, '^\zs'.vimwiki#vars#get_global('rxSchemes').'\ze:')
let link_infos.is_file = 0 if scheme == ''
let link_infos.target = link_text let link_infos.scheme = 'wiki'.source_wiki
return link_infos else
let link_infos.scheme = scheme
if link_infos.scheme !~# '\mwiki\d\+\|diary\|local\|file'
" unknown scheme, may be a weblink
let link_infos.is_file = 0
let link_infos.target = link_text
return link_infos
endif
let link_infos.is_file = 1
let link_text = matchstr(link_text, '^'.vimwiki#vars#get_global('rxSchemes').':\zs.*\ze')
endif endif
let link_infos.is_file = 1
let link_text = matchstr(link_text, vimwiki#vars#get_global('rxSchemeUrlMatchUrl'))
let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' || link_infos.scheme ==# 'diary' let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' || link_infos.scheme ==# 'diary'
" extract anchor " extract anchor
@ -139,6 +145,7 @@ function! vimwiki#base#resolve_link(link_text, ...)
let link_infos.index = eval(matchstr(link_infos.scheme, '\D\+\zs\d\+\ze')) let link_infos.index = eval(matchstr(link_infos.scheme, '\D\+\zs\d\+\ze'))
if link_infos.index < 0 || link_infos.index >= vimwiki#vars#number_of_wikis() if link_infos.index < 0 || link_infos.index >= vimwiki#vars#number_of_wikis()
let link_infos.is_file = -1 let link_infos.is_file = -1
let link_infos.index = -1
return link_infos return link_infos
endif endif
@ -190,22 +197,32 @@ endfunction
function! vimwiki#base#system_open_link(url) function! vimwiki#base#system_open_link(url)
" handlers " handlers
function! s:win32_handler(url) function! s:win32_handler(url)
"http://vim.wikia.com/wiki/Opening_current_Vim_file_in_your_Windows_browser "Disable shellslash for cmd and command.com, but enable for all other shells
"disable 'shellslash', otherwise the url will be enclosed in single quotes, "See Issue #560
"which is problematic if (&shell =~? "cmd") || (&shell =~? "command.com")
"see https://github.com/vimwiki/vimwiki/issues/54#issuecomment-48011289
if exists('+shellslash') if exists('+shellslash')
let old_ssl = &shellslash let old_ssl = &shellslash
set noshellslash set noshellslash
let url = shellescape(a:url, 1) let url = shellescape(a:url, 1)
let &shellslash = old_ssl let &shellslash = old_ssl
else
let url = shellescape(a:url, 1)
endif
execute 'silent ! start "Title" /B ' . url
else else
let url = shellescape(a:url, 1)
endif if exists('+shellslash')
if &l:shell ==? "powershell" let old_ssl = &shellslash
execute 'silent ! start ' . a:url set shellslash
else let url = shellescape(a:url, 1)
execute 'silent ! start "Title" /B ' . a:url let &shellslash = old_ssl
else
let url = shellescape(a:url, 1)
endif
execute 'silent ! start ' . url
endif endif
endfunction endfunction
function! s:macunix_handler(url) function! s:macunix_handler(url)
@ -239,7 +256,11 @@ function! vimwiki#base#open_link(cmd, link, ...)
endif endif
if link_infos.is_file == -1 if link_infos.is_file == -1
echomsg 'Vimwiki Error: Unable to resolve link!' if link_infos.index == -1
echomsg 'Vimwiki Error: No registered wiki ''' . link_infos.scheme . '''.'
else
echomsg 'Vimwiki Error: Unable to resolve link!'
endif
return return
endif endif
@ -696,19 +717,22 @@ function! vimwiki#base#edit_file(command, filename, anchor, ...)
" This hack is necessary because apparently Vim messes up the result of " This hack is necessary because apparently Vim messes up the result of
" getpos() directly after this command. Strange. " getpos() directly after this command. Strange.
if !(a:command ==# ':e ' && vimwiki#path#is_equal(a:filename, expand('%:p'))) if !(a:command ==# ':e ' && vimwiki#path#is_equal(a:filename, expand('%:p')))
try if &autowriteall && !&hidden " in this case, the file is saved before switching to the
if &autowriteall && !&hidden " in this case, the file is saved before switching to the " new buffer. This causes Vim to show two messages in the command line which triggers
" new buffer. This causes Vim to show two messages in the command line which triggers " the annoying hit-enter prompt. Solution: show no messages at all.
" the annoying hit-enter prompt. Solution: show no messages at all. silent execute a:command fname
silent execute a:command fname else
else try
execute a:command fname execute a:command fname
endif catch /E37:/
catch /E37:/ echomsg 'Vimwiki: Can''t leave the current buffer, because it is modified. Hint: Take a look at'
echomsg 'Vimwiki: The current file is modified. Hint: Take a look at' \ ''':h g:vimwiki_autowriteall'' to see how to save automatically.'
\ ''':h g:vimwiki_autowriteall'' to see how to save automatically.' return
return catch /E325:/
endtry echom 'Vimwiki: Vim couldn''t open the file, probably because a swapfile already exists. See :h E325.'
return
endtry
endif
" If the opened file was not already loaded by Vim, an autocommand is " If the opened file was not already loaded by Vim, an autocommand is
" triggered at this point " triggered at this point
@ -825,16 +849,17 @@ function! s:update_wiki_link(fname, old, new)
endfunction endfunction
function! s:update_wiki_links_dir(dir, old_fname, new_fname) function! s:update_wiki_links_dir(wiki_nr, dir, old_fname, new_fname)
let old_fname = substitute(a:old_fname, '[/\\]', '[/\\\\]', 'g') let old_fname = substitute(a:old_fname, '[/\\]', '[/\\\\]', 'g')
let new_fname = a:new_fname let new_fname = a:new_fname
let old_fname_r = vimwiki#base#apply_template( let old_fname_r = vimwiki#base#apply_template(
\ vimwiki#vars#get_syntaxlocal('WikiLinkMatchUrlTemplate'), old_fname, '', '') \ vimwiki#vars#get_syntaxlocal('WikiLinkMatchUrlTemplate',
\ vimwiki#vars#get_wikilocal('syntax', a:wiki_nr)), old_fname, '', '')
let files = split(glob(vimwiki#vars#get_wikilocal('path').a:dir.'*'. let files = split(glob(vimwiki#vars#get_wikilocal('path', a:wiki_nr).a:dir.'*'.
\ vimwiki#vars#get_wikilocal('ext')), '\n') \ vimwiki#vars#get_wikilocal('ext', a:wiki_nr)), '\n')
for fname in files for fname in l:files
call s:update_wiki_link(fname, old_fname_r, new_fname) call s:update_wiki_link(fname, old_fname_r, new_fname)
endfor endfor
endfunction endfunction
@ -848,11 +873,11 @@ function! s:tail_name(fname)
endfunction endfunction
function! s:update_wiki_links(old_fname, new_fname) function! s:update_wiki_links(wiki_nr, old_fname, new_fname,old_fname_relpath)
let old_fname = a:old_fname let old_fname = a:old_fname
let new_fname = a:new_fname let new_fname = a:new_fname
let subdirs = split(a:old_fname, '[/\\]')[: -2] let subdirs = split(a:old_fname_relpath, '[/\\]')[: -2]
" TODO: Use Dictionary here... " TODO: Use Dictionary here...
let dirs_keys = [''] let dirs_keys = ['']
@ -874,7 +899,7 @@ function! s:update_wiki_links(old_fname, new_fname)
while idx < len(dirs_keys) while idx < len(dirs_keys)
let dir = dirs_keys[idx] let dir = dirs_keys[idx]
let new_dir = dirs_vals[idx] let new_dir = dirs_vals[idx]
call s:update_wiki_links_dir(dir, new_dir.old_fname, new_dir.new_fname) call s:update_wiki_links_dir(a:wiki_nr, dir, new_dir.old_fname, new_dir.new_fname)
let idx = idx + 1 let idx = idx + 1
endwhile endwhile
endfunction endfunction
@ -974,7 +999,7 @@ endfunction
" will only be updated if it already exists " will only be updated if it already exists
function! vimwiki#base#update_listing_in_buffer(strings, start_header, function! vimwiki#base#update_listing_in_buffer(strings, start_header,
\ content_regex, default_lnum, create) \ content_regex, default_lnum, create)
" apparently, Vim behaves strange when files change while in diff mode " Vim behaves strangely when files change while in diff mode
if &diff || &readonly if &diff || &readonly
return return
endif endif
@ -1020,8 +1045,8 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header,
" fold gets deleted. So we temporarily disable folds, and then reenable " fold gets deleted. So we temporarily disable folds, and then reenable
" them right back. " them right back.
let foldenable_save = &l:foldenable let foldenable_save = &l:foldenable
setlo nofoldenable setlocal nofoldenable
silent exe start_lnum.','.string(end_lnum - 1).'delete _' silent exe 'keepjumps ' . start_lnum.','.string(end_lnum - 1).'delete _'
let &l:foldenable = foldenable_save let &l:foldenable = foldenable_save
let lines_diff = 0 - (end_lnum - start_lnum) let lines_diff = 0 - (end_lnum - start_lnum)
else else
@ -1036,16 +1061,16 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header,
let new_header = whitespaces_in_first_line let new_header = whitespaces_in_first_line
\ . s:safesubstitute(vimwiki#vars#get_syntaxlocal('rxH1_Template'), \ . s:safesubstitute(vimwiki#vars#get_syntaxlocal('rxH1_Template'),
\ '__Header__', a:start_header, '') \ '__Header__', a:start_header, '')
call append(start_lnum - 1, new_header) keepjumps call append(start_lnum - 1, new_header)
let start_lnum += 1 let start_lnum += 1
let lines_diff += 1 + len(a:strings) let lines_diff += 1 + len(a:strings)
for string in a:strings for string in a:strings
call append(start_lnum - 1, string) keepjumps call append(start_lnum - 1, string)
let start_lnum += 1 let start_lnum += 1
endfor endfor
" append an empty line if there is not one " append an empty line if there is not one
if start_lnum <= line('$') && getline(start_lnum) !~# '\m^\s*$' if start_lnum <= line('$') && getline(start_lnum) !~# '\m^\s*$'
call append(start_lnum - 1, '') keepjumps call append(start_lnum - 1, '')
let lines_diff += 1 let lines_diff += 1
endif endif
@ -1077,8 +1102,10 @@ function! vimwiki#base#find_prev_link()
endfunction endfunction
" This is an API function, that is, remappable by the user. Don't change the signature. function! vimwiki#base#follow_link(split, ...)
function! vimwiki#base#follow_link(split, reuse, move_cursor, ...) let reuse_other_split_window = a:0 >= 1 ? a:1 : 0
let move_cursor_to_new_window = a:0 >= 2 ? a:2 : 1
" Parse link at cursor and pass to VimwikiLinkHandler, or failing that, the " Parse link at cursor and pass to VimwikiLinkHandler, or failing that, the
" default open_link handler " default open_link handler
@ -1114,7 +1141,7 @@ function! vimwiki#base#follow_link(split, reuse, move_cursor, ...)
" if we want to and can reuse a split window, jump to that window and open " if we want to and can reuse a split window, jump to that window and open
" the new file there " the new file there
if (a:split ==# 'hsplit' || a:split ==# 'vsplit') && a:reuse if (a:split ==# 'hsplit' || a:split ==# 'vsplit') && reuse_other_split_window
let previous_window_nr = winnr('#') let previous_window_nr = winnr('#')
if previous_window_nr > 0 && previous_window_nr != winnr() if previous_window_nr > 0 && previous_window_nr != winnr()
execute previous_window_nr . 'wincmd w' execute previous_window_nr . 'wincmd w'
@ -1138,7 +1165,7 @@ function! vimwiki#base#follow_link(split, reuse, move_cursor, ...)
call vimwiki#base#open_link(cmd, lnk) call vimwiki#base#open_link(cmd, lnk)
if !a:move_cursor if !move_cursor_to_new_window
if (a:split ==# 'hsplit' || a:split ==# 'vsplit') if (a:split ==# 'hsplit' || a:split ==# 'vsplit')
execute 'wincmd p' execute 'wincmd p'
elseif a:split ==# 'tab' elseif a:split ==# 'tab'
@ -1147,8 +1174,8 @@ function! vimwiki#base#follow_link(split, reuse, move_cursor, ...)
endif endif
else else
if a:0 > 0 if a:0 >= 3
execute "normal! ".a:1 execute "normal! ".a:3
else else
call vimwiki#base#normalize_link(0) call vimwiki#base#normalize_link(0)
endif endif
@ -1247,12 +1274,10 @@ function! vimwiki#base#rename_link()
let new_link = input('Enter new name: ') let new_link = input('Enter new name: ')
if new_link =~# '[/\\]' if new_link =~# '[/\\]'
" It is actually doable but I do not have free time to do it.
echomsg 'Vimwiki Error: Cannot rename to a filename with path!' echomsg 'Vimwiki Error: Cannot rename to a filename with path!'
return return
endif endif
" check new_fname - it should be 'good', not empty
if substitute(new_link, '\s', '', 'g') == '' if substitute(new_link, '\s', '', 'g') == ''
echomsg 'Vimwiki Error: Cannot rename to an empty filename!' echomsg 'Vimwiki Error: Cannot rename to an empty filename!'
return return
@ -1264,6 +1289,7 @@ function! vimwiki#base#rename_link()
endif endif
let new_link = subdir.new_link let new_link = subdir.new_link
let wiki_nr = vimwiki#vars#get_bufferlocal("wiki_nr")
let new_fname = vimwiki#vars#get_wikilocal('path') . new_link . vimwiki#vars#get_wikilocal('ext') let new_fname = vimwiki#vars#get_wikilocal('path') . new_link . vimwiki#vars#get_wikilocal('ext')
" do not rename if file with such name exists " do not rename if file with such name exists
@ -1307,7 +1333,7 @@ function! vimwiki#base#rename_link()
setlocal nomore setlocal nomore
" update links " update links
call s:update_wiki_links(s:tail_name(old_fname), new_link) call s:update_wiki_links(wiki_nr, s:tail_name(old_fname), s:tail_name(new_link),old_fname)
" restore wiki buffers " restore wiki buffers
for bitem in blist for bitem in blist
@ -1760,13 +1786,31 @@ endfunction
" a:create == 0: update if TOC exists " a:create == 0: update if TOC exists
function! vimwiki#base#table_of_contents(create) function! vimwiki#base#table_of_contents(create)
let headers = s:collect_headers() let headers = s:collect_headers()
let toc_header_text = vimwiki#vars#get_global('toc_header')
if !a:create
" Do nothing if there is no TOC to update. (This is a small performance optimization -- if
" auto_toc == 1, but the current buffer has no TOC but is long, saving the buffer could
" otherwise take a few seconds for nothing.)
let toc_already_present = 0
for entry in headers
if entry[2] ==# toc_header_text
let toc_already_present = 1
break
endif
endfor
if !toc_already_present
return
endif
endif
let numbering = vimwiki#vars#get_global('html_header_numbering') let numbering = vimwiki#vars#get_global('html_header_numbering')
let headers_levels = [['', 0], ['', 0], ['', 0], ['', 0], ['', 0], ['', 0]] let headers_levels = [['', 0], ['', 0], ['', 0], ['', 0], ['', 0], ['', 0]]
let complete_header_infos = [] let complete_header_infos = []
for header in headers for header in headers
let h_text = header[2] let h_text = header[2]
let h_level = header[1] let h_level = header[1]
if h_text ==# vimwiki#vars#get_global('toc_header') " don't include the TOC's header itself if h_text ==# toc_header_text " don't include the TOC's header itself
continue continue
endif endif
let headers_levels[h_level-1] = [h_text, headers_levels[h_level-1][1]+1] let headers_levels[h_level-1] = [h_text, headers_levels[h_level-1][1]+1]
@ -1794,18 +1838,20 @@ function! vimwiki#base#table_of_contents(create)
let indentstring = repeat(' ', vimwiki#u#sw()) let indentstring = repeat(' ', vimwiki#u#sw())
let bullet = vimwiki#lst#default_symbol().' ' let bullet = vimwiki#lst#default_symbol().' '
for [lvl, link, desc] in complete_header_infos for [lvl, link, desc] in complete_header_infos
let esc_link = substitute(link, "'", "''", 'g') if vimwiki#vars#get_wikilocal('syntax') == 'markdown'
let esc_desc = substitute(desc, "'", "''", 'g') let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template')
let link = s:safesubstitute(vimwiki#vars#get_global('WikiLinkTemplate2'), '__LinkUrl__', else
\ '#'.esc_link, '') let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2')
let link = s:safesubstitute(link, '__LinkDescription__', esc_desc, '') endif
let link = s:safesubstitute(link_tpl, '__LinkUrl__',
\ '#'.link, '')
let link = s:safesubstitute(link, '__LinkDescription__', desc, '')
call add(lines, startindent.repeat(indentstring, lvl-1).bullet.link) call add(lines, startindent.repeat(indentstring, lvl-1).bullet.link)
endfor endfor
let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' ' let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' '
call vimwiki#base#update_listing_in_buffer(lines, call vimwiki#base#update_listing_in_buffer(lines, toc_header_text, links_rx, 1, a:create)
\ vimwiki#vars#get_global('toc_header'), links_rx, 1, a:create)
endfunction endfunction
@ -1830,17 +1876,21 @@ endfunction
function! s:clean_url(url) function! s:clean_url(url)
let url = split(a:url, '/\|=\|-\|&\|?\|\.') " remove protocol and tld
let url = substitute(a:url, '^\a\+\d*:', '', '')
let url = substitute(url, '^//', '', '')
let url = substitute(url, '^\([^/]\+\)\.\a\{2,4}/', '\1/', '')
let url = split(url, '/\|=\|-\|&\|?\|\.')
let url = filter(url, 'v:val !=# ""') let url = filter(url, 'v:val !=# ""')
let url = filter(url, 'v:val !=# "www"') if url[0] == "www"
let url = filter(url, 'v:val !=# "com"') let url = url[1:]
let url = filter(url, 'v:val !=# "org"') endif
let url = filter(url, 'v:val !=# "net"') if url[-1] =~ '^\(htm\|html\|php\)$'
let url = filter(url, 'v:val !=# "edu"') let url = url[0:-2]
let url = filter(url, 'v:val !=# "http\:"') endif
let url = filter(url, 'v:val !=# "https\:"') " remove words consisting of only hexadecimal digits or non-word characters
let url = filter(url, 'v:val !=# "file\:"') let url = filter(url, 'v:val !~ "^\\A\\{4,}$"')
let url = filter(url, 'v:val !=# "xml\:"') let url = filter(url, 'v:val !~ "^\\x\\{4,}$" || v:val !~ "\\d"')
return join(url, " ") return join(url, " ")
endfunction endfunction
@ -1881,12 +1931,12 @@ function! s:normalize_link_in_diary(lnk)
let link_exists_in_wiki = filereadable(link_wiki) let link_exists_in_wiki = filereadable(link_wiki)
let link_is_date = a:lnk =~# '\d\d\d\d-\d\d-\d\d' let link_is_date = a:lnk =~# '\d\d\d\d-\d\d-\d\d'
if ! link_exists_in_wiki || link_exists_in_diary || link_is_date if link_exists_in_diary || link_is_date
let str = a:lnk let str = a:lnk
let rxUrl = vimwiki#vars#get_global('rxWord') let rxUrl = vimwiki#vars#get_global('rxWord')
let rxDesc = '' let rxDesc = ''
let template = vimwiki#vars#get_global('WikiLinkTemplate1') let template = vimwiki#vars#get_global('WikiLinkTemplate1')
else elseif link_exists_in_wiki
let relative_link = let relative_link =
\ vimwiki#path#relpath(vimwiki#vars#get_wikilocal('diary_path'), \ vimwiki#path#relpath(vimwiki#vars#get_wikilocal('diary_path'),
\ vimwiki#vars#get_wikilocal('path')) \ vimwiki#vars#get_wikilocal('path'))
@ -1894,6 +1944,11 @@ function! s:normalize_link_in_diary(lnk)
let rxUrl = '^.*\ze|' let rxUrl = '^.*\ze|'
let rxDesc = '|\zs.*$' let rxDesc = '|\zs.*$'
let template = vimwiki#vars#get_global('WikiLinkTemplate2') let template = vimwiki#vars#get_global('WikiLinkTemplate2')
else
let str = a:lnk
let rxUrl = '.*'
let rxDesc = ''
let template = vimwiki#vars#get_global('WikiLinkTemplate1')
endif endif
return vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) return vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template)
@ -1937,9 +1992,8 @@ function! s:normalize_link_syntax_n()
if s:is_diary_file(expand("%:p")) if s:is_diary_file(expand("%:p"))
let sub = s:normalize_link_in_diary(lnk) let sub = s:normalize_link_in_diary(lnk)
else else
let sub = vimwiki#base#normalize_link_helper(lnk, let sub = s:safesubstitute(
\ vimwiki#vars#get_global('rxWord'), '', \ vimwiki#vars#get_global('WikiLinkTemplate1'), '__LinkUrl__', lnk, '')
\ vimwiki#vars#get_global('WikiLinkTemplate1'))
endif endif
call vimwiki#base#replacestr_at_cursor('\V'.lnk, sub) call vimwiki#base#replacestr_at_cursor('\V'.lnk, sub)
return return

View File

@ -149,17 +149,21 @@ function! s:format_diary()
\ '__Header__', s:get_month_name(month), '')) \ '__Header__', s:get_month_name(month), ''))
for [fl, cap] in s:sort(items(g_files[year][month])) for [fl, cap] in s:sort(items(g_files[year][month]))
if empty(cap) let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2')
let entry = substitute(vimwiki#vars#get_global('WikiLinkTemplate1'),
\ '__LinkUrl__', fl, '') if vimwiki#vars#get_wikilocal('syntax') == 'markdown'
let entry = substitute(entry, '__LinkDescription__', cap, '') let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template')
call add(result, repeat(' ', vimwiki#lst#get_list_margin()).'* '.entry)
else if empty(cap) " When using markdown syntax, we should ensure we always have a link description.
let entry = substitute(vimwiki#vars#get_global('WikiLinkTemplate2'), let cap = fl
\ '__LinkUrl__', fl, '') endif
let entry = substitute(entry, '__LinkDescription__', cap, '') elseif empty(cap)
call add(result, repeat(' ', vimwiki#lst#get_list_margin()).'* '.entry) let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
endif endif
let entry = substitute(link_tpl, '__LinkUrl__', fl, '')
let entry = substitute(entry, '__LinkDescription__', cap, '')
call add(result, repeat(' ', vimwiki#lst#get_list_margin()).'* '.entry)
endfor endfor
endfor endfor
@ -169,20 +173,27 @@ function! s:format_diary()
endfunction endfunction
" The given wiki number a:wnum is 1 for the first wiki, 2 for the second and so on. This is in
" contrast to most other places, where counting starts with 0. When a:wnum is 0, the current wiki
" is used.
function! vimwiki#diary#make_note(wnum, ...) function! vimwiki#diary#make_note(wnum, ...)
if a:wnum > vimwiki#vars#number_of_wikis() if a:wnum == 0
echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in g:vimwiki_list!' let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
if wiki_nr < 0 " this happens when e.g. VimwikiMakeDiaryNote was called outside a wiki buffer
let wiki_nr = 0
endif
else
let wiki_nr = a:wnum - 1
endif
if wiki_nr >= vimwiki#vars#number_of_wikis()
echomsg 'Vimwiki Error: Wiki '.wiki_nr.' is not registered in g:vimwiki_list!'
return return
endif endif
" TODO: refactor it. base#goto_index uses the same " TODO: refactor it. base#goto_index uses the same
if a:wnum > 0
let idx = a:wnum - 1
else
let idx = 0
endif
call vimwiki#path#mkdir(vimwiki#vars#get_wikilocal('diary_path', idx)) call vimwiki#path#mkdir(vimwiki#vars#get_wikilocal('diary_path', wiki_nr))
let cmd = 'edit' let cmd = 'edit'
if a:0 if a:0
@ -200,7 +211,7 @@ function! vimwiki#diary#make_note(wnum, ...)
let link = 'diary:'.vimwiki#diary#diary_date_link() let link = 'diary:'.vimwiki#diary#diary_date_link()
endif endif
call vimwiki#base#open_link(cmd, link, s:diary_index(idx)) call vimwiki#base#open_link(cmd, link, s:diary_index(wiki_nr))
endfunction endfunction
@ -218,6 +229,11 @@ function! vimwiki#diary#goto_diary_index(wnum)
endif endif
call vimwiki#base#edit_file('e', s:diary_index(idx), '') call vimwiki#base#edit_file('e', s:diary_index(idx), '')
if vimwiki#vars#get_wikilocal('auto_diary_index')
call vimwiki#diary#generate_diary_section()
write! " save changes
endif
endfunction endfunction
@ -295,8 +311,7 @@ function! vimwiki#diary#calendar_action(day, month, year, week, dir)
endif endif
endif endif
" XXX: Well, +1 is for inconsistent index basing... call vimwiki#diary#make_note(0, 0, link)
call vimwiki#diary#make_note(vimwiki#vars#get_bufferlocal('wiki_nr')+1, 0, link)
endfunction endfunction

View File

@ -183,13 +183,6 @@ function! s:subst_func(line, regexp, func, ...)
endfunction endfunction
function! s:save_vimwiki_buffer()
if &filetype ==? 'vimwiki' && filewritable(expand('%'))
silent update
endif
endfunction
function! s:process_date(placeholders, default_date) function! s:process_date(placeholders, default_date)
if !empty(a:placeholders) if !empty(a:placeholders)
for [placeholder, row, idx] in a:placeholders for [placeholder, row, idx] in a:placeholders
@ -346,7 +339,7 @@ endfunction
function! s:linkify_link(src, descr) function! s:linkify_link(src, descr)
let src_str = ' href="'.s:escape_html_attribute(a:src).'"' let src_str = ' href="'.s:escape_html_attribute(a:src).'"'
let descr = substitute(a:descr,'^\s*\(.*\)\s*$','\1','') let descr = vimwiki#u#trim(a:descr)
let descr = (descr == "" ? a:src : descr) let descr = (descr == "" ? a:src : descr)
let descr_str = (descr =~# vimwiki#vars#get_global('rxWikiIncl') let descr_str = (descr =~# vimwiki#vars#get_global('rxWikiIncl')
\ ? s:tag_wikiincl(descr) \ ? s:tag_wikiincl(descr)
@ -419,7 +412,8 @@ function! s:tag_wikilink(value)
let str = a:value let str = a:value
let url = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl')) let url = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'))
let descr = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr')) let descr = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'))
let descr = (substitute(descr,'^\s*\(.*\)\s*$','\1','') != '' ? descr : url) let descr = vimwiki#u#trim(descr)
let descr = (descr != '' ? descr : url)
let line = VimwikiLinkConverter(url, s:current_wiki_file, s:current_html_file) let line = VimwikiLinkConverter(url, s:current_wiki_file, s:current_html_file)
if line == '' if line == ''
@ -814,7 +808,7 @@ function! s:process_tag_math(line, math)
" environment properly " environment properly
let s:current_math_env = matchstr(class, '^%\zs\S\+\ze%') let s:current_math_env = matchstr(class, '^%\zs\S\+\ze%')
if s:current_math_env != "" if s:current_math_env != ""
call add(lines, substitute(class, '^%\(\S\+\)%','\\begin{\1}', '')) call add(lines, substitute(class, '^%\(\S\+\)%', '\\begin{\1}', ''))
elseif class != "" elseif class != ""
call add(lines, "\\\[".class) call add(lines, "\\\[".class)
else else
@ -1560,9 +1554,11 @@ function! vimwiki#html#WikiAll2HTML()
echomsg 'Vimwiki: Saving Vimwiki files ...' echomsg 'Vimwiki: Saving Vimwiki files ...'
let save_eventignore = &eventignore let save_eventignore = &eventignore
let &eventignore = "all" let &eventignore = "all"
let cur_buf = bufname('%') try
bufdo call s:save_vimwiki_buffer() wall
exe 'buffer '.cur_buf catch
" just ignore errors
endtry
let &eventignore = save_eventignore let &eventignore = save_eventignore
let path_html = vimwiki#vars#get_wikilocal('path_html') let path_html = vimwiki#vars#get_wikilocal('path_html')

View File

@ -299,6 +299,13 @@ function! s:regexp_of_marker(item)
endfunction endfunction
" Returns: Whether or not the checkbox of a list item is [X] or [-]
function! s:is_closed(item)
let state = a:item.cb
return state ==# vimwiki#vars#get_syntaxlocal('listsyms_list')[-1]
\ || state ==# vimwiki#vars#get_global('listsym_rejected')
endfunction
" --------------------------------------------------------- " ---------------------------------------------------------
" functions for navigating between items " functions for navigating between items
" --------------------------------------------------------- " ---------------------------------------------------------
@ -756,10 +763,47 @@ function! s:set_state(item, new_rate)
endfunction endfunction
"Set state of the list item to [ ] or [o] or whatever " Sets the state of the list item to [ ] or [o] or whatever. Updates the states of its child items.
"Updates the states of its child items " If the new state should be [X] or [-], the state of the current list item is changed to this
function! s:set_state_plus_children(item, new_rate) " state, but if a child item already has [X] or [-] it is left alone.
call s:set_state(a:item, a:new_rate) function! s:set_state_plus_children(item, new_rate, ...)
let retain_state_if_closed = a:0 > 0 && a:1 > 0
if !(retain_state_if_closed && (a:new_rate == 100 || a:new_rate == -1) && s:is_closed(a:item))
call s:set_state(a:item, a:new_rate)
endif
let all_children_are_done = 1
let all_children_are_rejected = 1
let child_item = s:get_first_child(a:item)
while 1
if child_item.type == 0
break
endif
if child_item.cb != vimwiki#vars#get_global('listsym_rejected')
let all_children_are_rejected = 0
endif
if child_item.cb != vimwiki#vars#get_syntaxlocal('listsyms_list')[-1]
let all_children_are_done = 0
endif
if !all_children_are_done && !all_children_are_rejected
break
endif
let child_item = s:get_next_child_item(a:item, child_item)
endwhile
if (a:new_rate == 100 && all_children_are_done) ||
\ (a:new_rate == -1) && all_children_are_rejected
return
endif
if (a:new_rate == -1 && all_children_are_done) ||
\ (a:new_rate == 100 && all_children_are_rejected)
let retain_closed_children = 0
else
let retain_closed_children = 1
endif
let child_item = s:get_first_child(a:item) let child_item = s:get_first_child(a:item)
while 1 while 1
@ -767,7 +811,7 @@ function! s:set_state_plus_children(item, new_rate)
break break
endif endif
if child_item.cb != '' if child_item.cb != ''
call s:set_state_plus_children(child_item, a:new_rate) call s:set_state_plus_children(child_item, a:new_rate, retain_closed_children)
endif endif
let child_item = s:get_next_child_item(a:item, child_item) let child_item = s:get_next_child_item(a:item, child_item)
endwhile endwhile
@ -802,6 +846,7 @@ function! s:update_state(item)
let sum_children_rate = 0 let sum_children_rate = 0
let count_children_with_cb = 0 let count_children_with_cb = 0
let count_rejected_children = 0
let child_item = s:get_first_child(a:item) let child_item = s:get_first_child(a:item)
@ -811,16 +856,24 @@ function! s:update_state(item)
endif endif
if child_item.cb != '' if child_item.cb != ''
let rate = s:get_rate(child_item) let rate = s:get_rate(child_item)
if rate != -1 if rate == -1
let count_children_with_cb += 1 " for calculating the parent rate, a [-] item counts as much as a [X] item ...
let sum_children_rate += rate let rate = 100
" ... with the exception that a parent with *only* [-] items will be [-] too
let count_rejected_children += 1
endif endif
let count_children_with_cb += 1
let sum_children_rate += rate
endif endif
let child_item = s:get_next_child_item(a:item, child_item) let child_item = s:get_next_child_item(a:item, child_item)
endwhile endwhile
if count_children_with_cb > 0 if count_children_with_cb > 0
let new_rate = sum_children_rate / count_children_with_cb if count_rejected_children == count_children_with_cb
let new_rate = -1
else
let new_rate = sum_children_rate / count_children_with_cb
endif
call s:set_state_recursively(a:item, new_rate) call s:set_state_recursively(a:item, new_rate)
else else
let rate = s:get_rate(a:item) let rate = s:get_rate(a:item)
@ -841,13 +894,13 @@ endfunction
"Creates checkbox in a list item. "Creates checkbox in a list item.
"Returns: 1 if successful "Returns: 1 if successful
function! s:create_cb(item) function! s:create_cb(item, start_rate)
if a:item.type == 0 || a:item.cb != '' if a:item.type == 0 || a:item.cb != ''
return 0 return 0
endif endif
let new_item = a:item let new_item = a:item
let new_item.cb = vimwiki#vars#get_syntaxlocal('listsyms_list')[0] let new_item.cb = s:rate_to_state(a:start_rate)
call s:substitute_rx_in_line(new_item.lnum, call s:substitute_rx_in_line(new_item.lnum,
\ vimwiki#u#escape(new_item.mrkr) . '\zs\ze', ' [' . new_item.cb . ']') \ vimwiki#u#escape(new_item.mrkr) . '\zs\ze', ' [' . new_item.cb . ']')
@ -866,8 +919,7 @@ function! s:remove_cb(item)
endfunction endfunction
"Change state of checkbox " Change state of the checkboxes in the lines of the given range
"in the lines of the given range
function! s:change_cb(from_line, to_line, new_rate) function! s:change_cb(from_line, to_line, new_rate)
let from_item = s:get_corresponding_item(a:from_line) let from_item = s:get_corresponding_item(a:from_line)
if from_item.type == 0 if from_item.type == 0
@ -894,9 +946,9 @@ function! s:change_cb(from_line, to_line, new_rate)
endfunction endfunction
"Toggles checkbox between two states in the lines of the given range, " Toggles checkbox between two states in the lines of the given range, creates checkboxes (with
"creates chceckboxes if there aren't any. " a:start_rate as state) if there aren't any.
function! s:toggle_create_cb(from_line, to_line, state1, state2) function! s:toggle_create_cb(from_line, to_line, state1, state2, start_rate)
let from_item = s:get_corresponding_item(a:from_line) let from_item = s:get_corresponding_item(a:from_line)
if from_item.type == 0 if from_item.type == 0
return return
@ -908,7 +960,7 @@ function! s:toggle_create_cb(from_line, to_line, state1, state2)
let parent_items_of_lines = [] let parent_items_of_lines = []
for cur_ln in range(from_item.lnum, a:to_line) for cur_ln in range(from_item.lnum, a:to_line)
let cur_item = s:get_item(cur_ln) let cur_item = s:get_item(cur_ln)
let success = s:create_cb(cur_item) let success = s:create_cb(cur_item, a:start_rate)
if success if success
let cur_parent_item = s:get_parent(cur_item) let cur_parent_item = s:get_parent(cur_item)
@ -974,46 +1026,14 @@ endfunction
"Toggles checkbox between [ ] and [X] or creates one "Toggles checkbox between [ ] and [X] or creates one
"in the lines of the given range "in the lines of the given range
function! vimwiki#lst#toggle_cb(from_line, to_line) function! vimwiki#lst#toggle_cb(from_line, to_line)
return s:toggle_create_cb(a:from_line, a:to_line, 100, 0) return s:toggle_create_cb(a:from_line, a:to_line, 100, 0, 0)
endfunction endfunction
"Toggles checkbox between [ ] and [-] or creates one "Toggles checkbox between [ ] and [-] or creates one
"in the lines of the given range "in the lines of the given range
function! vimwiki#lst#toggle_rejected_cb(from_line, to_line) function! vimwiki#lst#toggle_rejected_cb(from_line, to_line)
return s:toggle_create_cb(a:from_line, a:to_line, -1, 0) return s:toggle_create_cb(a:from_line, a:to_line, -1, 0, -1)
endfunction
"Increment checkbox between [ ] and [X]
"in the lines of the given range
function! vimwiki#lst#increment_cb(from_line, to_line)
let from_item = s:get_corresponding_item(a:from_line)
if from_item.type == 0
return
endif
"if from_line has CB, increment it and set all siblings to the same new state
let rate_first_line = s:get_rate(from_item)
let n = len(vimwiki#vars#get_syntaxlocal('listsyms_list'))
let new_rate = min([rate_first_line + 100/(n-1)+1, 100])
call s:change_cb(a:from_line, a:to_line, new_rate)
endfunction
"Toggles checkbox between [ ] and [X] or creates one
"in the lines of the given range
function! vimwiki#lst#toggle_cb(from_line, to_line)
return s:toggle_create_cb(a:from_line, a:to_line, 100, 0)
endfunction
"Toggles checkbox between [ ] and [-] or creates one
"in the lines of the given range
function! vimwiki#lst#toggle_rejected_cb(from_line, to_line)
return s:toggle_create_cb(a:from_line, a:to_line, -1, 0)
endfunction endfunction
@ -1395,7 +1415,7 @@ function! s:clone_marker_from_to(from, to)
let new_indent = ( vimwiki#vars#get_syntaxlocal('recurring_bullets') ? 0 : indent(a:from) ) let new_indent = ( vimwiki#vars#get_syntaxlocal('recurring_bullets') ? 0 : indent(a:from) )
call s:set_indent(a:to, new_indent) call s:set_indent(a:to, new_indent)
if item_from.cb != '' if item_from.cb != ''
call s:create_cb(s:get_item(a:to)) call s:create_cb(s:get_item(a:to), 0)
call s:update_state(s:get_parent(s:get_item(a:to))) call s:update_state(s:get_parent(s:get_item(a:to)))
endif endif
if item_from.type == 2 if item_from.type == 2

View File

@ -13,7 +13,7 @@
" global user variables and syntax stuff which is the same for every syntax. " global user variables and syntax stuff which is the same for every syntax.
" "
" - wiki-local variables. They are stored in g:vimwiki_wikilocal_vars which is a list of " - wiki-local variables. They are stored in g:vimwiki_wikilocal_vars which is a list of
" dictionaries. One dict for every registered wiki. The last dictionary contains default values " dictionaries, one dict for every registered wiki. The last dictionary contains default values
" (used for temporary wikis). " (used for temporary wikis).
" "
" - syntax variables. Stored in the dict g:vimwiki_syntax_variables which holds all the regexes and " - syntax variables. Stored in the dict g:vimwiki_syntax_variables which holds all the regexes and
@ -28,82 +28,38 @@
function! s:populate_global_variables() function! s:populate_global_variables()
let g:vimwiki_global_vars = { let g:vimwiki_global_vars = {}
\ 'CJK_length': 0,
\ 'auto_chdir': 0,
\ 'autowriteall': 1,
\ 'conceallevel': 2,
\ 'diary_months':
\ {
\ 1: 'January', 2: 'February', 3: 'March',
\ 4: 'April', 5: 'May', 6: 'June',
\ 7: 'July', 8: 'August', 9: 'September',
\ 10: 'October', 11: 'November', 12: 'December'
\ },
\ 'dir_link': '',
\ 'ext2syntax': {},
\ 'folding': '',
\ 'global_ext': 1,
\ 'hl_cb_checked': 0,
\ 'hl_headers': 0,
\ 'html_header_numbering': 0,
\ 'html_header_numbering_sym': '',
\ 'list_ignore_newline': 1,
\ 'text_ignore_newline': 1,
\ 'listsyms': ' .oOX',
\ 'listsym_rejected': '-',
\ 'map_prefix': '<Leader>w',
\ 'menu': 'Vimwiki',
\ 'table_auto_fmt': 1,
\ 'table_mappings': 1,
\ 'toc_header': 'Contents',
\ 'url_maxsave': 15,
\ 'use_calendar': 1,
\ 'use_mouse': 0,
\ 'user_htmls': '',
\ 'valid_html_tags': 'b,i,s,u,sub,sup,kbd,br,hr,div,center,strong,em',
\ 'w32_dir_enc': '',
\ }
" copy the user's settings from variables of the form g:vimwiki_<option> into the dict call s:read_global_settings_from_user()
" g:vimwiki_global_vars (or set a default value) call s:normalize_global_settings()
for key in keys(g:vimwiki_global_vars)
if exists('g:vimwiki_'.key)
let g:vimwiki_global_vars[key] = g:vimwiki_{key}
endif
endfor
call s:validate_global_settings()
" non-configurable global variables: " non-configurable global variables:
" Scheme regexes must be defined even if syntax file is not loaded yet cause users should be " Scheme regexes must be defined even if syntax file is not loaded yet cause users should be
" able to <leader>w<leader>w without opening any vimwiki file first " able to <leader>w<leader>w without opening any vimwiki file first
let g:vimwiki_global_vars.schemes = 'wiki\d\+,diary,local' let g:vimwiki_global_vars.schemes = join(['wiki\d\+', 'diary', 'local'], '\|')
let g:vimwiki_global_vars.web_schemes1 = 'http,https,file,ftp,gopher,telnet,nntp,ldap,rsync'. let g:vimwiki_global_vars.web_schemes1 = join(['http', 'https', 'file', 'ftp', 'gopher',
\ ',imap,pop,irc,ircs,cvs,svn,svn+ssh,git,ssh,fish,sftp' \ 'telnet', 'nntp', 'ldap', 'rsync', 'imap', 'pop', 'irc', 'ircs', 'cvs', 'svn', 'svn+ssh',
let web_schemes2 = 'mailto,news,xmpp,sip,sips,doi,urn,tel,data' \ 'git', 'ssh', 'fish', 'sftp'], '\|')
let web_schemes2 =
\ join(['mailto', 'news', 'xmpp', 'sip', 'sips', 'doi', 'urn', 'tel', 'data'], '\|')
let rx_schemes = '\%('. let g:vimwiki_global_vars.rxSchemes = '\%('.
\ join(split(g:vimwiki_global_vars.schemes, '\s*,\s*'), '\|').'\|'. \ g:vimwiki_global_vars.schemes . '\|'.
\ join(split(g:vimwiki_global_vars.web_schemes1, '\s*,\s*'), '\|').'\|'. \ g:vimwiki_global_vars.web_schemes1 . '\|'.
\ join(split(web_schemes2, '\s*,\s*'), '\|'). \ web_schemes2 .
\ '\)' \ '\)'
let g:vimwiki_global_vars.rxSchemeUrl = rx_schemes.':.*'
let g:vimwiki_global_vars.rxSchemeUrlMatchScheme = '\zs'.rx_schemes.'\ze:.*'
let g:vimwiki_global_vars.rxSchemeUrlMatchUrl = rx_schemes.':\zs.*\ze'
" match URL for common protocols; see http://en.wikipedia.org/wiki/URI_scheme " match URL for common protocols; see http://en.wikipedia.org/wiki/URI_scheme
" http://tools.ietf.org/html/rfc3986 " http://tools.ietf.org/html/rfc3986
let rxWebProtocols = let rxWebProtocols =
\ '\%('. \ '\%('.
\ '\%('. \ '\%('.
\ '\%('.join(split(g:vimwiki_global_vars.web_schemes1, '\s*,\s*'), '\|').'\):'. \ '\%('.g:vimwiki_global_vars.web_schemes1 . '\):'.
\ '\%(//\)'. \ '\%(//\)'.
\ '\)'. \ '\)'.
\ '\|'. \ '\|'.
\ '\%('.join(split(web_schemes2, '\s*,\s*'), '\|').'\):'. \ '\%('.web_schemes2.'\):'.
\ '\)' \ '\)'
let g:vimwiki_global_vars.rxWeblinkUrl = rxWebProtocols . '\S\{-1,}'. '\%(([^ \t()]*)\)\=' let g:vimwiki_global_vars.rxWeblinkUrl = rxWebProtocols . '\S\{-1,}'. '\%(([^ \t()]*)\)\='
@ -183,15 +139,103 @@ function! s:populate_global_variables()
endfunction endfunction
function! s:validate_global_settings() function! s:read_global_settings_from_user()
let global_settings = {
\ 'CJK_length': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'auto_chdir': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'autowriteall': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'conceallevel': {'type': type(0), 'default': 2, 'min': 0, 'max': 3},
\ 'diary_months': {'type': type({}), 'default':
\ {
\ 1: 'January', 2: 'February', 3: 'March',
\ 4: 'April', 5: 'May', 6: 'June',
\ 7: 'July', 8: 'August', 9: 'September',
\ 10: 'October', 11: 'November', 12: 'December'
\ }},
\ 'dir_link': {'type': type(''), 'default': ''},
\ 'ext2syntax': {'type': type({}), 'default': {}},
\ 'folding': {'type': type(''), 'default': '', 'possible_values': ['', 'expr', 'syntax',
\ 'list', 'custom', ':quick', 'expr:quick', 'syntax:quick', 'list:quick',
\ 'custom:quick']},
\ 'global_ext': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'hl_cb_checked': {'type': type(0), 'default': 0, 'min': 0, 'max': 2},
\ 'hl_headers': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'html_header_numbering': {'type': type(0), 'default': 0, 'min': 0, 'max': 6},
\ 'html_header_numbering_sym': {'type': type(''), 'default': ''},
\ 'list_ignore_newline': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'text_ignore_newline': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'listsyms': {'type': type(''), 'default': ' .oOX', 'min_length': 2},
\ 'listsym_rejected': {'type': type(''), 'default': '-', 'length': 1},
\ 'map_prefix': {'type': type(''), 'default': '<Leader>w'},
\ 'menu': {'type': type(''), 'default': 'Vimwiki'},
\ 'table_auto_fmt': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'table_mappings': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'toc_header': {'type': type(''), 'default': 'Contents', 'min_length': 1},
\ 'url_maxsave': {'type': type(0), 'default': 15, 'min': 0},
\ 'use_calendar': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'use_mouse': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'user_htmls': {'type': type(''), 'default': ''},
\ 'valid_html_tags': {'type': type(''), 'default':
\ 'b,i,s,u,sub,sup,kbd,br,hr,div,center,strong,em'},
\ 'w32_dir_enc': {'type': type(''), 'default': ''},
\ }
" copy the user's settings from variables of the form g:vimwiki_<option> into the dict
" g:vimwiki_global_vars (or set a default value)
for key in keys(global_settings)
if exists('g:vimwiki_'.key)
let users_value = g:vimwiki_{key}
let value_infos = global_settings[key]
call s:check_users_value(key, users_value, value_infos, 1)
let g:vimwiki_global_vars[key] = users_value
else
let g:vimwiki_global_vars[key] = global_settings[key].default
endif
endfor
" validate some settings individually
let key = 'diary_months'
let users_value = g:vimwiki_global_vars[key]
for month in range(1, 12)
if !has_key(users_value, month) || type(users_value[month]) != type('') ||
\ empty(users_value[month])
echom printf('Vimwiki Error: The provided value ''%s'' of the option ''g:vimwiki_%s'' is'
\ . ' invalid. See '':h g:vimwiki_%s''.', string(users_value), key, key)
break
endif
endfor
let key = 'ext2syntax'
let users_value = g:vimwiki_global_vars[key]
for ext in keys(users_value)
if empty(ext) || index(['markdown', 'media', 'mediawiki', 'default'], users_value[ext]) == -1
echom printf('Vimwiki Error: The provided value ''%s'' of the option ''g:vimwiki_%s'' is'
\ . ' invalid. See '':h g:vimwiki_%s''.', string(users_value), key, key)
break
endif
endfor
endfunction
function! s:normalize_global_settings()
let g:vimwiki_global_vars.dir_link = let g:vimwiki_global_vars.dir_link =
\ vimwiki#path#file_segment(g:vimwiki_global_vars.dir_link) \ vimwiki#path#file_segment(g:vimwiki_global_vars.dir_link)
for extension in g:vimwiki_global_vars.ext2syntax let keys = keys(g:vimwiki_global_vars.ext2syntax)
if extension[0] != '.' for ext in keys
let g:vimwiki_global_vars.ext2syntax['.'.extension] = " ensure the file extensions in ext2syntax start with a dot
\ g:vimwiki_global_vars.ext2syntax[extension] if ext[0] != '.'
call remove(g:vimwiki_global_vars.ext2syntax, extension) let new_ext = '.' . ext
let g:vimwiki_global_vars.ext2syntax[new_ext] = g:vimwiki_global_vars.ext2syntax[ext]
call remove(g:vimwiki_global_vars.ext2syntax, ext)
endif
" for convenience, we also allow the term 'mediawiki'
if g:vimwiki_global_vars.ext2syntax[ext] ==# 'mediawiki'
let g:vimwiki_global_vars.ext2syntax[ext] = 'media'
endif endif
endfor endfor
@ -204,32 +248,32 @@ function! s:validate_global_settings()
endfunction endfunction
" g:vimwiki_wikilocal_vars is a list of dictionaries: one dict for every registered wiki plus one
" (the last in the list) which contains the default values (used for temporary wikis).
function! s:populate_wikilocal_options() function! s:populate_wikilocal_options()
let default_values = { let default_values = {
\ 'auto_export': 0, \ 'auto_diary_index': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'auto_tags': 0, \ 'auto_export': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'auto_toc': 0, \ 'auto_tags': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'automatic_nested_syntaxes': 1, \ 'auto_toc': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'css_name': 'style.css', \ 'automatic_nested_syntaxes': {'type': type(0), 'default': 1, 'min': 0, 'max': 1},
\ 'custom_wiki2html': '', \ 'css_name': {'type': type(''), 'default': 'style.css', 'min_length': 1},
\ 'custom_wiki2html_args': '', \ 'custom_wiki2html': {'type': type(''), 'default': ''},
\ 'diary_header': 'Diary', \ 'custom_wiki2html_args': {'type': type(''), 'default': ''},
\ 'diary_index': 'diary', \ 'diary_header': {'type': type(''), 'default': 'Diary', 'min_length': 1},
\ 'diary_rel_path': 'diary/', \ 'diary_index': {'type': type(''), 'default': 'diary', 'min_length': 1},
\ 'diary_sort': 'desc', \ 'diary_rel_path': {'type': type(''), 'default': 'diary/', 'min_length': 1},
\ 'ext': '.wiki', \ 'diary_sort': {'type': type(''), 'default': 'desc', 'possible_values': ['asc', 'desc']},
\ 'index': 'index', \ 'ext': {'type': type(''), 'default': '.wiki', 'min_length': 1},
\ 'list_margin': -1, \ 'index': {'type': type(''), 'default': 'index', 'min_length': 1},
\ 'maxhi': 0, \ 'list_margin': {'type': type(0), 'default': -1, 'min': -1},
\ 'nested_syntaxes': {}, \ 'maxhi': {'type': type(0), 'default': 0, 'min': 0, 'max': 1},
\ 'path': '~/vimwiki/', \ 'nested_syntaxes': {'type': type({}), 'default': {}},
\ 'path_html': '', \ 'path': {'type': type(''), 'default': $HOME . '/vimwiki/', 'min_length': 1},
\ 'syntax': 'default', \ 'path_html': {'type': type(''), 'default': ''},
\ 'template_default': 'default', \ 'syntax': {'type': type(''), 'default': 'default',
\ 'template_ext': '.tpl', \ 'possible_values': ['default', 'markdown', 'media', 'mediawiki']},
\ 'template_path': '~/vimwiki/templates/', \ 'template_default': {'type': type(''), 'default': 'default', 'min_length': 1},
\ 'template_ext': {'type': type(''), 'default': '.tpl'},
\ 'template_path': {'type': type(''), 'default': $HOME . '/vimwiki/templates/'},
\ } \ }
let g:vimwiki_wikilocal_vars = [] let g:vimwiki_wikilocal_vars = []
@ -237,9 +281,10 @@ function! s:populate_wikilocal_options()
let default_wiki_settings = {} let default_wiki_settings = {}
for key in keys(default_values) for key in keys(default_values)
if exists('g:vimwiki_'.key) if exists('g:vimwiki_'.key)
call s:check_users_value(key, g:vimwiki_{key}, default_values[key], 1)
let default_wiki_settings[key] = g:vimwiki_{key} let default_wiki_settings[key] = g:vimwiki_{key}
else else
let default_wiki_settings[key] = default_values[key] let default_wiki_settings[key] = default_values[key].default
endif endif
endfor endfor
@ -249,11 +294,10 @@ function! s:populate_wikilocal_options()
let new_wiki_settings = {} let new_wiki_settings = {}
for key in keys(default_values) for key in keys(default_values)
if has_key(users_wiki_settings, key) if has_key(users_wiki_settings, key)
call s:check_users_value(key, users_wiki_settings[key], default_values[key], 0)
let new_wiki_settings[key] = users_wiki_settings[key] let new_wiki_settings[key] = users_wiki_settings[key]
elseif exists('g:vimwiki_'.key)
let new_wiki_settings[key] = g:vimwiki_{key}
else else
let new_wiki_settings[key] = default_values[key] let new_wiki_settings[key] = default_wiki_settings[key]
endif endif
endfor endfor
@ -273,11 +317,79 @@ function! s:populate_wikilocal_options()
let temporary_wiki_settings.is_temporary_wiki = 1 let temporary_wiki_settings.is_temporary_wiki = 1
call add(g:vimwiki_wikilocal_vars, temporary_wiki_settings) call add(g:vimwiki_wikilocal_vars, temporary_wiki_settings)
call s:validate_wikilocal_settings() " check some values individually
let key = 'nested_syntaxes'
for wiki_settings in g:vimwiki_wikilocal_vars
let users_value = wiki_settings[key]
for keyword in keys(users_value)
if type(keyword) != type('') || empty(keyword) || type(users_value[keyword]) != type('') ||
\ empty(users_value[keyword])
echom printf('Vimwiki Error: The provided value ''%s'' of the option ''g:vimwiki_%s'' is'
\ . ' invalid. See '':h g:vimwiki_%s''.', string(users_value), key, key)
break
endif
endfor
endfor
call s:normalize_wikilocal_settings()
endfunction endfunction
function! s:validate_wikilocal_settings() function! s:check_users_value(key, users_value, value_infos, comes_from_global_variable)
let type_code_to_name = {
\ type(0): 'number',
\ type(''): 'string',
\ type([]): 'list',
\ type({}): 'dictionary'}
let setting_origin = a:comes_from_global_variable ?
\ printf('''g:vimwiki_%s''', a:key) :
\ printf('''%s'' in g:vimwiki_list', a:key)
if has_key(a:value_infos, 'type') && type(a:users_value) != a:value_infos.type
echom printf('Vimwiki Error: The provided value of the option %s is a %s, ' .
\ 'but expected is a %s. See '':h g:vimwiki_%s''.', setting_origin,
\ type_code_to_name[type(a:users_value)], type_code_to_name[a:value_infos.type], a:key)
endif
if a:value_infos.type == type(0) && has_key(a:value_infos, 'min') &&
\ a:users_value < a:value_infos.min
echom printf('Vimwiki Error: The provided value ''%i'' of the option %s is'
\ . ' too small. The minimum value is %i. See '':h g:vimwiki_%s''.', a:users_value,
\ setting_origin, a:value_infos.min, a:key)
endif
if a:value_infos.type == type(0) && has_key(a:value_infos, 'max') &&
\ a:users_value > a:value_infos.max
echom printf('Vimwiki Error: The provided value ''%i'' of the option %s is'
\ . ' too large. The maximum value is %i. See '':h g:vimwiki_%s''.', a:users_value,
\ setting_origin, a:value_infos.max, a:key)
endif
if has_key(a:value_infos, 'possible_values') &&
\ index(a:value_infos.possible_values, a:users_value) == -1
echom printf('Vimwiki Error: The provided value ''%s'' of the option %s is'
\ . ' invalid. Allowed values are %s. See ''g:vimwiki_%s''.', a:users_value,
\ setting_origin, string(a:value_infos.possible_values), a:key)
endif
if a:value_infos.type == type('') && has_key(a:value_infos, 'length') &&
\ strwidth(a:users_value) != a:value_infos.length
echom printf('Vimwiki Error: The provided value ''%s'' of the option %s must'
\ . ' contain exactly %i character(s) but has %i. See '':h g:vimwiki_%s''.',
\ a:users_value, setting_origin, a:value_infos.length, strwidth(a:users_value), a:key)
endif
if a:value_infos.type == type('') && has_key(a:value_infos, 'min_length') &&
\ strwidth(a:users_value) < a:value_infos.min_length
echom printf('Vimwiki Error: The provided value ''%s'' of the option %s must'
\ . ' have at least %d character(s) but has %d. See '':h g:vimwiki_%s''.', a:users_value,
\ setting_origin, a:value_infos.min_length, strwidth(a:users_value), a:key)
endif
endfunction
function! s:normalize_wikilocal_settings()
for wiki_settings in g:vimwiki_wikilocal_vars for wiki_settings in g:vimwiki_wikilocal_vars
let wiki_settings.css_name = vimwiki#path#file_segment(wiki_settings.css_name) let wiki_settings.css_name = vimwiki#path#file_segment(wiki_settings.css_name)
@ -296,6 +408,16 @@ function! s:validate_wikilocal_settings()
let wiki_settings['template_path'] = vimwiki#path#dir_obj(wiki_settings['template_path']) let wiki_settings['template_path'] = vimwiki#path#dir_obj(wiki_settings['template_path'])
let wiki_settings['diary_path'] = vimwiki#path#join_dir(wiki_settings['path'], let wiki_settings['diary_path'] = vimwiki#path#join_dir(wiki_settings['path'],
\ vimwiki#path#dir_segment(wiki_settings['diary_rel_path'])) \ vimwiki#path#dir_segment(wiki_settings['diary_rel_path']))
let ext = wiki_settings['ext']
if !empty(ext) && ext[0] != '.'
let wiki_settings['ext'] = '.' . ext
endif
" for convenience, we also allow the term 'mediawiki'
if wiki_settings.syntax ==# 'mediawiki'
let wiki_settings.syntax = 'media'
endif
endfor endfor
endfunction endfunction
@ -390,7 +512,7 @@ function! vimwiki#vars#populate_syntax_vars(syntax)
"create regexp for bulleted list items "create regexp for bulleted list items
if !empty(g:vimwiki_syntax_variables[a:syntax].bullet_types) if !empty(g:vimwiki_syntax_variables[a:syntax].bullet_types)
let g:vimwiki_syntax_variables[a:syntax].rxListBullet = let g:vimwiki_syntax_variables[a:syntax].rxListBullet =
\ join( map(g:vimwiki_syntax_variables[a:syntax].bullet_types, \ join( map(copy(g:vimwiki_syntax_variables[a:syntax].bullet_types),
\'vimwiki#u#escape(v:val).' \'vimwiki#u#escape(v:val).'
\ .'repeat("\\+", g:vimwiki_syntax_variables[a:syntax].recurring_bullets)' \ .'repeat("\\+", g:vimwiki_syntax_variables[a:syntax].recurring_bullets)'
\ ) , '\|') \ ) , '\|')
@ -727,7 +849,7 @@ function! vimwiki#vars#add_temporary_wiki(settings)
let new_temp_wiki_settings[key] = value let new_temp_wiki_settings[key] = value
endfor endfor
call insert(g:vimwiki_wikilocal_vars, new_temp_wiki_settings, -1) call insert(g:vimwiki_wikilocal_vars, new_temp_wiki_settings, -1)
call s:validate_wikilocal_settings() call s:normalize_wikilocal_settings()
endfunction endfunction

View File

@ -9,7 +9,7 @@
|___| |___| |_| |_||__| |__||___| |___| |_||___| ~ |___| |___| |_| |_||__| |__||___| |___| |_||___| ~
Version: 2.3 Version: 2.4
============================================================================== ==============================================================================
CONTENTS *vimwiki* CONTENTS *vimwiki*
@ -47,10 +47,11 @@ CONTENTS *vimwiki*
12.2. Temporary Wiki |vimwiki-temporary-wiki| 12.2. Temporary Wiki |vimwiki-temporary-wiki|
12.3. Per-Wiki Options |vimwiki-local-options| 12.3. Per-Wiki Options |vimwiki-local-options|
12.4. Global Options |vimwiki-global-options| 12.4. Global Options |vimwiki-global-options|
13. Contributing |vimwiki-contributing| 13. Getting help |vimwiki-help|
14. Development |vimwiki-development| 14. Contributing & Bug reports |vimwiki-contributing|
15. Changelog |vimwiki-changelog| 15. Development |vimwiki-development|
16. License |vimwiki-license| 16. Changelog |vimwiki-changelog|
17. License |vimwiki-license|
============================================================================== ==============================================================================
@ -676,12 +677,24 @@ Vimwiki file.
*:VimwikiGoBackLink* *:VimwikiGoBackLink*
Go back to the wiki page you came from. Go back to the wiki page you came from.
*:VimwikiSplitLink* *:VimwikiSplitLink* [reuse] [move_cursor]
Split and follow wiki link (create target wiki page if needed). Split and follow wiki link (create target wiki page if needed).
*:VimwikiVSplitLink* If the argument 'reuse' is given and nonzero, the link is opened in a
possibly existing split window instead of making a new split.
If 'move_cursor' is given and nonzero, the cursor moves to the window with
the opened link, otherwise, it stays in the window with the link.
*:VimwikiVSplitLink* [reuse] [move_cursor]
Vertical split and follow wiki link (create target wiki page if needed). Vertical split and follow wiki link (create target wiki page if needed).
If the argument 'reuse' is given and nonzero, the link is opened in a
possibly existing split window instead of making a new split.
If 'move_cursor' is given and nonzero, the cursor moves to the window with
the opened link, otherwise, it stays in the window with the link.
*:VimwikiTabnewLink* *:VimwikiTabnewLink*
Follow wiki link in a new tab (create target wiki page if needed). Follow wiki link in a new tab (create target wiki page if needed).
@ -736,6 +749,11 @@ Vimwiki file.
To display next match use |:lnext| command. To display next match use |:lnext| command.
To display previous match use |:lprevious| command. To display previous match use |:lprevious| command.
Hint: this feature is simply a wrapper around |:lvimgrep|. For a
description of how the pattern can look like, see |:vimgrep|. For example,
to do a case insensitive search, use >
:VWS /\cpattern/
*:VimwikiBacklinks* *:VimwikiBacklinks*
*:VWB* *:VWB*
Search for wikilinks to the current wiki page in all files of current Search for wikilinks to the current wiki page in all files of current
@ -823,35 +841,6 @@ Vimwiki file.
are specified, outputs all tags. To make this command work properly, make are specified, outputs all tags. To make this command work properly, make
sure the tags have been built (see |vimwiki-build-tags|). sure the tags have been built (see |vimwiki-build-tags|).
------------------------------------------------------------------------------
4.3. Functions *vimwiki-functions*
Functions to interact with Vimwiki. (It's intended that most commands will be
replaced with corresponding function calls in the future.)
Warning: this is currently unstable and likely to change.
To map them to a key, use >
nnoremap <C-K> :call vimwiki#base#function_name(arg1, arg2)<CR>
<
*vimwiki-follow_link*
vimwiki#base#follow_link({split}, {reuse}, {move_cursor})
Open the link under the cursor. {split} can have the following values:
'nosplit' open the link in the current window
'vsplit' open in a vertically split window
'hsplit' open in a horizontally split window
'tab' open in a new tab
If {reuse} is 1 and {split} one of 'vsplit' or 'hsplit', open the link in
a possibly existing split window instead of making a new split.
If {move_cursor} is 1 the cursor moves to the window or tab with the
opened link, otherwise, it stays in the window or tab with the link.
For example, <CR> is per default mapped to
vimwiki#base#follow_link('nosplit', 0, 1)
============================================================================== ==============================================================================
5. Wiki syntax *vimwiki-syntax* 5. Wiki syntax *vimwiki-syntax*
@ -888,6 +877,8 @@ is decorated: >
super^script^ super^script^
sub,,script,, sub,,script,,
Furthermore, there are a number of words which are highlighted extra flashy:
TODO, DONE, STARTED, FIXME, FIXED, XXX.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
5.2. Links *vimwiki-syntax-links* 5.2. Links *vimwiki-syntax-links*
@ -1677,7 +1668,7 @@ checkbox without a childitem.
It is possible to toggle several list items using visual mode. But note that It is possible to toggle several list items using visual mode. But note that
instead of toggling every item individually, all items get checked if the instead of toggling every item individually, all items get checked if the
first item is unchecked and all items get unchecked if the first item is first item was unchecked and all items get unchecked if the first item was
checked. checked.
Use gl<Space> (see |vimwiki_gl<Space>|) to remove a single checkbox and Use gl<Space> (see |vimwiki_gl<Space>|) to remove a single checkbox and
@ -1763,7 +1754,7 @@ See |g:vimwiki_use_calendar| option to turn it off/on.
============================================================================== ==============================================================================
12. Anchors *vimwiki-anchors* 11. Anchors *vimwiki-anchors*
Every header, tag, and bold text can be used as an anchor. To jump to it, use Every header, tag, and bold text can be used as an anchor. To jump to it, use
a wikilink of the form > a wikilink of the form >
@ -1850,6 +1841,12 @@ as described in |vimwiki-register-wiki|, or may be registered on the fly as
described in |vimwiki-temporary-wiki|. For a list of per-wiki options, see described in |vimwiki-temporary-wiki|. For a list of per-wiki options, see
|vimwiki-local-options|. |vimwiki-local-options|.
A note for Vim power users:
If you have an elaborated Vim setup, where you e.g. load plugins
conditionally, make sure the settings are set before Vimwiki loads (that is,
before plugin/vimwiki.vim is sourced). If this is not possible, try this
command after the Vimwiki settings are (re-) set: >
:call vimwiki#vars#init()
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
12.1 Registered Wiki *g:vimwiki_list* *vimwiki-register-wiki* 12.1 Registered Wiki *g:vimwiki_list* *vimwiki-register-wiki*
@ -2258,15 +2255,15 @@ be located at https://github.com/vimwiki-backup/vimwiki/issues/384
To use the internal wiki2html converter, use an empty string (the default). To use the internal wiki2html converter, use an empty string (the default).
vimwiki-option-custom_wiki2html_args *vimwiki-option-custom_wiki2html_args*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Key Default value~ Key Default value~
custom_wiki2html_args '' custom_wiki2html_args ''
Description Description~
If a custom script is called with |vimwiki-option-custom_wiki2html|, additional If a custom script is called with |vimwiki-option-custom_wiki2html|, additional
parameters can be passed by setting them using 'custom_wiki2html_args' in parameters can be passed using this option: >
|g:vimwiki_list|. let g:vimwiki_list = [{'path': '~/path/', 'custom_wiki2html_args': 'stuff'}]
*vimwiki-option-list_margin* *vimwiki-option-list_margin*
@ -2298,6 +2295,17 @@ current wiki page is saved: >
let g:vimwiki_list = [{'path': '~/my_site/', 'auto_tags': 1}] let g:vimwiki_list = [{'path': '~/my_site/', 'auto_tags': 1}]
*vimwiki-option-auto_diary_index*
------------------------------------------------------------------------------
Key Default value Values~
auto_diary_index 0 0, 1
Description~
Set this option to 1 to automatically update the diary index when opened.
See |:VimwikiDiaryGenerateLinks|: >
let g:vimwiki_list = [{'path': '~/my_site/', 'auto_diary_index': 1}]
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
12.4 Global Options *vimwiki-global-options* 12.4 Global Options *vimwiki-global-options*
@ -2887,29 +2895,26 @@ Value Description~
Default: 0 Default: 0
==============================================================================
13. Getting help *vimwiki-help*
For questions, discussions, praise or rants there is a mailing list:
https://groups.google.com/forum/#!forum/vimwiki
Also, there is the IRC channel #vimwiki on Freenode which can be accessed via
webchat: https://webchat.freenode.net/?channels=#vimwiki
============================================================================== ==============================================================================
13. Contributing *vimwiki-contributing* 14. Contributing & Bug reports *vimwiki-contributing*
Your help in making Vimwiki better is really appreciated! Your help in making Vimwiki better is really appreciated!
Any help, whether it is a spelling correction or a code snippet to patch -- Any help, whether it is a spelling correction or a code snippet to patch --
everything is welcomed. everything is welcomed.
Before filing a bug or starting to write a patch, check the latest development See CONTRIBUTING.md for info about how to file bugs etc.
version from https://github.com/vimwiki/vimwiki/tree/dev to see if your
problem is already fixed.
Issues can be filed at https://github.com/vimwiki/vimwiki/issues/.
If you want to provide a pull request on GitHub, please start from the dev
branch, not from the master branch.
For questions, discussions, praise or rants there is a mailing list:
https://groups.google.com/forum/#!forum/vimwiki
============================================================================== ==============================================================================
14. Development *vimwiki-development* 15. Development *vimwiki-development*
Homepage: http://vimwiki.github.io/ Homepage: http://vimwiki.github.io/
Github: https://github.com/vimwiki/vimwiki/ Github: https://github.com/vimwiki/vimwiki/
@ -2953,10 +2958,24 @@ Contributors and their Github usernames in roughly chronological order:
- Daniel Trnka (@trnila) - Daniel Trnka (@trnila)
- Yuchen Pei (@ycpei) - Yuchen Pei (@ycpei)
- @maqiv - @maqiv
- @dpc
- Drew Hays (@Dru89)
- Daniel Etrata (@danetrata)
- Keith Haber (@kjhaber)
- @beuerle
- Silvio Ricardo Cordeiro (@silvioricardoc)
- @blyoa
- Jonathan McElroy (@jonathanmcelroy)
- @PetrusZ
- Brian Gianforcaro (@bgianfo)
- Ben Burrill (@benburrill)
- Zhuang Ma (@mzlogin)
- Huy Le (@huynle)
- Nick Borden (@hcwndbyw)
============================================================================== ==============================================================================
15. Changelog *vimwiki-changelog* 16. Changelog *vimwiki-changelog*
Issue numbers starting with '#' are issues from Issue numbers starting with '#' are issues from
@ -2965,14 +2984,61 @@ http://code.google.com/p/vimwiki/issues/list. They may be accessible from
https://github.com/vimwiki-backup/vimwiki/issues. https://github.com/vimwiki-backup/vimwiki/issues.
2.4 (not yet released)~
New:~
* Add the option |g:vimwiki_text_ignore_newline|.
* |g:vimwiki_listsyms| can have fewer or more than 5 symbols.
* glx on a list item marks a checkbox as won't do, see |vimwiki_glx|.
* Add the option |g:vimwiki_listsym_rejected| to set the character used
for won't-do list items.
* gln and glp change the "done" status of a checkbox, see |vimwiki_gln|.
* |:VimwikiSplitLink| and |:VimwikiVSplitLink| can now reuse an existing
split window and not move the cursor.
* Add 'aH' and 'iH' text objects, see |vimwiki-text-objects|.
* Add the keys |vimwiki_[[|, |vimwiki_]]|, |vimwiki_[=|, |vimwiki_]=| and
|vimwiki_]u| for navigating between headers.
* Add the command |:VimwikiMakeTomorrowDiaryNote|.
* |g:vimwiki_folding| has a new option 'custom'.
* Add the ':quick' option for faster folding, see |g:vimwiki_folding|.
* Add the %date placeholder, see |vimwiki-date|.
* Add the option |vimwiki-option-custom_wiki2html_args|.
* Add support for HTML-style comments when using markdown syntax.
Removed:~
* Remove the undocumented and buggy command :VimwikiReadLocalOptions
which allowed to store Vimwiki related settings in a local file.
* Remove the undocumented command :VimwikiPrintWikiState.
* For complicated reasons, Vimwiki doesn't clean up its settings anymore
if you change the filetype of a wiki buffer.
Fixed:~
* Make |vimwiki-option-automatic_nested_syntaxes| work also for markdown.
* Issue #236: Highlight math blocks as TeX math, not TeX.
* Issue #264: Don't overwrite mappings to i_<CR> from other plugins.
* Fix an error where <BS> sometimes didn't work under Windows.
* Issue #302: |:VimwikiDiaryGenerateLinks| had issues with markdown.
* Issue #445: Better handling of |'autowriteall'| and |'hidden'|.
* Improve 'ah' and 'ih' text objects, see |vimwiki-text-objects|.
* Allow opening of links using Powershell.
* Allow any visual mode to be used with |vimwiki_+|.
* Markdown syntax for |vimwiki-toc| is used, when appropriate.
* Wikis can now be in subfolders of other wikis.
* Issue #482: |:VimwikiMakeDiaryNote| now uses the diary of the current wiki.
* Opening the diary and wikis from the menu works correctly now.
* Issue #497: Make |:VimwikiMakeDiaryNote| work outside a wiki buffer.
* Use markdown syntax in the diary when appropriate.
* Various other minor fixes.
2.3 (2016-03-31)~ 2.3 (2016-03-31)~
New: New:~
* Add |:VimwikiMakeYesterdayDiaryNote| command * Add |:VimwikiMakeYesterdayDiaryNote| command
* Issue #128: add option |vimwiki-option-automatic_nested_syntaxes| * Issue #128: add option |vimwiki-option-automatic_nested_syntaxes|
* Issue #192: Sort links in the list generated by |:VimwikiGenerateTags| * Issue #192: Sort links in the list generated by |:VimwikiGenerateTags|
Fixed: Fixed:~
* Issue #176: Fix issue when the wiki path contains spaces * Issue #176: Fix issue when the wiki path contains spaces
* Also look for tags in wiki files in subdirectories * Also look for tags in wiki files in subdirectories
* Locate the .tags file correctly on Windows * Locate the .tags file correctly on Windows
@ -3198,7 +3264,7 @@ http://code.google.com/p/vimwiki/issues/list
* First public version. * First public version.
============================================================================== ==============================================================================
16. License *vimwiki-license* 17. License *vimwiki-license*
The MIT License The MIT License
http://www.opensource.org/licenses/mit-license.php http://www.opensource.org/licenses/mit-license.php

View File

@ -63,14 +63,14 @@ function! Complete_wikifiles(findstart, base)
elseif a:base !~# '#' elseif a:base !~# '#'
" we look for wiki files " we look for wiki files
if a:base =~# '^wiki\d:' if a:base =~# '\m^wiki\d\+:'
let wikinumber = eval(matchstr(a:base, '^wiki\zs\d')) let wikinumber = eval(matchstr(a:base, '\m^wiki\zs\d\+'))
if wikinumber >= vimwiki#vars#number_of_wikis() if wikinumber >= vimwiki#vars#number_of_wikis()
return [] return []
endif endif
let diary = 0 let diary = 0
let prefix = matchstr(a:base, '^wiki\d:\zs.*') let prefix = matchstr(a:base, '\m^wiki\d\+:\zs.*')
let scheme = matchstr(a:base, '^wiki\d:\ze') let scheme = matchstr(a:base, '\m^wiki\d\+:\ze')
elseif a:base =~# '^diary:' elseif a:base =~# '^diary:'
let wikinumber = vimwiki#vars#get_bufferlocal('wiki_nr') let wikinumber = vimwiki#vars#get_bufferlocal('wiki_nr')
let diary = 1 let diary = 1
@ -263,8 +263,8 @@ command! -buffer VimwikiDeleteLink call vimwiki#base#delete_link()
command! -buffer VimwikiRenameLink call vimwiki#base#rename_link() command! -buffer VimwikiRenameLink call vimwiki#base#rename_link()
command! -buffer VimwikiFollowLink call vimwiki#base#follow_link('nosplit', 0, 1) command! -buffer VimwikiFollowLink call vimwiki#base#follow_link('nosplit', 0, 1)
command! -buffer VimwikiGoBackLink call vimwiki#base#go_back_link() command! -buffer VimwikiGoBackLink call vimwiki#base#go_back_link()
command! -buffer VimwikiSplitLink call vimwiki#base#follow_link('hsplit', 0, 1) command! -buffer -nargs=* VimwikiSplitLink call vimwiki#base#follow_link('hsplit', <f-args>)
command! -buffer VimwikiVSplitLink call vimwiki#base#follow_link('vsplit', 0, 1) command! -buffer -nargs=* VimwikiVSplitLink call vimwiki#base#follow_link('vsplit', <f-args>)
command! -buffer -nargs=? VimwikiNormalizeLink call vimwiki#base#normalize_link(<f-args>) command! -buffer -nargs=? VimwikiNormalizeLink call vimwiki#base#normalize_link(<f-args>)

View File

@ -14,6 +14,13 @@ let s:old_cpo = &cpo
set cpo&vim set cpo&vim
if exists('g:vimwiki_autowriteall')
let s:vimwiki_autowriteall_saved = g:vimwiki_autowriteall
else
let s:vimwiki_autowriteall_saved = 1
endif
" this is called when the cursor leaves the buffer " this is called when the cursor leaves the buffer
function! s:setup_buffer_leave() function! s:setup_buffer_leave()
" don't do anything if it's not managed by Vimwiki (that is, when it's not in " don't do anything if it's not managed by Vimwiki (that is, when it's not in
@ -24,7 +31,7 @@ function! s:setup_buffer_leave()
let &autowriteall = s:vimwiki_autowriteall_saved let &autowriteall = s:vimwiki_autowriteall_saved
if vimwiki#vars#get_global('menu') != "" if !empty(vimwiki#vars#get_global('menu'))
exe 'nmenu disable '.vimwiki#vars#get_global('menu').'.Table' exe 'nmenu disable '.vimwiki#vars#get_global('menu').'.Table'
endif endif
endfunction endfunction
@ -49,6 +56,10 @@ function! s:create_temporary_wiki()
\ } \ }
call vimwiki#vars#add_temporary_wiki(new_temp_wiki_settings) call vimwiki#vars#add_temporary_wiki(new_temp_wiki_settings)
" Update the wiki number of the current buffer, because it may have changed when adding this
" temporary wiki.
call vimwiki#vars#set_bufferlocal('wiki_nr', vimwiki#base#find_wiki(expand('%:p')))
endfunction endfunction
@ -137,7 +148,7 @@ function! s:set_global_options()
let s:vimwiki_autowriteall_saved = &autowriteall let s:vimwiki_autowriteall_saved = &autowriteall
let &autowriteall = vimwiki#vars#get_global('autowriteall') let &autowriteall = vimwiki#vars#get_global('autowriteall')
if vimwiki#vars#get_global('menu') !=# '' if !empty(vimwiki#vars#get_global('menu'))
exe 'nmenu enable '.vimwiki#vars#get_global('menu').'.Table' exe 'nmenu enable '.vimwiki#vars#get_global('menu').'.Table'
endif endif
endfunction endfunction
@ -147,23 +158,25 @@ endfunction
" Vim defaults. So we enforce our settings here when the cursor enters a " Vim defaults. So we enforce our settings here when the cursor enters a
" Vimwiki buffer. " Vimwiki buffer.
function! s:set_windowlocal_options() function! s:set_windowlocal_options()
let foldmethod = vimwiki#vars#get_global('folding') if !&diff " if Vim is currently in diff mode, don't interfere with its folding
if foldmethod =~? '^expr.*' let foldmethod = vimwiki#vars#get_global('folding')
setlocal foldmethod=expr if foldmethod =~? '^expr.*'
setlocal foldexpr=VimwikiFoldLevel(v:lnum) setlocal foldmethod=expr
setlocal foldtext=VimwikiFoldText() setlocal foldexpr=VimwikiFoldLevel(v:lnum)
elseif foldmethod =~? '^list.*' || foldmethod =~? '^lists.*' setlocal foldtext=VimwikiFoldText()
setlocal foldmethod=expr elseif foldmethod =~? '^list.*' || foldmethod =~? '^lists.*'
setlocal foldexpr=VimwikiFoldListLevel(v:lnum) setlocal foldmethod=expr
setlocal foldtext=VimwikiFoldText() setlocal foldexpr=VimwikiFoldListLevel(v:lnum)
elseif foldmethod =~? '^syntax.*' setlocal foldtext=VimwikiFoldText()
setlocal foldmethod=syntax elseif foldmethod =~? '^syntax.*'
setlocal foldtext=VimwikiFoldText() setlocal foldmethod=syntax
elseif foldmethod =~? '^custom.*' setlocal foldtext=VimwikiFoldText()
" do nothing elseif foldmethod =~? '^custom.*'
else " do nothing
setlocal foldmethod=manual else
normal! zE setlocal foldmethod=manual
normal! zE
endif
endif endif
if vimwiki#vars#get_global('conceallevel') && exists("+conceallevel") if vimwiki#vars#get_global('conceallevel') && exists("+conceallevel")
@ -219,11 +232,11 @@ endif
augroup vimwiki augroup vimwiki
autocmd! autocmd!
autocmd ColorScheme * call s:setup_cleared_syntax()
for s:ext in s:known_extensions for s:ext in s:known_extensions
exe 'autocmd BufNewFile,BufRead *'.s:ext.' call s:setup_new_wiki_buffer()' exe 'autocmd BufNewFile,BufRead *'.s:ext.' call s:setup_new_wiki_buffer()'
exe 'autocmd BufEnter *'.s:ext.' call s:setup_buffer_enter()' exe 'autocmd BufEnter *'.s:ext.' call s:setup_buffer_enter()'
exe 'autocmd BufLeave *'.s:ext.' call s:setup_buffer_leave()' exe 'autocmd BufLeave *'.s:ext.' call s:setup_buffer_leave()'
exe 'autocmd ColorScheme *'.s:ext.' call s:setup_cleared_syntax()'
" Format tables when exit from insert mode. Do not use textwidth to " Format tables when exit from insert mode. Do not use textwidth to
" autowrap tables. " autowrap tables.
if vimwiki#vars#get_global('table_auto_fmt') if vimwiki#vars#get_global('table_auto_fmt')
@ -256,14 +269,14 @@ command! -count=1 VimwikiTabIndex
command! -count=1 VimwikiDiaryIndex command! -count=1 VimwikiDiaryIndex
\ call vimwiki#diary#goto_diary_index(v:count1) \ call vimwiki#diary#goto_diary_index(v:count1)
command! -count=1 VimwikiMakeDiaryNote command! -count=1 VimwikiMakeDiaryNote
\ call vimwiki#diary#make_note(v:count1) \ call vimwiki#diary#make_note(v:count)
command! -count=1 VimwikiTabMakeDiaryNote command! -count=1 VimwikiTabMakeDiaryNote
\ call vimwiki#diary#make_note(v:count1, 1) \ call vimwiki#diary#make_note(v:count, 1)
command! -count=1 VimwikiMakeYesterdayDiaryNote command! -count=1 VimwikiMakeYesterdayDiaryNote
\ call vimwiki#diary#make_note(v:count1, 0, \ call vimwiki#diary#make_note(v:count, 0,
\ vimwiki#diary#diary_date_link(localtime() - 60*60*24)) \ vimwiki#diary#diary_date_link(localtime() - 60*60*24))
command! -count=1 VimwikiMakeTomorrowDiaryNote command! -count=1 VimwikiMakeTomorrowDiaryNote
\ call vimwiki#diary#make_note(v:count1, 0, \ call vimwiki#diary#make_note(v:count, 0,
\ vimwiki#diary#diary_date_link(localtime() + 60*60*24)) \ vimwiki#diary#diary_date_link(localtime() + 60*60*24))
command! VimwikiDiaryGenerateLinks command! VimwikiDiaryGenerateLinks
@ -329,9 +342,9 @@ function! s:build_menu(topmenu)
let norm_path = vimwiki#path#to_string(vimwiki#vars#get_wikilocal('path', idx)) let norm_path = vimwiki#path#to_string(vimwiki#vars#get_wikilocal('path', idx))
let norm_path = escape(norm_path, '\ .') let norm_path = escape(norm_path, '\ .')
execute 'menu '.a:topmenu.'.Open\ index.'.norm_path. execute 'menu '.a:topmenu.'.Open\ index.'.norm_path.
\ ' :call vimwiki#base#goto_index('.idx.')<CR>' \ ' :call vimwiki#base#goto_index('.(idx+1).')<CR>'
execute 'menu '.a:topmenu.'.Open/Create\ diary\ note.'.norm_path. execute 'menu '.a:topmenu.'.Open/Create\ diary\ note.'.norm_path.
\ ' :call vimwiki#diary#make_note('.idx.')<CR>' \ ' :call vimwiki#diary#make_note('.(idx+1).')<CR>'
endfor endfor
endfunction endfunction

View File

@ -106,8 +106,8 @@ call s:add_target_syntax_ON(vimwiki#vars#get_syntaxlocal('rxWeblink'), 'VimwikiL
" WikiLink " WikiLink
" All remaining schemes are highlighted automatically " All remaining schemes are highlighted automatically
let s:rxSchemes = '\%('. let s:rxSchemes = '\%('.
\ join(split(vimwiki#vars#get_global('schemes'), '\s*,\s*'), '\|').'\|'. \ vimwiki#vars#get_global('schemes') . '\|'.
\ join(split(vimwiki#vars#get_global('web_schemes1'), '\s*,\s*'), '\|'). \ vimwiki#vars#get_global('web_schemes1').
\ '\):' \ '\):'
" a) match [[nonwiki-scheme-URL]] " a) match [[nonwiki-scheme-URL]]

View File

@ -104,8 +104,8 @@ call s:add_target_syntax_ON(vimwiki#vars#get_syntaxlocal('rxWeblink1'), 'Vimwiki
" WikiLink " WikiLink
" All remaining schemes are highlighted automatically " All remaining schemes are highlighted automatically
let s:rxSchemes = '\%('. let s:rxSchemes = '\%('.
\ join(split(vimwiki#vars#get_global('schemes'), '\s*,\s*'), '\|').'\|'. \ vimwiki#vars#get_global('schemes') . '\|'.
\ join(split(vimwiki#vars#get_global('web_schemes1'), '\s*,\s*'), '\|'). \ vimwiki#vars#get_global('web_schemes1').
\ '\):' \ '\):'
" a) match [nonwiki-scheme-URL] " a) match [nonwiki-scheme-URL]