vimwiki

Personal wiki for vim
git clone https://github.com/vimwiki/vimwiki.git
Log | Files | Refs | README | LICENSE

commit 10f502a6981da63cbf2b60489f8f0ff396c49018
parent 23d273d54711035ac2b1c19838438521f0982595
Author: Steven Schmeiser <steven@schmeiser.org>
Date:   Mon,  9 Jul 2018 13:51:18 -0400

table align - catch up to dev

Diffstat:
ALICENSE | 22++++++++++++++++++++++
MREADME.md | 17+++++++++++++++++
Mautoload/vimwiki/base.vim | 1215+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mautoload/vimwiki/diary.vim | 233++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mautoload/vimwiki/html.vim | 693+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mautoload/vimwiki/lst.vim | 758++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mautoload/vimwiki/markdown_base.vim | 130++++++++++++++++++++++++++++++++-----------------------------------------------
Mautoload/vimwiki/path.vim | 66+++++++++++++++++++++++++++++++++++++-----------------------------
Mautoload/vimwiki/style.css | 7+++++++
Mautoload/vimwiki/tags.vim | 108++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mautoload/vimwiki/tbl.vim | 285++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mautoload/vimwiki/u.vim | 52++++++++++++++++++++++++++++------------------------
Aautoload/vimwiki/vars.vim | 711+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdoc/vimwiki.txt | 309++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Mftplugin/vimwiki.vim | 337++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mplugin/vimwiki.vim | 631++++++++++++++++++++++++++++---------------------------------------------------
Dsyntax/omnipresent_syntax.vim | 35-----------------------------------
Msyntax/vimwiki.vim | 552++++++++++++++++++++++++++++++-------------------------------------------------
Msyntax/vimwiki_default.vim | 103+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msyntax/vimwiki_markdown.vim | 97+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msyntax/vimwiki_markdown_custom.vim | 340+++++++++++++++++--------------------------------------------------------------
Msyntax/vimwiki_media.vim | 93+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
22 files changed, 3684 insertions(+), 3110 deletions(-)

diff --git a/LICENSE b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2008-2010 Maxim Kim + 2013-2017 Daniel Schemala + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md @@ -135,6 +135,15 @@ Installation using [Pathogen](http://www.vim.org/scripts/script.php?script_id=23 cd bundle 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) ------------------------------------------------------------------------------ @@ -146,6 +155,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. + +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) and [lightline](https://github.com/itchyny/lightline.vim) diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim @@ -1,4 +1,4 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file " Desc: Basic functionality " Home: https://github.com/vimwiki/vimwiki/ @@ -8,183 +8,43 @@ if exists("g:loaded_vimwiki_auto") || &cp endif let g:loaded_vimwiki_auto = 1 -" s:vimwiki_get_known_syntaxes -function! s:vimwiki_get_known_syntaxes() " {{{ + +function! s:safesubstitute(text, search, replace, mode) + " Substitute regexp but do not interpret replace + let escaped = escape(a:replace, '\&') + return substitute(a:text, a:search, escaped, a:mode) +endfunction + + +function! s:vimwiki_get_known_syntaxes() " Getting all syntaxes that different wikis could have let syntaxes = {} let syntaxes['default'] = 1 - for wiki in g:vimwiki_list - if has_key(wiki, 'syntax') - let syntaxes[wiki.syntax] = 1 - endif + for wiki_nr in range(vimwiki#vars#number_of_wikis()) + let wiki_syntax = vimwiki#vars#get_wikilocal('syntax', wiki_nr) + let syntaxes[wiki_syntax] = 1 endfor - " append map g:vimwiki_ext2syntax - for syn in values(g:vimwiki_ext2syntax) + " also consider the syntaxes from g:vimwiki_ext2syntax + for syn in values(vimwiki#vars#get_global('ext2syntax')) let syntaxes[syn] = 1 endfor return keys(syntaxes) -endfunction " }}} - -" vimwiki#base#apply_wiki_options -function! vimwiki#base#apply_wiki_options(options) " {{{ Update the current - " wiki using the options dictionary - for kk in keys(a:options) - let g:vimwiki_list[g:vimwiki_current_idx][kk] = a:options[kk] - endfor - call Validate_wiki_options(g:vimwiki_current_idx) - call vimwiki#base#setup_buffer_state(g:vimwiki_current_idx) -endfunction " }}} - -" vimwiki#base#read_wiki_options -function! vimwiki#base#read_wiki_options(check) " {{{ Attempt to read wiki - " options from the current page's directory, or its ancesters. If a file - " named vimwiki.vimrc is found, which declares a wiki-options dictionary - " named g:local_wiki, a message alerts the user that an update has been - " found and may be applied. If the argument check=1, the user is queried - " before applying the update to the current wiki's option. - - " Save global vimwiki options ... after all, the global list is often - " initialized for the first time in vimrc files, and we don't want to - " overwrite !! (not to mention all the other globals ...) - let l:vimwiki_list = deepcopy(g:vimwiki_list, 1) - " - if a:check > 1 - call vimwiki#base#print_wiki_state() - echo " \n" - endif - " - let g:local_wiki = {} - let done = 0 - " ... start the wild-goose chase! - for invsubdir in ['.', '..', '../..', '../../..'] - " other names are possible, but most vimrc files will cause grief! - for nm in ['vimwiki.vimrc'] - " TODO: use an alternate strategy, instead of source, to read options - if done - continue - endif - " - let local_wiki_options_filename = expand('%:p:h').'/'.invsubdir.'/'.nm - if !filereadable(local_wiki_options_filename) - continue - endif - " - echo "\nFound file : ".local_wiki_options_filename - let query = "Vimwiki: Check for options in this file [Y]es/[n]o? " - if a:check > 0 && input(query) =~? '^n') - continue - endif - " - try - execute 'source '.local_wiki_options_filename - catch - endtry - if empty(g:local_wiki) - continue - endif - " - if a:check > 0 - echo "\n\nFound wiki options\n g:local_wiki = ".string(g:local_wiki) - let query = "Vimwiki: Apply these options [Y]es/[n]o? " - if input(query) =~? '^n' - let g:local_wiki = {} - continue - endif - endif - " - " restore global list - " - this prevents corruption by g:vimwiki_list in options_file - let g:vimwiki_list = deepcopy(l:vimwiki_list, 1) - " - call vimwiki#base#apply_wiki_options(g:local_wiki) - let done = 1 - endfor - endfor - if !done - " - " restore global list, if no local options were found - " - this prevents corruption by g:vimwiki_list in options_file - let g:vimwiki_list = deepcopy(l:vimwiki_list, 1) - " - endif - if a:check > 1 - echo " \n " - if done - call vimwiki#base#print_wiki_state() - else - echo "Vimwiki: No options were applied." - endif - endif -endfunction " }}} - -" vimwiki#base#setup_buffer_state -function! vimwiki#base#setup_buffer_state(idx) " {{{ Init page-specific variables - " Only call this function *after* opening a wiki page. - if a:idx < 0 - return - endif - - let g:vimwiki_current_idx = a:idx - - " The following state depends on the current active wiki page - let subdir = vimwiki#base#current_subdir(a:idx) - call VimwikiSet('subdir', subdir, a:idx) - call VimwikiSet('invsubdir', vimwiki#base#invsubdir(subdir), a:idx) - - if g:vimwiki_auto_chdir == 1 - exe 'lcd' VimwikiGet('path') - endif - - " update cache - call vimwiki#base#cache_buffer_state() -endfunction " }}} +endfunction -" vimwiki#base#cache_buffer_state -function! vimwiki#base#cache_buffer_state() "{{{ - let b:vimwiki_idx = g:vimwiki_current_idx -endfunction "}}} -" vimwiki#base#recall_buffer_state -function! vimwiki#base#recall_buffer_state() "{{{ - if !exists('b:vimwiki_idx') - return 0 - else - let g:vimwiki_current_idx = b:vimwiki_idx - return 1 - endif -endfunction " }}} - -" vimwiki#base#print_wiki_state -function! vimwiki#base#print_wiki_state() "{{{ print wiki options - " and buffer state variables - let g_width = 18 - let b_width = 18 - echo "- Wiki Options (idx=".g:vimwiki_current_idx.") -" - for kk in VimwikiGetOptionNames() - echo " '".kk."': ".repeat(' ', g_width-len(kk)).string(VimwikiGet(kk)) - endfor - if !exists('b:vimwiki_list') - return - endif - echo "- Cached Variables -" - for kk in keys(b:vimwiki_list) - echo " '".kk."': ".repeat(' ', b_width-len(kk)).string(b:vimwiki_list[kk]) - endfor -endfunction "}}} - -" vimwiki#base#file_pattern -function! vimwiki#base#file_pattern(files) "{{{ Get search regex from glob() +function! vimwiki#base#file_pattern(files) + " Get search regex from glob() " string. Aim to support *all* special characters, forcing the user to choose " names that are compatible with any external restrictions that they " encounter (e.g. filesystem, wiki conventions, other syntaxes, ...). " See: https://github.com/vimwiki-backup/vimwiki/issues/316 - " Change / to [/\\] to allow "Windows paths" + " Change / to [/\\] to allow "Windows paths" return '\V\%('.join(a:files, '\|').'\)\m' -endfunction "}}} +endfunction + -" vimwiki#base#subdir "FIXME TODO slow and faulty -function! vimwiki#base#subdir(path, filename) "{{{ +function! vimwiki#base#subdir(path, filename) let path = a:path " ensure that we are not fooled by a symbolic link "FIXME if we are not "fooled", we end up in a completely different wiki? @@ -205,58 +65,57 @@ function! vimwiki#base#subdir(path, filename) "{{{ let res = res.'/' endif return res -endfunction "}}} +endfunction + + +function! vimwiki#base#current_subdir() + return vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path'), expand('%:p')) +endfunction -" vimwiki#base#current_subdir -function! vimwiki#base#current_subdir(idx)"{{{ - return vimwiki#base#subdir(VimwikiGet('path', a:idx), expand('%:p')) -endfunction"}}} -" vimwiki#base#invsubdir -function! vimwiki#base#invsubdir(subdir) " {{{ +function! vimwiki#base#invsubdir(subdir) return substitute(a:subdir, '[^/\.]\+/', '../', 'g') -endfunction " }}} +endfunction -" Returns: the number of the wiki a file belongs to -function! vimwiki#base#find_wiki(path) "{{{ +" Returns: the number of the wiki a file belongs to or -1 if it doesn't belong +" to any registered wiki. +" The path can be the full path or just the directory of the file +function! vimwiki#base#find_wiki(path) + let bestmatch = -1 + let bestlen = 0 let path = vimwiki#path#path_norm(vimwiki#path#chomp_slash(a:path)) - let idx = 0 - while idx < len(g:vimwiki_list) - let idx_path = expand(VimwikiGet('path', idx)) + for idx in range(vimwiki#vars#number_of_wikis()) + let idx_path = expand(vimwiki#vars#get_wikilocal('path', idx)) let idx_path = vimwiki#path#path_norm(vimwiki#path#chomp_slash(idx_path)) - if vimwiki#path#is_equal( - \ vimwiki#path#path_common_pfx(idx_path, path), idx_path) - return idx + let common_pfx = vimwiki#path#path_common_pfx(idx_path, path) + if vimwiki#path#is_equal(common_pfx, idx_path) + if len(common_pfx) > bestlen + let bestlen = len(common_pfx) + let bestmatch = idx + endif endif - let idx += 1 - endwhile + endfor - " an orphan page has been detected - return -1 -endfunction "}}} + return bestmatch +endfunction " THE central function of Vimwiki. Extract infos about the target from a link. " If the second parameter is present, which should be an absolute file path, it " is assumed that the link appears in that file. Without it, the current file " is used. -function! vimwiki#base#resolve_link(link_text, ...) "{{{ +function! vimwiki#base#resolve_link(link_text, ...) if a:0 let source_wiki = vimwiki#base#find_wiki(a:1) let source_file = a:1 else - let source_wiki = g:vimwiki_current_idx + let source_wiki = vimwiki#vars#get_bufferlocal('wiki_nr') let source_file = vimwiki#path#current_wiki_file() endif let link_text = a:link_text - " if link is schemeless add wikiN: scheme - if link_text !~# g:vimwiki_rxSchemeUrl - let link_text = 'wiki'.source_wiki.':'.link_text - endif - let link_infos = { \ 'index': -1, @@ -265,21 +124,25 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{ \ 'anchor': '', \ } - - " extract scheme - let link_infos.scheme = matchstr(link_text, g:vimwiki_rxSchemeUrlMatchScheme) - if link_infos.scheme == '' || link_text == '' - let link_infos.filename = '' " malformed link + if link_text == '' return link_infos endif - if link_infos.scheme !~# '\mwiki\d\+\|diary\|local\|file' - let link_infos.filename = link_text " unknown scheme, may be a weblink - return link_infos + + let scheme = matchstr(link_text, '^\zs'.vimwiki#vars#get_global('rxSchemes').'\ze:') + if scheme == '' + let link_infos.scheme = 'wiki'.source_wiki + else + let link_infos.scheme = scheme + + if link_infos.scheme !~# '\mwiki\d\+\|diary\|local\|file' + let link_infos.filename = link_text " unknown scheme, may be a weblink + return link_infos + endif + + let link_text = matchstr(link_text, '^'.vimwiki#vars#get_global('rxSchemes').':\zs.*\ze') endif - let link_text = matchstr(link_text, g:vimwiki_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 if is_wiki_link @@ -310,36 +173,35 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{ " extract the other items depending on the scheme if link_infos.scheme =~# '\mwiki\d\+' let link_infos.index = eval(matchstr(link_infos.scheme, '\D\+\zs\d\+\ze')) - if link_infos.index < 0 || link_infos.index >= len(g:vimwiki_list) + if link_infos.index < 0 || link_infos.index >= vimwiki#vars#number_of_wikis() let link_infos.filename = '' return link_infos endif if !is_relative || link_infos.index != source_wiki - let root_dir = VimwikiGet('path', link_infos.index) + let root_dir = vimwiki#vars#get_wikilocal('path', link_infos.index) endif let link_infos.filename = root_dir . link_text if vimwiki#path#is_link_to_dir(link_text) - if g:vimwiki_dir_link != '' - let link_infos.filename .= g:vimwiki_dir_link . - \ VimwikiGet('ext', link_infos.index) + if vimwiki#vars#get_global('dir_link') != '' + let link_infos.filename .= vimwiki#vars#get_global('dir_link') . + \ vimwiki#vars#get_wikilocal('ext', link_infos.index) endif else - let link_infos.filename .= VimwikiGet('ext', link_infos.index) + let link_infos.filename .= vimwiki#vars#get_wikilocal('ext', link_infos.index) endif elseif link_infos.scheme ==# 'diary' let link_infos.index = source_wiki let link_infos.filename = - \ VimwikiGet('path', link_infos.index) . - \ VimwikiGet('diary_rel_path', link_infos.index) . + \ vimwiki#vars#get_wikilocal('path', link_infos.index) . + \ vimwiki#vars#get_wikilocal('diary_rel_path', link_infos.index) . \ link_text . - \ VimwikiGet('ext', link_infos.index) - elseif (link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local') - \ && is_relative + \ vimwiki#vars#get_wikilocal('ext', link_infos.index) + elseif (link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local') && is_relative let link_infos.filename = simplify(root_dir . link_text) else " absolute file link " collapse repeated leading "/"'s within a link @@ -351,11 +213,10 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{ let link_infos.filename = vimwiki#path#normalize(link_infos.filename) return link_infos -endfunction "}}} +endfunction -" vimwiki#base#system_open_link -function! vimwiki#base#system_open_link(url) "{{{ +function! vimwiki#base#system_open_link(url) " handlers function! s:win32_handler(url) "http://vim.wikia.com/wiki/Opening_current_Vim_file_in_your_Windows_browser @@ -370,7 +231,11 @@ function! vimwiki#base#system_open_link(url) "{{{ else let url = shellescape(a:url, 1) endif - execute 'silent ! start "Title" /B ' . url + if &l:shell ==? "powershell" + execute 'silent ! start ' . a:url + else + execute 'silent ! start "Title" /B ' . a:url + endif endfunction function! s:macunix_handler(url) call system('open ' . shellescape(a:url).' &') @@ -391,19 +256,23 @@ function! vimwiki#base#system_open_link(url) "{{{ endif endtry echomsg 'Vimwiki Error: Default Vimwiki link handler was unable to open the HTML file!' -endfunction "}}} +endfunction + -" vimwiki#base#open_link -function! vimwiki#base#open_link(cmd, link, ...) "{{{ - let link_infos = vimwiki#base#resolve_link(a:link) +function! vimwiki#base#open_link(cmd, link, ...) + let link_infos = {} + if a:0 + let link_infos = vimwiki#base#resolve_link(a:link, a:1) + else + let link_infos = vimwiki#base#resolve_link(a:link) + endif if link_infos.filename == '' echomsg 'Vimwiki Error: Unable to resolve link!' return endif - 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' let update_prev_link = is_wiki_link && \ !vimwiki#path#is_equal(link_infos.filename, vimwiki#path#current_wiki_file()) @@ -422,24 +291,21 @@ function! vimwiki#base#open_link(cmd, link, ...) "{{{ if is_wiki_link call vimwiki#base#edit_file(a:cmd, link_infos.filename, link_infos.anchor, \ vimwiki_prev_link, update_prev_link) - if link_infos.index != g:vimwiki_current_idx - " this call to setup_buffer_state may not be necessary - call vimwiki#base#setup_buffer_state(link_infos.index) - endif else call vimwiki#base#system_open_link(link_infos.filename) endif -endfunction " }}} +endfunction + -" vimwiki#base#get_globlinks_escaped -function! vimwiki#base#get_globlinks_escaped() abort "{{{only get links from the current dir +function! vimwiki#base#get_globlinks_escaped() abort + " only get links from the current dir " change to the directory of the current file let orig_pwd = getcwd() lcd! %:h - " all path are relative to the current file's location - let globlinks = glob('*'.VimwikiGet('ext'),1)."\n" + " all path are relative to the current file's location + let globlinks = glob('*'.vimwiki#vars#get_wikilocal('ext'), 1)."\n" " remove extensions - let globlinks = substitute(globlinks, '\'.VimwikiGet('ext').'\ze\n', '', 'g') + let globlinks = substitute(globlinks, '\'.vimwiki#vars#get_wikilocal('ext').'\ze\n', '', 'g') " restore the original working directory exe 'lcd! '.orig_pwd " convert to a List @@ -450,47 +316,46 @@ function! vimwiki#base#get_globlinks_escaped() abort "{{{only get links from the let globlinks = join(lst, "\n") " return all escaped links as a single newline-separated string return globlinks -endfunction " }}} +endfunction + -" vimwiki#base#generate_links -function! vimwiki#base#generate_links() "{{{ +function! vimwiki#base#generate_links() let lines = [] - let links = vimwiki#base#get_wikilinks(g:vimwiki_current_idx, 0) + let links = vimwiki#base#get_wikilinks(vimwiki#vars#get_bufferlocal('wiki_nr'), 0) call sort(links) - let bullet = repeat(' ', vimwiki#lst#get_list_margin()). - \ vimwiki#lst#default_symbol().' ' + let bullet = repeat(' ', vimwiki#lst#get_list_margin()) . vimwiki#lst#default_symbol().' ' for link in links let abs_filepath = vimwiki#path#abs_path_of_link(link) if !s:is_diary_file(abs_filepath) call add(lines, bullet. - \ substitute(g:vimwiki_WikiLinkTemplate1, '__LinkUrl__', '\='."'".link."'", '')) + \ s:safesubstitute(vimwiki#vars#get_global('WikiLinkTemplate1'), + \ '__LinkUrl__', link, '')) endif endfor let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' ' - call vimwiki#base#update_listing_in_buffer(lines, 'Generated Links', links_rx, - \ line('$')+1, 1) -endfunction " }}} + call vimwiki#base#update_listing_in_buffer(lines, 'Generated Links', links_rx, line('$')+1, 1) +endfunction + -" vimwiki#base#goto -function! vimwiki#base#goto(...) "{{{ +function! vimwiki#base#goto(...) let key = a:1 let anchor = a:0 > 1 ? a:2 : '' call vimwiki#base#edit_file(':e', - \ VimwikiGet('path') . key . VimwikiGet('ext'), + \ vimwiki#vars#get_wikilocal('path') . key . vimwiki#vars#get_wikilocal('ext'), \ anchor) -endfunction "}}} +endfunction + -" vimwiki#base#backlinks -function! vimwiki#base#backlinks() "{{{ +function! vimwiki#base#backlinks() let current_filename = expand("%:p") let locations = [] - for idx in range(len(g:vimwiki_list)) - let syntax = VimwikiGet('syntax', idx) + for idx in range(vimwiki#vars#number_of_wikis()) + let syntax = vimwiki#vars#get_wikilocal('syntax', idx) let wikifiles = vimwiki#base#find_files(idx, 0) for source_file in wikifiles let links = s:get_links(source_file, idx) @@ -510,7 +375,8 @@ function! vimwiki#base#backlinks() "{{{ call setloclist(0, locations, 'r') lopen endif -endfunction "}}} +endfunction + " Returns: a list containing all files of the given wiki as absolute file path. " If the given wiki number is negative, the diary of the current wiki is used @@ -518,20 +384,21 @@ endfunction "}}} function! vimwiki#base#find_files(wiki_nr, directories_only) let wiki_nr = a:wiki_nr if wiki_nr >= 0 - let root_directory = VimwikiGet('path', wiki_nr) + let root_directory = vimwiki#vars#get_wikilocal('path', wiki_nr) else - let root_directory = VimwikiGet('path').VimwikiGet('diary_rel_path') - let wiki_nr = g:vimwiki_current_idx + let root_directory = vimwiki#vars#get_wikilocal('path') . + \ vimwiki#vars#get_wikilocal('diary_rel_path') + let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr') endif if a:directories_only let ext = '/' else - let ext = VimwikiGet('ext', wiki_nr) + let ext = vimwiki#vars#get_wikilocal('ext', wiki_nr) endif " if current wiki is temporary -- was added by an arbitrary wiki file then do " not search wiki files in subdirectories. Or it would hang the system if " wiki file was created in $HOME or C:/ dirs. - if VimwikiGet('temp', wiki_nr) + if vimwiki#vars#get_wikilocal('is_temporary_wiki', wiki_nr) let pattern = '*'.ext else let pattern = '**/*'.ext @@ -539,18 +406,19 @@ function! vimwiki#base#find_files(wiki_nr, directories_only) return split(globpath(root_directory, pattern), '\n') endfunction + " Returns: a list containing the links to get from the current file to all wiki " files in the given wiki. " If the given wiki number is negative, the diary of the current wiki is used. " If also_absolute_links is nonzero, also return links of the form /file function! vimwiki#base#get_wikilinks(wiki_nr, also_absolute_links) let files = vimwiki#base#find_files(a:wiki_nr, 0) - if a:wiki_nr == g:vimwiki_current_idx + if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr') let cwd = vimwiki#path#wikify_path(expand('%:p:h')) elseif a:wiki_nr < 0 - let cwd = VimwikiGet('path').VimwikiGet('diary_rel_path') + let cwd = vimwiki#vars#get_wikilocal('path') . vimwiki#vars#get_wikilocal('diary_rel_path') else - let cwd = VimwikiGet('path', a:wiki_nr) + let cwd = vimwiki#vars#get_wikilocal('path', a:wiki_nr) endif let result = [] for wikifile in files @@ -560,10 +428,10 @@ function! vimwiki#base#get_wikilinks(wiki_nr, also_absolute_links) endfor if a:also_absolute_links for wikifile in files - if a:wiki_nr == g:vimwiki_current_idx - let cwd = VimwikiGet('path') + if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr') + let cwd = vimwiki#vars#get_wikilocal('path') elseif a:wiki_nr < 0 - let cwd = VimwikiGet('path').VimwikiGet('diary_rel_path') + let cwd = vimwiki#vars#get_wikilocal('path') . vimwiki#vars#get_wikilocal('diary_rel_path') endif let wikifile = fnamemodify(wikifile, ':r') " strip extension let wikifile = '/'.vimwiki#path#relpath(cwd, wikifile) @@ -573,20 +441,21 @@ function! vimwiki#base#get_wikilinks(wiki_nr, also_absolute_links) return result endfunction + " Returns: a list containing the links to all directories from the current file function! vimwiki#base#get_wiki_directories(wiki_nr) let dirs = vimwiki#base#find_files(a:wiki_nr, 1) - if a:wiki_nr == g:vimwiki_current_idx + if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr') let cwd = vimwiki#path#wikify_path(expand('%:p:h')) - let root_dir = VimwikiGet('path') + let root_dir = vimwiki#vars#get_wikilocal('path') else - let cwd = VimwikiGet('path', a:wiki_nr) + let cwd = vimwiki#vars#get_wikilocal('path', a:wiki_nr) endif let result = ['./'] for wikidir in dirs let wikidir_relative = vimwiki#path#relpath(cwd, wikidir) call add(result, wikidir_relative) - if a:wiki_nr == g:vimwiki_current_idx + if a:wiki_nr == vimwiki#vars#get_bufferlocal('wiki_nr') let wikidir_absolute = '/'.vimwiki#path#relpath(root_dir, wikidir) call add(result, wikidir_absolute) endif @@ -594,14 +463,15 @@ function! vimwiki#base#get_wiki_directories(wiki_nr) return result endfunction -function! vimwiki#base#get_anchors(filename, syntax) "{{{ + +function! vimwiki#base#get_anchors(filename, syntax) if !filereadable(a:filename) return [] endif - let rxheader = g:vimwiki_{a:syntax}_header_search - let rxbold = g:vimwiki_{a:syntax}_bold_search - let rxtag = g:vimwiki_{a:syntax}_tag_search + let rxheader = vimwiki#vars#get_syntaxlocal('header_search', a:syntax) + let rxbold = vimwiki#vars#get_syntaxlocal('bold_search', a:syntax) + let rxtag = vimwiki#vars#get_syntaxlocal('tag_search', a:syntax) let anchor_level = ['', '', '', '', '', '', ''] let anchors = [] @@ -665,47 +535,49 @@ function! vimwiki#base#get_anchors(filename, syntax) "{{{ endfor return anchors -endfunction "}}} +endfunction -" s:jump_to_anchor -function! s:jump_to_anchor(anchor) "{{{ + +function! s:jump_to_anchor(anchor) let oldpos = getpos('.') call cursor(1, 1) let anchor = vimwiki#u#escape(a:anchor) let segments = split(anchor, '#', 0) + for segment in segments - let anchor_header = substitute( - \ g:vimwiki_{VimwikiGet('syntax')}_header_match, - \ '__Header__', "\\='".segment."'", '') - let anchor_bold = substitute(g:vimwiki_{VimwikiGet('syntax')}_bold_match, - \ '__Text__', "\\='".segment."'", '') - let anchor_tag = substitute(g:vimwiki_{VimwikiGet('syntax')}_tag_match, - \ '__Tag__', "\\='".segment."'", '') - - if !search(anchor_tag, 'Wc') - \ && !search(anchor_header, 'Wc') - \ && !search(anchor_bold, 'Wc') + let anchor_header = s:safesubstitute( + \ vimwiki#vars#get_syntaxlocal('header_match'), + \ '__Header__', segment, '') + let anchor_bold = s:safesubstitute( + \ vimwiki#vars#get_syntaxlocal('bold_match'), + \ '__Text__', segment, '') + let anchor_tag = s:safesubstitute( + \ vimwiki#vars#get_syntaxlocal('tag_match'), + \ '__Tag__', segment, '') + + if !search(anchor_tag, 'Wc') && !search(anchor_header, 'Wc') && !search(anchor_bold, 'Wc') call setpos('.', oldpos) break endif let oldpos = getpos('.') endfor -endfunction "}}} +endfunction + " Params: full path to a wiki file and its wiki number " Returns: a list of all links inside the wiki file " Every list item has the form " [target file, anchor, line number of the link in source file, column number] -function! s:get_links(wikifile, idx) "{{{ +function! s:get_links(wikifile, idx) if !filereadable(a:wikifile) return [] endif - let syntax = VimwikiGet('syntax', a:idx) - let rx_link = g:vimwiki_{syntax}_wikilink + let syntax = vimwiki#vars#get_wikilocal('syntax', a:idx) + let rx_link = vimwiki#vars#get_syntaxlocal('wikilink', syntax) let links = [] let lnum = 0 @@ -721,22 +593,22 @@ function! s:get_links(wikifile, idx) "{{{ endif let link_count += 1 let target = vimwiki#base#resolve_link(link_text, a:wikifile) - if target.filename != '' && - \ target.scheme =~# '\mwiki\d\+\|diary\|file\|local' + if target.filename != '' && target.scheme =~# '\mwiki\d\+\|diary\|file\|local' call add(links, [target.filename, target.anchor, lnum, col]) endif endwhile endfor return links -endfunction "}}} +endfunction + -function! vimwiki#base#check_links() "{{{ +function! vimwiki#base#check_links() let anchors_of_files = {} let links_of_files = {} let errors = [] - for idx in range(len(g:vimwiki_list)) - let syntax = VimwikiGet('syntax', idx) + for idx in range(vimwiki#vars#number_of_wikis()) + let syntax = vimwiki#vars#get_wikilocal('syntax', idx) let wikifiles = vimwiki#base#find_files(idx, 0) for wikifile in wikifiles let links_of_files[wikifile] = s:get_links(wikifile, idx) @@ -789,9 +661,9 @@ function! vimwiki#base#check_links() "{{{ endfor " mark every index file as reachable - for idx in range(len(g:vimwiki_list)) - let index_file = VimwikiGet('path', idx) . VimwikiGet('index', idx) . - \ VimwikiGet('ext', idx) + for idx in range(vimwiki#vars#number_of_wikis()) + let index_file = vimwiki#vars#get_wikilocal('path', idx) . + \ vimwiki#vars#get_wikilocal('index', idx) . vimwiki#vars#get_wikilocal('ext', idx) if filereadable(index_file) let reachable_wikifiles[index_file] = 1 endif @@ -828,19 +700,11 @@ function! vimwiki#base#check_links() "{{{ call setqflist(errors, 'r') copen endif -endfunction "}}} - -" vimwiki#base#edit_file -function! vimwiki#base#edit_file(command, filename, anchor, ...) "{{{ - " XXX: Should we allow * in filenames!? - " Maxim: It is allowed, escaping here is for vim to be able to open files - " which have that symbols. - " Try to remove * from escaping and open&save : - " [[testBLAfile]]... - " then - " [[test*file]]... - " you'll have E77: Too many file names - let fname = escape(a:filename, '% *|#') +endfunction + + +function! vimwiki#base#edit_file(command, filename, anchor, ...) + let fname = escape(a:filename, '% *|#`') let dir = fnamemodify(a:filename, ":p:h") let ok = vimwiki#path#mkdir(dir, 1) @@ -851,17 +715,33 @@ function! vimwiki#base#edit_file(command, filename, anchor, ...) "{{{ return endif - " check if the file we want to open is already the current file + " Check if the file we want to open is already the current file " which happens if we jump to an achor in the current file. " This hack is necessary because apparently Vim messes up the result of " getpos() directly after this command. Strange. if !(a:command ==# ':e ' && vimwiki#path#is_equal(a:filename, expand('%:p'))) - execute a:command.' '.fname + try + 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 + " the annoying hit-enter prompt. Solution: show no messages at all. + silent execute a:command fname + else + execute a:command fname + endif + catch /E37:/ + echomsg 'Vimwiki: The current file is modified. Hint: Take a look at' + \ ''':h g:vimwiki_autowriteall'' to see how to save automatically.' + return + endtry + + " If the opened file was not already loaded by Vim, an autocommand is + " triggered at this point + " Make sure no other plugin takes ownership over the new file. Vimwiki " rules them all! Well, except for directories, which may be opened with " Netrw if &filetype != 'vimwiki' && fname !~ '\m/$' - set filetype=vimwiki + setfiletype vimwiki endif endif if a:anchor != '' @@ -872,21 +752,21 @@ function! vimwiki#base#edit_file(command, filename, anchor, ...) "{{{ " a:1 -- previous vimwiki link to save " a:2 -- should we update previous link if a:0 && a:2 && len(a:1) > 0 - let b:vimwiki_prev_link = a:1 + call vimwiki#vars#set_bufferlocal('prev_link', a:1) endif -endfunction " }}} +endfunction -" vimwiki#base#search_word -function! vimwiki#base#search_word(wikiRx, cmd) "{{{ + +function! vimwiki#base#search_word(wikiRx, cmd) let match_line = search(a:wikiRx, 's'.a:cmd) if match_line == 0 echomsg 'Vimwiki: Wiki link not found' endif -endfunction " }}} +endfunction + -" vimwiki#base#matchstr_at_cursor " Returns part of the line that matches wikiRX at cursor -function! vimwiki#base#matchstr_at_cursor(wikiRX) "{{{ +function! vimwiki#base#matchstr_at_cursor(wikiRX) let col = col('.') - 1 let line = getline('.') let ebeg = -1 @@ -906,10 +786,10 @@ function! vimwiki#base#matchstr_at_cursor(wikiRX) "{{{ else return "" endif -endf "}}} +endfunction -" vimwiki#base#replacestr_at_cursor -function! vimwiki#base#replacestr_at_cursor(wikiRX, sub) "{{{ + +function! vimwiki#base#replacestr_at_cursor(wikiRX, sub) let col = col('.') - 1 let line = getline('.') let ebeg = -1 @@ -929,27 +809,27 @@ function! vimwiki#base#replacestr_at_cursor(wikiRX, sub) "{{{ let newline = strpart(line, 0, ebeg).a:sub.strpart(line, ebeg+elen) call setline(line('.'), newline) endif -endf "}}} +endfunction -" s:print_wiki_list -function! s:print_wiki_list() "{{{ + +function! s:print_wiki_list() let idx = 0 - while idx < len(g:vimwiki_list) - if idx == g:vimwiki_current_idx + while idx < vimwiki#vars#number_of_wikis() + if idx == vimwiki#vars#get_bufferlocal('wiki_nr') let sep = ' * ' echohl PmenuSel else let sep = ' ' echohl None endif - echo (idx + 1).sep.VimwikiGet('path', idx) + echo (idx + 1) . sep . vimwiki#vars#get_wikilocal('path', idx) let idx += 1 endwhile echohl None -endfunction " }}} +endfunction -" s:update_wiki_link -function! s:update_wiki_link(fname, old, new) " {{{ + +function! s:update_wiki_link(fname, old, new) echo "Updating links in ".a:fname let has_updates = 0 let dest = [] @@ -966,32 +846,33 @@ function! s:update_wiki_link(fname, old, new) " {{{ call writefile(dest, a:fname) call delete(a:fname.'#vimwiki_upd#') endif -endfunction " }}} +endfunction -" s:update_wiki_links_dir -function! s:update_wiki_links_dir(dir, old_fname, new_fname) " {{{ + +function! s:update_wiki_links_dir(dir, old_fname, new_fname) let old_fname = substitute(a:old_fname, '[/\\]', '[/\\\\]', 'g') let new_fname = a:new_fname let old_fname_r = vimwiki#base#apply_template( - \ g:vimwiki_WikiLinkMatchUrlTemplate, old_fname, '', '') + \ vimwiki#vars#get_syntaxlocal('WikiLinkMatchUrlTemplate'), old_fname, '', '') - let files = split(glob(VimwikiGet('path').a:dir.'*'.VimwikiGet('ext')), '\n') + let files = split(glob(vimwiki#vars#get_wikilocal('path').a:dir.'*'. + \ vimwiki#vars#get_wikilocal('ext')), '\n') for fname in files call s:update_wiki_link(fname, old_fname_r, new_fname) endfor -endfunction " }}} +endfunction + -" s:tail_name -function! s:tail_name(fname) "{{{ +function! s:tail_name(fname) let result = substitute(a:fname, ":", "__colon__", "g") let result = fnamemodify(result, ":t:r") let result = substitute(result, "__colon__", ":", "g") return result -endfunction "}}} +endfunction + -" s:update_wiki_links -function! s:update_wiki_links(old_fname, new_fname) " {{{ +function! s:update_wiki_links(old_fname, new_fname) let old_fname = a:old_fname let new_fname = a:new_fname @@ -1017,39 +898,40 @@ function! s:update_wiki_links(old_fname, new_fname) " {{{ while idx < len(dirs_keys) let dir = dirs_keys[idx] let new_dir = dirs_vals[idx] - call s:update_wiki_links_dir(dir, - \ new_dir.old_fname, new_dir.new_fname) + call s:update_wiki_links_dir(dir, new_dir.old_fname, new_dir.new_fname) let idx = idx + 1 endwhile -endfunction " }}} +endfunction + -" s:get_wiki_buffers -function! s:get_wiki_buffers() "{{{ +function! s:get_wiki_buffers() let blist = [] let bcount = 1 while bcount<=bufnr("$") if bufexists(bcount) let bname = fnamemodify(bufname(bcount), ":p") - if bname =~# VimwikiGet('ext')."$" - let bitem = [bname, getbufvar(bname, "vimwiki_prev_link")] + " this may find buffers that are not part of the current wiki, but that + " doesn't hurt + if bname =~# vimwiki#vars#get_wikilocal('ext')."$" + let bitem = [bname, vimwiki#vars#get_bufferlocal('prev_link', bcount)] call add(blist, bitem) endif endif let bcount = bcount + 1 endwhile return blist -endfunction " }}} +endfunction + -" s:open_wiki_buffer -function! s:open_wiki_buffer(item) "{{{ +function! s:open_wiki_buffer(item) call vimwiki#base#edit_file(':e', a:item[0], '') if !empty(a:item[1]) - call setbufvar(a:item[0], "vimwiki_prev_link", a:item[1]) + call vimwiki#vars#set_bufferlocal('prev_link', a:item[1], a:item[0]) endif -endfunction " }}} +endfunction + -" vimwiki#base#nested_syntax -function! vimwiki#base#nested_syntax(filetype, start, end, textSnipHl) abort "{{{ +function! vimwiki#base#nested_syntax(filetype, start, end, textSnipHl) abort " From http://vim.wikia.com/wiki/VimTip857 let ft=toupper(a:filetype) let group='textGroup'.ft @@ -1096,14 +978,15 @@ function! vimwiki#base#nested_syntax(filetype, start, end, textSnipHl) abort "{{ " regular one. " Perl syntax file has perlFunctionName which is usually has no effect due to " 'contained' flag. Now we have 'syntax include' that makes all the groups - " included as 'contained' into specific group. + " included as 'contained' into specific group. " Here perlFunctionName (with quite an angry regexp "\h\w*[^:]") clashes with " the rest syntax rules as now it has effect being really 'contained'. " Clear it! if ft =~? 'perl' - syntax clear perlFunctionName + syntax clear perlFunctionName endif -endfunction "}}} +endfunction + " creates or updates auto-generated listings in a wiki file, like TOC, diary " links, tags list etc. @@ -1114,7 +997,7 @@ endfunction "}}} " - if a:create is true, it will be created if it doesn't exist, otherwise it " will only be updated if it already exists 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 if &diff || &readonly return @@ -1123,9 +1006,8 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header, " check if the listing is already there let already_there = 0 - let header_rx = '\m^\s*'. - \ substitute(g:vimwiki_rxH1_Template, '__Header__', a:start_header, '') - \ .'\s*$' + let header_rx = '\m^\s*'.substitute(vimwiki#vars#get_syntaxlocal('rxH1_Template'), + \ '__Header__', a:start_header, '') .'\s*$' let start_lnum = 1 while start_lnum <= line('$') @@ -1176,8 +1058,8 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header, " write new listing let new_header = whitespaces_in_first_line - \ . substitute(g:vimwiki_rxH1_Template, - \ '__Header__', '\='."'".a:start_header."'", '') + \ . s:safesubstitute(vimwiki#vars#get_syntaxlocal('rxH1_Template'), + \ '__Header__', a:start_header, '') call append(start_lnum - 1, new_header) let start_lnum += 1 let lines_diff += 1 + len(a:strings) @@ -1201,41 +1083,43 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header, let winview_save.lnum += lines_diff endif call winrestview(winview_save) -endfunction "}}} +endfunction -" WIKI link following functions {{{ -" vimwiki#base#find_next_link -function! vimwiki#base#find_next_link() "{{{ - call vimwiki#base#search_word(g:vimwiki_rxAnyLink, '') -endfunction " }}} -" vimwiki#base#find_prev_link -function! vimwiki#base#find_prev_link() "{{{ +function! vimwiki#base#find_next_link() + call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), '') +endfunction + + +function! vimwiki#base#find_prev_link() "Jump 2 times if the cursor is in the middle of a link if synIDattr(synID(line('.'), col('.'), 0), "name") =~# "VimwikiLink.*" && \ synIDattr(synID(line('.'), col('.')-1, 0), "name") =~# "VimwikiLink.*" - call vimwiki#base#search_word(g:vimwiki_rxAnyLink, 'b') + call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), 'b') endif - call vimwiki#base#search_word(g:vimwiki_rxAnyLink, 'b') -endfunction " }}} + call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), 'b') +endfunction + + +function! vimwiki#base#follow_link(split, ...) + let reuse_other_split_window = a:0 >= 1 ? a:1 : 0 + let move_cursor_to_new_window = a:0 >= 2 ? a:2 : 1 -" vimwiki#base#follow_link -function! vimwiki#base#follow_link(split, reuse, move_cursor, ...) "{{{ " Parse link at cursor and pass to VimwikiLinkHandler, or failing that, the " default open_link handler " try WikiLink - let lnk = matchstr(vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWikiLink), - \ g:vimwiki_rxWikiLinkMatchUrl) + let lnk = matchstr(vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink')), + \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl')) " try WikiIncl if lnk == "" - let lnk = matchstr(vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWikiIncl), - \ g:vimwiki_rxWikiInclMatchUrl) + let lnk = matchstr(vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWikiIncl')), + \ vimwiki#vars#get_global('rxWikiInclMatchUrl')) endif " try Weblink if lnk == "" - let lnk = matchstr(vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWeblink), - \ g:vimwiki_rxWeblinkMatchUrl) + let lnk = matchstr(vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink')), + \ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl')) endif if lnk != "" " cursor is indeed on a link @@ -1256,7 +1140,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 " 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('#') if previous_window_nr > 0 && previous_window_nr != winnr() execute previous_window_nr . 'wincmd w' @@ -1265,7 +1149,7 @@ function! vimwiki#base#follow_link(split, reuse, move_cursor, ...) "{{{ endif - if VimwikiGet('syntax') == 'markdown' + if vimwiki#vars#get_wikilocal('syntax') == 'markdown' let processed_by_markdown_reflink = vimwiki#markdown_base#open_reflink(lnk) if processed_by_markdown_reflink return @@ -1273,14 +1157,14 @@ function! vimwiki#base#follow_link(split, reuse, move_cursor, ...) "{{{ " remove the extension from the filename if exists, because non-vimwiki " markdown files usually include the extension in links - let lnk = substitute(lnk, VimwikiGet('ext').'$', '', '') + let lnk = substitute(lnk, '\'.vimwiki#vars#get_wikilocal('ext').'$', '', '') endif let current_tab_page = tabpagenr() call vimwiki#base#open_link(cmd, lnk) - if !a:move_cursor + if !move_cursor_to_new_window if (a:split ==# 'hsplit' || a:split ==# 'vsplit') execute 'wincmd p' elseif a:split ==# 'tab' @@ -1289,36 +1173,36 @@ function! vimwiki#base#follow_link(split, reuse, move_cursor, ...) "{{{ endif else - if a:0 > 0 - execute "normal! ".a:1 - else + if a:0 >= 3 + execute "normal! ".a:3 + else call vimwiki#base#normalize_link(0) endif endif -endfunction " }}} +endfunction -" vimwiki#base#go_back_link -function! vimwiki#base#go_back_link() "{{{ - if exists("b:vimwiki_prev_link") + +function! vimwiki#base#go_back_link() + let prev_link = vimwiki#vars#get_bufferlocal('prev_link') + if !empty(prev_link) " go back to saved wiki link - let prev_word = b:vimwiki_prev_link - execute ":e ".substitute(prev_word[0], '\s', '\\\0', 'g') - call setpos('.', prev_word[1]) + call vimwiki#base#edit_file(':e ', prev_link[0], '') + call setpos('.', prev_link[1]) else " maybe we came here by jumping to a tag -> pop from the tag stack silent! pop! endif -endfunction " }}} +endfunction -" vimwiki#base#goto_index -function! vimwiki#base#goto_index(wnum, ...) "{{{ - if a:wnum > len(g:vimwiki_list) - echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in g:vimwiki_list!' + +function! vimwiki#base#goto_index(wnum, ...) + if a:wnum > vimwiki#vars#number_of_wikis() + echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in your Vimwiki settings!' return endif " usually a:wnum is greater then 0 but with the following command it is == 0: - " vim -n -c "exe 'VimwikiIndex' | echo g:vimwiki_current_idx" + " vim -n -c ":VimwikiIndex" if a:wnum > 0 let idx = a:wnum - 1 else @@ -1326,23 +1210,27 @@ function! vimwiki#base#goto_index(wnum, ...) "{{{ endif if a:0 - let cmd = 'tabedit' + if a:1 == 1 + let cmd = 'tabedit' + elseif a:1 == 2 + let cmd = 'split' + elseif a:1 == 3 + let cmd = 'vsplit' + endif else let cmd = 'edit' endif - call Validate_wiki_options(idx) - call vimwiki#base#edit_file(cmd, - \ VimwikiGet('path', idx).VimwikiGet('index', idx). - \ VimwikiGet('ext', idx), - \ '') - call vimwiki#base#setup_buffer_state(idx) -endfunction "}}} + let index_file = vimwiki#vars#get_wikilocal('path', idx). + \ vimwiki#vars#get_wikilocal('index', idx). + \ vimwiki#vars#get_wikilocal('ext', idx) -" vimwiki#base#delete_link -function! vimwiki#base#delete_link() "{{{ - "" file system funcs - "" Delete wiki link you are in from filesystem + call vimwiki#base#edit_file(cmd, index_file, '') +endfunction + + +function! vimwiki#base#delete_link() + " Delete wiki file you are in from filesystem let val = input('Delete "'.expand('%').'" [y]es/[N]o? ') if val !~? '^y' return @@ -1362,12 +1250,12 @@ function! vimwiki#base#delete_link() "{{{ if expand('%:p') != "" execute "e" endif -endfunction "}}} +endfunction + -" vimwiki#base#rename_link " Rename current file, update all links to it -function! vimwiki#base#rename_link() "{{{ - let subdir = VimwikiGet('subdir') +function! vimwiki#base#rename_link() + let subdir = vimwiki#vars#get_bufferlocal('subdir') let old_fname = subdir.expand('%:t') " there is no file (new one maybe) @@ -1396,24 +1284,23 @@ function! vimwiki#base#rename_link() "{{{ return endif - let url = matchstr(new_link, g:vimwiki_rxWikiLinkMatchUrl) + let url = matchstr(new_link, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl')) if url != '' let new_link = url endif - + let new_link = subdir.new_link - let new_fname = VimwikiGet('path').new_link.VimwikiGet('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 let fname = glob(new_fname) if fname != '' - echomsg 'Vimwiki Error: Cannot rename to "'.new_fname. - \ '". File with that name exist!' + echomsg 'Vimwiki Error: Cannot rename to "'.new_fname.'". File with that name exist!' return endif " rename wiki link file try - echomsg 'Vimwiki: Renaming '.VimwikiGet('path').old_fname.' to '.new_fname + echomsg 'Vimwiki: Renaming '.vimwiki#vars#get_wikilocal('path').old_fname.' to '.new_fname let res = rename(expand('%:p'), expand(new_fname)) if res != 0 throw "Cannot rename!" @@ -1425,8 +1312,7 @@ function! vimwiki#base#rename_link() "{{{ let &buftype="nofile" - let cur_buffer = [expand('%:p'), - \getbufvar(expand('%:p'), "vimwiki_prev_link")] + let cur_buffer = [expand('%:p'), vimwiki#vars#get_bufferlocal('prev_link')] let blist = s:get_wiki_buffers() @@ -1456,73 +1342,79 @@ function! vimwiki#base#rename_link() "{{{ endif endfor - call s:open_wiki_buffer([new_fname, - \ cur_buffer[1]]) + call s:open_wiki_buffer([new_fname, cur_buffer[1]]) " execute 'bwipeout '.escape(cur_buffer[0], ' ') echomsg 'Vimwiki: '.old_fname.' is renamed to '.new_fname let &more = setting_more -endfunction " }}} +endfunction + -" vimwiki#base#ui_select -function! vimwiki#base#ui_select() "{{{ +function! vimwiki#base#ui_select() call s:print_wiki_list() let idx = input("Select Wiki (specify number): ") if idx == "" return endif call vimwiki#base#goto_index(idx) -endfunction "}}} -" }}} +endfunction -" TEXT OBJECTS functions {{{ -" vimwiki#base#TO_header -function! vimwiki#base#TO_header(inner, visual) "{{{ - if !search('^\(=\+\).\+\1\s*$', 'bcW') +function! vimwiki#base#TO_header(inner, including_subheaders, count) + let headers = s:collect_headers() + if empty(headers) return endif - - let sel_start = line("'<") - let sel_end = line("'>") - let block_start = line(".") - let advance = 0 - let level = vimwiki#u#count_first_sym(getline('.')) + let current_line = line('.') - let is_header_selected = sel_start == block_start - \ && sel_start != sel_end + let current_header_index = s:current_header(headers, current_line) - if a:visual && is_header_selected - if level > 1 - let level -= 1 - call search('^\(=\{'.level.'\}\).\+\1\s*$', 'bcW') - else - let advance = 1 - endif + if current_header_index < 0 + return endif - normal! V + " from which to which header + if !a:including_subheaders && a:count <= 1 + let first_line = headers[current_header_index][0] + let last_line = current_header_index == len(headers)-1 ? line('$') : + \ headers[current_header_index + 1][0] - 1 + else + let first_header_index = current_header_index + for _ in range(a:count - 1) + let parent = s:get_another_header(headers, first_header_index, -1, '<') + if parent < 0 + break + else + let first_header_index = parent + endif + endfor - if a:visual && is_header_selected - call cursor(sel_end + advance, 0) + let next_sibling_or_higher = s:get_another_header(headers, first_header_index, +1, '<=') + + let first_line = headers[first_header_index][0] + let last_line = + \ next_sibling_or_higher >= 0 ? headers[next_sibling_or_higher][0] - 1 : line('$') endif - if search('^\(=\{1,'.level.'}\).\+\1\s*$', 'W') - call cursor(line('.') - 1, 0) - else - call cursor(line('$'), 0) + if a:inner + let first_line += 1 + let last_line = prevnonblank(last_line) endif - if a:inner && getline(line('.')) =~# '^\s*$' - let lnum = prevnonblank(line('.') - 1) - call cursor(lnum, 0) + if first_line > last_line + " this can happen e.g. when doing vih on a header with another header in the very next line + return endif -endfunction "}}} -" vimwiki#base#TO_table_cell -function! vimwiki#base#TO_table_cell(inner, visual) "{{{ + call cursor(first_line, 1) + normal! V + call cursor(last_line, 1) +endfunction + + +function! vimwiki#base#TO_table_cell(inner, visual) if col('.') == col('$')-1 return endif @@ -1566,7 +1458,7 @@ function! vimwiki#base#TO_table_cell(inner, visual) "{{{ " XXX: WORKAROUND. " if blockwise selection is ended at | character then pressing j to extend - " selection furhter fails. But if we shake the cursor left and right then + " selection further fails. But if we shake the cursor left and right then " it works. normal! hl else @@ -1584,10 +1476,10 @@ function! vimwiki#base#TO_table_cell(inner, visual) "{{{ normal! 2h endif endif -endfunction "}}} +endfunction + -" vimwiki#base#TO_table_col -function! vimwiki#base#TO_table_col(inner, visual) "{{{ +function! vimwiki#base#TO_table_col(inner, visual) let t_rows = vimwiki#tbl#get_rows(line('.')) if empty(t_rows) return @@ -1699,23 +1591,21 @@ function! vimwiki#base#TO_table_col(inner, visual) "{{{ " expand selection to the bottom line of the table call vimwiki#u#cursor(t_rows[-1][0], virtcol('.')) endif -endfunction "}}} -" }}} +endfunction + -" HEADER functions {{{ -" vimwiki#base#AddHeaderLevel -function! vimwiki#base#AddHeaderLevel() "{{{ +function! vimwiki#base#AddHeaderLevel() let lnum = line('.') let line = getline(lnum) - let rxHdr = g:vimwiki_rxH + let rxHdr = vimwiki#vars#get_syntaxlocal('rxH') if line =~# '^\s*$' return endif - if line =~# g:vimwiki_rxHeader + if line =~# vimwiki#vars#get_syntaxlocal('rxHeader') let level = vimwiki#u#count_first_sym(line) if level < 6 - if g:vimwiki_symH + if vimwiki#vars#get_syntaxlocal('symH') let line = substitute(line, '\('.rxHdr.'\+\).\+\1', rxHdr.'&'.rxHdr, '') else let line = substitute(line, '\('.rxHdr.'\+\).\+', rxHdr.'&', '') @@ -1723,31 +1613,31 @@ function! vimwiki#base#AddHeaderLevel() "{{{ call setline(lnum, line) endif else - let line = substitute(line, '^\s*', '&'.rxHdr.' ', '') - if g:vimwiki_symH + let line = substitute(line, '^\s*', '&'.rxHdr.' ', '') + if vimwiki#vars#get_syntaxlocal('symH') let line = substitute(line, '\s*$', ' '.rxHdr.'&', '') endif call setline(lnum, line) endif -endfunction "}}} +endfunction + -" vimwiki#base#RemoveHeaderLevel -function! vimwiki#base#RemoveHeaderLevel() "{{{ +function! vimwiki#base#RemoveHeaderLevel() let lnum = line('.') let line = getline(lnum) - let rxHdr = g:vimwiki_rxH + let rxHdr = vimwiki#vars#get_syntaxlocal('rxH') if line =~# '^\s*$' return endif - if line =~# g:vimwiki_rxHeader + if line =~# vimwiki#vars#get_syntaxlocal('rxHeader') let level = vimwiki#u#count_first_sym(line) let old = repeat(rxHdr, level) let new = repeat(rxHdr, level - 1) let chomp = line =~# rxHdr.'\s' - if g:vimwiki_symH + if vimwiki#vars#get_syntaxlocal('symH') let line = substitute(line, old, new, 'g') else let line = substitute(line, old, new, '') @@ -1762,39 +1652,147 @@ function! vimwiki#base#RemoveHeaderLevel() "{{{ call setline(lnum, line) endif -endfunction " }}} +endfunction -" a:create == 1: creates or updates TOC in current file -" a:create == 0: update if TOC exists -function! vimwiki#base#table_of_contents(create) - " collect new headers + + +" Returns all the headers in the current buffer as a list of the form +" [[line_number, header_level, header_text], [...], [...], ...] +function! s:collect_headers() let is_inside_pre_or_math = 0 " 1: inside pre, 2: inside math, 0: outside let headers = [] - let headers_levels = [['', 0], ['', 0], ['', 0], ['', 0], ['', 0], ['', 0]] for lnum in range(1, line('$')) let line_content = getline(lnum) - if (is_inside_pre_or_math == 1 && line_content =~# g:vimwiki_rxPreEnd) || - \ (is_inside_pre_or_math == 2 && line_content =~# g:vimwiki_rxMathEnd) + if (is_inside_pre_or_math == 1 && line_content =~# vimwiki#vars#get_syntaxlocal('rxPreEnd')) || + \ (is_inside_pre_or_math == 2 && line_content =~# vimwiki#vars#get_syntaxlocal('rxMathEnd')) let is_inside_pre_or_math = 0 continue endif if is_inside_pre_or_math > 0 continue endif - if line_content =~# g:vimwiki_rxPreStart + if line_content =~# vimwiki#vars#get_syntaxlocal('rxPreStart') let is_inside_pre_or_math = 1 continue endif - if line_content =~# g:vimwiki_rxMathStart + if line_content =~# vimwiki#vars#get_syntaxlocal('rxMathStart') let is_inside_pre_or_math = 2 continue endif - if line_content !~# g:vimwiki_rxHeader + if line_content !~# vimwiki#vars#get_syntaxlocal('rxHeader') continue endif - let h_level = vimwiki#u#count_first_sym(line_content) - let h_text = vimwiki#u#trim(matchstr(line_content, g:vimwiki_rxHeader)) - if h_text ==# g:vimwiki_toc_header " don't include the TOC's header itself + let header_level = vimwiki#u#count_first_sym(line_content) + let header_text = + \ vimwiki#u#trim(matchstr(line_content, vimwiki#vars#get_syntaxlocal('rxHeader'))) + call add(headers, [lnum, header_level, header_text]) + endfor + + return headers +endfunction + + +function! s:current_header(headers, line_number) + if empty(a:headers) + return -1 + endif + + if a:line_number >= a:headers[-1][0] + return len(a:headers) - 1 + endif + + let current_header_index = -1 + while a:headers[current_header_index+1][0] <= a:line_number + let current_header_index += 1 + endwhile + return current_header_index +endfunction + + +function! s:get_another_header(headers, current_index, direction, operation) + if empty(a:headers) || a:current_index < 0 + return -1 + endif + let current_level = a:headers[a:current_index][1] + let index = a:current_index + a:direction + + while 1 + if index < 0 || index >= len(a:headers) + return -1 + endif + if eval('a:headers[index][1] ' . a:operation . ' current_level') + return index + endif + let index += a:direction + endwhile +endfunction + + +function! vimwiki#base#goto_parent_header() + let headers = s:collect_headers() + let current_header_index = s:current_header(headers, line('.')) + let parent_header = s:get_another_header(headers, current_header_index, -1, '<') + if parent_header >= 0 + call cursor(headers[parent_header][0], 1) + else + echo 'Vimwiki: no parent header found' + endif +endfunction + + +function! vimwiki#base#goto_next_header() + let headers = s:collect_headers() + let current_header_index = s:current_header(headers, line('.')) + if current_header_index >= 0 && current_header_index < len(headers) - 1 + call cursor(headers[current_header_index + 1][0], 1) + elseif current_header_index < 0 && !empty(headers) " we're above the first header + call cursor(headers[0][0], 1) + else + echo 'Vimwiki: no next header found' + endif +endfunction + + +function! vimwiki#base#goto_prev_header() + let headers = s:collect_headers() + let current_header_index = s:current_header(headers, line('.')) + " if the cursor already was on a header, jump to the previous one + if current_header_index >= 1 && headers[current_header_index][0] == line('.') + let current_header_index -= 1 + endif + if current_header_index >= 0 + call cursor(headers[current_header_index][0], 1) + else + echo 'Vimwiki: no previous header found' + endif +endfunction + + +function! vimwiki#base#goto_sibling(direction) + let headers = s:collect_headers() + let current_header_index = s:current_header(headers, line('.')) + let next_potential_sibling = + \ s:get_another_header(headers, current_header_index, a:direction, '<=') + if next_potential_sibling >= 0 && headers[next_potential_sibling][1] == + \ headers[current_header_index][1] + call cursor(headers[next_potential_sibling][0], 1) + else + echo 'Vimwiki: no sibling header found' + endif +endfunction + + +" a:create == 1: creates or updates TOC in current file +" a:create == 0: update if TOC exists +function! vimwiki#base#table_of_contents(create) + let headers = s:collect_headers() + let numbering = vimwiki#vars#get_global('html_header_numbering') + let headers_levels = [['', 0], ['', 0], ['', 0], ['', 0], ['', 0], ['', 0]] + let complete_header_infos = [] + for header in headers + let h_text = header[2] + let h_level = header[1] + if h_text ==# vimwiki#vars#get_global('toc_header') " don't include the TOC's header itself continue endif let headers_levels[h_level-1] = [h_text, headers_levels[h_level-1][1]+1] @@ -1808,184 +1806,185 @@ function! vimwiki#base#table_of_contents(create) endfor let h_complete_id .= headers_levels[h_level-1][0] - if g:vimwiki_html_header_numbering > 0 - \ && g:vimwiki_html_header_numbering <= h_level - let h_number = join(map(copy(headers_levels[ - \ g:vimwiki_html_header_numbering-1 : h_level-1]), 'v:val[1]'), '.') - let h_number .= g:vimwiki_html_header_numbering_sym + if numbering > 0 && numbering <= h_level + let h_number = join(map(copy(headers_levels[numbering-1 : h_level-1]), 'v:val[1]'), '.') + let h_number .= vimwiki#vars#get_global('html_header_numbering_sym') let h_text = h_number.' '.h_text endif - call add(headers, [h_level, h_complete_id, h_text]) + call add(complete_header_infos, [h_level, h_complete_id, h_text]) endfor let lines = [] let startindent = repeat(' ', vimwiki#lst#get_list_margin()) let indentstring = repeat(' ', vimwiki#u#sw()) let bullet = vimwiki#lst#default_symbol().' ' - for [lvl, link, desc] in headers + for [lvl, link, desc] in complete_header_infos let esc_link = substitute(link, "'", "''", 'g') let esc_desc = substitute(desc, "'", "''", 'g') - let link = substitute(g:vimwiki_WikiLinkTemplate2, '__LinkUrl__', - \ '\='."'".'#'.esc_link."'", '') - let link = substitute(link, '__LinkDescription__', '\='."'".esc_desc."'", '') + let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2') + if vimwiki#vars#get_wikilocal('syntax') == 'markdown' + let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template') + endif + let link = s:safesubstitute(link_tpl, '__LinkUrl__', + \ '#'.esc_link, '') + let link = s:safesubstitute(link, '__LinkDescription__', esc_desc, '') call add(lines, startindent.repeat(indentstring, lvl-1).bullet.link) endfor let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' ' - call vimwiki#base#update_listing_in_buffer(lines, g:vimwiki_toc_header, links_rx, - \ 1, a:create) + call vimwiki#base#update_listing_in_buffer(lines, + \ vimwiki#vars#get_global('toc_header'), links_rx, 1, a:create) endfunction -"}}} -" LINK functions {{{ -" vimwiki#base#apply_template + " Construct a regular expression matching from template (with special " characters properly escaped), by substituting rxUrl for __LinkUrl__, rxDesc " for __LinkDescription__, and rxStyle for __LinkStyle__. The three " arguments rxUrl, rxDesc, and rxStyle are copied verbatim, without any " special character escapes or substitutions. -function! vimwiki#base#apply_template(template, rxUrl, rxDesc, rxStyle) "{{{ +function! vimwiki#base#apply_template(template, rxUrl, rxDesc, rxStyle) let lnk = a:template if a:rxUrl != "" - let lnk = substitute(lnk, '__LinkUrl__', '\='."'".a:rxUrl."'", 'g') + let lnk = s:safesubstitute(lnk, '__LinkUrl__', a:rxUrl, 'g') endif if a:rxDesc != "" - let lnk = substitute(lnk, '__LinkDescription__', '\='."'".a:rxDesc."'", 'g') + let lnk = s:safesubstitute(lnk, '__LinkDescription__', a:rxDesc, 'g') endif if a:rxStyle != "" - let lnk = substitute(lnk, '__LinkStyle__', '\='."'".a:rxStyle."'", 'g') + let lnk = s:safesubstitute(lnk, '__LinkStyle__', a:rxStyle, 'g') endif return lnk -endfunction " }}} +endfunction -" s:clean_url -function! s:clean_url(url) " {{{ - let url = split(a:url, '/\|=\|-\|&\|?\|\.') + +function! s:clean_url(url) + " remove protocol and tld + let url = substitute(a:url, '^\a\+://', '', '') + let url = substitute(url, '^\([^/]\+\).\a\{2,4}/', '\1/', '') + let url = split(url, '/\|=\|-\|&\|?\|\.') let url = filter(url, 'v:val !=# ""') - let url = filter(url, 'v:val !=# "www"') - let url = filter(url, 'v:val !=# "com"') - let url = filter(url, 'v:val !=# "org"') - let url = filter(url, 'v:val !=# "net"') - let url = filter(url, 'v:val !=# "edu"') - let url = filter(url, 'v:val !=# "http\:"') - let url = filter(url, 'v:val !=# "https\:"') - let url = filter(url, 'v:val !=# "file\:"') - let url = filter(url, 'v:val !=# "xml\:"') + if url[0] == "www" + let url = url[1:] + endif + if url[-1] =~ '^\(htm\|html\|php\)$' + let url = url[0:-2] + endif + " remove words consisting of only hexadecimal digits or non-word characters + let url = filter(url, 'v:val !~ "^\\A\\{4,}$"') + let url = filter(url, 'v:val !~ "^\\x\\{4,}$" || v:val !~ "\\d"') return join(url, " ") -endfunction " }}} +endfunction -" s:is_diary_file -function! s:is_diary_file(filename) " {{{ + +function! s:is_diary_file(filename) let file_path = vimwiki#path#path_norm(a:filename) - let rel_path = VimwikiGet('diary_rel_path') - let diary_path = vimwiki#path#path_norm(VimwikiGet('path') . rel_path) - return rel_path != '' - \ && file_path =~# '^'.vimwiki#u#escape(diary_path) -endfunction " }}} - -" vimwiki#base#normalize_link_helper -function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) " {{{ - let str = a:str - let url = matchstr(str, a:rxUrl) - let descr = matchstr(str, a:rxDesc) - let template = a:template + let rel_path = vimwiki#vars#get_wikilocal('diary_rel_path') + let diary_path = vimwiki#path#path_norm(vimwiki#vars#get_wikilocal('path') . rel_path) + return rel_path != '' && file_path =~# '^'.vimwiki#u#escape(diary_path) +endfunction + + +function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) + let url = matchstr(a:str, a:rxUrl) + let descr = matchstr(a:str, a:rxDesc) if descr == "" let descr = s:clean_url(url) endif - let lnk = substitute(template, '__LinkDescription__', '\="'.descr.'"', '') - let lnk = substitute(lnk, '__LinkUrl__', '\="'.url.'"', '') + let lnk = s:safesubstitute(a:template, '__LinkDescription__', descr, '') + let lnk = s:safesubstitute(lnk, '__LinkUrl__', url, '') return lnk -endfunction " }}} +endfunction + -" vimwiki#base#normalize_imagelink_helper -function! vimwiki#base#normalize_imagelink_helper(str, rxUrl, rxDesc, rxStyle, template) "{{{ +function! vimwiki#base#normalize_imagelink_helper(str, rxUrl, rxDesc, rxStyle, template) let lnk = vimwiki#base#normalize_link_helper(a:str, a:rxUrl, a:rxDesc, a:template) let style = matchstr(a:str, a:rxStyle) - let lnk = substitute(lnk, '__LinkStyle__', '\="'.style.'"', '') + let lnk = s:safesubstitute(lnk, '__LinkStyle__', style, '') return lnk -endfunction " }}} - -" s:normalize_link_in_diary -function! s:normalize_link_in_diary(lnk) " {{{ - let link = a:lnk . VimwikiGet('ext') - let link_wiki = VimwikiGet('path') . '/' . link - let link_diary = VimwikiGet('path') . '/' - \ . VimwikiGet('diary_rel_path') . '/' . link +endfunction + + +function! s:normalize_link_in_diary(lnk) + let link = a:lnk . vimwiki#vars#get_wikilocal('ext') + let link_wiki = vimwiki#vars#get_wikilocal('path') . '/' . link + let link_diary = vimwiki#vars#get_wikilocal('path') . '/' + \ . vimwiki#vars#get_wikilocal('diary_rel_path') . '/' . link let link_exists_in_diary = filereadable(link_diary) let link_exists_in_wiki = filereadable(link_wiki) 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 let str = a:lnk - let rxUrl = g:vimwiki_rxWord + let rxUrl = vimwiki#vars#get_global('rxWord') let rxDesc = '' - let template = g:vimwiki_WikiLinkTemplate1 + let template = vimwiki#vars#get_global('WikiLinkTemplate1') else - let depth = len(split(VimwikiGet('diary_rel_path'), '/')) + let depth = len(split(vimwiki#vars#get_wikilocal('diary_rel_path'), '/')) let str = repeat('../', depth) . a:lnk . '|' . a:lnk let rxUrl = '^.*\ze|' let rxDesc = '|\zs.*$' - let template = g:vimwiki_WikiLinkTemplate2 + let template = vimwiki#vars#get_global('WikiLinkTemplate2') endif return vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) -endfunction " }}} +endfunction + -" s:normalize_link_syntax_n -function! s:normalize_link_syntax_n() " {{{ +function! s:normalize_link_syntax_n() " try WikiLink - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWikiLink) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink')) if !empty(lnk) let sub = vimwiki#base#normalize_link_helper(lnk, - \ g:vimwiki_rxWikiLinkMatchUrl, g:vimwiki_rxWikiLinkMatchDescr, - \ g:vimwiki_WikiLinkTemplate2) - call vimwiki#base#replacestr_at_cursor(g:vimwiki_rxWikiLink, sub) + \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'), + \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'), + \ vimwiki#vars#get_global('WikiLinkTemplate2')) + call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink'), sub) return endif - + " try WikiIncl - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWikiIncl) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWikiIncl')) if !empty(lnk) " NO-OP !! return endif " try Weblink - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWeblink) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink')) if !empty(lnk) let sub = vimwiki#base#normalize_link_helper(lnk, - \ lnk, '', g:vimwiki_WikiLinkTemplate2) - call vimwiki#base#replacestr_at_cursor(g:vimwiki_rxWeblink, sub) + \ lnk, '', vimwiki#vars#get_global('WikiLinkTemplate2')) + call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink'), sub) return endif " try Word (any characters except separators) " rxWord is less permissive than rxWikiLinkUrl which is used in " normalize_link_syntax_v - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWord) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWord')) if !empty(lnk) if s:is_diary_file(expand("%:p")) let sub = s:normalize_link_in_diary(lnk) else let sub = vimwiki#base#normalize_link_helper(lnk, - \ g:vimwiki_rxWord, '', - \ g:vimwiki_WikiLinkTemplate1) + \ vimwiki#vars#get_global('rxWord'), '', + \ vimwiki#vars#get_global('WikiLinkTemplate1')) endif call vimwiki#base#replacestr_at_cursor('\V'.lnk, sub) return endif -endfunction " }}} +endfunction + -" s:normalize_link_syntax_v -function! s:normalize_link_syntax_v() " {{{ +function! s:normalize_link_syntax_v() let sel_save = &selection let &selection = "old" - let rv = @" - let rt = getregtype('"') + let default_register_save = @" + let registertype_save = getregtype('"') try " Save selected text to register " @@ -1995,36 +1994,36 @@ function! s:normalize_link_syntax_v() " {{{ if s:is_diary_file(expand("%:p")) let sub = s:normalize_link_in_diary(@") else - let sub = substitute(g:vimwiki_WikiLinkTemplate1, - \ '__LinkUrl__', '\=' . "'" . @" . "'", '') + let sub = s:safesubstitute(vimwiki#vars#get_global('WikiLinkTemplate1'), + \ '__LinkUrl__', @", '') endif " Put substitution in register " and change text - call setreg('"', sub, 'v') + call setreg('"', substitute(sub, '\n', '', ''), visualmode()) normal! `>""pgvd finally - call setreg('"', rv, rt) + call setreg('"', default_register_save, registertype_save) let &selection = sel_save endtry -endfunction " }}} +endfunction -" vimwiki#base#normalize_link -function! vimwiki#base#normalize_link(is_visual_mode) "{{{ - if exists('*vimwiki#'.VimwikiGet('syntax').'_base#normalize_link') + +function! vimwiki#base#normalize_link(is_visual_mode) + if exists('*vimwiki#'.vimwiki#vars#get_wikilocal('syntax').'_base#normalize_link') " Syntax-specific links - call vimwiki#{VimwikiGet('syntax')}_base#normalize_link(a:is_visual_mode) + call vimwiki#{vimwiki#vars#get_wikilocal('syntax')}_base#normalize_link(a:is_visual_mode) else if !a:is_visual_mode call s:normalize_link_syntax_n() - elseif visualmode() ==# 'v' && line("'<") == line("'>") - " action undefined for 'line-wise' or 'multi-line' visual mode selections + elseif line("'<") == line("'>") + " action undefined for multi-line visual mode selections call s:normalize_link_syntax_v() endif endif -endfunction "}}} +endfunction -" vimwiki#base#detect_nested_syntax -function! vimwiki#base#detect_nested_syntax() "{{{ + +function! vimwiki#base#detect_nested_syntax() let last_word = '\v.*<(\w+)\s*$' let lines = map(filter(getline(1, "$"), 'v:val =~ "\\%({{{\\|```\\)" && v:val =~ last_word'), \ 'substitute(v:val, last_word, "\\=submatch(1)", "")') @@ -2033,26 +2032,20 @@ function! vimwiki#base#detect_nested_syntax() "{{{ let dict[elem] = elem endfor return dict -endfunction "}}} - -" }}} +endfunction -" Command completion functions {{{ -" vimwiki#base#complete_links_escaped -function! vimwiki#base#complete_links_escaped(ArgLead, CmdLine, CursorPos) abort " {{{ +function! vimwiki#base#complete_links_escaped(ArgLead, CmdLine, CursorPos) abort " We can safely ignore args if we use -custom=complete option, Vim engine " will do the job of filtering. return vimwiki#base#get_globlinks_escaped() -endfunction " }}} +endfunction -"}}} " ------------------------------------------------------------------------- " Load syntax-specific Wiki functionality for s:syn in s:vimwiki_get_known_syntaxes() execute 'runtime! autoload/vimwiki/'.s:syn.'_base.vim' -endfor +endfor " ------------------------------------------------------------------------- - diff --git a/autoload/vimwiki/diary.vim b/autoload/vimwiki/diary.vim @@ -1,76 +1,80 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file -" Desc: Handle diary notes +" Description: Handle diary notes " Home: https://github.com/vimwiki/vimwiki/ -" Load only once {{{ + if exists("g:loaded_vimwiki_diary_auto") || &cp finish endif let g:loaded_vimwiki_diary_auto = 1 -"}}} + let s:vimwiki_max_scan_for_caption = 5 -" Helpers {{{ -function! s:prefix_zero(num) "{{{ + +function! s:prefix_zero(num) if a:num < 10 return '0'.a:num endif return a:num -endfunction "}}} +endfunction + + +function! s:diary_path(...) + let idx = a:0 == 0 ? vimwiki#vars#get_bufferlocal('wiki_nr') : a:1 + return vimwiki#vars#get_wikilocal('path', idx).vimwiki#vars#get_wikilocal('diary_rel_path', idx) +endfunction -function! s:get_date_link(fmt) "{{{ - return strftime(a:fmt) -endfunction "}}} -function! s:diary_path(...) "{{{ - let idx = a:0 == 0 ? g:vimwiki_current_idx : a:1 - return VimwikiGet('path', idx).VimwikiGet('diary_rel_path', idx) -endfunction "}}} +function! s:diary_index(...) + let idx = a:0 == 0 ? vimwiki#vars#get_bufferlocal('wiki_nr') : a:1 + return s:diary_path(idx).vimwiki#vars#get_wikilocal('diary_index', idx). + \ vimwiki#vars#get_wikilocal('ext', idx) +endfunction -function! s:diary_index(...) "{{{ - let idx = a:0 == 0 ? g:vimwiki_current_idx : a:1 - return s:diary_path(idx).VimwikiGet('diary_index', idx).VimwikiGet('ext', idx) -endfunction "}}} -function! s:diary_date_link(...) "{{{ - let idx = a:0 == 0 ? g:vimwiki_current_idx : a:1 - return s:get_date_link(VimwikiGet('diary_link_fmt', idx)) -endfunction "}}} +function! vimwiki#diary#diary_date_link(...) + if a:0 + return strftime('%Y-%m-%d', a:1) + else + return strftime('%Y-%m-%d') + endif +endfunction + -function! s:get_position_links(link) "{{{ +function! s:get_position_links(link) let idx = -1 let links = [] if a:link =~# '^\d\{4}-\d\d-\d\d' let links = map(s:get_diary_files(), 'fnamemodify(v:val, ":t:r")') " include 'today' into links - if index(links, s:diary_date_link()) == -1 - call add(links, s:diary_date_link()) + if index(links, vimwiki#diary#diary_date_link()) == -1 + call add(links, vimwiki#diary#diary_date_link()) endif call sort(links) let idx = index(links, a:link) endif return [idx, links] -endfunction "}}} +endfunction -fun! s:get_month_name(month) "{{{ - return g:vimwiki_diary_months[str2nr(a:month)] -endfun "}}} -" Helpers }}} +function! s:get_month_name(month) + return vimwiki#vars#get_global('diary_months')[str2nr(a:month)] +endfunction -" Diary index stuff {{{ -fun! s:read_captions(files) "{{{ + +function! s:read_captions(files) let result = {} + let rx_header = vimwiki#vars#get_syntaxlocal('rxHeader') for fl in a:files " remove paths and extensions - let fl_key = fnamemodify(fl, ':t:r') + let fl_key = substitute(fnamemodify(fl, ':t'), vimwiki#vars#get_wikilocal('ext').'$', '', '') if filereadable(fl) for line in readfile(fl, '', s:vimwiki_max_scan_for_caption) - if line =~# g:vimwiki_rxHeader && !has_key(result, fl_key) - let result[fl_key] = vimwiki#u#trim(matchstr(line, g:vimwiki_rxHeader)) + if line =~# rx_header && !has_key(result, fl_key) + let result[fl_key] = vimwiki#u#trim(matchstr(line, rx_header)) endif endfor endif @@ -81,11 +85,13 @@ fun! s:read_captions(files) "{{{ endfor return result -endfun "}}} +endfunction + -fun! s:get_diary_files() "{{{ +function! s:get_diary_files() let rx = '^\d\{4}-\d\d-\d\d' - let s_files = glob(VimwikiGet('path').VimwikiGet('diary_rel_path').'*'.VimwikiGet('ext')) + let s_files = glob(vimwiki#vars#get_wikilocal('path'). + \ vimwiki#vars#get_wikilocal('diary_rel_path').'*'.vimwiki#vars#get_wikilocal('ext')) let files = split(s_files, '\n') call filter(files, 'fnamemodify(v:val, ":t") =~# "'.escape(rx, '\').'"') @@ -93,9 +99,10 @@ fun! s:get_diary_files() "{{{ call filter(files, 'v:val !~# ''.*\~$''') return files -endfun "}}} +endfunction -fun! s:group_links(links) "{{{ + +function! s:group_links(links) let result = {} let p_year = 0 let p_month = 0 @@ -114,83 +121,104 @@ fun! s:group_links(links) "{{{ let p_month = month endfor return result -endfun "}}} +endfunction + -function! s:sort(lst) "{{{ - if VimwikiGet("diary_sort") ==? 'desc' +function! s:sort(lst) + if vimwiki#vars#get_wikilocal('diary_sort') ==? 'desc' return reverse(sort(a:lst)) else return sort(a:lst) endif -endfunction "}}} +endfunction -function! s:format_diary() "{{{ - let result = [] +function! s:format_diary() + let result = [] let links_with_captions = s:read_captions(s:get_diary_files()) let g_files = s:group_links(links_with_captions) for year in s:sort(keys(g_files)) call add(result, '') - call add(result, substitute(g:vimwiki_rxH2_Template, '__Header__', year , '')) + call add(result, + \ substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', year , '')) for month in s:sort(keys(g_files[year])) call add(result, '') - call add(result, substitute(g:vimwiki_rxH3_Template, '__Header__', s:get_month_name(month), '')) + call add(result, substitute(vimwiki#vars#get_syntaxlocal('rxH3_Template'), + \ '__Header__', s:get_month_name(month), '')) for [fl, cap] in s:sort(items(g_files[year][month])) - if empty(cap) - let entry = substitute(g:vimwiki_WikiLinkTemplate1, '__LinkUrl__', fl, '') - let entry = substitute(entry, '__LinkDescription__', cap, '') - call add(result, repeat(' ', &sw).'* '.entry) - else - let entry = substitute(g:vimwiki_WikiLinkTemplate2, '__LinkUrl__', fl, '') - let entry = substitute(entry, '__LinkDescription__', cap, '') - call add(result, repeat(' ', &sw).'* '.entry) + let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2') + + if vimwiki#vars#get_wikilocal('syntax') == 'markdown' + let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template') + + if empty(cap) " When using markdown syntax, we should ensure we always have a link description. + let cap = fl + endif + elseif empty(cap) + let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1') 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 return result -endfunction "}}} +endfunction -" Diary index stuff }}} -function! vimwiki#diary#make_note(wnum, ...) "{{{ - if a:wnum > len(g:vimwiki_list) - echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in g:vimwiki_list!' - return +" 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, ...) + if a:wnum == 0 + 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 - " TODO: refactor it. base#goto_index uses the same - if a:wnum > 0 - let idx = a:wnum - 1 - else - let idx = 0 + if wiki_nr >= vimwiki#vars#number_of_wikis() + echomsg 'Vimwiki Error: Wiki '.wiki_nr.' is not registered in g:vimwiki_list!' + return endif - call vimwiki#path#mkdir(VimwikiGet('path', idx).VimwikiGet('diary_rel_path', idx)) + " TODO: refactor it. base#goto_index uses the same - if a:0 && a:1 == 1 - let cmd = 'tabedit' - else - let cmd = 'edit' + call vimwiki#path#mkdir(vimwiki#vars#get_wikilocal('path', wiki_nr). + \ vimwiki#vars#get_wikilocal('diary_rel_path', wiki_nr)) + + let cmd = 'edit' + if a:0 + if a:1 == 1 + let cmd = 'tabedit' + elseif a:1 == 2 + let cmd = 'split' + elseif a:1 == 3 + let cmd = 'vsplit' + endif endif if a:0>1 let link = 'diary:'.a:2 else - let link = 'diary:'.s:diary_date_link(idx) + let link = 'diary:'.vimwiki#diary#diary_date_link() endif - call vimwiki#base#open_link(cmd, link, s:diary_index(idx)) - call vimwiki#base#setup_buffer_state(idx) -endfunction "}}} + call vimwiki#base#open_link(cmd, link, s:diary_index(wiki_nr)) +endfunction + -function! vimwiki#diary#goto_diary_index(wnum) "{{{ - if a:wnum > len(g:vimwiki_list) +function! vimwiki#diary#goto_diary_index(wnum) + if a:wnum > vimwiki#vars#number_of_wikis() echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in g:vimwiki_list!' return endif @@ -203,10 +231,10 @@ function! vimwiki#diary#goto_diary_index(wnum) "{{{ endif call vimwiki#base#edit_file('e', s:diary_index(idx), '') - call vimwiki#base#setup_buffer_state(idx) -endfunction "}}} +endfunction -function! vimwiki#diary#goto_next_day() "{{{ + +function! vimwiki#diary#goto_next_day() let link = '' let [idx, links] = s:get_position_links(expand('%:t:r')) @@ -218,15 +246,16 @@ function! vimwiki#diary#goto_next_day() "{{{ let link = 'diary:'.links[idx+1] else " goto today - let link = 'diary:'.s:diary_date_link() + let link = 'diary:'.vimwiki#diary#diary_date_link() endif if len(link) call vimwiki#base#open_link(':e ', link) endif -endfunction "}}} +endfunction + -function! vimwiki#diary#goto_prev_day() "{{{ +function! vimwiki#diary#goto_prev_day() let link = '' let [idx, links] = s:get_position_links(expand('%:t:r')) @@ -238,29 +267,30 @@ function! vimwiki#diary#goto_prev_day() "{{{ let link = 'diary:'.links[idx-1] else " goto today - let link = 'diary:'.s:diary_date_link() + let link = 'diary:'.vimwiki#diary#diary_date_link() endif if len(link) call vimwiki#base#open_link(':e ', link) endif -endfunction "}}} +endfunction -function! vimwiki#diary#generate_diary_section() "{{{ + +function! vimwiki#diary#generate_diary_section() let current_file = vimwiki#path#path_norm(expand("%:p")) let diary_file = vimwiki#path#path_norm(s:diary_index()) if vimwiki#path#is_equal(current_file, diary_file) - let content_rx = '^\%(\s*\* \)\|\%(^\s*$\)\|\%('.g:vimwiki_rxHeader.'\)' + let content_rx = '^\%(\s*\* \)\|\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxHeader').'\)' call vimwiki#base#update_listing_in_buffer(s:format_diary(), - \ VimwikiGet('diary_header'), content_rx, line('$')+1, 1) + \ vimwiki#vars#get_wikilocal('diary_header'), content_rx, line('$')+1, 1) else echomsg 'Vimwiki Error: You can generate diary links only in a diary index page!' endif -endfunction "}}} +endfunction + -" Calendar.vim {{{ -" Callback function. -function! vimwiki#diary#calendar_action(day, month, year, week, dir) "{{{ +" Callback function for Calendar.vim +function! vimwiki#diary#calendar_action(day, month, year, week, dir) let day = s:prefix_zero(a:day) let month = s:prefix_zero(a:month) @@ -278,18 +308,15 @@ function! vimwiki#diary#calendar_action(day, month, year, week, dir) "{{{ endif endif - " XXX: Well, +1 is for inconsistent index basing... - call vimwiki#diary#make_note(g:vimwiki_current_idx+1, 0, link) -endfunction "}}} + call vimwiki#diary#make_note(0, 0, link) +endfunction -" Sign function. -function vimwiki#diary#calendar_sign(day, month, year) "{{{ + +function vimwiki#diary#calendar_sign(day, month, year) let day = s:prefix_zero(a:day) let month = s:prefix_zero(a:month) - let sfile = VimwikiGet('path').VimwikiGet('diary_rel_path'). - \ a:year.'-'.month.'-'.day.VimwikiGet('ext') + let sfile = vimwiki#vars#get_wikilocal('path').vimwiki#vars#get_wikilocal('diary_rel_path'). + \ a:year.'-'.month.'-'.day.vimwiki#vars#get_wikilocal('ext') return filereadable(expand(sfile)) -endfunction "}}} - -" Calendar.vim }}} +endfunction diff --git a/autoload/vimwiki/html.vim b/autoload/vimwiki/html.vim @@ -1,62 +1,57 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file -" Desc: Export to HTML +" Description: HTML export " Home: https://github.com/vimwiki/vimwiki/ -" TODO: We need vimwiki abstract syntax tree. If properly designed it wourld -" greatly symplify different syntax to HTML generation. -" -" vimwiki -- --> PDF -" \ / -" markdown -----> AST -----> HTML -" / \ -" mediawiki -- --> Latex -" - -" Load only once {{{ + if exists("g:loaded_vimwiki_html_auto") || &cp finish endif let g:loaded_vimwiki_html_auto = 1 -"}}} -" UTILITY "{{{ -function! s:root_path(subdir) "{{{ + +function! s:root_path(subdir) return repeat('../', len(split(a:subdir, '[/\\]'))) -endfunction "}}} +endfunction + + +function! s:syntax_supported() + return vimwiki#vars#get_wikilocal('syntax') ==? "default" +endfunction -function! s:syntax_supported() " {{{ - return VimwikiGet('syntax') ==? "default" -endfunction " }}} -function! s:remove_blank_lines(lines) " {{{ +function! s:remove_blank_lines(lines) while !empty(a:lines) && a:lines[-1] =~# '^\s*$' call remove(a:lines, -1) endwhile -endfunction "}}} +endfunction + -function! s:is_web_link(lnk) "{{{ +function! s:is_web_link(lnk) if a:lnk =~# '^\%(https://\|http://\|www.\|ftp://\|file://\|mailto:\)' return 1 endif return 0 -endfunction "}}} +endfunction + -function! s:is_img_link(lnk) "{{{ +function! s:is_img_link(lnk) if tolower(a:lnk) =~# '\.\%(png\|jpg\|gif\|jpeg\)$' return 1 endif return 0 -endfunction "}}} +endfunction + -function! s:has_abs_path(fname) "{{{ +function! s:has_abs_path(fname) if a:fname =~# '\(^.:\)\|\(^/\)' return 1 endif return 0 -endfunction "}}} +endfunction -function! s:find_autoload_file(name) " {{{ + +function! s:find_autoload_file(name) for path in split(&runtimepath, ',') let fname = path.'/autoload/vimwiki/'.a:name if glob(fname) != '' @@ -64,15 +59,17 @@ function! s:find_autoload_file(name) " {{{ endif endfor return '' -endfunction " }}} +endfunction -function! s:default_CSS_full_name(path) " {{{ + +function! s:default_CSS_full_name(path) let path = expand(a:path) - let css_full_name = path.VimwikiGet('css_name') + let css_full_name = path . vimwiki#vars#get_wikilocal('css_name') return css_full_name -endfunction "}}} +endfunction + -function! s:create_default_CSS(path) " {{{ +function! s:create_default_CSS(path) let css_full_name = s:default_CSS_full_name(a:path) if glob(css_full_name) == "" call vimwiki#path#mkdir(fnamemodify(css_full_name, ':p:h')) @@ -84,26 +81,28 @@ function! s:create_default_CSS(path) " {{{ endif endif return 0 -endfunction "}}} +endfunction + -function! s:template_full_name(name) "{{{ +function! s:template_full_name(name) if a:name == '' - let name = VimwikiGet('template_default') + let name = vimwiki#vars#get_wikilocal('template_default') else let name = a:name endif - let fname = expand(VimwikiGet('template_path'). - \ name.VimwikiGet('template_ext')) + let fname = expand(vimwiki#vars#get_wikilocal('template_path'). + \ name . vimwiki#vars#get_wikilocal('template_ext')) if filereadable(fname) return fname else return '' endif -endfunction "}}} +endfunction + -function! s:get_html_template(template) "{{{ +function! s:get_html_template(template) " TODO: refactor it!!! let lines=[] @@ -113,8 +112,7 @@ function! s:get_html_template(template) "{{{ let lines = readfile(template_name) return lines catch /E484/ - echomsg 'Vimwiki: HTML template '.template_name. - \ ' does not exist!' + echomsg 'Vimwiki: HTML template '.template_name. ' does not exist!' endtry endif @@ -126,23 +124,22 @@ function! s:get_html_template(template) "{{{ let lines = readfile(default_tpl) return lines -endfunction "}}} +endfunction -function! s:safe_html_preformatted(line) "{{{ + +function! s:safe_html_preformatted(line) let line = substitute(a:line,'<','\&lt;', 'g') let line = substitute(line,'>','\&gt;', 'g') return line -endfunction "}}} +endfunction -function! s:safe_html_anchor(string) "{{{ - let string = substitute(a:string, '"', '\&quot;', 'g') - let string = substitute(string, "'", '\&#39;', 'g') - let string = substitute(string, '/', '\&#47;', 'g') - let string = substitute(string, '\t', ' ', 'g') " &#9; doesn't work - return string -endfunction "}}} -function! s:safe_html_line(line) "{{{ +function! s:escape_html_attribute(string) + return substitute(a:string, '"', '\&quot;', 'g') +endfunction + + +function! s:safe_html_line(line) " escape & < > when producing HTML text " s:lt_pattern, s:gt_pattern depend on g:vimwiki_valid_html_tags " and are set in vimwiki#html#Wiki2HTML() @@ -151,20 +148,21 @@ function! s:safe_html_line(line) "{{{ let line = substitute(line,s:gt_pattern,'\&gt;', 'g') return line -endfunction "}}} +endfunction + -function! s:delete_html_files(path) "{{{ +function! s:delete_html_files(path) let htmlfiles = split(glob(a:path.'**/*.html'), '\n') for fname in htmlfiles " ignore user html files, e.g. search.html,404.html - if stridx(g:vimwiki_user_htmls, fnamemodify(fname, ":t")) >= 0 + if stridx(vimwiki#vars#get_global('user_htmls'), fnamemodify(fname, ":t")) >= 0 continue endif " delete if there is no corresponding wiki file - let subdir = vimwiki#base#subdir(VimwikiGet('path_html'), fname) - let wikifile = VimwikiGet('path').subdir. - \fnamemodify(fname, ":t:r").VimwikiGet('ext') + let subdir = vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path_html'), fname) + let wikifile = vimwiki#vars#get_wikilocal('path').subdir. + \fnamemodify(fname, ":t:r").vimwiki#vars#get_wikilocal('ext') if filereadable(wikifile) continue endif @@ -175,13 +173,15 @@ function! s:delete_html_files(path) "{{{ echomsg 'Vimwiki Error: Cannot delete '.fname endtry endfor -endfunction "}}} +endfunction + -function! s:mid(value, cnt) "{{{ +function! s:mid(value, cnt) return strpart(a:value, a:cnt, len(a:value) - 2 * a:cnt) -endfunction "}}} +endfunction -function! s:subst_func(line, regexp, func, ...) " {{{ + +function! s:subst_func(line, regexp, func, ...) " Substitute text found by regexp with result of " func(matched) function. @@ -201,16 +201,17 @@ function! s:subst_func(line, regexp, func, ...) " {{{ let pos = matchend(a:line, a:regexp, pos) endfor return res_line -endfunction " }}} +endfunction -function! s:save_vimwiki_buffer() "{{{ + +function! s:save_vimwiki_buffer() if &filetype ==? 'vimwiki' && filewritable(expand('%')) silent update endif -endfunction "}}} +endfunction + -" get date. -function! s:process_date(placeholders, default_date) "{{{ +function! s:process_date(placeholders, default_date) if !empty(a:placeholders) for [placeholder, row, idx] in a:placeholders let [type, param] = placeholder @@ -220,10 +221,10 @@ function! s:process_date(placeholders, default_date) "{{{ endfor endif return a:default_date -endfunction "}}} +endfunction + -" get title. -function! s:process_title(placeholders, default_title) "{{{ +function! s:process_title(placeholders, default_title) if !empty(a:placeholders) for [placeholder, row, idx] in a:placeholders let [type, param] = placeholder @@ -233,9 +234,10 @@ function! s:process_title(placeholders, default_title) "{{{ endfor endif return a:default_title -endfunction "}}} +endfunction + -function! s:is_html_uptodate(wikifile) "{{{ +function! s:is_html_uptodate(wikifile) let tpl_time = -1 let tpl_file = s:template_full_name('') @@ -244,16 +246,17 @@ function! s:is_html_uptodate(wikifile) "{{{ endif let wikifile = fnamemodify(a:wikifile, ":p") - let htmlfile = expand(VimwikiGet('path_html').VimwikiGet('subdir'). - \fnamemodify(wikifile, ":t:r").".html") + let htmlfile = expand(vimwiki#vars#get_wikilocal('path_html') . + \ vimwiki#vars#get_bufferlocal('subdir') . fnamemodify(wikifile, ":t:r").".html") if getftime(wikifile) <= getftime(htmlfile) && tpl_time <= getftime(htmlfile) return 1 endif return 0 -endfunction "}}} +endfunction -function! s:html_insert_contents(html_lines, content) "{{{ + +function! s:html_insert_contents(html_lines, content) let lines = [] for line in a:html_lines if line =~# '%content%' @@ -273,22 +276,23 @@ function! s:html_insert_contents(html_lines, content) "{{{ endif endfor return lines -endfunction "}}} -"}}} +endfunction -" INLINE TAGS "{{{ -function! s:tag_eqin(value) "{{{ + +function! s:tag_eqin(value) " mathJAX wants \( \) for inline maths return '\('.s:mid(a:value, 1).'\)' -endfunction "}}} +endfunction + -function! s:tag_em(value) "{{{ +function! s:tag_em(value) return '<em>'.s:mid(a:value, 1).'</em>' -endfunction "}}} +endfunction + -function! s:tag_strong(value, header_ids) "{{{ +function! s:tag_strong(value, header_ids) let text = s:mid(a:value, 1) - let id = s:safe_html_anchor(text) + let id = s:escape_html_attribute(text) let complete_id = '' for l in range(6) if a:header_ids[l][0] != '' @@ -299,11 +303,12 @@ function! s:tag_strong(value, header_ids) "{{{ let complete_id = complete_id[:-2] endif let complete_id .= '-'.id - return '<span id="'.s:safe_html_anchor(complete_id).'"></span><strong id="' + return '<span id="'.s:escape_html_attribute(complete_id).'"></span><strong id="' \ .id.'">'.text.'</strong>' -endfunction "}}} +endfunction + -function! s:tag_tags(value, header_ids) "{{{ +function! s:tag_tags(value, header_ids) let complete_id = '' for level in range(6) if a:header_ids[level][0] != '' @@ -313,88 +318,89 @@ function! s:tag_tags(value, header_ids) "{{{ if a:header_ids[5][0] == '' let complete_id = complete_id[:-2] endif - let complete_id = s:safe_html_anchor(complete_id) + let complete_id = s:escape_html_attribute(complete_id) let result = [] for tag in split(a:value, ':') - let id = s:safe_html_anchor(tag) + let id = s:escape_html_attribute(tag) call add(result, '<span id="'.complete_id.'-'.id.'"></span><span class="tag" id="' \ .id.'">'.tag.'</span>') endfor return join(result) -endfunction "}}} +endfunction -function! s:tag_todo(value) "{{{ + +function! s:tag_todo(value) return '<span class="todo">'.a:value.'</span>' -endfunction "}}} +endfunction -function! s:tag_strike(value) "{{{ + +function! s:tag_strike(value) return '<del>'.s:mid(a:value, 2).'</del>' -endfunction "}}} +endfunction + -function! s:tag_super(value) "{{{ +function! s:tag_super(value) return '<sup><small>'.s:mid(a:value, 1).'</small></sup>' -endfunction "}}} +endfunction -function! s:tag_sub(value) "{{{ - return '<sub><small>'.s:mid(a:value, 2).'</small></sub>' -endfunction "}}} -function! s:tag_code(value) "{{{ - return '<code>'.s:safe_html_preformatted(s:mid(a:value, 1)).'</code>' -endfunction "}}} +function! s:tag_sub(value) + return '<sub><small>'.s:mid(a:value, 2).'</small></sub>' +endfunction -"function! s:tag_pre(value) "{{{ -" return '<code>'.s:mid(a:value, 3).'</code>' -"endfunction "}}} -"FIXME dead code? -"function! s:tag_math(value) "{{{ -" return '\['.s:mid(a:value, 3).'\]' -"endfunction "}}} +function! s:tag_code(value) + return '<code>'.s:safe_html_preformatted(s:mid(a:value, 1)).'</code>' +endfunction -"{{{ v2.0 links -" match n-th ARG within {{URL[|ARG1|ARG2|...]}} " {{{ +" match n-th ARG within {{URL[|ARG1|ARG2|...]}} " *c,d,e),... -function! vimwiki#html#incl_match_arg(nn_index) - let rx = g:vimwiki_rxWikiInclPrefix. g:vimwiki_rxWikiInclUrl - let rx = rx. repeat(g:vimwiki_rxWikiInclSeparator. g:vimwiki_rxWikiInclArg, a:nn_index-1) +function! s:incl_match_arg(nn_index) + let rx = vimwiki#vars#get_global('rxWikiInclPrefix'). vimwiki#vars#get_global('rxWikiInclUrl') + let rx = rx . repeat(vimwiki#vars#get_global('rxWikiInclSeparator') . + \ vimwiki#vars#get_global('rxWikiInclArg'), a:nn_index-1) if a:nn_index > 0 - let rx = rx. g:vimwiki_rxWikiInclSeparator. '\zs'. g:vimwiki_rxWikiInclArg. '\ze' + let rx = rx. vimwiki#vars#get_global('rxWikiInclSeparator'). '\zs' . + \ vimwiki#vars#get_global('rxWikiInclArg') . '\ze' endif - let rx = rx. g:vimwiki_rxWikiInclArgs. g:vimwiki_rxWikiInclSuffix + let rx = rx . vimwiki#vars#get_global('rxWikiInclArgs') . + \ vimwiki#vars#get_global('rxWikiInclSuffix') return rx endfunction -"}}} -function! vimwiki#html#linkify_link(src, descr) "{{{ - let src_str = ' href="'.s:safe_html_anchor(a:src).'"' + +function! s:linkify_link(src, descr) + let src_str = ' href="'.s:escape_html_attribute(a:src).'"' let descr = substitute(a:descr,'^\s*\(.*\)\s*$','\1','') let descr = (descr == "" ? a:src : descr) - let descr_str = (descr =~# g:vimwiki_rxWikiIncl - \ ? s:tag_wikiincl(descr) + let descr_str = (descr =~# vimwiki#vars#get_global('rxWikiIncl') + \ ? s:tag_wikiincl(descr) \ : descr) return '<a'.src_str.'>'.descr_str.'</a>' -endfunction "}}} +endfunction + -function! vimwiki#html#linkify_image(src, descr, verbatim_str) "{{{ +function! s:linkify_image(src, descr, verbatim_str) let src_str = ' src="'.a:src.'"' let descr_str = (a:descr != '' ? ' alt="'.a:descr.'"' : '') let verbatim_str = (a:verbatim_str != '' ? ' '.a:verbatim_str : '') return '<img'.src_str.descr_str.verbatim_str.' />' -endfunction "}}} +endfunction + -function! s:tag_weblink(value) "{{{ +function! s:tag_weblink(value) " Weblink Template -> <a href="url">descr</a> let str = a:value - let url = matchstr(str, g:vimwiki_rxWeblinkMatchUrl) - let descr = matchstr(str, g:vimwiki_rxWeblinkMatchDescr) - let line = vimwiki#html#linkify_link(url, descr) + let url = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl')) + let descr = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWeblinkMatchDescr')) + let line = s:linkify_link(url, descr) return line -endfunction "}}} +endfunction + -function! s:tag_wikiincl(value) "{{{ +function! s:tag_wikiincl(value) " {{imgurl|arg1|arg2}} -> ??? " {{imgurl}} -> <img src="imgurl"/> " {{imgurl|descr|style="A"}} -> <img src="imgurl" alt="descr" style="A" /> @@ -404,15 +410,14 @@ function! s:tag_wikiincl(value) "{{{ let line = VimwikiWikiIncludeHandler(str) " otherwise, assume image transclusion if line == '' - let url_0 = matchstr(str, g:vimwiki_rxWikiInclMatchUrl) - let descr = matchstr(str, vimwiki#html#incl_match_arg(1)) - let verbatim_str = matchstr(str, vimwiki#html#incl_match_arg(2)) + let url_0 = matchstr(str, vimwiki#vars#get_global('rxWikiInclMatchUrl')) + let descr = matchstr(str, s:incl_match_arg(1)) + let verbatim_str = matchstr(str, s:incl_match_arg(2)) let link_infos = vimwiki#base#resolve_link(url_0) if link_infos.scheme =~# '\mlocal\|wiki\d\+\|diary' - let url = vimwiki#path#relpath(fnamemodify(s:current_html_file, ':h'), - \ link_infos.filename) + let url = vimwiki#path#relpath(fnamemodify(s:current_html_file, ':h'), link_infos.filename) " strip the .html extension when we have wiki links, so that the user can " simply write {{image.png}} to include an image from the wiki directory if link_infos.scheme =~# '\mwiki\d\+\|diary' @@ -423,12 +428,13 @@ function! s:tag_wikiincl(value) "{{{ endif let url = escape(url, '#') - let line = vimwiki#html#linkify_image(url, descr, verbatim_str) + let line = s:linkify_image(url, descr, verbatim_str) endif return line -endfunction "}}} +endfunction + -function! s:tag_wikilink(value) "{{{ +function! s:tag_wikilink(value) " [[url]] -> <a href="url.html">url</a> " [[url|descr]] -> <a href="url.html">descr</a> " [[url|{{...}}]] -> <a href="url.html"> ... </a> @@ -437,12 +443,11 @@ function! s:tag_wikilink(value) "{{{ " [[url#a1#a2]] -> <a href="url.html#a1-a2">url#a1#a2</a> " [[#a1#a2]] -> <a href="#a1-a2">#a1#a2</a> let str = a:value - let url = matchstr(str, g:vimwiki_rxWikiLinkMatchUrl) - let descr = matchstr(str, g:vimwiki_rxWikiLinkMatchDescr) + let url = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl')) + let descr = matchstr(str, vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr')) let descr = (substitute(descr,'^\s*\(.*\)\s*$','\1','') != '' ? 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 == '' let link_infos = vimwiki#base#resolve_link(url, s:current_wiki_file) @@ -450,8 +455,8 @@ function! s:tag_wikilink(value) "{{{ " external file links are always absolute let html_link = link_infos.filename elseif link_infos.scheme ==# 'local' - let html_link = vimwiki#path#relpath(fnamemodify(s:current_html_file, - \ ':h'), link_infos.filename) + let html_link = vimwiki#path#relpath(fnamemodify(s:current_html_file, ':h'), + \ link_infos.filename) elseif link_infos.scheme =~# '\mwiki\d\+\|diary' " wiki links are always relative to the current file let html_link = vimwiki#path#relpath( @@ -471,13 +476,12 @@ function! s:tag_wikilink(value) "{{{ let line = html_link endif - let line =vimwiki#html#linkify_link(line, descr) + let line = s:linkify_link(line, descr) return line -endfunction "}}} -"}}} +endfunction -function! s:tag_remove_internal_link(value) "{{{ +function! s:tag_remove_internal_link(value) let value = s:mid(a:value, 2) let line = '' @@ -498,9 +502,10 @@ function! s:tag_remove_internal_link(value) "{{{ let line = value endif return line -endfunction "}}} +endfunction + -function! s:tag_remove_external_link(value) "{{{ +function! s:tag_remove_external_link(value) let value = s:mid(a:value, 1) let line = '' @@ -520,23 +525,25 @@ function! s:tag_remove_external_link(value) "{{{ let line = '['.value.']' endif return line -endfunction "}}} +endfunction + -function! s:make_tag(line, regexp, func, ...) "{{{ +function! s:make_tag(line, regexp, func, ...) " Make tags for a given matched regexp. " Exclude preformatted text and href links. - " FIXME + " FIXME let patt_splitter = '\(`[^`]\+`\)\|'. - \ '\('.g:vimwiki_rxPreStart.'.\+'.g:vimwiki_rxPreEnd.'\)\|'. + \ '\('.vimwiki#vars#get_syntaxlocal('rxPreStart').'.\+'. + \ vimwiki#vars#get_syntaxlocal('rxPreEnd').'\)\|'. \ '\(<a href.\{-}</a>\)\|'. \ '\(<img src.\{-}/>\)\|'. \ '\(<pre.\{-}</pre>\)\|'. - \ '\('.g:vimwiki_rxEqIn.'\)' + \ '\('.vimwiki#vars#get_syntaxlocal('rxEqIn').'\)' "FIXME FIXME !!! these can easily occur on the same line! "XXX {{{ }}} ??? obsolete if '`[^`]\+`' ==# a:regexp || '{{{.\+}}}' ==# a:regexp || - \ g:vimwiki_rxEqIn ==# a:regexp + \ vimwiki#vars#get_syntaxlocal('rxEqIn') ==# a:regexp let res_line = s:subst_func(a:line, a:regexp, a:func) else let pos = 0 @@ -559,92 +566,99 @@ function! s:make_tag(line, regexp, func, ...) "{{{ endfor endif return res_line -endfunction "}}} +endfunction -function! s:process_tags_remove_links(line) " {{{ + +function! s:process_tags_remove_links(line) let line = a:line let line = s:make_tag(line, '\[\[.\{-}\]\]', 's:tag_remove_internal_link') let line = s:make_tag(line, '\[.\{-}\]', 's:tag_remove_external_link') return line -endfunction " }}} +endfunction -function! s:process_tags_typefaces(line, header_ids) "{{{ + +function! s:process_tags_typefaces(line, header_ids) let line = a:line - let line = s:make_tag(line, g:vimwiki_rxItalic, 's:tag_em') - let line = s:make_tag(line, g:vimwiki_rxBold, 's:tag_strong', a:header_ids) - let line = s:make_tag(line, g:vimwiki_rxTodo, 's:tag_todo') - let line = s:make_tag(line, g:vimwiki_rxDelText, 's:tag_strike') - let line = s:make_tag(line, g:vimwiki_rxSuperScript, 's:tag_super') - let line = s:make_tag(line, g:vimwiki_rxSubScript, 's:tag_sub') - let line = s:make_tag(line, g:vimwiki_rxCode, 's:tag_code') - let line = s:make_tag(line, g:vimwiki_rxEqIn, 's:tag_eqin') - let line = s:make_tag(line, g:vimwiki_rxTags, 's:tag_tags', a:header_ids) + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxItalic'), 's:tag_em') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxBold'), 's:tag_strong', a:header_ids) + let line = s:make_tag(line, vimwiki#vars#get_global('rxTodo'), 's:tag_todo') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxDelText'), 's:tag_strike') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxSuperScript'), 's:tag_super') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxSubScript'), 's:tag_sub') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxCode'), 's:tag_code') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxEqIn'), 's:tag_eqin') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxTags'), 's:tag_tags', a:header_ids) return line -endfunction " }}} +endfunction + -function! s:process_tags_links(line) " {{{ +function! s:process_tags_links(line) let line = a:line - let line = s:make_tag(line, g:vimwiki_rxWikiLink, 's:tag_wikilink') - let line = s:make_tag(line, g:vimwiki_rxWikiIncl, 's:tag_wikiincl') - let line = s:make_tag(line, g:vimwiki_rxWeblink, 's:tag_weblink') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxWikiLink'), 's:tag_wikilink') + let line = s:make_tag(line, vimwiki#vars#get_global('rxWikiIncl'), 's:tag_wikiincl') + let line = s:make_tag(line, vimwiki#vars#get_syntaxlocal('rxWeblink'), 's:tag_weblink') return line -endfunction " }}} +endfunction + -function! s:process_inline_tags(line, header_ids) "{{{ +function! s:process_inline_tags(line, header_ids) let line = s:process_tags_links(a:line) let line = s:process_tags_typefaces(line, a:header_ids) return line -endfunction " }}} -"}}} +endfunction + -" BLOCK TAGS {{{ -function! s:close_tag_pre(pre, ldest) "{{{ +function! s:close_tag_pre(pre, ldest) if a:pre[0] call insert(a:ldest, "</pre>") return 0 endif return a:pre -endfunction "}}} +endfunction -function! s:close_tag_math(math, ldest) "{{{ + +function! s:close_tag_math(math, ldest) if a:math[0] call insert(a:ldest, "\\\]") return 0 endif return a:math -endfunction "}}} +endfunction -function! s:close_tag_quote(quote, ldest) "{{{ + +function! s:close_tag_quote(quote, ldest) if a:quote call insert(a:ldest, "</blockquote>") return 0 endif return a:quote -endfunction "}}} +endfunction + -function! s:close_tag_para(para, ldest) "{{{ +function! s:close_tag_para(para, ldest) if a:para call insert(a:ldest, "</p>") return 0 endif return a:para -endfunction "}}} +endfunction + -function! s:close_tag_table(table, ldest, header_ids) "{{{ +function! s:close_tag_table(table, ldest, header_ids) " The first element of table list is a string which tells us if table should be centered. " The rest elements are rows which are lists of columns: - " ['center', + " ['center', " [ CELL1, CELL2, CELL3 ], " [ CELL1, CELL2, CELL3 ], " [ CELL1, CELL2, CELL3 ], " ] " And CELLx is: { 'body': 'col_x', 'rowspan': r, 'colspan': c } - function! s:sum_rowspan(table) "{{{ + function! s:sum_rowspan(table) let table = a:table " Get max cells - let max_cells = 0 + let max_cells = 0 for row in table[1:] let n_cells = len(row) if n_cells > max_cells @@ -670,9 +684,9 @@ function! s:close_tag_table(table, ldest, header_ids) "{{{ endif endfor endfor - endfunction "}}} + endfunction - function! s:sum_colspan(table) "{{{ + function! s:sum_colspan(table) for row in a:table[1:] let cols = 1 @@ -685,19 +699,19 @@ function! s:close_tag_table(table, ldest, header_ids) "{{{ endif endfor endfor - endfunction "}}} + endfunction - function! s:close_tag_row(row, header, ldest, header_ids) "{{{ + function! s:close_tag_row(row, header, ldest, header_ids) call add(a:ldest, '<tr>') - " Set tag element of columns + " Set tag element of columns if a:header let tag_name = 'th' else let tag_name = 'td' end - " Close tag of columns + " Close tag of columns for cell in a:row if cell.rowspan == 0 || cell.colspan == 0 continue @@ -720,7 +734,7 @@ function! s:close_tag_table(table, ldest, header_ids) "{{{ endfor call add(a:ldest, '</tr>') - endfunction "}}} + endfunction let table = a:table let ldest = a:ldest @@ -763,24 +777,27 @@ function! s:close_tag_table(table, ldest, header_ids) "{{{ let table = [] endif return table -endfunction "}}} +endfunction + -function! s:close_tag_list(lists, ldest) "{{{ +function! s:close_tag_list(lists, ldest) while len(a:lists) let item = remove(a:lists, 0) call insert(a:ldest, item[0]) endwhile -endfunction "}}} +endfunction -function! s:close_tag_def_list(deflist, ldest) "{{{ + +function! s:close_tag_def_list(deflist, ldest) if a:deflist call insert(a:ldest, "</dl>") return 0 endif return a:deflist -endfunction "}}} +endfunction -function! s:process_tag_pre(line, pre) "{{{ + +function! s:process_tag_pre(line, pre) " pre is the list of [is_in_pre, indent_of_pre] "XXX always outputs a single line or empty list! let lines = [] @@ -810,9 +827,10 @@ function! s:process_tag_pre(line, pre) "{{{ call add(lines, s:safe_html_preformatted(a:line)) endif return [processed, lines, pre] -endfunction "}}} +endfunction + -function! s:process_tag_math(line, math) "{{{ +function! s:process_tag_math(line, math) " math is the list of [is_in_math, indent_of_math] let lines = [] let math = a:math @@ -846,9 +864,10 @@ function! s:process_tag_math(line, math) "{{{ call add(lines, substitute(a:line, '^\s\{'.math[1].'}', '', '')) endif return [processed, lines, math] -endfunction "}}} +endfunction + -function! s:process_tag_quote(line, quote) "{{{ +function! s:process_tag_quote(line, quote) let lines = [] let quote = a:quote let processed = 0 @@ -864,25 +883,29 @@ function! s:process_tag_quote(line, quote) "{{{ let quote = 0 endif return [processed, lines, quote] -endfunction "}}} +endfunction + -function! s:process_tag_list(line, lists) "{{{ +function! s:process_tag_list(line, lists) - function! s:add_checkbox(line, rx_list) "{{{ + function! s:add_checkbox(line, rx_list) let st_tag = '<li>' let chk = matchlist(a:line, a:rx_list) if !empty(chk) && len(chk[1]) > 0 - let completion = index(g:vimwiki_listsyms_list, chk[1]) - let n = len(g:vimwiki_listsyms_list) + let completion = index(vimwiki#vars#get_syntaxlocal('listsyms_list'), chk[1]) + let n = len(vimwiki#vars#get_syntaxlocal('listsyms_list')) if completion == 0 let st_tag = '<li class="done0">' + elseif completion == -1 && chk[1] == vimwiki#vars#get_global('listsym_rejected') + let st_tag = '<li class="rejected">' elseif completion > 0 && completion < n let completion = float2nr(round(completion / (n-1.0) * 3.0 + 0.5 )) let st_tag = '<li class="done'.completion.'">' endif endif return [st_tag, ''] - endfunction "}}} + endfunction + let in_list = (len(a:lists) > 0) @@ -890,7 +913,7 @@ function! s:process_tag_list(line, lists) "{{{ " text. " XXX necessary? in *bold* text, no space must follow the first * if !in_list - let pos = match(a:line, '^\s*'.g:vimwiki_rxBold) + let pos = match(a:line, '^\s*'.vimwiki#vars#get_syntaxlocal('rxBold')) if pos != -1 return [0, []] endif @@ -946,11 +969,10 @@ function! s:process_tag_list(line, lists) "{{{ call add(a:lists, [en_tag, indent]) call add(lines, st_tag) - call add(lines, - \ substitute(a:line, lstRegExp.'\%('.checkbox.'\)\?', '', '')) + call add(lines, substitute(a:line, lstRegExp.'\%('.checkbox.'\)\?', '', '')) let processed = 1 elseif in_list && a:line =~# '^\s\+\S\+' - if g:vimwiki_list_ignore_newline + if vimwiki#vars#get_global('list_ignore_newline') call add(lines, a:line) else call add(lines, '<br />'.a:line) @@ -960,9 +982,10 @@ function! s:process_tag_list(line, lists) "{{{ call s:close_tag_list(a:lists, lines) endif return [processed, lines] -endfunction "}}} +endfunction + -function! s:process_tag_def_list(line, deflist) "{{{ +function! s:process_tag_def_list(line, deflist) let lines = [] let deflist = a:deflist let processed = 0 @@ -984,9 +1007,10 @@ function! s:process_tag_def_list(line, deflist) "{{{ call add(lines, "</dl>") endif return [processed, lines, deflist] -endfunction "}}} +endfunction + -function! s:process_tag_para(line, para) "{{{ +function! s:process_tag_para(line, para) let lines = [] let para = a:para let processed = 0 @@ -996,7 +1020,7 @@ function! s:process_tag_para(line, para) "{{{ let para = 1 endif let processed = 1 - if g:vimwiki_text_ignore_newline == 1 + if vimwiki#vars#get_global('text_ignore_newline') call add(lines, a:line) else call add(lines, a:line."<br />") @@ -1006,27 +1030,28 @@ function! s:process_tag_para(line, para) "{{{ let para = 0 endif return [processed, lines, para] -endfunction "}}} +endfunction + -function! s:process_tag_h(line, id) "{{{ +function! s:process_tag_h(line, id) let line = a:line let processed = 0 let h_level = 0 let h_text = '' let h_id = '' - if a:line =~# g:vimwiki_rxHeader + if a:line =~# vimwiki#vars#get_syntaxlocal('rxHeader') let h_level = vimwiki#u#count_first_sym(a:line) endif if h_level > 0 - let h_text = vimwiki#u#trim(matchstr(line, g:vimwiki_rxHeader)) + let h_text = vimwiki#u#trim(matchstr(line, vimwiki#vars#get_syntaxlocal('rxHeader'))) let h_number = '' let h_complete_id = '' - let h_id = s:safe_html_anchor(h_text) + let h_id = s:escape_html_attribute(h_text) let centered = (a:line =~# '^\s') - if h_text !=# g:vimwiki_toc_header + if h_text !=# vimwiki#vars#get_global('toc_header') let a:id[h_level-1] = [h_text, a:id[h_level-1][1]+1] @@ -1044,15 +1069,15 @@ function! s:process_tag_h(line, id) "{{{ let h_number .= a:id[h_level-1][1] let h_complete_id .= a:id[h_level-1][0] - if g:vimwiki_html_header_numbering + if vimwiki#vars#get_global('html_header_numbering') let num = matchstr(h_number, - \ '^\(\d.\)\{'.(g:vimwiki_html_header_numbering-1).'}\zs.*') + \ '^\(\d.\)\{'.(vimwiki#vars#get_global('html_header_numbering')-1).'}\zs.*') if !empty(num) - let num .= g:vimwiki_html_header_numbering_sym + let num .= vimwiki#vars#get_global('html_header_numbering_sym') endif let h_text = num.' '.h_text endif - let h_complete_id = s:safe_html_anchor(h_complete_id) + let h_complete_id = s:escape_html_attribute(h_complete_id) let h_part = '<div id="'.h_complete_id.'"><h'.h_level.' id="'.h_id.'"' else @@ -1061,7 +1086,6 @@ function! s:process_tag_h(line, id) "{{{ endif - if centered let h_part .= ' class="justcenter">' else @@ -1075,9 +1099,10 @@ function! s:process_tag_h(line, id) "{{{ let processed = 1 endif return [processed, line] -endfunction "}}} +endfunction + -function! s:process_tag_hr(line) "{{{ +function! s:process_tag_hr(line) let line = a:line let processed = 0 if a:line =~# '^-----*$' @@ -1085,10 +1110,11 @@ function! s:process_tag_hr(line) "{{{ let processed = 1 endif return [processed, line] -endfunction "}}} +endfunction + -function! s:process_tag_table(line, table, header_ids) "{{{ - function! s:table_empty_cell(value) "{{{ +function! s:process_tag_table(line, table, header_ids) + function! s:table_empty_cell(value) let cell = {} if a:value =~# '^\s*\\/\s*$' @@ -1110,9 +1136,9 @@ function! s:process_tag_table(line, table, header_ids) "{{{ endif return cell - endfunction "}}} + endfunction - function! s:table_add_row(table, line) "{{{ + function! s:table_add_row(table, line) if empty(a:table) if a:line =~# '^\s\+' let row = ['center', []] @@ -1123,7 +1149,7 @@ function! s:process_tag_table(line, table, header_ids) "{{{ let row = [[]] endif return row - endfunction "}}} + endfunction let table = a:table let lines = [] @@ -1144,14 +1170,10 @@ function! s:process_tag_table(line, table, header_ids) "{{{ let table = s:close_tag_table(table, lines, a:header_ids) endif return [processed, lines, table] -endfunction "}}} - -"}}} +endfunction -" }}} -" WIKI2HTML "{{{ -function! s:parse_line(line, state) " {{{ +function! s:parse_line(line, state) let state = {} let state.para = a:state.para let state.quote = a:state.quote @@ -1169,7 +1191,7 @@ function! s:parse_line(line, state) " {{{ let processed = 0 - " pres "{{{ + " pres if !processed let [processed, lines, state.pre] = s:process_tag_pre(line, state.pre) " pre is just fine to be in the list -- do not close list item here. @@ -1193,10 +1215,10 @@ function! s:parse_line(line, state) " {{{ endif call extend(res_lines, lines) endif - "}}} + if !processed - if line =~# g:vimwiki_rxComment + if line =~# vimwiki#vars#get_syntaxlocal('rxComment') let processed = 1 endif endif @@ -1227,7 +1249,7 @@ function! s:parse_line(line, state) " {{{ endif endif - " html template -- placeholder "{{{ + " html template -- placeholder if !processed if line =~# '\m^\s*%template\%(\s.*\)\?$' let processed = 1 @@ -1235,17 +1257,16 @@ function! s:parse_line(line, state) " {{{ let state.placeholder = ['template', param] endif endif - "}}} - " tables "{{{ + + " tables if !processed - let [processed, lines, state.table] = s:process_tag_table(line, - \ state.table, state.header_ids) + let [processed, lines, state.table] = s:process_tag_table(line, state.table, state.header_ids) call extend(res_lines, lines) endif - "}}} - " lists "{{{ + + " lists if !processed let [processed, lines] = s:process_tag_list(line, state.lists) if processed && state.quote @@ -1271,15 +1292,14 @@ function! s:parse_line(line, state) " {{{ call extend(res_lines, lines) endif - "}}} - " headers "{{{ + + " headers if !processed let [processed, line] = s:process_tag_h(line, state.header_ids) if processed call s:close_tag_list(state.lists, res_lines) - let state.table = s:close_tag_table(state.table, res_lines, - \ state.header_ids) + let state.table = s:close_tag_table(state.table, res_lines, state.header_ids) let state.pre = s:close_tag_pre(state.pre, res_lines) let state.math = s:close_tag_math(state.math, res_lines) let state.quote = s:close_tag_quote(state.quote, res_lines) @@ -1288,9 +1308,9 @@ function! s:parse_line(line, state) " {{{ call add(res_lines, line) endif endif - "}}} - " quotes "{{{ + + " quotes if !processed let [processed, lines, state.quote] = s:process_tag_quote(line, state.quote) if processed && len(state.lists) @@ -1316,23 +1336,22 @@ function! s:parse_line(line, state) " {{{ call extend(res_lines, lines) endif - "}}} - " horizontal rules "{{{ + + " horizontal rules if !processed let [processed, line] = s:process_tag_hr(line) if processed call s:close_tag_list(state.lists, res_lines) - let state.table = s:close_tag_table(state.table, res_lines, - \ state.header_ids) + let state.table = s:close_tag_table(state.table, res_lines, state.header_ids) let state.pre = s:close_tag_pre(state.pre, res_lines) let state.math = s:close_tag_math(state.math, res_lines) call add(res_lines, line) endif endif - "}}} - " definition lists "{{{ + + " definition lists if !processed let [processed, lines, state.deflist] = s:process_tag_def_list(line, state.deflist) @@ -1340,9 +1359,9 @@ function! s:parse_line(line, state) " {{{ call extend(res_lines, lines) endif - "}}} - "" P "{{{ + + "" P if !processed let [processed, lines, state.para] = s:process_tag_para(line, state.para) if processed && len(state.lists) @@ -1358,15 +1377,14 @@ function! s:parse_line(line, state) " {{{ let state.math = s:close_tag_math(state.math, res_lines) endif if processed && len(state.table) - let state.table = s:close_tag_table(state.table, res_lines, - \ state.header_ids) + let state.table = s:close_tag_table(state.table, res_lines, state.header_ids) endif call map(lines, 's:process_inline_tags(v:val, state.header_ids)') call extend(res_lines, lines) endif - "}}} + "" add the rest if !processed @@ -1375,35 +1393,44 @@ function! s:parse_line(line, state) " {{{ return [res_lines, state] -endfunction " }}} +endfunction + + +function! s:use_custom_wiki2html() + let custom_wiki2html = vimwiki#vars#get_wikilocal('custom_wiki2html') + return !empty(custom_wiki2html) && + \ (s:file_exists(custom_wiki2html) || s:binary_exists(custom_wiki2html)) +endfunction -function! s:use_custom_wiki2html() "{{{ - let custom_wiki2html = VimwikiGet('custom_wiki2html') - return !empty(custom_wiki2html) && (s:file_exists(custom_wiki2html) || s:binary_exists(custom_wiki2html)) -endfunction " }}} -function! vimwiki#html#CustomWiki2HTML(path, wikifile, force) "{{{ +function! vimwiki#html#CustomWiki2HTML(path, wikifile, force) call vimwiki#path#mkdir(a:path) - echomsg system(VimwikiGet('custom_wiki2html'). ' '. + echomsg system(vimwiki#vars#get_wikilocal('custom_wiki2html'). ' '. \ a:force. ' '. - \ VimwikiGet('syntax'). ' '. - \ strpart(VimwikiGet('ext'), 1). ' '. + \ vimwiki#vars#get_wikilocal('syntax'). ' '. + \ strpart(vimwiki#vars#get_wikilocal('ext'), 1). ' '. \ shellescape(a:path). ' '. \ shellescape(a:wikifile). ' '. \ shellescape(s:default_CSS_full_name(a:path)). ' '. - \ (len(VimwikiGet('template_path')) > 1 ? shellescape(expand(VimwikiGet('template_path'))) : '-'). ' '. - \ (len(VimwikiGet('template_default')) > 0 ? VimwikiGet('template_default') : '-'). ' '. - \ (len(VimwikiGet('template_ext')) > 0 ? VimwikiGet('template_ext') : '-'). ' '. - \ (len(VimwikiGet('subdir')) > 0 ? shellescape(s:root_path(VimwikiGet('subdir'))) : '-'). ' '. - \ (len(VimwikiGet('custom_wiki2html_args')) > 0 ? VimwikiGet('custom_wiki2html_args') : '-')) -endfunction " }}} - -function! s:convert_file(path_html, wikifile) "{{{ + \ (len(vimwiki#vars#get_wikilocal('template_path')) > 1 ? + \ shellescape(expand(vimwiki#vars#get_wikilocal('template_path'))) : '-'). ' '. + \ (len(vimwiki#vars#get_wikilocal('template_default')) > 0 ? + \ vimwiki#vars#get_wikilocal('template_default') : '-'). ' '. + \ (len(vimwiki#vars#get_wikilocal('template_ext')) > 0 ? + \ vimwiki#vars#get_wikilocal('template_ext') : '-'). ' '. + \ (len(vimwiki#vars#get_bufferlocal('subdir')) > 0 ? + \ shellescape(s:root_path(vimwiki#vars#get_bufferlocal('subdir'))) : '-'). ' '. + \ (len(vimwiki#vars#get_wikilocal('custom_wiki2html_args')) > 0 ? + \ vimwiki#vars#get_wikilocal('custom_wiki2html_args') : '-')) +endfunction + + +function! s:convert_file(path_html, wikifile) let done = 0 let wikifile = fnamemodify(a:wikifile, ":p") - let path_html = expand(a:path_html).VimwikiGet('subdir') + let path_html = expand(a:path_html).vimwiki#vars#get_bufferlocal('subdir') let htmlfile = fnamemodify(wikifile, ":t:r").'.html' " the currently processed file name is needed when processing links @@ -1448,16 +1475,15 @@ function! s:convert_file(path_html, wikifile) "{{{ " prepare constants for s:safe_html_line() let s:lt_pattern = '<' let s:gt_pattern = '>' - if g:vimwiki_valid_html_tags != '' - let tags = join(split(g:vimwiki_valid_html_tags, '\s*,\s*'), '\|') - let s:lt_pattern = '\c<\%(/\?\%('.tags.'\)\%(\s\{-1}\S\{-}\)\{-}/\?>\)\@!' + if vimwiki#vars#get_global('valid_html_tags') != '' + let tags = join(split(vimwiki#vars#get_global('valid_html_tags'), '\s*,\s*'), '\|') + let s:lt_pattern = '\c<\%(/\?\%('.tags.'\)\%(\s\{-1}\S\{-}\)\{-}/\?>\)\@!' let s:gt_pattern = '\c\%(</\?\%('.tags.'\)\%(\s\{-1}\S\{-}\)\{-}/\?\)\@<!>' endif " prepare regexps for lists let s:bullets = '[*-]' - let s:numbers = - \'\C\%(#\|\d\+)\|\d\+\.\|[ivxlcdm]\+)\|[IVXLCDM]\+)\|\l\{1,2})\|\u\{1,2})\)' + let s:numbers = '\C\%(#\|\d\+)\|\d\+\.\|[ivxlcdm]\+)\|[IVXLCDM]\+)\|\l\{1,2})\|\u\{1,2})\)' for line in lsource let oldquote = state.quote @@ -1514,9 +1540,9 @@ function! s:convert_file(path_html, wikifile) "{{{ call map(html_lines, 'substitute(v:val, "%title%", "'. title .'", "g")') call map(html_lines, 'substitute(v:val, "%date%", "'. date .'", "g")') call map(html_lines, 'substitute(v:val, "%root_path%", "'. - \ s:root_path(VimwikiGet('subdir')) .'", "g")') + \ s:root_path(vimwiki#vars#get_bufferlocal('subdir')) .'", "g")') - let css_name = expand(VimwikiGet('css_name')) + let css_name = expand(vimwiki#vars#get_wikilocal('css_name')) let css_name = substitute(css_name, '\', '/', 'g') call map(html_lines, 'substitute(v:val, "%css%", "'. css_name .'", "g")') @@ -1539,17 +1565,19 @@ function! s:convert_file(path_html, wikifile) "{{{ endif return path_html.htmlfile -endfunction "}}} +endfunction + -function! vimwiki#html#Wiki2HTML(path_html, wikifile) "{{{ +function! vimwiki#html#Wiki2HTML(path_html, wikifile) let result = s:convert_file(a:path_html, a:wikifile) if result != '' call s:create_default_CSS(a:path_html) endif return result -endfunction "}}} +endfunction + -function! vimwiki#html#WikiAll2HTML(path_html) "{{{ +function! vimwiki#html#WikiAll2HTML(path_html) if !s:syntax_supported() && !s:use_custom_wiki2html() echomsg 'Vimwiki Error: Conversion to HTML is not supported for this syntax' return @@ -1574,17 +1602,18 @@ function! vimwiki#html#WikiAll2HTML(path_html) "{{{ setlocal nomore " temporarily adjust current_subdir global state variable - let current_subdir = VimwikiGet('subdir') - let current_invsubdir = VimwikiGet('invsubdir') + let current_subdir = vimwiki#vars#get_bufferlocal('subdir') + let current_invsubdir = vimwiki#vars#get_bufferlocal('invsubdir') - let wikifiles = split(glob(VimwikiGet('path').'**/*'.VimwikiGet('ext')), '\n') + let wikifiles = split(glob(vimwiki#vars#get_wikilocal('path').'**/*'. + \ vimwiki#vars#get_wikilocal('ext')), '\n') for wikifile in wikifiles let wikifile = fnamemodify(wikifile, ":p") " temporarily adjust 'subdir' and 'invsubdir' state variables - let subdir = vimwiki#base#subdir(VimwikiGet('path'), wikifile) - call VimwikiSet('subdir', subdir) - call VimwikiSet('invsubdir', vimwiki#base#invsubdir(subdir)) + let subdir = vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path'), wikifile) + call vimwiki#vars#set_bufferlocal('subdir', subdir) + call vimwiki#vars#set_bufferlocal('invsubdir', vimwiki#base#invsubdir(subdir)) if !s:is_html_uptodate(wikifile) echomsg 'Vimwiki: Processing '.wikifile @@ -1595,8 +1624,8 @@ function! vimwiki#html#WikiAll2HTML(path_html) "{{{ endif endfor " reset 'subdir' state variable - call VimwikiSet('subdir', current_subdir) - call VimwikiSet('invsubdir', current_invsubdir) + call vimwiki#vars#set_bufferlocal('subdir', current_subdir) + call vimwiki#vars#set_bufferlocal('invsubdir', current_invsubdir) let created = s:create_default_CSS(path_html) if created @@ -1606,28 +1635,32 @@ function! vimwiki#html#WikiAll2HTML(path_html) "{{{ echomsg 'Vimwiki: Done!' let &more = setting_more -endfunction "}}} +endfunction -function! s:file_exists(fname) "{{{ + +function! s:file_exists(fname) return !empty(getftype(expand(a:fname))) -endfunction "}}} +endfunction -function! s:binary_exists(fname) "{{{ + +function! s:binary_exists(fname) return executable(expand(a:fname)) -endfunction "}}} +endfunction + -" uses VimwikiGet('path') -function! s:get_wikifile_url(wikifile) "{{{ - return VimwikiGet('path_html'). - \ vimwiki#base#subdir(VimwikiGet('path'), a:wikifile). +function! s:get_wikifile_url(wikifile) + return vimwiki#vars#get_wikilocal('path_html') . + \ vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path'), a:wikifile). \ fnamemodify(a:wikifile, ":t:r").'.html' -endfunction "}}} +endfunction + -function! vimwiki#html#PasteUrl(wikifile) "{{{ +function! vimwiki#html#PasteUrl(wikifile) execute 'r !echo file://'.s:get_wikifile_url(a:wikifile) -endfunction "}}} +endfunction + -function! vimwiki#html#CatUrl(wikifile) "{{{ +function! vimwiki#html#CatUrl(wikifile) execute '!echo file://'.s:get_wikifile_url(a:wikifile) -endfunction "}}} -"}}} +endfunction + diff --git a/autoload/vimwiki/lst.vim b/autoload/vimwiki/lst.vim @@ -1,20 +1,25 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file -" Desc: Everything concerning lists and checkboxes +" Description: Everything concerning lists and checkboxes " Home: https://github.com/vimwiki/vimwiki/ + if exists("g:loaded_vimwiki_list_auto") || &cp finish endif let g:loaded_vimwiki_list_auto = 1 -"incrementation functions for the various kinds of numbers {{{ -function! s:increment_1(value) "{{{ +" --------------------------------------------------------- +" incrementation functions for the various kinds of numbers +" --------------------------------------------------------- + +function! s:increment_1(value) return eval(a:value) + 1 -endfunction "}}} +endfunction + -function! s:increment_A(value) "{{{ +function! s:increment_A(value) let list_of_chars = split(a:value, '.\zs') let done = 0 for idx in reverse(range(len(list_of_chars))) @@ -31,9 +36,10 @@ function! s:increment_A(value) "{{{ call insert(list_of_chars, 'A') endif return join(list_of_chars, '') -endfunction "}}} +endfunction -function! s:increment_a(value) "{{{ + +function! s:increment_a(value) let list_of_chars = split(a:value, '.\zs') let done = 0 for idx in reverse(range(len(list_of_chars))) @@ -50,9 +56,10 @@ function! s:increment_a(value) "{{{ call insert(list_of_chars, 'a') endif return join(list_of_chars, '') -endfunction "}}} +endfunction + -function! s:increment_I(value) "{{{ +function! s:increment_I(value) let subst_list = [ ['XLVIII$', 'IL'], ['VIII$', 'IX'], ['III$', 'IV'], \ ['DCCCXCIX$', 'CM'], ['CCCXCIX$', 'CD'], ['LXXXIX$', 'XC'], \ ['XXXIX$', 'XL'], ['\(I\{1,2\}\)$', '\1I'], ['CDXCIX$', 'D'], @@ -64,9 +71,10 @@ function! s:increment_I(value) "{{{ endif endfor return '' -endfunction "}}} +endfunction + -function! s:increment_i(value) "{{{ +function! s:increment_i(value) let subst_list = [ ['xlviii$', 'il'], ['viii$', 'ix'], ['iii$', 'iv'], \ ['dcccxcix$', 'cm'], ['cccxcix$', 'cd'], ['lxxxix$', 'xc'], \ ['xxxix$', 'xl'], ['\(i\{1,2\}\)$', '\1i'], ['cdxcix$', 'd'], @@ -78,27 +86,29 @@ function! s:increment_i(value) "{{{ endif endfor return '' -endfunction "}}} +endfunction -"incrementation functions for the various kinds of numbers }}} -"utility functions {{{ +" --------------------------------------------------------- +" utility functions +" --------------------------------------------------------- -function! s:substitute_rx_in_line(lnum, pattern, new_string) "{{{ - call setline(a:lnum, substitute(getline(a:lnum), a:pattern, a:new_string, - \ '')) -endfunction "}}} +function! s:substitute_rx_in_line(lnum, pattern, new_string) + call setline(a:lnum, substitute(getline(a:lnum), a:pattern, a:new_string, '')) +endfunction -function! s:substitute_string_in_line(lnum, old_string, new_string) "{{{ - call s:substitute_rx_in_line(a:lnum, vimwiki#u#escape(a:old_string), - \ a:new_string) -endfunction "}}} -function! s:first_char(string) "{{{ +function! s:substitute_string_in_line(lnum, old_string, new_string) + call s:substitute_rx_in_line(a:lnum, vimwiki#u#escape(a:old_string), a:new_string) +endfunction + + +function! s:first_char(string) return matchstr(a:string, '^.') -endfunction "}}} +endfunction + -if exists("*strdisplaywidth") "{{{ +if exists("*strdisplaywidth") function! s:string_length(str) return strdisplaywidth(a:str) endfunction @@ -106,42 +116,48 @@ else function! s:string_length(str) return strlen(substitute(a:str, '.', 'x', 'g')) endfunction -endif "}}} +endif + -function! vimwiki#lst#default_symbol() "{{{ - return g:vimwiki_list_markers[0] -endfunction "}}} +function! vimwiki#lst#default_symbol() + return vimwiki#vars#get_syntaxlocal('list_markers')[0] +endfunction -function! vimwiki#lst#get_list_margin() "{{{ - if VimwikiGet('list_margin') < 0 + +function! vimwiki#lst#get_list_margin() + let list_margin = vimwiki#vars#get_wikilocal('list_margin') + if list_margin < 0 return &sw else - return VimwikiGet('list_margin') + return list_margin endif -endfunction "}}} +endfunction + "Returns: the column where the text of a line starts (possible list item "markers and checkboxes are skipped) -function! s:text_begin(lnum) "{{{ - return s:string_length(matchstr(getline(a:lnum), g:vimwiki_rxListItem)) -endfunction "}}} +function! s:text_begin(lnum) + return s:string_length(matchstr(getline(a:lnum), vimwiki#vars#get_syntaxlocal('rxListItem'))) +endfunction + "Returns: 2 if there is a marker and text " 1 for a marker and no text " 0 for no marker at all (empty line or only text) -function! s:line_has_marker(lnum) "{{{ - if getline(a:lnum) =~# g:vimwiki_rxListItem.'\s*$' +function! s:line_has_marker(lnum) + if getline(a:lnum) =~# vimwiki#vars#get_syntaxlocal('rxListItem').'\s*$' return 1 - elseif getline(a:lnum) =~# g:vimwiki_rxListItem.'\s*\S' + elseif getline(a:lnum) =~# vimwiki#vars#get_syntaxlocal('rxListItem').'\s*\S' return 2 else return 0 endif -endfunction "}}} +endfunction -"utility functions }}} -"get properties of an item {{{ +" --------------------------------------------------------- +" get properties of a list item +" --------------------------------------------------------- "Returns: the mainly used data structure in this file "An item represents a single list item and is a dictionary with the keys @@ -149,14 +165,14 @@ endfunction "}}} "type - 1 for bulleted item, 2 for numbered item, 0 for a regular line "mrkr - the concrete marker, e.g. '**' or 'b)' "cb - the char in the checkbox or '' if there is no checkbox -function! s:get_item(lnum) "{{{ +function! s:get_item(lnum) let item = {'lnum': a:lnum} if a:lnum == 0 || a:lnum > line('$') let item.type = 0 return item endif - let matches = matchlist(getline(a:lnum), g:vimwiki_rxListItem) + let matches = matchlist(getline(a:lnum), vimwiki#vars#get_syntaxlocal('rxListItem')) if matches == [] || \ (matches[1] == '' && matches[2] == '') || \ (matches[1] != '' && matches[2] != '') @@ -175,48 +191,54 @@ function! s:get_item(lnum) "{{{ endif return item -endfunction "}}} +endfunction -function! s:empty_item() "{{{ + +function! s:empty_item() return {'type': 0} -endfunction "}}} +endfunction + "Returns: level of the line "0 is the 'highest' level -function! s:get_level(lnum) "{{{ +function! s:get_level(lnum) if getline(a:lnum) =~# '^\s*$' return 0 endif - if VimwikiGet('syntax') !=? 'media' + if !vimwiki#vars#get_syntaxlocal('recurring_bullets') let level = indent(a:lnum) else - let level = s:string_length(matchstr(getline(a:lnum), s:rx_bullet_chars))-1 + let level = s:string_length(matchstr(getline(a:lnum), + \ vimwiki#vars#get_syntaxlocal(rx_bullet_chars)))-1 if level < 0 let level = (indent(a:lnum) == 0) ? 0 : 9999 endif endif return level -endfunction "}}} +endfunction + "Returns: 1, a, i, A, I or '' "If in doubt if alphanumeric character or romanian "numeral, peek in the previous line -function! s:guess_kind_of_numbered_item(item) "{{{ +function! s:guess_kind_of_numbered_item(item) if a:item.type != 2 | return '' | endif let number_chars = a:item.mrkr[:-2] let divisor = a:item.mrkr[-1:] + let number_kinds = vimwiki#vars#get_syntaxlocal('number_kinds') + if number_chars =~# '\d\+' return '1' endif if number_chars =~# '\l\+' - if number_chars !~# '^[ivxlcdm]\+' || index(s:number_kinds, 'i') == -1 + if number_chars !~# '^[ivxlcdm]\+' || index(number_kinds, 'i') == -1 return 'a' else let item_above = s:get_prev_list_item(a:item, 0) if item_above.type != 0 - if index(s:number_kinds, 'a') == -1 || + if index(number_kinds, 'a') == -1 || \ (item_above.mrkr[-1:] !=# divisor && number_chars =~# 'i\+') || \ s:increment_i(item_above.mrkr[:-2]) ==# number_chars return 'i' @@ -224,7 +246,7 @@ function! s:guess_kind_of_numbered_item(item) "{{{ return 'a' endif else - if number_chars =~# 'i\+' || index(s:number_kinds, 'a') == -1 + if number_chars =~# 'i\+' || index(number_kinds, 'a') == -1 return 'i' else return 'a' @@ -234,13 +256,13 @@ function! s:guess_kind_of_numbered_item(item) "{{{ endif endif if number_chars =~# '\u\+' - if number_chars !~# '^[IVXLCDM]\+' || index(s:number_kinds, 'I') == -1 + if number_chars !~# '^[IVXLCDM]\+' || index(number_kinds, 'I') == -1 return 'A' else let item_above = s:get_prev_list_item(a:item, 0) if item_above.type != 0 - if index(s:number_kinds, 'A') == -1 || + if index(number_kinds, 'A') == -1 || \ (item_above.mrkr[-1:] !=# divisor && number_chars =~# 'I\+') || \ s:increment_I(item_above.mrkr[:-2]) ==# number_chars return 'I' @@ -248,7 +270,7 @@ function! s:guess_kind_of_numbered_item(item) "{{{ return 'A' endif else - if number_chars =~# 'I\+' || index(s:number_kinds, 'A') == -1 + if number_chars =~# 'I\+' || index(number_kinds, 'A') == -1 return 'I' else return 'A' @@ -257,14 +279,16 @@ function! s:guess_kind_of_numbered_item(item) "{{{ endif endif -endfunction "}}} +endfunction + -function! s:regexp_of_marker(item) "{{{ +function! s:regexp_of_marker(item) if a:item.type == 1 return vimwiki#u#escape(a:item.mrkr) elseif a:item.type == 2 + let number_divisors = vimwiki#vars#get_syntaxlocal('number_divisors') for ki in ['d', 'u', 'l'] - let match = matchstr(a:item.mrkr, '\'.ki.'\+['.s:number_divisors.']') + let match = matchstr(a:item.mrkr, '\'.ki.'\+['.number_divisors.']') if match != '' return '\'.ki.'\+'.vimwiki#u#escape(match[-1:]) endif @@ -272,15 +296,16 @@ function! s:regexp_of_marker(item) "{{{ else return '' endif -endfunction "}}} +endfunction -"get properties of an item }}} -"functions for navigating between items {{{ +" --------------------------------------------------------- +" functions for navigating between items +" --------------------------------------------------------- "Returns: the list item after a:item or an empty item "If a:ignore_kind is 1, the markers can differ -function! s:get_next_list_item(item, ignore_kind) "{{{ +function! s:get_next_list_item(item, ignore_kind) let org_lvl = s:get_level(a:item.lnum) if !a:ignore_kind let org_regex = s:regexp_of_marker(a:item) @@ -299,11 +324,12 @@ function! s:get_next_list_item(item, ignore_kind) "{{{ let cur_ln = s:get_next_line(cur_ln) endwhile return s:empty_item() -endfunction "}}} +endfunction + "Returns: the list item before a:item or an empty item "If a:ignore_kind is 1, the markers can differ -function! s:get_prev_list_item(item, ignore_kind) "{{{ +function! s:get_prev_list_item(item, ignore_kind) let org_lvl = s:get_level(a:item.lnum) if !a:ignore_kind let org_regex = s:regexp_of_marker(a:item) @@ -322,9 +348,10 @@ function! s:get_prev_list_item(item, ignore_kind) "{{{ let cur_ln = s:get_prev_line(cur_ln) endwhile return s:empty_item() -endfunction "}}} +endfunction + -function! s:get_item_of_level(cur_ln, cur_lvl, org_lvl, org_regex) "{{{ +function! s:get_item_of_level(cur_ln, cur_lvl, org_lvl, org_regex) let cur_linecontent = getline(a:cur_ln) if a:cur_lvl == a:org_lvl if cur_linecontent =~# '^\s*'.a:org_regex.'\s' @@ -335,17 +362,19 @@ function! s:get_item_of_level(cur_ln, cur_lvl, org_lvl, org_regex) "{{{ elseif a:cur_lvl < a:org_lvl return s:empty_item() endif -endfunction "}}} +endfunction -function! s:get_any_item_of_level(cur_ln, cur_lvl, org_lvl) "{{{ + +function! s:get_any_item_of_level(cur_ln, cur_lvl, org_lvl) if a:cur_lvl == a:org_lvl return s:get_item(a:cur_ln) elseif a:cur_lvl < a:org_lvl return s:empty_item() endif -endfunction "}}} +endfunction + -function! s:get_first_item_in_list(item, ignore_kind) "{{{ +function! s:get_first_item_in_list(item, ignore_kind) let cur_item = a:item while 1 let prev_item = s:get_prev_list_item(cur_item, a:ignore_kind) @@ -356,9 +385,10 @@ function! s:get_first_item_in_list(item, ignore_kind) "{{{ endif endwhile return cur_item -endfunction "}}} +endfunction + -function! s:get_last_item_in_list(item, ignore_kind) "{{{ +function! s:get_last_item_in_list(item, ignore_kind) let cur_item = a:item while 1 let next_item = s:get_next_list_item(cur_item, a:ignore_kind) @@ -369,17 +399,17 @@ function! s:get_last_item_in_list(item, ignore_kind) "{{{ endif endwhile return cur_item -endfunction "}}} +endfunction + "Returns: lnum+1 in most cases, but skips blank lines and preformatted text, "0 in case of nonvalid line. "If there is no second argument, 0 is returned at a header, otherwise the "header is skipped -function! s:get_next_line(lnum, ...) "{{{ - if getline(a:lnum) =~# g:vimwiki_rxPreStart +function! s:get_next_line(lnum, ...) + if getline(a:lnum) =~# vimwiki#vars#get_syntaxlocal('rxPreStart') let cur_ln = a:lnum + 1 - while cur_ln <= line('$') && - \ getline(cur_ln) !~# g:vimwiki_rxPreEnd + while cur_ln <= line('$') && getline(cur_ln) !~# vimwiki#vars#get_syntaxlocal('rxPreEnd') let cur_ln += 1 endwhile let next_line = cur_ln @@ -387,27 +417,28 @@ function! s:get_next_line(lnum, ...) "{{{ let next_line = nextnonblank(a:lnum+1) endif - if a:0 > 0 && getline(next_line) =~# g:vimwiki_rxHeader + if a:0 > 0 && getline(next_line) =~# vimwiki#vars#get_syntaxlocal('rxHeader') let next_line = s:get_next_line(next_line, 1) endif if next_line < 0 || next_line > line('$') || - \ (getline(next_line) =~# g:vimwiki_rxHeader && a:0 == 0) + \ (getline(next_line) =~# vimwiki#vars#get_syntaxlocal('rxHeader') && a:0 == 0) return 0 endif return next_line -endfunction "}}} +endfunction + "Returns: lnum-1 in most cases, but skips blank lines and preformatted text "0 in case of nonvalid line and a header, because a header ends every list -function! s:get_prev_line(lnum) "{{{ +function! s:get_prev_line(lnum) let prev_line = prevnonblank(a:lnum-1) - if getline(prev_line) =~# g:vimwiki_rxPreEnd + if getline(prev_line) =~# vimwiki#vars#get_syntaxlocal('rxPreEnd') let cur_ln = a:lnum - 1 while 1 - if cur_ln == 0 || getline(cur_ln) =~# g:vimwiki_rxPreStart + if cur_ln == 0 || getline(cur_ln) =~# vimwiki#vars#get_syntaxlocal('rxPreStart') break endif let cur_ln -= 1 @@ -416,14 +447,15 @@ function! s:get_prev_line(lnum) "{{{ endif if prev_line < 0 || prev_line > line('$') || - \ getline(prev_line) =~# g:vimwiki_rxHeader + \ getline(prev_line) =~# vimwiki#vars#get_syntaxlocal('rxHeader') return 0 endif return prev_line -endfunction "}}} +endfunction -function! s:get_first_child(item) "{{{ + +function! s:get_first_child(item) if a:item.lnum >= line('$') return s:empty_item() endif @@ -433,19 +465,18 @@ function! s:get_first_child(item) "{{{ if cur_item.type != 0 && s:get_level(cur_item.lnum) > org_lvl return cur_item endif - if cur_item.lnum > line('$') || cur_item.lnum <= 0 || - \ s:get_level(cur_item.lnum) <= org_lvl + if cur_item.lnum > line('$') || cur_item.lnum <= 0 || s:get_level(cur_item.lnum) <= org_lvl return s:empty_item() endif let cur_item = s:get_item(s:get_next_line(cur_item.lnum)) endwhile -endfunction "}}} +endfunction "Returns: the next sibling of a:child, given the parent item "Used for iterating over children "Note: child items do not necessarily have the same indent, i.e. level -function! s:get_next_child_item(parent, child) "{{{ +function! s:get_next_child_item(parent, child) if a:parent.type == 0 | return s:empty_item() | endif let parent_lvl = s:get_level(a:parent.lnum) let cur_ln = s:get_last_line_of_item_incl_children(a:child) @@ -461,9 +492,10 @@ function! s:get_next_child_item(parent, child) "{{{ endif endwhile return s:empty_item() -endfunction "}}} +endfunction + -function! s:get_parent(item) "{{{ +function! s:get_parent(item) let parent_line = 0 let cur_ln = prevnonblank(a:item.lnum) @@ -487,10 +519,11 @@ function! s:get_parent(item) "{{{ endif endwhile return s:get_item(parent_line) -endfunction "}}} +endfunction + "Returns: the item above or the item below or an empty item -function! s:get_a_neighbor_item(item) "{{{ +function! s:get_a_neighbor_item(item) let prev_item = s:get_prev_list_item(a:item, 1) if prev_item.type != 0 return prev_item @@ -501,9 +534,10 @@ function! s:get_a_neighbor_item(item) "{{{ endif endif return s:empty_item() -endfunction "}}} +endfunction -function! s:get_a_neighbor_item_in_column(lnum, column) "{{{ + +function! s:get_a_neighbor_item_in_column(lnum, column) let cur_ln = s:get_prev_line(a:lnum) while cur_ln >= 1 if s:get_level(cur_ln) <= a:column @@ -512,11 +546,12 @@ function! s:get_a_neighbor_item_in_column(lnum, column) "{{{ let cur_ln = s:get_prev_line(cur_ln) endwhile return s:empty_item() -endfunction "}}} +endfunction + "Returns: the item if there is one in a:lnum "else the multiline item a:lnum belongs to -function! s:get_corresponding_item(lnum) "{{{ +function! s:get_corresponding_item(lnum) let item = s:get_item(a:lnum) if item.type != 0 return item @@ -535,10 +570,11 @@ function! s:get_corresponding_item(lnum) "{{{ let cur_ln = s:get_prev_line(cur_ln) endwhile return s:empty_item() -endfunction "}}} +endfunction + "Returns: the last line of a (possibly multiline) item, including all children -function! s:get_last_line_of_item_incl_children(item) "{{{ +function! s:get_last_line_of_item_incl_children(item) let cur_ln = a:item.lnum let org_lvl = s:get_level(a:item.lnum) while 1 @@ -548,11 +584,12 @@ function! s:get_last_line_of_item_incl_children(item) "{{{ endif let cur_ln = next_line endwhile -endfunction "}}} +endfunction + "Returns: the last line of a (possibly multiline) item "Note: there can be other list items between the first and last line -function! s:get_last_line_of_item(item) "{{{ +function! s:get_last_line_of_item(item) if a:item.type == 0 | return 0 | endif let org_lvl = s:get_level(a:item.lnum) let last_corresponding_line = a:item.lnum @@ -567,20 +604,21 @@ function! s:get_last_line_of_item(item) "{{{ let last_corresponding_line = cur_ln let cur_ln = s:get_next_line(cur_ln) else - let cur_ln = s:get_next_line( - \ s:get_last_line_of_item_incl_children(cur_item)) + let cur_ln = s:get_next_line(s:get_last_line_of_item_incl_children(cur_item)) endif endwhile return last_corresponding_line -endfunction "}}} +endfunction + -"functions for navigating between items }}} +" --------------------------------------------------------- +" renumber list items +" --------------------------------------------------------- -"renumber list items {{{ "Renumbers the current list from a:item on downwards "Returns: the last item that was adjusted -function! s:adjust_numbered_list_below(item, recursive) "{{{ +function! s:adjust_numbered_list_below(item, recursive) if !(a:item.type == 2 || (a:item.type == 1 && a:recursive)) return a:item endif @@ -607,9 +645,10 @@ function! s:adjust_numbered_list_below(item, recursive) "{{{ let cur_item = next_item endwhile return cur_item -endfunction "}}} +endfunction -function! s:adjust_items_recursively(parent) "{{{ + +function! s:adjust_items_recursively(parent) if a:parent.type == 0 return s:empty_item() end @@ -626,13 +665,14 @@ function! s:adjust_items_recursively(parent) "{{{ return last_item endif endwhile -endfunction "}}} +endfunction + "Renumbers the list a:item is in. "If a:ignore_kind == 0, only the items which have the same kind of marker as "a:item are considered, otherwise all items. "Returns: the last item that was adjusted -function! s:adjust_numbered_list(item, ignore_kind, recursive) "{{{ +function! s:adjust_numbered_list(item, ignore_kind, recursive) if !(a:item.type == 2 || (a:item.type == 1 && (a:ignore_kind || a:recursive))) return s:empty_item() end @@ -641,10 +681,8 @@ function! s:adjust_numbered_list(item, ignore_kind, recursive) "{{{ while 1 if first_item.type == 2 - let new_mrkr = s:guess_kind_of_numbered_item(first_item) . - \ first_item.mrkr[-1:] - call s:substitute_string_in_line(first_item.lnum, first_item.mrkr, - \ new_mrkr) + let new_mrkr = s:guess_kind_of_numbered_item(first_item) . first_item.mrkr[-1:] + call s:substitute_string_in_line(first_item.lnum, first_item.mrkr, new_mrkr) let first_item.mrkr = new_mrkr endif @@ -656,20 +694,22 @@ function! s:adjust_numbered_list(item, ignore_kind, recursive) "{{{ endif let first_item = next_first_item endwhile -endfunction "}}} +endfunction + "Renumbers the list the cursor is in "also update its parents checkbox state -function! vimwiki#lst#adjust_numbered_list() "{{{ +function! vimwiki#lst#adjust_numbered_list() let cur_item = s:get_corresponding_item(line('.')) if cur_item.type == 0 | return | endif call s:adjust_numbered_list(cur_item, 1, 0) call s:update_state(s:get_parent(cur_item)) -endfunction "}}} +endfunction + "Renumbers all lists of the buffer "of course, this might take some seconds -function! vimwiki#lst#adjust_whole_buffer() "{{{ +function! vimwiki#lst#adjust_whole_buffer() let cur_ln = 1 while 1 let cur_item = s:get_item(cur_ln) @@ -681,25 +721,30 @@ function! vimwiki#lst#adjust_whole_buffer() "{{{ return endif endwhile -endfunction "}}} +endfunction -"renumber list items }}} -"checkbox stuff {{{ +" --------------------------------------------------------- +" checkbox stuff +" --------------------------------------------------------- "Returns: the rate of checkboxed list item in percent -function! s:get_rate(item) "{{{ +function! s:get_rate(item) if a:item.type == 0 || a:item.cb == '' return -1 endif let state = a:item.cb - let n=len(g:vimwiki_listsyms_list) - return index(g:vimwiki_listsyms_list, state) * 100/(n-1) -endfunction "}}} + if state == vimwiki#vars#get_global('listsym_rejected') + return -1 + endif + let n = len(vimwiki#vars#get_syntaxlocal('listsyms_list')) + return index(vimwiki#vars#get_syntaxlocal('listsyms_list'), state) * 100/(n-1) +endfunction + "Set state of the list item to [ ] or [o] or whatever "Returns: 1 if the state changed, 0 otherwise -function! s:set_state(item, new_rate) "{{{ +function! s:set_state(item, new_rate) let new_state = s:rate_to_state(a:new_rate) let old_state = s:rate_to_state(s:get_rate(a:item)) if new_state !=# old_state @@ -708,11 +753,12 @@ function! s:set_state(item, new_rate) "{{{ else return 0 endif -endfunction "}}} +endfunction + "Set state of the list item to [ ] or [o] or whatever "Updates the states of its child items -function! s:set_state_plus_children(item, new_rate) "{{{ +function! s:set_state_plus_children(item, new_rate) call s:set_state(a:item, a:new_rate) let child_item = s:get_first_child(a:item) @@ -725,26 +771,31 @@ function! s:set_state_plus_children(item, new_rate) "{{{ endif let child_item = s:get_next_child_item(a:item, child_item) endwhile -endfunction "}}} +endfunction + "Returns: the appropriate symbol for a given percent rate -function! s:rate_to_state(rate) "{{{ +function! s:rate_to_state(rate) + let listsyms_list = vimwiki#vars#get_syntaxlocal('listsyms_list') let state = '' - let n=len(g:vimwiki_listsyms_list) + let n = len(listsyms_list) if a:rate == 100 - let state = g:vimwiki_listsyms_list[n-1] + let state = listsyms_list[n-1] elseif a:rate == 0 - let state = g:vimwiki_listsyms_list[0] + let state = listsyms_list[0] + elseif a:rate == -1 + let state = vimwiki#vars#get_global('listsym_rejected') else let index = float2nr(ceil(a:rate/100.0*(n-2))) - let state = g:vimwiki_listsyms_list[index] + let state = listsyms_list[index] endif return state -endfunction "}}} +endfunction + "updates the symbol of a checkboxed item according to the symbols of its "children -function! s:update_state(item) "{{{ +function! s:update_state(item) if a:item.type == 0 || a:item.cb == '' return endif @@ -759,8 +810,11 @@ function! s:update_state(item) "{{{ break endif if child_item.cb != '' - let count_children_with_cb += 1 - let sum_children_rate += s:get_rate(child_item) + let rate = s:get_rate(child_item) + if rate != -1 + 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) endwhile @@ -774,43 +828,47 @@ function! s:update_state(item) "{{{ call s:set_state_recursively(a:item, 0) endif endif -endfunction "}}} +endfunction + -function! s:set_state_recursively(item, new_rate) "{{{ +function! s:set_state_recursively(item, new_rate) let state_changed = s:set_state(a:item, a:new_rate) if state_changed call s:update_state(s:get_parent(a:item)) endif -endfunction "}}} +endfunction + "Creates checkbox in a list item. "Returns: 1 if successful -function! s:create_cb(item) "{{{ +function! s:create_cb(item) if a:item.type == 0 || a:item.cb != '' return 0 endif let new_item = a:item - let new_item.cb = g:vimwiki_listsyms_list[0] + let new_item.cb = vimwiki#vars#get_syntaxlocal('listsyms_list')[0] call s:substitute_rx_in_line(new_item.lnum, \ vimwiki#u#escape(new_item.mrkr) . '\zs\ze', ' [' . new_item.cb . ']') call s:update_state(new_item) return 1 -endfunction "}}} +endfunction + -function! s:remove_cb(item) "{{{ +function! s:remove_cb(item) let item = a:item if item.type != 0 && item.cb != '' let item.cb = '' call s:substitute_rx_in_line(item.lnum, '\s\+\[.\]', '') endif return item -endfunction "}}} +endfunction + "Change state of checkbox "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) if from_item.type == 0 return @@ -833,11 +891,53 @@ function! s:change_cb(from_line, to_line, new_rate) "{{{ call s:update_state(parent_item) endfor -endfunction "}}} +endfunction + + +"Toggles checkbox between two states in the lines of the given range, +"creates chceckboxes if there aren't any. +function! s:toggle_create_cb(from_line, to_line, state1, state2) + let from_item = s:get_corresponding_item(a:from_line) + if from_item.type == 0 + return + endif + + if from_item.cb == '' + + "if from_line has no CB, make a CB in every selected line + let parent_items_of_lines = [] + for cur_ln in range(from_item.lnum, a:to_line) + let cur_item = s:get_item(cur_ln) + let success = s:create_cb(cur_item) + + if success + let cur_parent_item = s:get_parent(cur_item) + if index(parent_items_of_lines, cur_parent_item) == -1 + call insert(parent_items_of_lines, cur_parent_item) + endif + endif + endfor + + for parent_item in parent_items_of_lines + call s:update_state(parent_item) + endfor + + else + + "if from_line has CB, toggle it and set all siblings to the same new state + let rate_first_line = s:get_rate(from_item) + let new_rate = rate_first_line == a:state1 ? a:state2 : a:state1 + + call s:change_cb(a:from_line, a:to_line, new_rate) + + endif + +endfunction + "Decrement checkbox between [ ] and [X] "in the lines of the given range -function! vimwiki#lst#decrement_cb(from_line, to_line) "{{{ +function! vimwiki#lst#decrement_cb(from_line, to_line) let from_item = s:get_corresponding_item(a:from_line) if from_item.type == 0 return @@ -845,16 +945,17 @@ function! vimwiki#lst#decrement_cb(from_line, to_line) "{{{ "if from_line has CB, decrement it and set all siblings to the same new state let rate_first_line = s:get_rate(from_item) - let n=len(g:vimwiki_listsyms_list) + let n = len(vimwiki#vars#get_syntaxlocal('listsyms_list')) let new_rate = max([rate_first_line - 100/(n-1)-1, 0]) call s:change_cb(a:from_line, a:to_line, new_rate) -endfunction "}}} +endfunction + "Increment checkbox between [ ] and [X] "in the lines of the given range -function! vimwiki#lst#increment_cb(from_line, to_line) "{{{ +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 @@ -862,54 +963,61 @@ function! vimwiki#lst#increment_cb(from_line, to_line) "{{{ "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(g:vimwiki_listsyms_list) + 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 "}}} +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) "{{{ +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 + + +"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_item.cb == '' - - "if from_line has no CB, make a CB in every selected line - let parent_items_of_lines = [] - for cur_ln in range(from_item.lnum, a:to_line) - let cur_item = s:get_item(cur_ln) - let success = s:create_cb(cur_item) + "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]) - if success - let cur_parent_item = s:get_parent(cur_item) - if index(parent_items_of_lines, cur_parent_item) == -1 - call insert(parent_items_of_lines, cur_parent_item) - endif - endif - endfor + call s:change_cb(a:from_line, a:to_line, new_rate) - for parent_item in parent_items_of_lines - call s:update_state(parent_item) - endfor +endfunction - else - "if from_line has CB, toggle it and set all siblings to the same new state - let rate_first_line = s:get_rate(from_item) - let new_rate = rate_first_line == 100 ? 0 : 100 +"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 - call s:change_cb(a:from_line, a:to_line, new_rate) - endif +"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 "}}} -function! vimwiki#lst#remove_cb(first_line, last_line) "{{{ +function! vimwiki#lst#remove_cb(first_line, last_line) let first_item = s:get_corresponding_item(a:first_line) let last_item = s:get_corresponding_item(a:last_line) @@ -934,11 +1042,11 @@ function! vimwiki#lst#remove_cb(first_line, last_line) "{{{ for parent_item in parent_items_of_lines call s:update_state(parent_item) endfor -endfunction "}}} +endfunction + -function! vimwiki#lst#remove_cb_in_list() "{{{ - let first_item = s:get_first_item_in_list( - \ s:get_corresponding_item(line('.')), 0) +function! vimwiki#lst#remove_cb_in_list() + let first_item = s:get_first_item_in_list(s:get_corresponding_item(line('.')), 0) let cur_item = first_item while 1 @@ -952,29 +1060,31 @@ function! vimwiki#lst#remove_cb_in_list() "{{{ endwhile call s:update_state(s:get_parent(first_item)) -endfunction "}}} +endfunction -"checkbox stuff }}} -"change the level of list items {{{ -function! s:set_indent(lnum, new_indent) "{{{ +" --------------------------------------------------------- +" change the level of list items +" --------------------------------------------------------- + +function! s:set_indent(lnum, new_indent) if &expandtab let indentstring = repeat(' ', a:new_indent) else - let indentstring = repeat('\t', a:new_indent / &tabstop) . - \ repeat(' ', a:new_indent % &tabstop) + let indentstring = repeat('\t', a:new_indent / &tabstop) . repeat(' ', a:new_indent % &tabstop) endif call s:substitute_rx_in_line(a:lnum, '^\s*', indentstring) -endfunction "}}} +endfunction + -function! s:decrease_level(item) "{{{ +function! s:decrease_level(item) let removed_indent = 0 - if VimwikiGet('syntax') ==? 'media' && a:item.type == 1 && - \ index(s:multiple_bullet_chars, s:first_char(a:item.mrkr)) > -1 + if vimwiki#vars#get_syntaxlocal('recurring_bullets') && a:item.type == 1 && + \ index(vimwiki#vars#get_syntaxlocal('multiple_bullet_chars'), + \ s:first_char(a:item.mrkr)) > -1 if s:string_length(a:item.mrkr) >= 2 - call s:substitute_string_in_line(a:item.lnum, - \ s:first_char(a:item.mrkr), '') + call s:substitute_string_in_line(a:item.lnum, s:first_char(a:item.mrkr), '') let removed_indent = -1 endif else @@ -988,12 +1098,14 @@ function! s:decrease_level(item) "{{{ let removed_indent = new_indent - old_indent endif return removed_indent -endfunction "}}} +endfunction -function! s:increase_level(item) "{{{ + +function! s:increase_level(item) let additional_indent = 0 - if VimwikiGet('syntax') ==? 'media' && a:item.type == 1 && - \ index(s:multiple_bullet_chars, s:first_char(a:item.mrkr)) > -1 + if vimwiki#vars#get_syntaxlocal('recurring_bullets') && a:item.type == 1 && + \ index(vimwiki#vars#get_syntaxlocal('multiple_bullet_chars'), + \ s:first_char(a:item.mrkr)) > -1 call s:substitute_string_in_line(a:item.lnum, a:item.mrkr, a:item.mrkr . \ s:first_char(a:item.mrkr)) let additional_indent = 1 @@ -1008,31 +1120,32 @@ function! s:increase_level(item) "{{{ let additional_indent = new_indent - old_indent endif return additional_indent -endfunction "}}} +endfunction + "adds a:indent_by to the current indent "a:indent_by can be negative -function! s:indent_line_by(lnum, indent_by) "{{{ +function! s:indent_line_by(lnum, indent_by) let item = s:get_item(a:lnum) - if VimwikiGet('syntax') ==? 'media' && item.type == 1 && - \ index(s:multiple_bullet_chars, s:first_char(item.mrkr)) > -1 + if vimwiki#vars#get_syntaxlocal('recurring_bullets') && item.type == 1 && + \ index(vimwiki#vars#get_syntaxlocal('multiple_bullet_chars'), + \ s:first_char(item.mrkr)) > -1 if a:indent_by > 0 - call s:substitute_string_in_line(a:lnum, item.mrkr, - \ item.mrkr . s:first_char(item.mrkr)) + call s:substitute_string_in_line(a:lnum, item.mrkr, item.mrkr . s:first_char(item.mrkr)) elseif a:indent_by < 0 call s:substitute_string_in_line(a:lnum, s:first_char(item.mrkr), '') endif else call s:set_indent(a:lnum, indent(a:lnum) + a:indent_by) endif -endfunction "}}} +endfunction + "changes lvl of lines in selection -function! s:change_level(from_line, to_line, direction, plus_children) "{{{ +function! s:change_level(from_line, to_line, direction, plus_children) let from_item = s:get_corresponding_item(a:from_line) if from_item.type == 0 - if a:direction ==# 'increase' && a:from_line == a:to_line && - \ empty(getline(a:from_line)) + if a:direction ==# 'increase' && a:from_line == a:to_line && empty(getline(a:from_line)) "that's because :> doesn't work on an empty line normal! gi else @@ -1073,8 +1186,7 @@ function! s:change_level(from_line, to_line, direction, plus_children) "{{{ let first_line_level = s:get_level(from_item.lnum) let more_than_one_level_concerned = 0 - let first_line_indented_by = - \ (a:direction ==# 'increase') ? + let first_line_indented_by = (a:direction ==# 'increase') ? \ s:increase_level(from_item) : s:decrease_level(from_item) let cur_ln = s:get_next_line(from_item.lnum) @@ -1104,71 +1216,80 @@ function! s:change_level(from_line, to_line, direction, plus_children) "{{{ call s:adjust_numbered_list(from_item, 0, 0) call s:adjust_numbered_list(to_be_adjusted, 0, 0) endif -endfunction "}}} +endfunction -function! vimwiki#lst#change_level(from_line, to_line, direction, plus_children) "{{{ + +function! vimwiki#lst#change_level(from_line, to_line, direction, plus_children) let cur_col = col('$') - col('.') call s:change_level(a:from_line, a:to_line, a:direction, a:plus_children) call cursor('.', col('$') - cur_col) -endfunction "}}} +endfunction + "indent line a:lnum to be the continuation of a:prev_item -function! s:indent_multiline(prev_item, lnum) "{{{ +function! s:indent_multiline(prev_item, lnum) if a:prev_item.type != 0 call s:set_indent(a:lnum, s:text_begin(a:prev_item.lnum)) endif -endfunction "}}} +endfunction -"change the level of list items }}} -"change markers of list items {{{ +" --------------------------------------------------------- +" change markers of list items +" --------------------------------------------------------- + "Returns: the position of a marker in g:vimwiki_list_markers -function! s:get_idx_list_markers(item) "{{{ +function! s:get_idx_list_markers(item) if a:item.type == 1 let m = s:first_char(a:item.mrkr) else let m = s:guess_kind_of_numbered_item(a:item) . a:item.mrkr[-1:] endif - return index(g:vimwiki_list_markers, m) -endfunction "}}} + return index(vimwiki#vars#get_syntaxlocal('list_markers'), m) +endfunction + "changes the marker of the given item to the next in g:vimwiki_list_markers -function! s:get_next_mrkr(item) "{{{ +function! s:get_next_mrkr(item) + let markers = vimwiki#vars#get_syntaxlocal('list_markers') if a:item.type == 0 - let new_mrkr = g:vimwiki_list_markers[0] + let new_mrkr = markers[0] else let idx = s:get_idx_list_markers(a:item) - let new_mrkr = g:vimwiki_list_markers[(idx+1) % len(g:vimwiki_list_markers)] + let new_mrkr = markers[(idx+1) % len(markers)] endif return new_mrkr -endfunction "}}} +endfunction + "changes the marker of the given item to the previous in g:vimwiki_list_markers -function! s:get_prev_mrkr(item) "{{{ +function! s:get_prev_mrkr(item) + let markers = vimwiki#vars#get_syntaxlocal('list_markers') if a:item.type == 0 - return g:vimwiki_list_markers[-1] + return markers[-1] endif let idx = s:get_idx_list_markers(a:item) if idx == -1 - return g:vimwiki_list_markers[-1] + return markers[-1] else - return g:vimwiki_list_markers[(idx - 1 + len(g:vimwiki_list_markers)) % - \ len(g:vimwiki_list_markers)] + return markers[(idx - 1 + len(markers)) % len(markers)] endif -endfunction "}}} +endfunction -function! s:set_new_mrkr(item, new_mrkr) "{{{ + +function! s:set_new_mrkr(item, new_mrkr) if a:item.type == 0 call s:substitute_rx_in_line(a:item.lnum, '^\s*\zs\ze', a:new_mrkr.' ') - if indent(a:item.lnum) == 0 && VimwikiGet('syntax') !=? 'media' + if indent(a:item.lnum) == 0 && !vimwiki#vars#get_syntaxlocal('recurring_bullets') call s:set_indent(a:item.lnum, vimwiki#lst#get_list_margin()) endif else call s:substitute_string_in_line(a:item.lnum, a:item.mrkr, a:new_mrkr) endif -endfunction "}}} +endfunction + -function! vimwiki#lst#change_marker(from_line, to_line, new_mrkr, mode) "{{{ +function! vimwiki#lst#change_marker(from_line, to_line, new_mrkr, mode) let cur_col_from_eol = col("$") - (a:mode ==# "i" ? col("'^") : col('.')) let new_mrkr = a:new_mrkr let cur_ln = a:from_line @@ -1182,28 +1303,26 @@ function! vimwiki#lst#change_marker(from_line, to_line, new_mrkr, mode) "{{{ endif "handle markers like *** - if index(s:multiple_bullet_chars, s:first_char(new_mrkr)) > -1 + if index(vimwiki#vars#get_syntaxlocal('multiple_bullet_chars'), s:first_char(new_mrkr)) > -1 "use *** if the item above has *** too let item_above = s:get_prev_list_item(cur_item, 1) - if item_above.type == 1 && - \ s:first_char(item_above.mrkr) ==# s:first_char(new_mrkr) + if item_above.type == 1 && s:first_char(item_above.mrkr) ==# s:first_char(new_mrkr) let new_mrkr = item_above.mrkr else "use *** if the item below has *** too let item_below = s:get_next_list_item(cur_item, 1) - if item_below.type == 1 && - \ s:first_char(item_below.mrkr) ==# s:first_char(new_mrkr) + if item_below.type == 1 && s:first_char(item_below.mrkr) ==# s:first_char(new_mrkr) let new_mrkr = item_below.mrkr else "if the old is ### and the new is * use *** if cur_item.type == 1 && - \ index(s:multiple_bullet_chars,s:first_char(cur_item.mrkr))>-1 + \ index(vimwiki#vars#get_syntaxlocal('multiple_bullet_chars'), + \ s:first_char(cur_item.mrkr))>-1 let new_mrkr = repeat(new_mrkr, s:string_length(cur_item.mrkr)) else "use *** if the parent item has ** let parent_item = s:get_parent(cur_item) - if parent_item.type == 1 && - \ s:first_char(parent_item.mrkr) ==# s:first_char(new_mrkr) + if parent_item.type == 1 && s:first_char(parent_item.mrkr) ==# s:first_char(new_mrkr) let new_mrkr = repeat(s:first_char(parent_item.mrkr), \ s:string_length(parent_item.mrkr)+1) endif @@ -1221,9 +1340,10 @@ function! vimwiki#lst#change_marker(from_line, to_line, new_mrkr, mode) "{{{ endwhile call cursor('.', col('$') - cur_col_from_eol) -endfunction "}}} +endfunction -function! vimwiki#lst#change_marker_in_list(new_mrkr) "{{{ + +function! vimwiki#lst#change_marker_in_list(new_mrkr) let cur_item = s:get_corresponding_item(line('.')) let first_item = s:get_first_item_in_list(cur_item, 0) let last_item = s:get_last_item_in_list(cur_item, 0) @@ -1237,11 +1357,12 @@ function! vimwiki#lst#change_marker_in_list(new_mrkr) "{{{ endwhile call s:adjust_numbered_list(s:get_item(first_item_line), 0, 0) -endfunction "}}} +endfunction + "sets kind of the item depending on neighbor items and the parent item -function! s:adjust_mrkr(item) "{{{ - if a:item.type == 0 || VimwikiGet('syntax') ==? 'media' +function! s:adjust_mrkr(item) + if a:item.type == 0 || vimwiki#vars#get_syntaxlocal('recurring_bullets') return endif @@ -1253,25 +1374,25 @@ function! s:adjust_mrkr(item) "{{{ "if possible, set e.g. *** if parent has ** as marker if neighbor_item.type == 0 && a:item.type == 1 && - \ index(s:multiple_bullet_chars, s:first_char(a:item.mrkr)) > -1 + \ index(vimwiki#vars#get_syntaxlocal('multiple_bullet_chars'), + \ s:first_char(a:item.mrkr)) > -1 let parent_item = s:get_parent(a:item) - if parent_item.type == 1 && - \ s:first_char(parent_item.mrkr) ==# s:first_char(a:item.mrkr) - let new_mrkr = repeat(s:first_char(parent_item.mrkr), - \ s:string_length(parent_item.mrkr)+1) + if parent_item.type == 1 && s:first_char(parent_item.mrkr) ==# s:first_char(a:item.mrkr) + let new_mrkr = repeat(s:first_char(parent_item.mrkr), s:string_length(parent_item.mrkr)+1) endif endif call s:substitute_string_in_line(a:item.lnum, a:item.mrkr, new_mrkr) call s:adjust_numbered_list(a:item, 0, 1) -endfunction "}}} +endfunction + -function! s:clone_marker_from_to(from, to) "{{{ +function! s:clone_marker_from_to(from, to) let item_from = s:get_item(a:from) if item_from.type == 0 | return | endif let new_mrkr = item_from.mrkr . ' ' call s:substitute_rx_in_line(a:to, '^\s*', new_mrkr) - let new_indent = ( VimwikiGet('syntax') !=? 'media' ? indent(a:from) : 0 ) + let new_indent = ( vimwiki#vars#get_syntaxlocal('recurring_bullets') ? 0 : indent(a:from) ) call s:set_indent(a:to, new_indent) if item_from.cb != '' call s:create_cb(s:get_item(a:to)) @@ -1281,9 +1402,10 @@ function! s:clone_marker_from_to(from, to) "{{{ let adjust_from = ( a:from < a:to ? a:from : a:to ) call s:adjust_numbered_list_below(s:get_item(adjust_from), 0) endif -endfunction "}}} +endfunction -function! s:remove_mrkr(item) "{{{ + +function! s:remove_mrkr(item) let item = a:item if item.cb != '' let item = s:remove_cb(item) @@ -1297,9 +1419,10 @@ function! s:remove_mrkr(item) "{{{ let item.type = 0 call s:update_state(parent_item) return item -endfunction "}}} +endfunction + -function! s:create_marker(lnum) "{{{ +function! s:create_marker(lnum) let new_sibling = s:get_corresponding_item(a:lnum) if new_sibling.type == 0 let new_sibling = s:get_a_neighbor_item_in_column(a:lnum, virtcol('.')) @@ -1308,15 +1431,17 @@ function! s:create_marker(lnum) "{{{ call s:clone_marker_from_to(new_sibling.lnum, a:lnum) else let cur_item = s:get_item(a:lnum) - call s:set_new_mrkr(cur_item, g:vimwiki_list_markers[0]) + call s:set_new_mrkr(cur_item, vimwiki#vars#get_syntaxlocal('list_markers')[0]) call s:adjust_numbered_list(cur_item, 0, 0) endif -endfunction "}}} +endfunction -"change markers of list items }}} -"handle keys {{{ -function! vimwiki#lst#kbd_o() "{{{ +" --------------------------------------------------------- +" handle keys +" --------------------------------------------------------- + +function! vimwiki#lst#kbd_o() let fold_end = foldclosedend('.') let lnum = (fold_end == -1) ? line('.') : fold_end let cur_item = s:get_item(lnum) @@ -1329,9 +1454,10 @@ function! vimwiki#lst#kbd_o() "{{{ call s:clone_marker_from_to(cur_item.lnum, cur_item.lnum+1) endif startinsert! -endfunction "}}} +endfunction + -function! vimwiki#lst#kbd_O() "{{{ +function! vimwiki#lst#kbd_O() normal! Ox let cur_ln = line('.') if getline(cur_ln+1) !~# '^\s*$' @@ -1340,9 +1466,10 @@ function! vimwiki#lst#kbd_O() "{{{ call s:clone_marker_from_to(cur_ln-1, cur_ln) endif startinsert! -endfunction "}}} +endfunction + -function! s:cr_on_empty_list_item(lnum, behavior) "{{{ +function! s:cr_on_empty_list_item(lnum, behavior) if a:behavior == 1 "just make a new list item normal! gi @@ -1396,18 +1523,20 @@ function! s:cr_on_empty_list_item(lnum, behavior) "{{{ endif return endif -endfunction "}}} +endfunction -function! s:cr_on_empty_line(lnum, behavior) "{{{ + +function! s:cr_on_empty_line(lnum, behavior) "inserting and deleting the x is necessary "because otherwise the indent is lost normal! gix if a:behavior == 2 || a:behavior == 3 call s:create_marker(a:lnum+1) endif -endfunction "}}} +endfunction + -function! s:cr_on_list_item(lnum, insert_new_marker, not_at_eol) "{{{ +function! s:cr_on_list_item(lnum, insert_new_marker, not_at_eol) if a:insert_new_marker "the ultimate feature of this script: make new marker on <CR> normal! gi @@ -1423,9 +1552,10 @@ function! s:cr_on_list_item(lnum, insert_new_marker, not_at_eol) "{{{ let prev_line = s:get_corresponding_item(s:get_prev_line(a:lnum+1)) call s:indent_multiline(prev_line, a:lnum+1) endif -endfunction "}}} +endfunction -function! vimwiki#lst#kbd_cr(normal, just_mrkr) "{{{ + +function! vimwiki#lst#kbd_cr(normal, just_mrkr) let lnum = line('.') let has_bp = s:line_has_marker(lnum) @@ -1471,10 +1601,11 @@ function! vimwiki#lst#kbd_cr(normal, just_mrkr) "{{{ startinsert endif -endfunction "}}} +endfunction + "creates a list item in the current line or removes it -function! vimwiki#lst#toggle_list_item() "{{{ +function! vimwiki#lst#toggle_list_item() let cur_col_from_eol = col("$") - col("'^") let cur_item = s:get_item(line('.')) @@ -1503,55 +1634,14 @@ function! vimwiki#lst#toggle_list_item() "{{{ else startinsert endif -endfunction "}}} - -"handle keys }}} - -"misc stuff {{{ -function! vimwiki#lst#setup_marker_infos() "{{{ - let s:rx_bullet_chars = '['.join(keys(g:vimwiki_bullet_types), '').']\+' - - let s:multiple_bullet_chars = [] - for i in keys(g:vimwiki_bullet_types) - if g:vimwiki_bullet_types[i] == 1 - call add(s:multiple_bullet_chars, i) - endif - endfor - - let s:number_kinds = [] - let s:number_divisors = "" - for i in g:vimwiki_number_types - call add(s:number_kinds, i[0]) - let s:number_divisors .= vimwiki#u#escape(i[1]) - endfor - - let s:char_to_rx = {'1': '\d\+', 'i': '[ivxlcdm]\+', 'I': '[IVXLCDM]\+', - \ 'a': '\l\{1,2}', 'A': '\u\{1,2}'} +endfunction - "create regexp for bulleted list items - let g:vimwiki_rxListBullet = join( map(keys(g:vimwiki_bullet_types), - \'vimwiki#u#escape(v:val).repeat("\\+", g:vimwiki_bullet_types[v:val])' - \ ) , '\|') - "create regex for numbered list items - if !empty(g:vimwiki_number_types) - let g:vimwiki_rxListNumber = '\C\%(' - for type in g:vimwiki_number_types[:-2] - let g:vimwiki_rxListNumber .= s:char_to_rx[type[0]] . - \ vimwiki#u#escape(type[1]) . '\|' - endfor - let g:vimwiki_rxListNumber .= s:char_to_rx[g:vimwiki_number_types[-1][0]]. - \ vimwiki#u#escape(g:vimwiki_number_types[-1][1]) . '\)' - else - "regex that matches nothing - let g:vimwiki_rxListNumber = '$^' - endif +" --------------------------------------------------------- +" misc stuff +" --------------------------------------------------------- - "the user can set the listsyms as string, but vimwiki needs a list - let g:vimwiki_listsyms_list = split(g:vimwiki_listsyms, '\zs') -endfunction "}}} - -function! vimwiki#lst#TO_list_item(inner, visual) "{{{ +function! vimwiki#lst#TO_list_item(inner, visual) let lnum = prevnonblank('.') let item = s:get_corresponding_item(lnum) if item.type == 0 @@ -1567,9 +1657,10 @@ function! vimwiki#lst#TO_list_item(inner, visual) "{{{ call cursor(to_line, 0) normal! o call cursor(from_line, 0) -endfunction "}}} +endfunction + -fun! vimwiki#lst#fold_level(lnum) "{{{ +function! vimwiki#lst#fold_level(lnum) let cur_item = s:get_item(a:lnum) if cur_item.type != 0 let parent_item = s:get_parent(cur_item) @@ -1582,6 +1673,5 @@ fun! vimwiki#lst#fold_level(lnum) "{{{ endif endif return '=' -endf "}}} +endfunction -"misc stuff }}} diff --git a/autoload/vimwiki/markdown_base.vim b/autoload/vimwiki/markdown_base.vim @@ -1,63 +1,44 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file -" Desc: Link functions for markdown syntax +" Description: Link functions for markdown syntax " Home: https://github.com/vimwiki/vimwiki/ -" MISC helper functions {{{ +function! s:safesubstitute(text, search, replace, mode) + " Substitute regexp but do not interpret replace + let escaped = escape(a:replace, '\&') + return substitute(a:text, a:search, escaped, a:mode) +endfunction -" vimwiki#markdown_base#reset_mkd_refs -function! vimwiki#markdown_base#reset_mkd_refs() "{{{ - call VimwikiClear('markdown_refs') -endfunction "}}} -" vimwiki#markdown_base#scan_reflinks -function! vimwiki#markdown_base#scan_reflinks() " {{{ +function! vimwiki#markdown_base#scan_reflinks() let mkd_refs = {} " construct list of references using vimgrep try " Why noautocmd? Because https://github.com/vimwiki/vimwiki/issues/121 - noautocmd execute 'vimgrep #'.g:vimwiki_rxMkdRef.'#j %' + noautocmd execute 'vimgrep #'.vimwiki#vars#get_syntaxlocal('rxMkdRef').'#j %' catch /^Vim\%((\a\+)\)\=:E480/ " No Match "Ignore it, and move on to the next file endtry - " + for d in getqflist() let matchline = join(getline(d.lnum, min([d.lnum+1, line('$')])), ' ') - let descr = matchstr(matchline, g:vimwiki_rxMkdRefMatchDescr) - let url = matchstr(matchline, g:vimwiki_rxMkdRefMatchUrl) + let descr = matchstr(matchline, vimwiki#vars#get_syntaxlocal('rxMkdRefMatchDescr')) + let url = matchstr(matchline, vimwiki#vars#get_syntaxlocal('rxMkdRefMatchUrl')) if descr != '' && url != '' let mkd_refs[descr] = url endif endfor - call VimwikiSet('markdown_refs', mkd_refs) + call vimwiki#vars#set_bufferlocal('markdown_refs', mkd_refs) return mkd_refs -endfunction "}}} +endfunction -" vimwiki#markdown_base#get_reflinks -function! vimwiki#markdown_base#get_reflinks() " {{{ - let done = 1 - try - let mkd_refs = VimwikiGet('markdown_refs') - catch - " work-around hack - let done = 0 - " ... the following command does not work inside catch block !? - " > let mkd_refs = vimwiki#markdown_base#scan_reflinks() - endtry - if !done - let mkd_refs = vimwiki#markdown_base#scan_reflinks() - endif - return mkd_refs -endfunction "}}} - -" vimwiki#markdown_base#open_reflink " try markdown reference links -function! vimwiki#markdown_base#open_reflink(link) " {{{ +function! vimwiki#markdown_base#open_reflink(link) " echom "vimwiki#markdown_base#open_reflink" let link = a:link - let mkd_refs = vimwiki#markdown_base#get_reflinks() + let mkd_refs = vimwiki#vars#get_bufferlocal('markdown_refs') if has_key(mkd_refs, link) let url = mkd_refs[link] call vimwiki#base#system_open_link(url) @@ -65,70 +46,68 @@ function! vimwiki#markdown_base#open_reflink(link) " {{{ else return 0 endif -endfunction " }}} -" }}} - -" WIKI link following functions {{{ +endfunction -" LINK functions {{{ -" s:normalize_link_syntax_n -function! s:normalize_link_syntax_n() " {{{ +function! s:normalize_link_syntax_n() let lnum = line('.') " try WikiIncl - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWikiIncl) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWikiIncl')) if !empty(lnk) " NO-OP !! return endif " try WikiLink0: replace with WikiLink1 - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWikiLink0) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink0')) if !empty(lnk) let sub = vimwiki#base#normalize_link_helper(lnk, - \ g:vimwiki_rxWikiLinkMatchUrl, g:vimwiki_rxWikiLinkMatchDescr, - \ g:vimwiki_WikiLink1Template2) - call vimwiki#base#replacestr_at_cursor(g:vimwiki_rxWikiLink0, sub) + \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'), + \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'), + \ vimwiki#vars#get_syntaxlocal('WikiLink1Template2')) + call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink0'), sub) return endif - + " try WikiLink1: replace with WikiLink0 - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWikiLink1) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink1')) if !empty(lnk) let sub = vimwiki#base#normalize_link_helper(lnk, - \ g:vimwiki_rxWikiLinkMatchUrl, g:vimwiki_rxWikiLinkMatchDescr, - \ g:vimwiki_WikiLinkTemplate2) - call vimwiki#base#replacestr_at_cursor(g:vimwiki_rxWikiLink1, sub) + \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'), + \ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'), + \ vimwiki#vars#get_global('WikiLinkTemplate2')) + call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink1'), sub) return endif - + " try Weblink - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWeblink) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink')) if !empty(lnk) let sub = vimwiki#base#normalize_link_helper(lnk, - \ g:vimwiki_rxWeblinkMatchUrl, g:vimwiki_rxWeblinkMatchDescr, - \ g:vimwiki_Weblink1Template) - call vimwiki#base#replacestr_at_cursor(g:vimwiki_rxWeblink, sub) + \ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl'), + \ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchDescr'), + \ vimwiki#vars#get_syntaxlocal('Weblink1Template')) + call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink'), sub) return endif " try Word (any characters except separators) " rxWord is less permissive than rxWikiLinkUrl which is used in " normalize_link_syntax_v - let lnk = vimwiki#base#matchstr_at_cursor(g:vimwiki_rxWord) + let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWord')) if !empty(lnk) let sub = vimwiki#base#normalize_link_helper(lnk, - \ g:vimwiki_rxWord, '', - \ g:vimwiki_Weblink1Template) + \ vimwiki#vars#get_global('rxWord'), '', + \ vimwiki#vars#get_syntaxlocal('Weblink1Template')) call vimwiki#base#replacestr_at_cursor('\V'.lnk, sub) return endif -endfunction " }}} +endfunction + -" s:normalize_link_syntax_v -function! s:normalize_link_syntax_v() " {{{ +function! s:normalize_link_syntax_v() let lnum = line('.') let sel_save = &selection let &selection = "old" @@ -139,10 +118,11 @@ function! s:normalize_link_syntax_v() " {{{ try norm! gvy let visual_selection = @" - let link = substitute(g:vimwiki_Weblink1Template, '__LinkUrl__', '\='."'".visual_selection."'", '') - let link = substitute(link, '__LinkDescription__', '\='."'".visual_selection."'", '') + let link = s:safesubstitute(vimwiki#vars#get_syntaxlocal('Weblink1Template'), + \ '__LinkUrl__', visual_selection, '') + let link = s:safesubstitute(link, '__LinkDescription__', visual_selection, '') - call setreg('"', link, 'v') + call setreg('"', substitute(link, '\n', '', ''), visualmode()) " paste result norm! `>""pgvd @@ -152,25 +132,19 @@ function! s:normalize_link_syntax_v() " {{{ let &selection = sel_save endtry -endfunction " }}} +endfunction -" vimwiki#base#normalize_link -function! vimwiki#markdown_base#normalize_link(is_visual_mode) "{{{ + +function! vimwiki#markdown_base#normalize_link(is_visual_mode) if 0 " Syntax-specific links else if !a:is_visual_mode call s:normalize_link_syntax_n() - elseif visualmode() ==# 'v' && line("'<") == line("'>") - " action undefined for 'line-wise' or 'multi-line' visual mode selections + elseif line("'<") == line("'>") + " action undefined for multi-line visual mode selections call s:normalize_link_syntax_v() endif endif -endfunction "}}} - -" }}} - -" ------------------------------------------------------------------------- -" Load syntax-specific Wiki functionality -" ------------------------------------------------------------------------- +endfunction diff --git a/autoload/vimwiki/path.vim b/autoload/vimwiki/path.vim @@ -1,15 +1,15 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file -" Desc: Path manipulation functions +" Description: Path manipulation functions " Home: https://github.com/vimwiki/vimwiki/ -function! vimwiki#path#chomp_slash(str) "{{{ +function! vimwiki#path#chomp_slash(str) return substitute(a:str, '[/\\]\+$', '', '') -endfunction "}}} +endfunction + " Define path-compare function, either case-sensitive or not, depending on OS. -"{{{ " function! vimwiki#path#is_equal(p1, p2) if vimwiki#u#is_windows() function! vimwiki#path#is_equal(p1, p2) return a:p1 ==? a:p2 @@ -18,10 +18,11 @@ else function! vimwiki#path#is_equal(p1, p2) return a:p1 ==# a:p2 endfunction -endif "}}} +endif + " collapse sections like /a/b/../c to /a/c -function! vimwiki#path#normalize(path) "{{{ +function! vimwiki#path#normalize(path) let path = a:path while 1 let result = substitute(path, '/[^/]\+/\.\.', '', '') @@ -31,9 +32,10 @@ function! vimwiki#path#normalize(path) "{{{ let path = result endwhile return result -endfunction "}}} +endfunction + -function! vimwiki#path#path_norm(path) "{{{ +function! vimwiki#path#path_norm(path) " /-slashes if a:path !~# '^scp:' let path = substitute(a:path, '\', '/', 'g') @@ -44,21 +46,24 @@ function! vimwiki#path#path_norm(path) "{{{ else return a:path endif -endfunction "}}} +endfunction + -function! vimwiki#path#is_link_to_dir(link) "{{{ +function! vimwiki#path#is_link_to_dir(link) " Check if link is to a directory. " It should be ended with \ or /. return a:link =~# '\m[/\\]$' -endfunction "}}} +endfunction -function! vimwiki#path#abs_path_of_link(link) "{{{ + +function! vimwiki#path#abs_path_of_link(link) return vimwiki#path#normalize(expand("%:p:h").'/'.a:link) -endfunction "}}} +endfunction + " return longest common path prefix of 2 given paths. " '~/home/usrname/wiki', '~/home/usrname/wiki/shmiki' => '~/home/usrname/wiki' -function! vimwiki#path#path_common_pfx(path1, path2) "{{{ +function! vimwiki#path#path_common_pfx(path1, path2) let p1 = split(a:path1, '[/\\]', 1) let p2 = split(a:path2, '[/\\]', 1) @@ -72,16 +77,17 @@ function! vimwiki#path#path_common_pfx(path1, path2) "{{{ else return join(p1[: idx-1], '/') endif -endfunction "}}} +endfunction + -function! vimwiki#path#wikify_path(path) "{{{ +function! vimwiki#path#wikify_path(path) let result = resolve(fnamemodify(a:path, ':p')) if vimwiki#u#is_windows() let result = substitute(result, '\\', '/', 'g') endif let result = vimwiki#path#chomp_slash(result) return result -endfunction "}}} +endfunction function! vimwiki#path#current_wiki_file() @@ -90,7 +96,7 @@ endfunction " Returns: the relative path from a:dir to a:file -function! vimwiki#path#relpath(dir, file) "{{{ +function! vimwiki#path#relpath(dir, file) let result = [] let dir = split(a:dir, '/') let file = split(a:file, '/') @@ -112,12 +118,13 @@ function! vimwiki#path#relpath(dir, file) "{{{ let result_path .= '/' endif return result_path -endfunction "}}} +endfunction + " If the optional argument provided and nonzero, -" it will ask before creating a directory +" it will ask before creating a directory " Returns: 1 iff directory exists or successfully created -function! vimwiki#path#mkdir(path, ...) "{{{ +function! vimwiki#path#mkdir(path, ...) let path = expand(a:path) if path =~# '^scp:' @@ -133,27 +140,27 @@ function! vimwiki#path#mkdir(path, ...) "{{{ endif let path = vimwiki#path#chomp_slash(path) - if vimwiki#u#is_windows() && !empty(g:vimwiki_w32_dir_enc) - let path = iconv(path, &enc, g:vimwiki_w32_dir_enc) + if vimwiki#u#is_windows() && !empty(vimwiki#vars#get_global('w32_dir_enc')) + let path = iconv(path, &enc, vimwiki#vars#get_global('w32_dir_enc')) endif - if a:0 && a:1 && input("Vimwiki: Make new directory: " - \ .path."\n [y]es/[N]o? ") !~? '^y' + if a:0 && a:1 && input("Vimwiki: Make new directory: ".path."\n [y]es/[N]o? ") !~? '^y' return 0 endif call mkdir(path, "p") return 1 endif -endfunction " }}} +endfunction + -function! vimwiki#path#is_absolute(path) "{{{ +function! vimwiki#path#is_absolute(path) if vimwiki#u#is_windows() return a:path =~? '\m^\a:' else return a:path =~# '\m^/\|\~/' endif -endfunction "}}} +endfunction " Combine a directory and a file into one path, doesn't generate duplicate @@ -173,3 +180,4 @@ else return directory . '/' . file endfunction endif + diff --git a/autoload/vimwiki/style.css b/autoload/vimwiki/style.css @@ -27,6 +27,13 @@ del {text-decoration: line-through; color: #777777;} .tag {background-color: #eeeeee; font-family: monospace; padding: 2px;} /* classes for items of todo lists */ +.rejected { + /* list-style: none; */ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAACXBIWXMAAADFAAAAxQEdzbqoAAAAB3RJTUUH4QgEFhAtuWgv9wAAAPZQTFRFmpqam5iYnJaWnJeXnpSUn5OTopCQpoqKpouLp4iIqIiIrYCAt3V1vW1tv2xsmZmZmpeXnpKS/x4e/x8f/yAg/yIi/yQk/yUl/yYm/ygo/ykp/yws/zAw/zIy/zMz/zQ0/zU1/zY2/zw8/0BA/0ZG/0pK/1FR/1JS/1NT/1RU/1VV/1ZW/1dX/1pa/15e/19f/2Zm/2lp/21t/25u/3R0/3p6/4CA/4GB/4SE/4iI/46O/4+P/52d/6am/6ur/66u/7Oz/7S0/7e3/87O/9fX/9zc/93d/+Dg/+vr/+3t/+/v//Dw//Ly//X1//f3//n5//z8////gzaKowAAAA90Uk5T/Pz8/Pz8/Pz8/Pz8/f39ppQKWQAAAAFiS0dEEnu8bAAAAACuSURBVAhbPY9ZF4FQFEZPSKbIMmWep4gMGTKLkIv6/3/GPbfF97b3w17rA0kQOPgvAeHW6uJ6+5h7HqLdwowgOzejXRXBdx6UdSru216xuOMBHHNU0clTzeSUA6EhF8V8kqroluMiU6HKcuf4phGPr1o2q9kYZWwNq1qfRRmTaXpqsyjj17KkWCxKBUBgXWueHIyiAIg18gsse4KHkLF5IKIY10WQgv7fOy4ST34BRiopZ8WLNrgAAAAASUVORK5CYII=); + background-repeat: no-repeat; + background-position: 0 .2em; + padding-left: 1.5em; +} .done0 { /* list-style: none; */ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAA7SURBVCiR7dMxEgAgCANBI3yVRzF5KxNbW6wsuH7LQ2YKQK1mkswBVERYF5Os3UV3gwd/jF2SkXy66gAZkxS6BniubAAAAABJRU5ErkJggg==); diff --git a/autoload/vimwiki/tags.vim b/autoload/vimwiki/tags.vim @@ -1,9 +1,11 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file let s:TAGS_METADATA_FILE_NAME = '.tags' + + " Tags metadata in-memory format: " metadata := { 'pagename': [entries, ...] } " entry := { 'tagname':..., 'lineno':..., 'link':... } @@ -19,16 +21,17 @@ let s:TAGS_METADATA_FILE_NAME = '.tags' " an optional field, "vimwiki:". In this field, we encode tab-separated values " of missing parameters -- "pagename" and "link". -" vimwiki#tags#update_tags + + " Update tags metadata. " a:full_rebuild == 1: re-scan entire wiki " a:full_rebuild == 0: only re-scan current page " a:all_files == '': only if the file is newer than .tags -function! vimwiki#tags#update_tags(full_rebuild, all_files) "{{{ +function! vimwiki#tags#update_tags(full_rebuild, all_files) let all_files = a:all_files != '' if !a:full_rebuild " Updating for one page (current) - let page_name = VimwikiGet('subdir') . expand('%:t:r') + let page_name = vimwiki#vars#get_bufferlocal('subdir') . expand('%:t:r') " Collect tags in current file let tags = s:scan_tags(getline(1, '$'), page_name) " Load metadata file @@ -40,10 +43,9 @@ function! vimwiki#tags#update_tags(full_rebuild, all_files) "{{{ " Save call s:write_tags_metadata(metadata) else " full rebuild - let files = vimwiki#base#find_files(g:vimwiki_current_idx, 0) - let wiki_base_dir = VimwikiGet('path', g:vimwiki_current_idx) - let tags_file_last_modification = - \ getftime(vimwiki#tags#metadata_file_path()) + let files = vimwiki#base#find_files(vimwiki#vars#get_bufferlocal('wiki_nr'), 0) + let wiki_base_dir = vimwiki#vars#get_wikilocal('path') + let tags_file_last_modification = getftime(vimwiki#tags#metadata_file_path()) let metadata = s:load_tags_metadata() for file in files if all_files || getftime(file) >= tags_file_last_modification @@ -56,20 +58,19 @@ function! vimwiki#tags#update_tags(full_rebuild, all_files) "{{{ endfor call s:write_tags_metadata(metadata) endif -endfunction " }}} +endfunction -" s:scan_tags -" Scans the list of text lines (argument) and produces tags metadata as a -" list of tag entries. -function! s:scan_tags(lines, page_name) "{{{ + +" Scans the list of text lines (argument) and produces tags metadata as a list of tag entries. +function! s:scan_tags(lines, page_name) let entries = [] " Code wireframe to scan for headers -- borrowed from " vimwiki#base#get_anchors(), with minor modifications. - let rxheader = g:vimwiki_{VimwikiGet('syntax')}_header_search - let rxtag = g:vimwiki_{VimwikiGet('syntax')}_tag_search + let rxheader = vimwiki#vars#get_syntaxlocal('header_search') + let rxtag = vimwiki#vars#get_syntaxlocal('tag_search') let anchor_level = ['', '', '', '', '', '', ''] let current_complete_anchor = '' @@ -136,17 +137,18 @@ function! s:scan_tags(lines, page_name) "{{{ endfor " loop over lines return entries -endfunction " }}} +endfunction + -" vimwiki#tags#metadata_file_path " Returns tags metadata file path -function! vimwiki#tags#metadata_file_path() abort "{{{ - return fnamemodify(vimwiki#path#join_path(VimwikiGet('path'), s:TAGS_METADATA_FILE_NAME), ':p') -endfunction " }}} +function! vimwiki#tags#metadata_file_path() abort + return fnamemodify(vimwiki#path#join_path(vimwiki#vars#get_wikilocal('path'), + \ s:TAGS_METADATA_FILE_NAME), ':p') +endfunction + -" s:load_tags_metadata " Loads tags metadata from file, returns a dictionary -function! s:load_tags_metadata() abort "{{{ +function! s:load_tags_metadata() abort let metadata_path = vimwiki#tags#metadata_file_path() if !filereadable(metadata_path) return {} @@ -193,29 +195,29 @@ function! s:load_tags_metadata() abort "{{{ endif endfor return metadata -endfunction " }}} +endfunction + -" s:remove_page_from_tags " Removes all entries for given page from metadata in-place. Returns updated " metadata (just in case). -function! s:remove_page_from_tags(metadata, page_name) "{{{ +function! s:remove_page_from_tags(metadata, page_name) if has_key(a:metadata, a:page_name) call remove(a:metadata, a:page_name) return a:metadata else return a:metadata endif -endfunction " }}} +endfunction + -" s:merge_tags " Merges metadata of one file into a:metadata -function! s:merge_tags(metadata, pagename, file_metadata) "{{{ +function! s:merge_tags(metadata, pagename, file_metadata) let metadata = a:metadata let metadata[a:pagename] = a:file_metadata return metadata -endfunction " }}} +endfunction + -" s:tags_entry_cmp " Compares two actual lines from tags file. Return value is in strcmp style. " See help on sort() -- that's what this function is going to be used for. " See also s:write_tags_metadata below -- that's where we compose these tags @@ -225,7 +227,7 @@ endfunction " }}} " numbers as strings, not integers, and so, for example, tag at line 14 " preceeds the same tag on the same page at line 9. (Because string "14" is " alphabetically 'less than' string "9".) -function! s:tags_entry_cmp(i1, i2) "{{{ +function! s:tags_entry_cmp(i1, i2) let items = [] for orig_item in [a:i1, a:i2] let fields = split(orig_item, "\t") @@ -245,11 +247,11 @@ function! s:tags_entry_cmp(i1, i2) "{{{ else return 0 endif -endfunction " }}} +endfunction + -" s:write_tags_metadata " Saves metadata object into a file. Throws exceptions in case of problems. -function! s:write_tags_metadata(metadata) "{{{ +function! s:write_tags_metadata(metadata) let metadata_path = vimwiki#tags#metadata_file_path() let tags = [] for pagename in keys(a:metadata) @@ -261,7 +263,7 @@ function! s:write_tags_metadata(metadata) "{{{ let entry_data = substitute(entry_data, "\n", '\\n', 'g') call add(tags, \ entry.tagname . "\t" - \ . pagename . VimwikiGet('ext') . "\t" + \ . pagename . vimwiki#vars#get_wikilocal('ext') . "\t" \ . entry.lineno \ . ';"' \ . "\t" . "vimwiki:" . entry_data @@ -271,11 +273,11 @@ function! s:write_tags_metadata(metadata) "{{{ call sort(tags, "s:tags_entry_cmp") call insert(tags, "!_TAG_FILE_SORTED\t1\t") call writefile(tags, metadata_path) -endfunction " }}} +endfunction + -" vimwiki#tags#get_tags " Returns list of unique tags found in the .tags file -function! vimwiki#tags#get_tags() "{{{ +function! vimwiki#tags#get_tags() let metadata = s:load_tags_metadata() let tags = {} for entries in values(metadata) @@ -284,13 +286,13 @@ function! vimwiki#tags#get_tags() "{{{ endfor endfor return keys(tags) -endfunction " }}} +endfunction + -" vimwiki#tags#generate_tags " Similar to vimwiki#base#generate_links. In the current buffer, appends " tags and references to all their instances. If no arguments (tags) are " specified, outputs all tags. -function! vimwiki#tags#generate_tags(...) abort "{{{ +function! vimwiki#tags#generate_tags(...) abort let need_all_tags = (a:0 == 0) let specific_tags = a:000 @@ -309,34 +311,32 @@ function! vimwiki#tags#generate_tags(...) abort "{{{ endfor let lines = [] - let bullet = repeat(' ', vimwiki#lst#get_list_margin()). - \ vimwiki#lst#default_symbol().' ' + let bullet = repeat(' ', vimwiki#lst#get_list_margin()).vimwiki#lst#default_symbol().' ' for tagname in sort(keys(tags_entries)) if need_all_tags || index(specific_tags, tagname) != -1 call extend(lines, [ \ '', - \ substitute(g:vimwiki_rxH2_Template, '__Header__', tagname, ''), + \ substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', tagname, ''), \ '' ]) for taglink in sort(tags_entries[tagname]) - call add(lines, bullet . - \ substitute(g:vimwiki_WikiLinkTemplate1, '__LinkUrl__', taglink, '')) + call add(lines, bullet . substitute(vimwiki#vars#get_global('WikiLinkTemplate1'), + \ '__LinkUrl__', taglink, '')) endfor endif endfor - let links_rx = '\m\%(^\s*$\)\|\%('.g:vimwiki_rxH2.'\)\|\%(^\s*' + let links_rx = '\m\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxH2').'\)\|\%(^\s*' \ .vimwiki#u#escape(vimwiki#lst#default_symbol()).' ' - \ .g:vimwiki_rxWikiLink.'$\)' + \ .vimwiki#vars#get_syntaxlocal('rxWikiLink').'$\)' + + call vimwiki#base#update_listing_in_buffer(lines, 'Generated Tags', links_rx, line('$')+1, 1) +endfunction - call vimwiki#base#update_listing_in_buffer(lines, 'Generated Tags', links_rx, - \ line('$')+1, 1) -endfunction " }}} -" vimwiki#tags#complete_tags -function! vimwiki#tags#complete_tags(ArgLead, CmdLine, CursorPos) abort " {{{ +function! vimwiki#tags#complete_tags(ArgLead, CmdLine, CursorPos) abort " We can safely ignore args if we use -custom=complete option, Vim engine " will do the job of filtering. let taglist = vimwiki#tags#get_tags() return join(taglist, "\n") -endfunction " }}} +endfunction diff --git a/autoload/vimwiki/tbl.vim b/autoload/vimwiki/tbl.vim @@ -1,35 +1,36 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file -" Desc: Tables +" Description: Tables " | Easily | manageable | text | tables | ! | " |--------|------------|-------|--------|---------| " | Have | fun! | Drink | tea | Period. | " " Home: https://github.com/vimwiki/vimwiki/ -" Load only once {{{ + + if exists("g:loaded_vimwiki_tbl_auto") || &cp finish endif let g:loaded_vimwiki_tbl_auto = 1 -"}}} + let s:textwidth = &tw -" Misc functions {{{ -function! s:rxSep() "{{{ - return g:vimwiki_rxTableSep -endfunction "}}} +function! s:rxSep() + return vimwiki#vars#get_syntaxlocal('rxTableSep') +endfunction + -function! s:wide_len(str) "{{{ +function! s:wide_len(str) " vim73 has new function that gives correct string width. if exists("*strdisplaywidth") return strdisplaywidth(a:str) endif " get str display width in vim ver < 7.2 - if !g:vimwiki_CJK_length + if !vimwiki#vars#get_global('CJK_length') let ret = strlen(substitute(a:str, '.', 'x', 'g')) else let savemodified = &modified @@ -42,42 +43,54 @@ function! s:wide_len(str) "{{{ let &modified = savemodified endif return ret -endfunction "}}} +endfunction -function! s:cell_splitter() "{{{ + +function! s:cell_splitter() return '\s*'.s:rxSep().'\s*' -endfunction "}}} +endfunction + -function! s:sep_splitter() "{{{ +function! s:sep_splitter() return '-'.s:rxSep().'-' -endfunction "}}} +endfunction + -function! s:is_table(line) "{{{ - return s:is_separator(a:line) || (a:line !~# s:rxSep().s:rxSep() && a:line =~# '^\s*'.s:rxSep().'.\+'.s:rxSep().'\s*$') -endfunction "}}} +function! s:is_table(line) + return s:is_separator(a:line) || + \ (a:line !~# s:rxSep().s:rxSep() && a:line =~# '^\s*'.s:rxSep().'.\+'.s:rxSep().'\s*$') +endfunction -function! s:is_separator(line) "{{{ + +function! s:is_separator(line) return a:line =~# '^\s*'.s:rxSep().'\(:\=--\+:\='.s:rxSep().'\)\+\s*$' -endfunction "}}} +endfunction + -function! s:is_separator_tail(line) "{{{ +function! s:is_separator_tail(line) return a:line =~# '^\{-1}\%(\s*\|-*\)\%('.s:rxSep().'-\+\)\+'.s:rxSep().'\s*$' -endfunction "}}} +endfunction -function! s:is_last_column(lnum, cnum) "{{{ + +function! s:is_last_column(lnum, cnum) + return a:line =~# '^\{-1}\%(\s*\|-*\)\%('.s:rxSep().'-\+\)\+'.s:rxSep().'\s*$' +endfunction + + +function! s:is_last_column(lnum, cnum) let line = strpart(getline(a:lnum), a:cnum - 1) - "echomsg "DEBUG is_last_column> ".(line =~# s:rxSep().'\s*$' && line !~# s:rxSep().'.*'.s:rxSep().'\s*$') return line =~# s:rxSep().'\s*$' && line !~# s:rxSep().'.*'.s:rxSep().'\s*$' - -endfunction "}}} +endfunction + -function! s:is_first_column(lnum, cnum) "{{{ +function! s:is_first_column(lnum, cnum) let line = strpart(getline(a:lnum), 0, a:cnum - 1) - "echomsg "DEBUG is_first_column> ".(line =~# '^\s*'.s:rxSep() && line !~# '^\s*'.s:rxSep().'.*'.s:rxSep()) - return line =~# '^\s*$' || (line =~# '^\s*'.s:rxSep() && line !~# '^\s*'.s:rxSep().'.*'.s:rxSep()) -endfunction "}}} + return line =~# '^\s*$' || + \ (line =~# '^\s*'.s:rxSep() && line !~# '^\s*'.s:rxSep().'.*'.s:rxSep()) +endfunction -function! s:count_separators_up(lnum) "{{{ + +function! s:count_separators_up(lnum) let lnum = a:lnum - 1 while lnum > 1 if !s:is_separator(getline(lnum)) @@ -87,9 +100,10 @@ function! s:count_separators_up(lnum) "{{{ endwhile return (a:lnum-lnum) -endfunction "}}} +endfunction + -function! s:count_separators_down(lnum) "{{{ +function! s:count_separators_down(lnum) let lnum = a:lnum + 1 while lnum < line('$') if !s:is_separator(getline(lnum)) @@ -99,9 +113,10 @@ function! s:count_separators_down(lnum) "{{{ endwhile return (lnum-a:lnum) -endfunction "}}} +endfunction -function! s:create_empty_row(cols) "{{{ + +function! s:create_empty_row(cols) let row = s:rxSep() let cell = " ".s:rxSep() @@ -110,9 +125,10 @@ function! s:create_empty_row(cols) "{{{ endfor return row -endfunction "}}} +endfunction + -function! s:create_row_sep(cols) "{{{ +function! s:create_row_sep(cols) let row = s:rxSep() let cell = "---".s:rxSep() @@ -121,9 +137,10 @@ function! s:create_row_sep(cols) "{{{ endfor return row -endfunction "}}} +endfunction -function! vimwiki#tbl#get_cells(line) "{{{ + +function! vimwiki#tbl#get_cells(line) let result = [] let cell = '' let quote = '' @@ -174,13 +191,15 @@ function! vimwiki#tbl#get_cells(line) "{{{ call add(result, vimwiki#u#trim(cell.quote, '|')) endif return result -endfunction "}}} +endfunction + -function! s:col_count(lnum) "{{{ +function! s:col_count(lnum) return len(vimwiki#tbl#get_cells(getline(a:lnum))) -endfunction "}}} +endfunction + -function! s:get_indent(lnum) "{{{ +function! s:get_indent(lnum) if !s:is_table(getline(a:lnum)) return endif @@ -198,9 +217,10 @@ function! s:get_indent(lnum) "{{{ endwhile return indent -endfunction " }}} +endfunction -function! s:get_rows(lnum) "{{{ + +function! s:get_rows(lnum) if !s:is_table(getline(a:lnum)) return endif @@ -232,14 +252,14 @@ function! s:get_rows(lnum) "{{{ endwhile return upper_rows + lower_rows -endfunction "}}} +endfunction + -function! s:get_cell_aligns(lnum) "{{{ +function! s:get_cell_aligns(lnum) let aligns = {} for [lnum, row] in s:get_rows(a:lnum) - let found_separator = 0 - if s:is_separator(row) - let found_separator = 1 + let found_separator = s:is_separator(row) + if found_separator let cells = vimwiki#tbl#get_cells(row) for idx in range(len(cells)) let cell = cells[idx] @@ -261,9 +281,10 @@ function! s:get_cell_aligns(lnum) "{{{ endfor endif return aligns -endfunction "}}} +endfunction + -function! s:get_cell_max_lens(lnum, ...) "{{{ +function! s:get_cell_max_lens(lnum, ...) let max_lens = {} for [lnum, row] in s:get_rows(a:lnum) if s:is_separator(row) @@ -280,9 +301,10 @@ function! s:get_cell_max_lens(lnum, ...) "{{{ endfor endfor return max_lens -endfunction "}}} +endfunction -function! s:get_aligned_rows(lnum, col1, col2) "{{{ + +function! s:get_aligned_rows(lnum, col1, col2) let rows = s:get_rows(a:lnum) let startlnum = rows[0][0] let cells = [] @@ -301,10 +323,11 @@ function! s:get_aligned_rows(lnum, col1, col2) "{{{ call add(result, [lnum, new_row]) endfor return result -endfunction "}}} +endfunction + " Number of the current column. Starts from 0. -function! s:cur_column() "{{{ +function! s:cur_column() let line = getline('.') if !s:is_table(line) return -1 @@ -321,12 +344,10 @@ function! s:cur_column() "{{{ endif endwhile return col -endfunction "}}} +endfunction -" }}} -" Format functions {{{ -function! s:fmt_cell(cell, max_len, align) "{{{ +function! s:fmt_cell(cell, max_len, align) let cell = ' '.a:cell.' ' let diff = a:max_len - s:wide_len(a:cell) @@ -337,13 +358,14 @@ function! s:fmt_cell(cell, max_len, align) "{{{ let cell .= repeat(' ', diff) elseif a:align == 'right' let cell = repeat(' ',diff).cell - else + else let cell = repeat(' ',diff/2).cell.repeat(' ',diff-diff/2) endif return cell -endfunction "}}} +endfunction -function! s:fmt_row(cells, max_lens, aligns, col1, col2) "{{{ + +function! s:fmt_row(cells, max_lens, aligns, col1, col2) let new_line = s:rxSep() for idx in range(len(a:cells)) if idx == a:col1 @@ -361,9 +383,10 @@ function! s:fmt_row(cells, max_lens, aligns, col1, col2) "{{{ let idx += 1 endwhile return new_line -endfunction "}}} +endfunction + -function! s:fmt_cell_sep(max_len, align) "{{{ +function! s:fmt_cell_sep(max_len, align) let cell = '' if a:max_len == 0 let cell .= '-' @@ -377,9 +400,10 @@ function! s:fmt_cell_sep(max_len, align) "{{{ else return ':'.cell.':' endif -endfunction "}}} +endfunction -function! s:fmt_sep(max_lens, aligns, col1, col2) "{{{ + +function! s:fmt_sep(max_lens, aligns, col1, col2) let new_line = s:rxSep() for idx in range(len(a:max_lens)) if idx == a:col1 @@ -390,11 +414,10 @@ function! s:fmt_sep(max_lens, aligns, col1, col2) "{{{ let new_line .= s:fmt_cell_sep(a:max_lens[idx], a:aligns[idx]).s:rxSep() endfor return new_line -endfunction "}}} -"}}} +endfunction + -" Keyboard functions "{{{ -function! s:kbd_create_new_row(cols, goto_first) "{{{ +function! s:kbd_create_new_row(cols, goto_first) let cmd = "\<ESC>o".s:create_empty_row(a:cols) let cmd .= "\<ESC>:call vimwiki#tbl#format(line('.'))\<CR>" let cmd .= "\<ESC>0" @@ -407,26 +430,29 @@ function! s:kbd_create_new_row(cols, goto_first) "{{{ let cmd .= "a" return cmd -endfunction "}}} +endfunction -function! s:kbd_goto_next_row() "{{{ + +function! s:kbd_goto_next_row() let cmd = "\<ESC>j" let cmd .= ":call search('.\\(".s:rxSep()."\\)', 'c', line('.'))\<CR>" let cmd .= ":call search('\\(".s:rxSep()."\\)\\zs', 'bc', line('.'))\<CR>" let cmd .= "a" return cmd -endfunction "}}} +endfunction + -function! s:kbd_goto_prev_row() "{{{ +function! s:kbd_goto_prev_row() let cmd = "\<ESC>k" let cmd .= ":call search('.\\(".s:rxSep()."\\)', 'c', line('.'))\<CR>" let cmd .= ":call search('\\(".s:rxSep()."\\)\\zs', 'bc', line('.'))\<CR>" let cmd .= "a" return cmd -endfunction "}}} +endfunction + " Used in s:kbd_goto_next_col -function! vimwiki#tbl#goto_next_col() "{{{ +function! vimwiki#tbl#goto_next_col() let curcol = virtcol('.') let lnum = line('.') let newcol = s:get_indent(lnum) @@ -439,9 +465,10 @@ function! vimwiki#tbl#goto_next_col() "{{{ endfor let newcol += 2 " +2 == 1 separator + 1 space |<space call vimwiki#u#cursor(lnum, newcol) -endfunction "}}} +endfunction -function! s:kbd_goto_next_col(jumpdown) "{{{ + +function! s:kbd_goto_next_col(jumpdown) let cmd = "\<ESC>" if a:jumpdown let seps = s:count_separators_down(line('.')) @@ -449,10 +476,11 @@ function! s:kbd_goto_next_col(jumpdown) "{{{ endif let cmd .= ":call vimwiki#tbl#goto_next_col()\<CR>a" return cmd -endfunction "}}} +endfunction + " Used in s:kbd_goto_prev_col -function! vimwiki#tbl#goto_prev_col() "{{{ +function! vimwiki#tbl#goto_prev_col() let curcol = virtcol('.') let lnum = line('.') let newcol = s:get_indent(lnum) @@ -471,9 +499,10 @@ function! vimwiki#tbl#goto_prev_col() "{{{ endfor let newcol += 2 " +2 == 1 separator + 1 space |<space call vimwiki#u#cursor(lnum, newcol) -endfunction "}}} +endfunction -function! s:kbd_goto_prev_col(jumpup) "{{{ + +function! s:kbd_goto_prev_col(jumpup) let cmd = "\<ESC>" if a:jumpup let seps = s:count_separators_up(line('.')) @@ -485,12 +514,10 @@ function! s:kbd_goto_prev_col(jumpup) "{{{ " let cmd .= "a" "echomsg "DEBUG kbd_goto_prev_col> ".cmd return cmd -endfunction "}}} +endfunction -"}}} -" Global functions {{{ -function! vimwiki#tbl#kbd_cr() "{{{ +function! vimwiki#tbl#kbd_cr() let lnum = line('.') if !s:is_table(getline(lnum)) return "" @@ -502,9 +529,10 @@ function! vimwiki#tbl#kbd_cr() "{{{ else return s:kbd_goto_next_row() endif -endfunction "}}} +endfunction + -function! vimwiki#tbl#kbd_tab() "{{{ +function! vimwiki#tbl#kbd_tab() let lnum = line('.') if !s:is_table(getline(lnum)) return "\<Tab>" @@ -518,9 +546,10 @@ function! vimwiki#tbl#kbd_tab() "{{{ return s:kbd_create_new_row(cols, 1) endif return s:kbd_goto_next_col(is_sep || last) -endfunction "}}} +endfunction -function! vimwiki#tbl#kbd_shift_tab() "{{{ + +function! vimwiki#tbl#kbd_shift_tab() let lnum = line('.') if !s:is_table(getline(lnum)) return "\<S-Tab>" @@ -533,9 +562,10 @@ function! vimwiki#tbl#kbd_shift_tab() "{{{ return "" endif return s:kbd_goto_prev_col(is_sep || first) -endfunction "}}} +endfunction + -function! vimwiki#tbl#format(lnum, ...) "{{{ +function! vimwiki#tbl#format(lnum, ...) if !(&filetype ==? 'vimwiki') return endif @@ -563,11 +593,12 @@ function! vimwiki#tbl#format(lnum, ...) "{{{ let row = indentstring.row call setline(lnum, row) endfor - + let &tw = s:textwidth -endfunction "}}} +endfunction -function! vimwiki#tbl#create(...) "{{{ + +function! vimwiki#tbl#create(...) if a:0 > 1 let cols = a:1 let rows = a:2 @@ -598,19 +629,21 @@ function! vimwiki#tbl#create(...) "{{{ for r in range(rows - 1) call add(lines, row) endfor - + call append(line('.'), lines) -endfunction "}}} +endfunction -function! vimwiki#tbl#align_or_cmd(cmd) "{{{ + +function! vimwiki#tbl#align_or_cmd(cmd) if s:is_table(getline('.')) call vimwiki#tbl#format(line('.')) else exe 'normal! '.a:cmd endif -endfunction "}}} +endfunction + -function! vimwiki#tbl#reset_tw(lnum) "{{{ +function! vimwiki#tbl#reset_tw(lnum) if !(&filetype ==? 'vimwiki') return endif @@ -618,14 +651,14 @@ function! vimwiki#tbl#reset_tw(lnum) "{{{ if !s:is_table(line) return endif - + let s:textwidth = &tw let &tw = 0 -endfunction "}}} +endfunction + -" TODO: move_column_left and move_column_right are good candidates to be -" refactored. -function! vimwiki#tbl#move_column_left() "{{{ +" TODO: move_column_left and move_column_right are good candidates to be refactored. +function! vimwiki#tbl#move_column_left() "echomsg "DEBUG move_column_left: " @@ -641,7 +674,7 @@ function! vimwiki#tbl#move_column_left() "{{{ endif if cur_col > 0 - call vimwiki#tbl#format(line('.'), cur_col-1, cur_col) + call vimwiki#tbl#format(line('.'), cur_col-1, cur_col) call cursor(line('.'), 1) let sep = '\('.s:rxSep().'\).\zs' @@ -651,16 +684,16 @@ function! vimwiki#tbl#move_column_left() "{{{ let mpos = match(line, sep, mpos+1) if mpos != -1 let col += 1 - else + else break endif endwhile endif +endfunction -endfunction "}}} -function! vimwiki#tbl#move_column_right() "{{{ +function! vimwiki#tbl#move_column_right() let line = getline('.') @@ -674,7 +707,7 @@ function! vimwiki#tbl#move_column_right() "{{{ endif if cur_col < s:col_count(line('.'))-1 - call vimwiki#tbl#format(line('.'), cur_col, cur_col+1) + call vimwiki#tbl#format(line('.'), cur_col, cur_col+1) call cursor(line('.'), 1) let sep = '\('.s:rxSep().'\).\zs' @@ -684,33 +717,35 @@ function! vimwiki#tbl#move_column_right() "{{{ let mpos = match(line, sep, mpos+1) if mpos != -1 let col += 1 - else + else break endif endwhile - endif +endfunction -endfunction "}}} -function! vimwiki#tbl#get_rows(lnum) "{{{ +function! vimwiki#tbl#get_rows(lnum) return s:get_rows(a:lnum) -endfunction "}}} +endfunction + -function! vimwiki#tbl#is_table(line) "{{{ +function! vimwiki#tbl#is_table(line) return s:is_table(a:line) -endfunction "}}} +endfunction -function! vimwiki#tbl#is_separator(line) "{{{ + +function! vimwiki#tbl#is_separator(line) return s:is_separator(a:line) -endfunction "}}} +endfunction + -function! vimwiki#tbl#cell_splitter() "{{{ +function! vimwiki#tbl#cell_splitter() return s:cell_splitter() -endfunction "}}} +endfunction + -function! vimwiki#tbl#sep_splitter() "{{{ +function! vimwiki#tbl#sep_splitter() return s:sep_splitter() -endfunction "}}} +endfunction -"}}} diff --git a/autoload/vimwiki/u.vim b/autoload/vimwiki/u.vim @@ -1,9 +1,9 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki autoload plugin file -" Desc: Utility functions +" Description: Utility functions " Home: https://github.com/vimwiki/vimwiki/ -function! vimwiki#u#trim(string, ...) "{{{ +function! vimwiki#u#trim(string, ...) let chars = '' if a:0 > 0 let chars = a:1 @@ -11,17 +11,20 @@ function! vimwiki#u#trim(string, ...) "{{{ let res = substitute(a:string, '^[[:space:]'.chars.']\+', '', '') let res = substitute(res, '[[:space:]'.chars.']\+$', '', '') return res -endfunction "}}} +endfunction + " Builtin cursor doesn't work right with unicode characters. -function! vimwiki#u#cursor(lnum, cnum) "{{{ +function! vimwiki#u#cursor(lnum, cnum) exe a:lnum exe 'normal! 0'.a:cnum.'|' -endfunction "}}} +endfunction + -function! vimwiki#u#is_windows() "{{{ +function! vimwiki#u#is_windows() return has("win32") || has("win64") || has("win95") || has("win16") -endfunction "}}} +endfunction + function! vimwiki#u#is_macos() if has("mac") || has("macunix") || has("gui_mac") @@ -32,32 +35,32 @@ function! vimwiki#u#is_macos() return os == 'Darwin' || os == 'Mac' endfunction -function! vimwiki#u#count_first_sym(line) "{{{ + +function! vimwiki#u#count_first_sym(line) let first_sym = matchstr(a:line, '\S') return len(matchstr(a:line, first_sym.'\+')) -endfunction "}}} +endfunction -function! vimwiki#u#escape(string) "{{{ + +function! vimwiki#u#escape(string) return escape(a:string, '~.*[]\^$') -endfunction "}}} +endfunction + " Load concrete Wiki syntax: sets regexes and templates for headers and links -function vimwiki#u#reload_regexes() "{{{ - execute 'runtime! syntax/vimwiki_'.VimwikiGet('syntax').'.vim' -endfunction "}}} +function vimwiki#u#reload_regexes() + execute 'runtime! syntax/vimwiki_'.vimwiki#vars#get_wikilocal('syntax').'.vim' +endfunction -" Load omnipresent Wiki syntax -function vimwiki#u#reload_omni_regexes() "{{{ - execute 'runtime! syntax/omnipresent_syntax.vim' -endfunction "}}} " Load syntax-specific functionality -function vimwiki#u#reload_regexes_custom() "{{{ - execute 'runtime! syntax/vimwiki_'.VimwikiGet('syntax').'_custom.vim' -endfunction "}}} +function vimwiki#u#reload_regexes_custom() + execute 'runtime! syntax/vimwiki_'.vimwiki#vars#get_wikilocal('syntax').'_custom.vim' +endfunction + " Backward compatible version of the built-in function shiftwidth() -if exists('*shiftwidth') "{{{ +if exists('*shiftwidth') func vimwiki#u#sw() return shiftwidth() endfunc @@ -65,4 +68,5 @@ else func vimwiki#u#sw() return &sw endfunc -endif "}}} +endif + diff --git a/autoload/vimwiki/vars.vim b/autoload/vimwiki/vars.vim @@ -0,0 +1,711 @@ +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 +" Vimwiki autoload plugin file +" Home: https://github.com/vimwiki/vimwiki/ + + + +" ------------------------------------------------------------------------------------------------ +" This file provides functions to manage the various state variables which are needed during a +" Vimwiki session. +" They consist of: +" +" - global variables. These are stored in the dict g:vimwiki_global_vars. They consist mainly of +" 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 +" dictionaries. One dict for every registered wiki. The last dictionary contains default values +" (used for temporary wikis). +" +" - syntax variables. Stored in the dict g:vimwiki_syntax_variables which holds all the regexes and +" other stuff which is needed for highlighting. +" +" - buffer-local variables. They are stored as buffer variables directly (b:foo) + +" As a developer, you should, if possible, only use the get_ and set_ functions for these types of +" variables, not the underlying dicts! +" ------------------------------------------------------------------------------------------------ + + +function! s:populate_global_variables() + + 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 + " g:vimwiki_global_vars (or set a default value) + for key in keys(g:vimwiki_global_vars) + if exists('g:vimwiki_'.key) + let g:vimwiki_global_vars[key] = g:vimwiki_{key} + endif + endfor + + " non-configurable global variables: + + " 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 + let g:vimwiki_global_vars.schemes = join(['wiki\d\+', 'diary', 'local'], '\|') + let g:vimwiki_global_vars.web_schemes1 = join(['http', 'https', 'file', 'ftp', 'gopher', + \ 'telnet', 'nntp', 'ldap', 'rsync', 'imap', 'pop', 'irc', 'ircs', 'cvs', 'svn', 'svn+ssh', + \ 'git', 'ssh', 'fish', 'sftp'], '\|') + let web_schemes2 = + \ join(['mailto', 'news', 'xmpp', 'sip', 'sips', 'doi', 'urn', 'tel', 'data'], '\|') + + let g:vimwiki_global_vars.rxSchemes = '\%('. + \ g:vimwiki_global_vars.schemes . '\|'. + \ g:vimwiki_global_vars.web_schemes1 . '\|'. + \ web_schemes2 . + \ '\)' + + " match URL for common protocols; see http://en.wikipedia.org/wiki/URI_scheme + " http://tools.ietf.org/html/rfc3986 + let rxWebProtocols = + \ '\%('. + \ '\%('. + \ '\%('.g:vimwiki_global_vars.web_schemes1 . '\):'. + \ '\%(//\)'. + \ '\)'. + \ '\|'. + \ '\%('.web_schemes2.'\):'. + \ '\)' + + let g:vimwiki_global_vars.rxWeblinkUrl = rxWebProtocols . '\S\{-1,}'. '\%(([^ \t()]*)\)\=' + + let wikilink_prefix = '[[' + let wikilink_suffix = ']]' + let wikilink_separator = '|' + let g:vimwiki_global_vars.rx_wikilink_prefix = vimwiki#u#escape(wikilink_prefix) + let g:vimwiki_global_vars.rx_wikilink_suffix = vimwiki#u#escape(wikilink_suffix) + let g:vimwiki_global_vars.rx_wikilink_separator = vimwiki#u#escape(wikilink_separator) + + " templates for the creation of wiki links + " [[URL]] + let g:vimwiki_global_vars.WikiLinkTemplate1 = wikilink_prefix . '__LinkUrl__'. wikilink_suffix + " [[URL|DESCRIPTION]] + let g:vimwiki_global_vars.WikiLinkTemplate2 = wikilink_prefix . '__LinkUrl__'. wikilink_separator + \ . '__LinkDescription__' . wikilink_suffix + + let valid_chars = '[^\\\]]' + let g:vimwiki_global_vars.rxWikiLinkUrl = valid_chars.'\{-}' + let g:vimwiki_global_vars.rxWikiLinkDescr = valid_chars.'\{-}' + + " this regexp defines what can form a link when the user presses <CR> in the + " buffer (and not on a link) to create a link + " basically, it's Ascii alphanumeric characters plus #|./@-_~ plus all + " non-Ascii characters + let g:vimwiki_global_vars.rxWord = '[^[:blank:]!"$%&''()*+,:;<=>?\[\]\\^`{}]\+' + + let g:vimwiki_global_vars.rx_wikilink_prefix1 = g:vimwiki_global_vars.rx_wikilink_prefix . + \ g:vimwiki_global_vars.rxWikiLinkUrl . g:vimwiki_global_vars.rx_wikilink_separator + let g:vimwiki_global_vars.rx_wikilink_suffix1 = g:vimwiki_global_vars.rx_wikilink_suffix + + let g:vimwiki_global_vars.rxWikiInclPrefix = '{{' + let g:vimwiki_global_vars.rxWikiInclSuffix = '}}' + let g:vimwiki_global_vars.rxWikiInclSeparator = '|' + " '{{__LinkUrl__}}' + let g:vimwiki_global_vars.WikiInclTemplate1 = g:vimwiki_global_vars.rxWikiInclPrefix + \ .'__LinkUrl__'. g:vimwiki_global_vars.rxWikiInclSuffix + " '{{__LinkUrl____LinkDescription__}}' + let g:vimwiki_global_vars.WikiInclTemplate2 = g:vimwiki_global_vars.rxWikiInclPrefix + \ . '__LinkUrl__' . g:vimwiki_global_vars.rxWikiInclSeparator . '__LinkDescription__' + \ . g:vimwiki_global_vars.rxWikiInclSuffix + + let valid_chars = '[^\\\}]' + let g:vimwiki_global_vars.rxWikiInclUrl = valid_chars.'\{-}' + let g:vimwiki_global_vars.rxWikiInclArg = valid_chars.'\{-}' + let g:vimwiki_global_vars.rxWikiInclArgs = '\%('. g:vimwiki_global_vars.rxWikiInclSeparator. + \ g:vimwiki_global_vars.rxWikiInclArg. '\)'.'\{-}' + + " *. {{URL}[{...}]} - i.e. {{URL}}, {{URL|ARG1}}, {{URL|ARG1|ARG2}}, etc. + " *a) match {{URL}[{...}]} + let g:vimwiki_global_vars.rxWikiIncl = g:vimwiki_global_vars.rxWikiInclPrefix. + \ g:vimwiki_global_vars.rxWikiInclUrl. + \ g:vimwiki_global_vars.rxWikiInclArgs. g:vimwiki_global_vars.rxWikiInclSuffix + " *b) match URL within {{URL}[{...}]} + let g:vimwiki_global_vars.rxWikiInclMatchUrl = g:vimwiki_global_vars.rxWikiInclPrefix. + \ '\zs'. g:vimwiki_global_vars.rxWikiInclUrl . '\ze'. + \ g:vimwiki_global_vars.rxWikiInclArgs . g:vimwiki_global_vars.rxWikiInclSuffix + + let g:vimwiki_global_vars.rxWikiInclPrefix1 = g:vimwiki_global_vars.rxWikiInclPrefix. + \ g:vimwiki_global_vars.rxWikiInclUrl . g:vimwiki_global_vars.rxWikiInclSeparator + let g:vimwiki_global_vars.rxWikiInclSuffix1 = g:vimwiki_global_vars.rxWikiInclArgs. + \ g:vimwiki_global_vars.rxWikiInclSuffix + + let g:vimwiki_global_vars.rxTodo = '\C\<\%(TODO\|DONE\|STARTED\|FIXME\|FIXED\|XXX\)\>' + + " default colors when headers of different levels are highlighted differently + " not making it yet another option; needed by ColorScheme autocommand + let g:vimwiki_global_vars.hcolor_guifg_light = ['#aa5858', '#507030', '#1030a0', '#103040' + \ , '#505050', '#636363'] + let g:vimwiki_global_vars.hcolor_ctermfg_light = ['DarkRed', 'DarkGreen', 'DarkBlue', 'Black' + \ , 'Black', 'Black'] + let g:vimwiki_global_vars.hcolor_guifg_dark = ['#e08090', '#80e090', '#6090e0', '#c0c0f0' + \ , '#e0e0f0', '#f0f0f0'] + let g:vimwiki_global_vars.hcolor_ctermfg_dark = ['Red', 'Green', 'Blue', 'White', 'White' + \ , 'White'] +endfunction + + +function! s:populate_wikilocal_options() + let default_values = { + \ 'auto_export': 0, + \ 'auto_tags': 0, + \ 'auto_toc': 0, + \ 'automatic_nested_syntaxes': 1, + \ 'css_name': 'style.css', + \ 'custom_wiki2html': '', + \ 'custom_wiki2html_args': '', + \ 'diary_header': 'Diary', + \ 'diary_index': 'diary', + \ 'diary_rel_path': 'diary/', + \ 'diary_sort': 'desc', + \ 'ext': '.wiki', + \ 'index': 'index', + \ 'list_margin': -1, + \ 'maxhi': 0, + \ 'nested_syntaxes': {}, + \ 'path': '~/vimwiki/', + \ 'path_html': '', + \ 'syntax': 'default', + \ 'template_default': 'default', + \ 'template_ext': '.tpl', + \ 'template_path': '~/vimwiki/templates/', + \ } + + let g:vimwiki_wikilocal_vars = [] + + let default_wiki_settings = {} + for key in keys(default_values) + if exists('g:vimwiki_'.key) + let default_wiki_settings[key] = g:vimwiki_{key} + else + let default_wiki_settings[key] = default_values[key] + endif + endfor + + " set the wiki-local variables according to g:vimwiki_list (or the default settings) + if exists('g:vimwiki_list') + for users_wiki_settings in g:vimwiki_list + let new_wiki_settings = {} + for key in keys(default_values) + if has_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 + let new_wiki_settings[key] = default_values[key] + endif + endfor + + let new_wiki_settings.is_temporary_wiki = 0 + + call add(g:vimwiki_wikilocal_vars, new_wiki_settings) + endfor + else + " if the user hasn't registered any wiki, we register one wiki using the default values + let new_wiki_settings = deepcopy(default_wiki_settings) + let new_wiki_settings.is_temporary_wiki = 0 + call add(g:vimwiki_wikilocal_vars, new_wiki_settings) + endif + + " default values for temporary wikis + let temporary_wiki_settings = deepcopy(default_wiki_settings) + let temporary_wiki_settings.is_temporary_wiki = 1 + call add(g:vimwiki_wikilocal_vars, temporary_wiki_settings) + + call s:validate_settings() +endfunction + + +function! s:validate_settings() + for wiki_settings in g:vimwiki_wikilocal_vars + let wiki_settings['path'] = s:normalize_path(wiki_settings['path']) + + let path_html = wiki_settings['path_html'] + if !empty(path_html) + let wiki_settings['path_html'] = s:normalize_path(path_html) + else + let wiki_settings['path_html'] = s:normalize_path( + \ substitute(wiki_settings['path'], '[/\\]\+$', '', '').'_html/') + endif + + let wiki_settings['template_path'] = s:normalize_path(wiki_settings['template_path']) + let wiki_settings['diary_rel_path'] = s:normalize_path(wiki_settings['diary_rel_path']) + endfor +endfunction + + +function! s:normalize_path(path) + " trim trailing / and \ because otherwise resolve() doesn't work quite right + let path = substitute(a:path, '[/\\]\+$', '', '') + if path !~# '^scp:' + return resolve(expand(path)).'/' + else + return path.'/' + endif +endfunction + + +function! vimwiki#vars#populate_syntax_vars(syntax) + if !exists('g:vimwiki_syntax_variables') + let g:vimwiki_syntax_variables = {} + endif + + if has_key(g:vimwiki_syntax_variables, a:syntax) + return + endif + + let g:vimwiki_syntax_variables[a:syntax] = {} + + execute 'runtime! syntax/vimwiki_'.a:syntax.'.vim' + + " generic stuff + let header_symbol = g:vimwiki_syntax_variables[a:syntax].rxH + if g:vimwiki_syntax_variables[a:syntax].symH + " symmetric headers + for i in range(1,6) + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i.'_Template'] = + \ repeat(header_symbol, i).' __Header__ '.repeat(header_symbol, i) + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i] = + \ '^\s*'.header_symbol.'\{'.i.'}[^'.header_symbol.'].*[^'.header_symbol.']' + \ .header_symbol.'\{'.i.'}\s*$' + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i.'_Start'] = + \ '^\s*'.header_symbol.'\{'.i.'}[^'.header_symbol.'].*[^'.header_symbol.']' + \ .header_symbol.'\{'.i.'}\s*$' + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i.'_End'] = + \ '^\s*'.header_symbol.'\{1,'.i.'}[^'.header_symbol.'].*[^'.header_symbol.']' + \ .header_symbol.'\{1,'.i.'}\s*$' + endfor + let g:vimwiki_syntax_variables[a:syntax].rxHeader = + \ '^\s*\('.header_symbol.'\{1,6}\)\zs[^'.header_symbol.'].*[^'.header_symbol.']\ze\1\s*$' + else + " asymmetric + for i in range(1,6) + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i.'_Template'] = + \ repeat(header_symbol, i).' __Header__' + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i] = + \ '^\s*'.header_symbol.'\{'.i.'}[^'.header_symbol.'].*$' + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i.'_Start'] = + \ '^\s*'.header_symbol.'\{'.i.'}[^'.header_symbol.'].*$' + let g:vimwiki_syntax_variables[a:syntax]['rxH'.i.'_End'] = + \ '^\s*'.header_symbol.'\{1,'.i.'}[^'.header_symbol.'].*$' + endfor + let g:vimwiki_syntax_variables[a:syntax].rxHeader = + \ '^\s*\('.header_symbol.'\{1,6}\)\zs[^'.header_symbol.'].*\ze$' + endif + + let g:vimwiki_syntax_variables[a:syntax].rxPreStart = + \ '^\s*'.g:vimwiki_syntax_variables[a:syntax].rxPreStart + let g:vimwiki_syntax_variables[a:syntax].rxPreEnd = + \ '^\s*'.g:vimwiki_syntax_variables[a:syntax].rxPreEnd.'\s*$' + + let g:vimwiki_syntax_variables[a:syntax].rxMathStart = + \ '^\s*'.g:vimwiki_syntax_variables[a:syntax].rxMathStart + let g:vimwiki_syntax_variables[a:syntax].rxMathEnd = + \ '^\s*'.g:vimwiki_syntax_variables[a:syntax].rxMathEnd.'\s*$' + + " list stuff + let g:vimwiki_syntax_variables[a:syntax].rx_bullet_chars = + \ '['.join(g:vimwiki_syntax_variables[a:syntax].bullet_types, '').']\+' + + let g:vimwiki_syntax_variables[a:syntax].multiple_bullet_chars = + \ g:vimwiki_syntax_variables[a:syntax].recurring_bullets + \ ? g:vimwiki_syntax_variables[a:syntax].bullet_types : [] + + let g:vimwiki_syntax_variables[a:syntax].number_kinds = [] + let g:vimwiki_syntax_variables[a:syntax].number_divisors = '' + for i in g:vimwiki_syntax_variables[a:syntax].number_types + call add(g:vimwiki_syntax_variables[a:syntax].number_kinds, i[0]) + let g:vimwiki_syntax_variables[a:syntax].number_divisors .= vimwiki#u#escape(i[1]) + endfor + + let char_to_rx = {'1': '\d\+', 'i': '[ivxlcdm]\+', 'I': '[IVXLCDM]\+', + \ 'a': '\l\{1,2}', 'A': '\u\{1,2}'} + + "create regexp for bulleted list items + if !empty(g:vimwiki_syntax_variables[a:syntax].bullet_types) + let g:vimwiki_syntax_variables[a:syntax].rxListBullet = + \ join( map(g:vimwiki_syntax_variables[a:syntax].bullet_types, + \'vimwiki#u#escape(v:val).' + \ .'repeat("\\+", g:vimwiki_syntax_variables[a:syntax].recurring_bullets)' + \ ) , '\|') + else + "regex that matches nothing + let g:vimwiki_syntax_variables[a:syntax].rxListBullet = '$^' + endif + + "create regex for numbered list items + if !empty(g:vimwiki_syntax_variables[a:syntax].number_types) + let g:vimwiki_syntax_variables[a:syntax].rxListNumber = '\C\%(' + for type in g:vimwiki_syntax_variables[a:syntax].number_types[:-2] + let g:vimwiki_syntax_variables[a:syntax].rxListNumber .= char_to_rx[type[0]] . + \ vimwiki#u#escape(type[1]) . '\|' + endfor + let g:vimwiki_syntax_variables[a:syntax].rxListNumber .= + \ char_to_rx[g:vimwiki_syntax_variables[a:syntax].number_types[-1][0]]. + \ vimwiki#u#escape(g:vimwiki_syntax_variables[a:syntax].number_types[-1][1]) . '\)' + else + "regex that matches nothing + let g:vimwiki_syntax_variables[a:syntax].rxListNumber = '$^' + endif + + "the user can set the listsyms as string, but vimwiki needs a list + let g:vimwiki_syntax_variables[a:syntax].listsyms_list = + \ split(vimwiki#vars#get_global('listsyms'), '\zs') + if match(vimwiki#vars#get_global('listsyms'), vimwiki#vars#get_global('listsym_rejected')) != -1 + echomsg 'Vimwiki Warning: the value of g:vimwiki_listsym_rejected (''' + \ . vimwiki#vars#get_global('listsym_rejected') + \ . ''') must not be a part of g:vimwiki_listsyms (''' . + \ . vimwiki#vars#get_global('listsyms') . ''')' + endif + let g:vimwiki_syntax_variables[a:syntax].rxListItemWithoutCB = + \ '^\s*\%(\('.g:vimwiki_syntax_variables[a:syntax].rxListBullet.'\)\|\(' + \ .g:vimwiki_syntax_variables[a:syntax].rxListNumber.'\)\)\s' + let g:vimwiki_syntax_variables[a:syntax].rxListItem = + \ g:vimwiki_syntax_variables[a:syntax].rxListItemWithoutCB + \ . '\+\%(\[\(['.vimwiki#vars#get_global('listsyms') + \ . vimwiki#vars#get_global('listsym_rejected').']\)\]\s\)\?' + if g:vimwiki_syntax_variables[a:syntax].recurring_bullets + let g:vimwiki_syntax_variables[a:syntax].rxListItemAndChildren = + \ '^\('.g:vimwiki_syntax_variables[a:syntax].rxListBullet.'\)\s\+\[[' + \ . g:vimwiki_syntax_variables[a:syntax].listsyms_list[-1] + \ . vimwiki#vars#get_global('listsym_rejected') . ']\]\s.*\%(\n\%(\1\%(' + \ .g:vimwiki_syntax_variables[a:syntax].rxListBullet.'\).*\|^$\|\s.*\)\)*' + else + let g:vimwiki_syntax_variables[a:syntax].rxListItemAndChildren = + \ '^\(\s*\)\%('.g:vimwiki_syntax_variables[a:syntax].rxListBullet.'\|' + \ . g:vimwiki_syntax_variables[a:syntax].rxListNumber.'\)\s\+\[[' + \ . g:vimwiki_syntax_variables[a:syntax].listsyms_list[-1] + \ . vimwiki#vars#get_global('listsym_rejected') . ']\]\s.*\%(\n\%(\1\s.*\|^$\)\)*' + endif + + " 0. URL : free-standing links: keep URL UR(L) strip trailing punct: URL; URL) UR(L)) + " let g:vimwiki_rxWeblink = '[\["(|]\@<!'. g:vimwiki_rxWeblinkUrl . + " \ '\%([),:;.!?]\=\%([ \t]\|$\)\)\@=' + let g:vimwiki_syntax_variables[a:syntax].rxWeblink = + \ '\<'. g:vimwiki_global_vars.rxWeblinkUrl . '\S*' + " 0a) match URL within URL + let g:vimwiki_syntax_variables[a:syntax].rxWeblinkMatchUrl = + \ g:vimwiki_syntax_variables[a:syntax].rxWeblink + " 0b) match DESCRIPTION within URL + let g:vimwiki_syntax_variables[a:syntax].rxWeblinkMatchDescr = '' + + " template for matching all wiki links with a given target file + let g:vimwiki_syntax_variables[a:syntax].WikiLinkMatchUrlTemplate = + \ g:vimwiki_global_vars.rx_wikilink_prefix . + \ '\zs__LinkUrl__\ze\%(#.*\)\?' . + \ g:vimwiki_global_vars.rx_wikilink_suffix . + \ '\|' . + \ g:vimwiki_global_vars.rx_wikilink_prefix . + \ '\zs__LinkUrl__\ze\%(#.*\)\?' . + \ g:vimwiki_global_vars.rx_wikilink_separator . + \ '.*' . + \ g:vimwiki_global_vars.rx_wikilink_suffix + + " a) match [[URL|DESCRIPTION]] + let g:vimwiki_syntax_variables[a:syntax].rxWikiLink = g:vimwiki_global_vars.rx_wikilink_prefix. + \ g:vimwiki_global_vars.rxWikiLinkUrl.'\%('.g:vimwiki_global_vars.rx_wikilink_separator. + \ g:vimwiki_global_vars.rxWikiLinkDescr.'\)\?'.g:vimwiki_global_vars.rx_wikilink_suffix + let g:vimwiki_syntax_variables[a:syntax].rxAnyLink = + \ g:vimwiki_syntax_variables[a:syntax].rxWikiLink.'\|'. + \ g:vimwiki_global_vars.rxWikiIncl.'\|'.g:vimwiki_syntax_variables[a:syntax].rxWeblink + " b) match URL within [[URL|DESCRIPTION]] + let g:vimwiki_syntax_variables[a:syntax].rxWikiLinkMatchUrl = + \ g:vimwiki_global_vars.rx_wikilink_prefix . '\zs'. g:vimwiki_global_vars.rxWikiLinkUrl + \ .'\ze\%('. g:vimwiki_global_vars.rx_wikilink_separator + \ . g:vimwiki_global_vars.rxWikiLinkDescr.'\)\?'.g:vimwiki_global_vars.rx_wikilink_suffix + " c) match DESCRIPTION within [[URL|DESCRIPTION]] + let g:vimwiki_syntax_variables[a:syntax].rxWikiLinkMatchDescr = + \ g:vimwiki_global_vars.rx_wikilink_prefix . g:vimwiki_global_vars.rxWikiLinkUrl + \ . g:vimwiki_global_vars.rx_wikilink_separator.'\%(\zs' + \ . g:vimwiki_global_vars.rxWikiLinkDescr. '\ze\)\?' + \ . g:vimwiki_global_vars.rx_wikilink_suffix + + if a:syntax ==# 'markdown' + call s:populate_extra_markdown_vars() + endif +endfunction + + +function! s:populate_extra_markdown_vars() + let mkd_syntax = g:vimwiki_syntax_variables['markdown'] + + " 0a) match [[URL|DESCRIPTION]] + let mkd_syntax.rxWikiLink0 = mkd_syntax.rxWikiLink + " 0b) match URL within [[URL|DESCRIPTION]] + let mkd_syntax.rxWikiLink0MatchUrl = mkd_syntax.rxWikiLinkMatchUrl + " 0c) match DESCRIPTION within [[URL|DESCRIPTION]] + let mkd_syntax.rxWikiLink0MatchDescr = mkd_syntax.rxWikiLinkMatchDescr + + let wikilink_md_prefix = '[' + let wikilink_md_suffix = ']' + let wikilink_md_separator = '][' + let rx_wikilink_md_separator = vimwiki#u#escape(wikilink_md_separator) + let mkd_syntax.rx_wikilink_md_prefix = vimwiki#u#escape(wikilink_md_prefix) + let mkd_syntax.rx_wikilink_md_suffix = vimwiki#u#escape(wikilink_md_suffix) + + " [URL][] + let mkd_syntax.WikiLink1Template1 = wikilink_md_prefix . '__LinkUrl__'. + \ wikilink_md_separator. wikilink_md_suffix + " [DESCRIPTION][URL] + let mkd_syntax.WikiLink1Template2 = wikilink_md_prefix. '__LinkDescription__'. + \ wikilink_md_separator. '__LinkUrl__'. wikilink_md_suffix + let mkd_syntax.WikiLinkMatchUrlTemplate .= + \ '\|' . + \ mkd_syntax.rx_wikilink_md_prefix . + \ '.*' . + \ rx_wikilink_md_separator . + \ '\zs__LinkUrl__\ze\%(#.*\)\?' . + \ mkd_syntax.rx_wikilink_md_suffix . + \ '\|' . + \ mkd_syntax.rx_wikilink_md_prefix . + \ '\zs__LinkUrl__\ze\%(#.*\)\?' . + \ rx_wikilink_md_separator . + \ mkd_syntax.rx_wikilink_md_suffix + + let valid_chars = '[^\\\[\]]' + let mkd_syntax.rxWikiLink1Url = valid_chars.'\{-}' + let mkd_syntax.rxWikiLink1Descr = valid_chars.'\{-}' + let mkd_syntax.rxWikiLink1InvalidPrefix = '[\]\[]\@<!' + let mkd_syntax.rxWikiLink1InvalidSuffix = '[\]\[]\@!' + let mkd_syntax.rx_wikilink_md_prefix = mkd_syntax.rxWikiLink1InvalidPrefix. + \ mkd_syntax.rx_wikilink_md_prefix + let mkd_syntax.rx_wikilink_md_suffix = mkd_syntax.rx_wikilink_md_suffix. + \ mkd_syntax.rxWikiLink1InvalidSuffix + + " 1. match [URL][], [DESCRIPTION][URL] + let mkd_syntax.rxWikiLink1 = mkd_syntax.rx_wikilink_md_prefix. + \ mkd_syntax.rxWikiLink1Url. rx_wikilink_md_separator. + \ mkd_syntax.rx_wikilink_md_suffix. + \ '\|'. mkd_syntax.rx_wikilink_md_prefix. + \ mkd_syntax.rxWikiLink1Descr . rx_wikilink_md_separator. + \ mkd_syntax.rxWikiLink1Url . mkd_syntax.rx_wikilink_md_suffix + " 2. match URL within [URL][], [DESCRIPTION][URL] + let mkd_syntax.rxWikiLink1MatchUrl = mkd_syntax.rx_wikilink_md_prefix. + \ '\zs'. mkd_syntax.rxWikiLink1Url. '\ze'. rx_wikilink_md_separator. + \ mkd_syntax.rx_wikilink_md_suffix. + \ '\|'. mkd_syntax.rx_wikilink_md_prefix. + \ mkd_syntax.rxWikiLink1Descr. rx_wikilink_md_separator. + \ '\zs'. mkd_syntax.rxWikiLink1Url. '\ze'. mkd_syntax.rx_wikilink_md_suffix + " 3. match DESCRIPTION within [DESCRIPTION][URL] + let mkd_syntax.rxWikiLink1MatchDescr = mkd_syntax.rx_wikilink_md_prefix. + \ '\zs'. mkd_syntax.rxWikiLink1Descr.'\ze'. rx_wikilink_md_separator. + \ mkd_syntax.rxWikiLink1Url . mkd_syntax.rx_wikilink_md_suffix + + let mkd_syntax.rxWikiLink1Prefix1 = mkd_syntax.rx_wikilink_md_prefix + let mkd_syntax.rxWikiLink1Suffix1 = rx_wikilink_md_separator. + \ mkd_syntax.rxWikiLink1Url . mkd_syntax.rx_wikilink_md_suffix + + " 1. match ANY wikilink + let mkd_syntax.rxWikiLink = mkd_syntax.rxWikiLink0 . '\|' . mkd_syntax.rxWikiLink1 + " 2. match URL within ANY wikilink + let mkd_syntax.rxWikiLinkMatchUrl = mkd_syntax.rxWikiLink0MatchUrl . '\|' . + \ mkd_syntax.rxWikiLink1MatchUrl + " 3. match DESCRIPTION within ANY wikilink + let mkd_syntax.rxWikiLinkMatchDescr = mkd_syntax.rxWikiLink0MatchDescr . '\|' . + \ mkd_syntax.rxWikiLink1MatchDescr + + " 0. URL : free-standing links: keep URL UR(L) strip trailing punct: URL; URL) UR(L)) + let mkd_syntax.rxWeblink0 = mkd_syntax.rxWeblink + " 0a) match URL within URL + let mkd_syntax.rxWeblinkMatchUrl0 = mkd_syntax.rxWeblinkMatchUrl + " 0b) match DESCRIPTION within URL + let mkd_syntax.rxWeblinkMatchDescr0 = mkd_syntax.rxWeblinkMatchDescr + + let mkd_syntax.rxWeblink1Prefix = '[' + let mkd_syntax.rxWeblink1Suffix = ')' + let mkd_syntax.rxWeblink1Separator = '](' + " [DESCRIPTION](URL) + let mkd_syntax.Weblink1Template = mkd_syntax.rxWeblink1Prefix . '__LinkDescription__'. + \ mkd_syntax.rxWeblink1Separator. '__LinkUrl__'. + \ mkd_syntax.rxWeblink1Suffix + + let valid_chars = '[^\\]' + + let mkd_syntax.rxWeblink1Prefix = vimwiki#u#escape(mkd_syntax.rxWeblink1Prefix) + let mkd_syntax.rxWeblink1Suffix = vimwiki#u#escape(mkd_syntax.rxWeblink1Suffix) + let mkd_syntax.rxWeblink1Separator = vimwiki#u#escape(mkd_syntax.rxWeblink1Separator) + let mkd_syntax.rxWeblink1Url = valid_chars.'\{-}' + let mkd_syntax.rxWeblink1Descr = valid_chars.'\{-}' + + " 1. [DESCRIPTION](URL) + " 1a) match [DESCRIPTION](URL) + let mkd_syntax.rxWeblink1 = mkd_syntax.rxWeblink1Prefix. + \ mkd_syntax.rxWeblink1Url . mkd_syntax.rxWeblink1Separator. + \ mkd_syntax.rxWeblink1Descr . mkd_syntax.rxWeblink1Suffix + " 1b) match URL within [DESCRIPTION](URL) + let mkd_syntax.rxWeblink1MatchUrl = mkd_syntax.rxWeblink1Prefix. + \ mkd_syntax.rxWeblink1Descr. mkd_syntax.rxWeblink1Separator. + \ '\zs' . mkd_syntax.rxWeblink1Url . '\ze' . mkd_syntax.rxWeblink1Suffix + " 1c) match DESCRIPTION within [DESCRIPTION](URL) + let mkd_syntax.rxWeblink1MatchDescr = mkd_syntax.rxWeblink1Prefix. + \ '\zs'.mkd_syntax.rxWeblink1Descr.'\ze'. mkd_syntax.rxWeblink1Separator. + \ mkd_syntax.rxWeblink1Url. mkd_syntax.rxWeblink1Suffix + + " TODO: image links too !! + let mkd_syntax.rxWeblink1Prefix1 = mkd_syntax.rxWeblink1Prefix + let mkd_syntax.rxWeblink1Suffix1 = mkd_syntax.rxWeblink1Separator. + \ mkd_syntax.rxWeblink1Url . mkd_syntax.rxWeblink1Suffix + + " *a) match ANY weblink + let mkd_syntax.rxWeblink = ''. + \ mkd_syntax.rxWeblink1.'\|'. + \ mkd_syntax.rxWeblink0 + " *b) match URL within ANY weblink + let mkd_syntax.rxWeblinkMatchUrl = ''. + \ mkd_syntax.rxWeblink1MatchUrl.'\|'. + \ mkd_syntax.rxWeblinkMatchUrl0 + " *c) match DESCRIPTION within ANY weblink + let mkd_syntax.rxWeblinkMatchDescr = ''. + \ mkd_syntax.rxWeblink1MatchDescr.'\|'. + \ mkd_syntax.rxWeblinkMatchDescr0 + + let mkd_syntax.rxAnyLink = mkd_syntax.rxWikiLink.'\|'. + \ g:vimwiki_global_vars.rxWikiIncl.'\|'.mkd_syntax.rxWeblink + + let mkd_syntax.rxMkdRef = '\['.g:vimwiki_global_vars.rxWikiLinkDescr.']:\%(\s\+\|\n\)'. + \ mkd_syntax.rxWeblink0 + let mkd_syntax.rxMkdRefMatchDescr = + \ '\[\zs'.g:vimwiki_global_vars.rxWikiLinkDescr.'\ze]:\%(\s\+\|\n\)'. mkd_syntax.rxWeblink0 + let mkd_syntax.rxMkdRefMatchUrl = + \ '\['.g:vimwiki_global_vars.rxWikiLinkDescr.']:\%(\s\+\|\n\)\zs'. + \ mkd_syntax.rxWeblink0.'\ze' +endfunction + + +function! vimwiki#vars#init() + call s:populate_global_variables() + call s:populate_wikilocal_options() +endfunction + + +function! vimwiki#vars#get_syntaxlocal(key, ...) + if a:0 + let syntax = a:1 + else + let syntax = vimwiki#vars#get_wikilocal('syntax') + endif + if !exists('g:vimwiki_syntax_variables') || !has_key(g:vimwiki_syntax_variables, syntax) + call vimwiki#vars#populate_syntax_vars(syntax) + endif + + return g:vimwiki_syntax_variables[syntax][a:key] +endfunction + + +" Get a variable for the buffer we are currently in or for the given buffer (number or name). +" Populate the variable, if it doesn't exist. +function! vimwiki#vars#get_bufferlocal(key, ...) + let buffer = a:0 ? a:1 : '%' + + let value = getbufvar(buffer, 'vimwiki_'.a:key, '/\/\') + if type(value) != 1 || value !=# '/\/\' + return value + elseif a:key ==# 'wiki_nr' + call setbufvar(buffer, 'vimwiki_wiki_nr', vimwiki#base#find_wiki(expand('%:p'))) + elseif a:key ==# 'subdir' + call setbufvar(buffer, 'vimwiki_subdir', vimwiki#base#current_subdir()) + elseif a:key ==# 'invsubdir' + let subdir = vimwiki#vars#get_bufferlocal('subdir') + call setbufvar(buffer, 'vimwiki_invsubdir', vimwiki#base#invsubdir(subdir)) + elseif a:key ==# 'existing_wikifiles' + call setbufvar(buffer, 'vimwiki_existing_wikifiles', + \ vimwiki#base#get_wikilinks(vimwiki#vars#get_bufferlocal('wiki_nr'), 1)) + elseif a:key ==# 'existing_wikidirs' + call setbufvar(buffer, 'vimwiki_existing_wikidirs', + \ vimwiki#base#get_wiki_directories(vimwiki#vars#get_bufferlocal('wiki_nr'))) + elseif a:key ==# 'prev_link' + call setbufvar(buffer, 'vimwiki_prev_link', []) + elseif a:key ==# 'markdown_refs' + call setbufvar(buffer, 'vimwiki_markdown_refs', vimwiki#markdown_base#scan_reflinks()) + else + echoerr 'Vimwiki Error: unknown buffer variable ' . string(a:key) + endif + + return getbufvar(buffer, 'vimwiki_'.a:key) +endfunction + + +function! vimwiki#vars#set_bufferlocal(key, value, ...) + let buffer = a:0 ? a:1 : '%' + call setbufvar(buffer, 'vimwiki_' . a:key, a:value) +endfunction + + +function! vimwiki#vars#get_global(key) + return g:vimwiki_global_vars[a:key] +endfunction + + +" the second argument can be a wiki number. When absent, the wiki of the currently active buffer is +" used +function! vimwiki#vars#get_wikilocal(key, ...) + if a:0 + return g:vimwiki_wikilocal_vars[a:1][a:key] + else + return g:vimwiki_wikilocal_vars[vimwiki#vars#get_bufferlocal('wiki_nr')][a:key] + endif +endfunction + + +function! vimwiki#vars#get_wikilocal_default(key) + return g:vimwiki_wikilocal_vars[-1][a:key] +endfunction + + +function! vimwiki#vars#set_wikilocal(key, value, wiki_nr) + if a:wiki_nr == len(g:vimwiki_wikilocal_vars) - 1 + call insert(g:vimwiki_wikilocal_vars, {}, -1) + endif + let g:vimwiki_wikilocal_vars[a:wiki_nr][a:key] = a:value +endfunction + + +function! vimwiki#vars#add_temporary_wiki(settings) + let new_temp_wiki_settings = copy(g:vimwiki_wikilocal_vars[-1]) + for [key, value] in items(a:settings) + let new_temp_wiki_settings[key] = value + endfor + call insert(g:vimwiki_wikilocal_vars, new_temp_wiki_settings, -1) + call s:validate_settings() +endfunction + + +" number of registered wikis + temporary +function! vimwiki#vars#number_of_wikis() + return len(g:vimwiki_wikilocal_vars) - 1 +endfunction + diff --git a/doc/vimwiki.txt b/doc/vimwiki.txt @@ -9,7 +9,7 @@ |___| |___| |_| |_||__| |__||___| |___| |_||___| ~ - Version: 2.3 + Version: 2.4 ============================================================================== CONTENTS *vimwiki* @@ -47,10 +47,11 @@ CONTENTS *vimwiki* 12.2. Temporary Wiki |vimwiki-temporary-wiki| 12.3. Per-Wiki Options |vimwiki-local-options| 12.4. Global Options |vimwiki-global-options| - 13. Contributing |vimwiki-contributing| - 14. Development |vimwiki-development| - 15. Changelog |vimwiki-changelog| - 16. License |vimwiki-license| + 13. Getting help |vimwiki-help| + 14. Contributing & Bug reports |vimwiki-contributing| + 15. Development |vimwiki-development| + 16. Changelog |vimwiki-changelog| + 17. License |vimwiki-license| ============================================================================== @@ -213,6 +214,22 @@ See also |:VimwikiTabMakeDiaryNote| < See also |:VimwikiMakeYesterdayDiaryNote| +[count]<Leader>w<Leader>m or <Plug>VimwikiMakeTomorrowDiaryNote + Open diary wiki-file for tomorrow of the [count]'s wiki. + + <Leader>w<Leader>m opens diary wiki-file for tomorrow in the first + wiki from |g:vimwiki_list|. + 1<Leader>w<Leader>m as above opens diary wiki-file for tomorrow in + the first wiki from |g:vimwiki_list|. + 2<Leader>w<Leader>m opens diary wiki-file for tomorrow in the second + wiki from |g:vimwiki_list|. + 3<Leader>w<Leader>m opens diary wiki-file for tomorrow in the third + wiki from |g:vimwiki_list|. + etc. + To remap: > + :nmap <Leader>dm <Plug>VimwikiMakeTomorrowDiaryNote +< +See also |:VimwikiMakeTomorrowDiaryNote| ------------------------------------------------------------------------------ 3.2. Local mappings @@ -222,7 +239,7 @@ To remap one of these keys, either put it in your .vimrc like this > or, the better way, put it in a file .vim/ftplugin/vimwiki.vim like this > :nmap <silent><buffer> <Leader>wc <Plug>Vimwiki2HTML -The latter has the advantage that the mapping is local to viwiki buffers in +The latter has the advantage that the mapping is local to Vimwiki buffers in every case. Also note that some keys work in normal mode as well as in visual mode. If you @@ -325,6 +342,34 @@ NORMAL MODE *vimwiki-local-mappings* To remap: > :nmap -- <Plug>VimwikiRemoveHeaderLevel < + *vimwiki_[[* +[[ Go to the previous header in the buffer. + To remap: > + :nmap <- <Plug>VimwikiGoToPrevHeader +< + *vimwiki_]]* +]] Go to the next header in the buffer. + To remap: > + :nmap -> <Plug>VimwikiGoToNextHeader +< + *vimwiki_[=* +[= Go to the previous header which has the same level as + the header the cursor is currently under. + To remap: > + :nmap <= <Plug>VimwikiGoToPrevSiblingHeader +< + *vimwiki_]=* +]= Go to the next header which has the same level as the + header the cursor is currently under. + To remap: > + :nmap => <Plug>VimwikiGoToNextSiblingHeader +< + *vimwiki_]u* *vimwiki_[u* +]u [u Go one level up -- that is, to the parent header of + the header the cursor is currently under. + To remap: > + :nmap -^ <Plug>VimwikiGoToParentHeader +< *vimwiki_+* + Create and/or decorate links. Depending on the context, this command will: convert words into @@ -456,6 +501,13 @@ gLI Change the symbol of the current list to noremap glo :VimwikiChangeSymbolTo I)<CR> noremap glO :VimwikiChangeSymbolInListTo I)<CR> < + *vimwiki_glx* +glx Toggle checkbox of a list item disabled/off. + Maps to |:VimwikiToggleRejectedListItem|. + See |vimwiki-todo-lists|. + To remap: > + :map <Leader>tx <Plug>VimwikiToggleRejectedListItem +< *vimwiki_gqq* *vimwiki_gww* gqq Format table. If you made some changes to a table or without swapping insert/normal modes this command @@ -557,12 +609,22 @@ INSERT MODE *vimwiki-list-mappings* ------------------------------------------------------------------------------ 3.3. Text objects *vimwiki-text-objects* -ah A section segment (the area between two consecutive - headings) including trailing empty lines. -ih A section segment without trailing empty lines. +ah A header including its content up to the next header. +ih The content under a header (like 'ah', but excluding + the header itself and trailing empty lines). + +aH A header including all of its subheaders. When [count] + is 2, include the parent header, when [count] is 3, + the grandparent and so on. +iH Like 'aH', but excluding the header itself and + trailing empty lines. -You can type 'vah' to select a section segment with its contents or 'dah' to -delete it or 'yah' to yank it or 'cah' to change it. +Examples: +- type 'cih' to change the content under the current header +- 'daH' deletes an entire header plus its content including the content of all + of its subheaders +- 'v2aH' selects the parent header of the header the cursor is under plus all + of the content of all of its subheaders a\ A cell in a table. i\ An inner cell in a table. @@ -600,6 +662,8 @@ il A single list item. *:VimwikiMakeYesterdayDiaryNote* Open diary wiki-file for yesterday of the current wiki. +*:VimwikiMakeTomorrowDiaryNote* + Open diary wiki-file for tomorrow of the current wiki. ------------------------------------------------------------------------------ 4.2. Local commands *vimwiki-local-commands* @@ -613,12 +677,24 @@ Vimwiki file. *:VimwikiGoBackLink* 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). -*: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). + 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* Follow wiki link in a new tab (create target wiki page if needed). @@ -656,6 +732,10 @@ Vimwiki file. Toggle checkbox of a list item on/off. See |vimwiki-todo-lists|. +*:VimwikiToggleRejectedListItem* + Toggle checkbox of a list item disabled/off. + See |vimwiki-todo-lists|. + *:VimwikiListChangeLevel* CMD Change the nesting level, or symbol, for a single-line list item. CMD may be ">>" or "<<" to change the indentation of the item, or @@ -669,6 +749,11 @@ Vimwiki file. To display next match use |:lnext| 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* *:VWB* Search for wikilinks to the current wiki page in all files of current @@ -756,35 +841,6 @@ Vimwiki file. are specified, outputs all tags. To make this command work properly, make 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* @@ -821,6 +877,8 @@ is decorated: > super^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* @@ -857,7 +915,7 @@ which opens up a popup menu with all the wiki files starting with "ind". When |vimwiki-option-maxhi| equals 1, a distinct highlighting style is used to identify wikilinks whose targets are not found. -Interwiki:~ +Interwiki~ If you maintain more than one wiki, you can create interwiki links between them by adding a numbered prefix "wikiX:" in front of a link: > @@ -868,15 +926,11 @@ or: > The number behind "wiki" is in the range 0..N-1 and identifies the destination wiki in |g:vimwiki_list|. -Diary:~ +Diary~ -The "diary:" scheme is used to concisely link to diary entries: > +The "diary:" scheme is used to link to diary entries: > [[diary:2012-03-05]] -This scheme precludes explicit inclusion of |vimwiki-option-diary_rel_path|, -and is most useful on subwiki pages to avoid links such as: > - [[../../diary/2012-03-05]] - Anchors~ A wikilink, interwiki link or diary link can be followed by a '#' and the name @@ -1233,14 +1287,9 @@ LaTeX code). Note: the highlighting in Vim is automatic. For the rendering in HTML, you have two alternative options: -1. using the MathJax server for rendering (needs internet connection). -Add to your HTML template the following line: - -<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> - -2. installing MathJax locally (faster, no internet required). Choose a -folder on your hard drive and save MathJax in it. Then add to your HTML -template the following line: +1. installing MathJax locally (Recommended: faster, no internet required). +Choose a folder on your hard drive and save MathJax in it. Then add to your +HTML template the following line: <script type="text/javascript" src="<mathjax_folder>/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> @@ -1255,6 +1304,11 @@ template folder. For instance, a sensible folder structure could be: In this case, <mathjax_folder> would be "../mathjax" (without quotes). +2. Loading MathJax from a CDN-server (needs internet connection). +Add to your HTML template the following line: + +<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/config/TeX-AMS-MML_HTMLorMML.js"></script> + ------------------------------------------------------------------------------ 5.9. Blockquotes *vimwiki-syntax-blockquotes* @@ -1621,6 +1675,9 @@ Use gl<Space> (see |vimwiki_gl<Space>|) to remove a single checkbox and gL<Space> (see |vimwiki_gL<Space>|) to remove all checkboxes of the list the cursor is in. +You can mark an item as rejected ("won't do") with +|vimwiki_glx|. A rejected item will not influence the status of its parents. + ============================================================================== 9. Tables *vimwiki-tables* @@ -1793,6 +1850,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 |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* @@ -2201,15 +2264,15 @@ be located at https://github.com/vimwiki-backup/vimwiki/issues/384 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~ custom_wiki2html_args '' -Description +Description~ If a custom script is called with |vimwiki-option-custom_wiki2html|, additional -parameters can be passed by setting them using 'custom_wiki2html_args' in -|g:vimwiki_list|. +parameters can be passed using this option: > + let g:vimwiki_list = [{'path': '~/path/', 'custom_wiki2html_args': 'stuff'}] *vimwiki-option-list_margin* @@ -2355,6 +2418,19 @@ You can set it to some more fancy symbols like this: ------------------------------------------------------------------------------ +*g:vimwiki_listsym_rejected* + +Character that is used to show that an item of a todo list will not be done. +Default value is '-'. + +The character used here must not be part of |g:vimwiki_listsyms|. + +You can set it to a more fancy symbol like this: +> + let g:vimwiki_listsym_rejected = '✗' + + +------------------------------------------------------------------------------ *g:vimwiki_use_mouse* Use local mouse mappings from |vimwiki-local-mappings|. @@ -2388,6 +2464,8 @@ Limitations: - 'list' is intended to work with lists nicely indented with 'shiftwidth'. - 'syntax' is only available for the default syntax so far. +The options above can be suffixed with ':quick' (e.g.: 'expr:quick') in order +to use some workarounds to make folds work faster. ------------------------------------------------------------------------------ *g:vimwiki_list_ignore_newline* @@ -2717,8 +2795,12 @@ Default: 2 ------------------------------------------------------------------------------ *g:vimwiki_autowriteall* -In Vim 'autowriteall' is a global setting. With g:vimwiki_autowriteall Vimwiki -makes it local to its buffers. +Automatically save a modified wiki buffer when switching wiki pages. Has the +same effect like setting the Vim option 'autowriteall', but it works for wiki +files only, while the Vim option is global. +Hint: if you're just annoyed that you have to save files manually to switch +wiki pages, consider setting the Vim option 'hidden' which makes that modified +files don't need to be saved. Value Description~ 0 autowriteall is off @@ -2810,9 +2892,17 @@ Value Description~ 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! Any help, whether it is a spelling correction or a code snippet to patch -- @@ -2827,12 +2917,8 @@ 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/ Github: https://github.com/vimwiki/vimwiki/ @@ -2863,10 +2949,37 @@ Contributors and their Github usernames in roughly chronological order: - @wangzq - Jinzhou Zhang (@lotabout) - Michael Riley (@optik-aper) + - Irfan Sharif (@irfansharif) + - John Conroy (@jconroy77) + - Christian Rondeau (@christianrondeau) + - Alex Thorne (@thornecc) + - Shafqat Bhuiyan (@priomsrb) + - Bradley Cicenas (@bcicen) + - Michael Thessel (@MichaelThessel) + - Michael F. Schönitzer (@nudin) + - @sqlwwx + - Guilherme Salazar (@salazar) + - Daniel Trnka (@trnila) + - Yuchen Pei (@ycpei) + - @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 @@ -2875,14 +2988,61 @@ http://code.google.com/p/vimwiki/issues/list. They may be accessible from 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)~ -New: +New:~ * Add |:VimwikiMakeYesterdayDiaryNote| command * Issue #128: add option |vimwiki-option-automatic_nested_syntaxes| * Issue #192: Sort links in the list generated by |:VimwikiGenerateTags| -Fixed: +Fixed:~ * Issue #176: Fix issue when the wiki path contains spaces * Also look for tags in wiki files in subdirectories * Locate the .tags file correctly on Windows @@ -3108,12 +3268,13 @@ http://code.google.com/p/vimwiki/issues/list * First public version. ============================================================================== -16. License *vimwiki-license* +17. License *vimwiki-license* -The MIT Licence +The MIT License http://www.opensource.org/licenses/mit-license.php Copyright (c) 2008-2010 Maxim Kim + 2013-2017 Daniel Schemala Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim @@ -1,4 +1,4 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki filetype plugin file " Home: https://github.com/vimwiki/vimwiki/ @@ -7,35 +7,22 @@ if exists("b:did_ftplugin") endif let b:did_ftplugin = 1 " Don't load another plugin for this buffer -call vimwiki#u#reload_regexes() -call vimwiki#u#reload_omni_regexes() -" UNDO list {{{ -" Reset the following options to undo this plugin. -let b:undo_ftplugin = "setlocal ". - \ "suffixesadd< isfname< formatlistpat< ". - \ "formatoptions< foldtext< ". - \ "foldmethod< foldexpr< commentstring< " -" UNDO }}} - -" MISC STUFF {{{ setlocal commentstring=%%%s -if g:vimwiki_conceallevel && exists("+conceallevel") - let &l:conceallevel = g:vimwiki_conceallevel +if vimwiki#vars#get_global('conceallevel') && exists("+conceallevel") + let &l:conceallevel = vimwiki#vars#get_global('conceallevel') endif -" GOTO FILE: gf {{{ -execute 'setlocal suffixesadd='.VimwikiGet('ext') +" This is for GOTO FILE: gf +execute 'setlocal suffixesadd='.vimwiki#vars#get_wikilocal('ext') setlocal isfname-=[,] -" gf}}} exe "setlocal tags+=" . escape(vimwiki#tags#metadata_file_path(), ' \|"') -" MISC }}} -" COMPLETION {{{ + function! Complete_wikifiles(findstart, base) if a:findstart == 1 let column = col('.')-2 @@ -45,7 +32,7 @@ function! Complete_wikifiles(findstart, base) let s:line_context = '[' return startoflink endif - if VimwikiGet('syntax') ==? 'markdown' + if vimwiki#vars#get_wikilocal('syntax') ==? 'markdown' let startofinlinelink = match(line, '\[.*\](\zs[^)]*$') if startofinlinelink != -1 let s:line_context = '[' @@ -61,7 +48,7 @@ function! Complete_wikifiles(findstart, base) return -1 else " Completion works for wikilinks/anchors, and for tags. s:line_content - " tells us, which string came before a:base. There seems to be no easier + " tells us which string came before a:base. There seems to be no easier " solution, because calling col('.') here returns garbage. if s:line_context == '' return [] @@ -78,7 +65,7 @@ function! Complete_wikifiles(findstart, base) if a:base =~# '^wiki\d:' let wikinumber = eval(matchstr(a:base, '^wiki\zs\d')) - if wikinumber >= len(g:vimwiki_list) + if wikinumber >= vimwiki#vars#number_of_wikis() return [] endif let prefix = matchstr(a:base, '^wiki\d:\zs.*') @@ -88,7 +75,7 @@ function! Complete_wikifiles(findstart, base) let prefix = matchstr(a:base, '^diary:\zs.*') let scheme = matchstr(a:base, '^diary:\ze') else " current wiki - let wikinumber = g:vimwiki_current_idx + let wikinumber = vimwiki#vars#get_bufferlocal('wiki_nr') let prefix = a:base let scheme = '' endif @@ -109,7 +96,7 @@ function! Complete_wikifiles(findstart, base) let given_wikifile = segments[0] == '' ? expand('%:t:r') : segments[0] let link_infos = vimwiki#base#resolve_link(given_wikifile.'#') let wikifile = link_infos.filename - let syntax = VimwikiGet('syntax', link_infos.index) + let syntax = vimwiki#vars#get_wikilocal('syntax', link_infos.index) let anchors = vimwiki#base#get_anchors(wikifile, syntax) let filtered_anchors = [] @@ -126,9 +113,9 @@ function! Complete_wikifiles(findstart, base) endfunction setlocal omnifunc=Complete_wikifiles -" COMPLETION }}} -" LIST STUFF {{{ + + " settings necessary for the automatic formatting of lists setlocal autoindent setlocal nosmartindent @@ -140,8 +127,7 @@ setlocal formatoptions-=o setlocal formatoptions-=2 setlocal formatoptions+=n -"Create 'formatlistpat' -let &formatlistpat = g:vimwiki_rxListItem +let &formatlistpat = vimwiki#vars#get_syntaxlocal('rxListItem') if !empty(&langmap) " Valid only if langmap is a comma separated pairs of chars @@ -156,50 +142,54 @@ if !empty(&langmap) endif endif -" LIST STUFF }}} -" FOLDING {{{ -" Folding list items {{{ -function! VimwikiFoldListLevel(lnum) "{{{ + +" ------------------------------------------------ +" Folding stuff +" ------------------------------------------------ + +function! VimwikiFoldListLevel(lnum) return vimwiki#lst#fold_level(a:lnum) -endfunction "}}} -" Folding list items }}} +endfunction + -" Folding sections and code blocks {{{ -function! VimwikiFoldLevel(lnum) "{{{ +function! VimwikiFoldLevel(lnum) let line = getline(a:lnum) " Header/section folding... - if line =~# g:vimwiki_rxHeader + if line =~# vimwiki#vars#get_syntaxlocal('rxHeader') return '>'.vimwiki#u#count_first_sym(line) " Code block folding... - elseif line =~# g:vimwiki_rxPreStart + elseif line =~# vimwiki#vars#get_syntaxlocal('rxPreStart') return 'a1' - elseif line =~# g:vimwiki_rxPreEnd + elseif line =~# vimwiki#vars#get_syntaxlocal('rxPreEnd') return 's1' else return "=" endif +endfunction -endfunction "}}} -" Constants used by VimwikiFoldText {{{ +" Constants used by VimwikiFoldText " use \u2026 and \u21b2 (or \u2424) if enc=utf-8 to save screen space let s:ellipsis = (&enc ==? 'utf-8') ? "\u2026" : "..." let s:ell_len = strlen(s:ellipsis) let s:newline = (&enc ==? 'utf-8') ? "\u21b2 " : " " let s:tolerance = 5 -" }}} -function! s:shorten_text_simple(text, len) "{{{ unused + +" unused +function! s:shorten_text_simple(text, len) let spare_len = a:len - len(a:text) return (spare_len>=0) ? [a:text,spare_len] : [a:text[0:a:len].s:ellipsis, -1] -endfunction "}}} +endfunction + " s:shorten_text(text, len) = [string, spare] with "spare" = len-strlen(string) " for long enough "text", the string's length is within s:tolerance of "len" " (so that -s:tolerance <= spare <= s:tolerance, "string" ends with s:ellipsis) -function! s:shorten_text(text, len) "{{{ returns [string, spare] +function! s:shorten_text(text, len) + " returns [string, spare] " strlen() returns lenght in bytes, not in characters, so we'll have to do a " trick here -- replace all non-spaces with dot, calculate lengths and " indexes on it, then use original string to break at selected index. @@ -212,16 +202,16 @@ function! s:shorten_text(text, len) "{{{ returns [string, spare] let newlen = a:len - s:ell_len let idx = strridx(text_pattern, ' ', newlen + s:tolerance) let break_idx = (idx + s:tolerance >= newlen) ? idx : newlen - return [matchstr(a:text, '\m^.\{'.break_idx.'\}').s:ellipsis, - \ newlen - break_idx] -endfunction "}}} + return [matchstr(a:text, '\m^.\{'.break_idx.'\}').s:ellipsis, newlen - break_idx] +endfunction + -function! VimwikiFoldText() "{{{ +function! VimwikiFoldText() let line = getline(v:foldstart) let main_text = substitute(line, '^\s*', repeat(' ',indent(v:foldstart)), '') let fold_len = v:foldend - v:foldstart + 1 let len_text = ' ['.fold_len.'] ' - if line !~# g:vimwiki_rxPreStart + if line !~# vimwiki#vars#get_syntaxlocal('rxPreStart') let [main_text, spare_len] = s:shorten_text(main_text, 50) return main_text.len_text else @@ -236,27 +226,30 @@ function! VimwikiFoldText() "{{{ endif return main_text.len_text.content_text endif -endfunction "}}} +endfunction + -" Folding sections and code blocks }}} -" FOLDING }}} -" COMMANDS {{{ +" ------------------------------------------------ +" Commands +" ------------------------------------------------ + command! -buffer Vimwiki2HTML \ if filewritable(expand('%')) | silent noautocmd w | endif \ <bar> - \ let res = vimwiki#html#Wiki2HTML(expand(VimwikiGet('path_html')), + \ let res = vimwiki#html#Wiki2HTML(expand(vimwiki#vars#get_wikilocal('path_html')), \ expand('%')) \ <bar> - \ if res != '' | echo 'Vimwiki: HTML conversion is done, output: '.expand(VimwikiGet('path_html')) | endif + \ if res != '' | echo 'Vimwiki: HTML conversion is done, output: ' + \ . expand(vimwiki#vars#get_wikilocal('path_html')) | endif command! -buffer Vimwiki2HTMLBrowse \ if filewritable(expand('%')) | silent noautocmd w | endif \ <bar> \ call vimwiki#base#system_open_link(vimwiki#html#Wiki2HTML( - \ expand(VimwikiGet('path_html')), + \ expand(vimwiki#vars#get_wikilocal('path_html')), \ expand('%'))) command! -buffer VimwikiAll2HTML - \ call vimwiki#html#WikiAll2HTML(expand(VimwikiGet('path_html'))) + \ call vimwiki#html#WikiAll2HTML(expand(vimwiki#vars#get_wikilocal('path_html'))) command! -buffer VimwikiTOC call vimwiki#base#table_of_contents(1) @@ -266,8 +259,8 @@ command! -buffer VimwikiDeleteLink call vimwiki#base#delete_link() command! -buffer VimwikiRenameLink call vimwiki#base#rename_link() command! -buffer VimwikiFollowLink call vimwiki#base#follow_link('nosplit', 0, 1) command! -buffer VimwikiGoBackLink call vimwiki#base#go_back_link() -command! -buffer VimwikiSplitLink call vimwiki#base#follow_link('hsplit', 0, 1) -command! -buffer VimwikiVSplitLink call vimwiki#base#follow_link('vsplit', 0, 1) +command! -buffer -nargs=* VimwikiSplitLink call vimwiki#base#follow_link('hsplit', <f-args>) +command! -buffer -nargs=* VimwikiVSplitLink call vimwiki#base#follow_link('vsplit', <f-args>) command! -buffer -nargs=? VimwikiNormalizeLink call vimwiki#base#normalize_link(<f-args>) @@ -279,10 +272,10 @@ command! -buffer -nargs=0 VimwikiBacklinks call vimwiki#base#backlinks() command! -buffer -nargs=0 VWB call vimwiki#base#backlinks() exe 'command! -buffer -nargs=* VimwikiSearch lvimgrep <args> '. - \ escape(VimwikiGet('path').'**/*'.VimwikiGet('ext'), ' ') + \ escape(vimwiki#vars#get_wikilocal('path').'**/*'.vimwiki#vars#get_wikilocal('ext'), ' ') exe 'command! -buffer -nargs=* VWS lvimgrep <args> '. - \ escape(VimwikiGet('path').'**/*'.VimwikiGet('ext'), ' ') + \ escape(vimwiki#vars#get_wikilocal('path').'**/*'.vimwiki#vars#get_wikilocal('ext'), ' ') command! -buffer -nargs=+ -complete=custom,vimwiki#base#complete_links_escaped \ VimwikiGoto call vimwiki#base#goto(<f-args>) @@ -291,13 +284,19 @@ command! -buffer VimwikiCheckLinks call vimwiki#base#check_links() " list commands command! -buffer -nargs=+ VimwikiReturn call <SID>CR(<f-args>) -command! -buffer -range -nargs=1 VimwikiChangeSymbolTo call vimwiki#lst#change_marker(<line1>, <line2>, <f-args>, 'n') -command! -buffer -range -nargs=1 VimwikiListChangeSymbolI call vimwiki#lst#change_marker(<line1>, <line2>, <f-args>, 'i') -command! -buffer -nargs=1 VimwikiChangeSymbolInListTo call vimwiki#lst#change_marker_in_list(<f-args>) +command! -buffer -range -nargs=1 VimwikiChangeSymbolTo + \ call vimwiki#lst#change_marker(<line1>, <line2>, <f-args>, 'n') +command! -buffer -range -nargs=1 VimwikiListChangeSymbolI + \ call vimwiki#lst#change_marker(<line1>, <line2>, <f-args>, 'i') +command! -buffer -nargs=1 VimwikiChangeSymbolInListTo + \ call vimwiki#lst#change_marker_in_list(<f-args>) command! -buffer -range VimwikiToggleListItem call vimwiki#lst#toggle_cb(<line1>, <line2>) +command! -buffer -range VimwikiToggleRejectedListItem + \ call vimwiki#lst#toggle_rejected_cb(<line1>, <line2>) command! -buffer -range VimwikiIncrementListItem call vimwiki#lst#increment_cb(<line1>, <line2>) command! -buffer -range VimwikiDecrementListItem call vimwiki#lst#decrement_cb(<line1>, <line2>) -command! -buffer -range -nargs=+ VimwikiListChangeLvl call vimwiki#lst#change_level(<line1>, <line2>, <f-args>) +command! -buffer -range -nargs=+ VimwikiListChangeLvl + \ call vimwiki#lst#change_level(<line1>, <line2>, <f-args>) command! -buffer -range VimwikiRemoveSingleCB call vimwiki#lst#remove_cb(<line1>, <line2>) command! -buffer VimwikiRemoveCBInList call vimwiki#lst#remove_cb_in_list() command! -buffer VimwikiRenumberList call vimwiki#lst#adjust_numbered_list() @@ -316,20 +315,25 @@ command! -buffer VimwikiDiaryNextDay call vimwiki#diary#goto_next_day() command! -buffer VimwikiDiaryPrevDay call vimwiki#diary#goto_prev_day() " tags commands -command! -buffer -bang - \ VimwikiRebuildTags call vimwiki#tags#update_tags(1, '<bang>') +command! -buffer -bang VimwikiRebuildTags call vimwiki#tags#update_tags(1, '<bang>') command! -buffer -nargs=* -complete=custom,vimwiki#tags#complete_tags \ VimwikiSearchTags VimwikiSearch /:<args>:/ command! -buffer -nargs=* -complete=custom,vimwiki#tags#complete_tags \ VimwikiGenerateTags call vimwiki#tags#generate_tags(<f-args>) -" COMMANDS }}} +command! -buffer VimwikiPasteUrl call vimwiki#html#PasteUrl(expand('%:p')) +command! -buffer VimwikiCatUrl call vimwiki#html#CatUrl(expand('%:p')) + -" KEYBINDINGS {{{ -if g:vimwiki_use_mouse +" ------------------------------------------------ +" Keybindings +" ------------------------------------------------ + +if vimwiki#vars#get_global('use_mouse') nmap <buffer> <S-LeftMouse> <NOP> nmap <buffer> <C-LeftMouse> <NOP> - nnoremap <silent><buffer> <2-LeftMouse> :call vimwiki#base#follow_link('nosplit', 0, 1, "\<lt>2-LeftMouse>")<CR> + nnoremap <silent><buffer> <2-LeftMouse> + \ :call vimwiki#base#follow_link('nosplit', 0, 1, "\<lt>2-LeftMouse>")<CR> nnoremap <silent><buffer> <S-2-LeftMouse> <LeftMouse>:VimwikiSplitLink<CR> nnoremap <silent><buffer> <C-2-LeftMouse> <LeftMouse>:VimwikiVSplitLink<CR> nnoremap <silent><buffer> <RightMouse><LeftMouse> :VimwikiGoBackLink<CR> @@ -337,46 +341,39 @@ endif if !hasmapto('<Plug>Vimwiki2HTML') - exe 'nmap <buffer> '.g:vimwiki_map_prefix.'h <Plug>Vimwiki2HTML' + exe 'nmap <buffer> '.vimwiki#vars#get_global('map_prefix').'h <Plug>Vimwiki2HTML' endif -nnoremap <script><buffer> - \ <Plug>Vimwiki2HTML :Vimwiki2HTML<CR> +nnoremap <script><buffer> <Plug>Vimwiki2HTML :Vimwiki2HTML<CR> if !hasmapto('<Plug>Vimwiki2HTMLBrowse') - exe 'nmap <buffer> '.g:vimwiki_map_prefix.'hh <Plug>Vimwiki2HTMLBrowse' + exe 'nmap <buffer> '.vimwiki#vars#get_global('map_prefix').'hh <Plug>Vimwiki2HTMLBrowse' endif -nnoremap <script><buffer> - \ <Plug>Vimwiki2HTMLBrowse :Vimwiki2HTMLBrowse<CR> +nnoremap <script><buffer> <Plug>Vimwiki2HTMLBrowse :Vimwiki2HTMLBrowse<CR> if !hasmapto('<Plug>VimwikiFollowLink') nmap <silent><buffer> <CR> <Plug>VimwikiFollowLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiFollowLink :VimwikiFollowLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiFollowLink :VimwikiFollowLink<CR> if !hasmapto('<Plug>VimwikiSplitLink') nmap <silent><buffer> <S-CR> <Plug>VimwikiSplitLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiSplitLink :VimwikiSplitLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiSplitLink :VimwikiSplitLink<CR> if !hasmapto('<Plug>VimwikiVSplitLink') nmap <silent><buffer> <C-CR> <Plug>VimwikiVSplitLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiVSplitLink :VimwikiVSplitLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiVSplitLink :VimwikiVSplitLink<CR> if !hasmapto('<Plug>VimwikiNormalizeLink') nmap <silent><buffer> + <Plug>VimwikiNormalizeLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiNormalizeLink :VimwikiNormalizeLink 0<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiNormalizeLink :VimwikiNormalizeLink 0<CR> if !hasmapto('<Plug>VimwikiNormalizeLinkVisual') vmap <silent><buffer> + <Plug>VimwikiNormalizeLinkVisual endif -vnoremap <silent><script><buffer> - \ <Plug>VimwikiNormalizeLinkVisual :<C-U>VimwikiNormalizeLink 1<CR> +vnoremap <silent><script><buffer> <Plug>VimwikiNormalizeLinkVisual :<C-U>VimwikiNormalizeLink 1<CR> if !hasmapto('<Plug>VimwikiNormalizeLinkVisualCR') vmap <silent><buffer> <CR> <Plug>VimwikiNormalizeLinkVisualCR @@ -388,50 +385,42 @@ if !hasmapto('<Plug>VimwikiTabnewLink') nmap <silent><buffer> <D-CR> <Plug>VimwikiTabnewLink nmap <silent><buffer> <C-S-CR> <Plug>VimwikiTabnewLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiTabnewLink :VimwikiTabnewLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiTabnewLink :VimwikiTabnewLink<CR> if !hasmapto('<Plug>VimwikiGoBackLink') nmap <silent><buffer> <BS> <Plug>VimwikiGoBackLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiGoBackLink :VimwikiGoBackLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiGoBackLink :VimwikiGoBackLink<CR> if !hasmapto('<Plug>VimwikiNextLink') nmap <silent><buffer> <TAB> <Plug>VimwikiNextLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiNextLink :VimwikiNextLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiNextLink :VimwikiNextLink<CR> if !hasmapto('<Plug>VimwikiPrevLink') nmap <silent><buffer> <S-TAB> <Plug>VimwikiPrevLink endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiPrevLink :VimwikiPrevLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiPrevLink :VimwikiPrevLink<CR> if !hasmapto('<Plug>VimwikiDeleteLink') - exe 'nmap <silent><buffer> '.g:vimwiki_map_prefix.'d <Plug>VimwikiDeleteLink' + exe 'nmap <silent><buffer> '.vimwiki#vars#get_global('map_prefix').'d <Plug>VimwikiDeleteLink' endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiDeleteLink :VimwikiDeleteLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiDeleteLink :VimwikiDeleteLink<CR> if !hasmapto('<Plug>VimwikiRenameLink') - exe 'nmap <silent><buffer> '.g:vimwiki_map_prefix.'r <Plug>VimwikiRenameLink' + exe 'nmap <silent><buffer> '.vimwiki#vars#get_global('map_prefix').'r <Plug>VimwikiRenameLink' endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiRenameLink :VimwikiRenameLink<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiRenameLink :VimwikiRenameLink<CR> if !hasmapto('<Plug>VimwikiDiaryNextDay') nmap <silent><buffer> <C-Down> <Plug>VimwikiDiaryNextDay endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiDiaryNextDay :VimwikiDiaryNextDay<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiDiaryNextDay :VimwikiDiaryNextDay<CR> if !hasmapto('<Plug>VimwikiDiaryPrevDay') nmap <silent><buffer> <C-Up> <Plug>VimwikiDiaryPrevDay endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiDiaryPrevDay :VimwikiDiaryPrevDay<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiDiaryPrevDay :VimwikiDiaryPrevDay<CR> " List mappings if !hasmapto('<Plug>VimwikiToggleListItem') @@ -442,10 +431,16 @@ if !hasmapto('<Plug>VimwikiToggleListItem') vmap <silent><buffer> <C-@> <Plug>VimwikiToggleListItem endif endif +if !hasmapto('<Plug>VimwikiToggleRejectedListItem') + nmap <silent><buffer> glx <Plug>VimwikiToggleRejectedListItem + vmap <silent><buffer> glx <Plug>VimwikiToggleRejectedListItem +endif +nnoremap <silent><script><buffer> <Plug>VimwikiToggleListItem :VimwikiToggleListItem<CR> +vnoremap <silent><script><buffer> <Plug>VimwikiToggleListItem :VimwikiToggleListItem<CR> nnoremap <silent><script><buffer> - \ <Plug>VimwikiToggleListItem :VimwikiToggleListItem<CR> + \ <Plug>VimwikiToggleRejectedListItem :VimwikiToggleRejectedListItem<CR> vnoremap <silent><script><buffer> - \ <Plug>VimwikiToggleListItem :VimwikiToggleListItem<CR> + \ <Plug>VimwikiToggleRejectedListItem :VimwikiToggleRejectedListItem<CR> if !hasmapto('<Plug>VimwikiIncrementListItem') nmap <silent><buffer> gln <Plug>VimwikiIncrementListItem @@ -455,39 +450,31 @@ if !hasmapto('<Plug>VimwikiDecrementListItem') nmap <silent><buffer> glp <Plug>VimwikiDecrementListItem vmap <silent><buffer> glp <Plug>VimwikiDecrementListItem endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiIncrementListItem :VimwikiIncrementListItem<CR> -vnoremap <silent><script><buffer> - \ <Plug>VimwikiIncrementListItem :VimwikiIncrementListItem<CR> -nnoremap <silent><script><buffer> - \ <Plug>VimwikiDecrementListItem :VimwikiDecrementListItem<CR> -vnoremap <silent><script><buffer> - \ <Plug>VimwikiDecrementListItem :VimwikiDecrementListItem<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiIncrementListItem :VimwikiIncrementListItem<CR> +vnoremap <silent><script><buffer> <Plug>VimwikiIncrementListItem :VimwikiIncrementListItem<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiDecrementListItem :VimwikiDecrementListItem<CR> +vnoremap <silent><script><buffer> <Plug>VimwikiDecrementListItem :VimwikiDecrementListItem<CR> if !hasmapto('<Plug>VimwikiDecreaseLvlSingleItem', 'i') - imap <silent><buffer> <C-D> - \ <Plug>VimwikiDecreaseLvlSingleItem + imap <silent><buffer> <C-D> <Plug>VimwikiDecreaseLvlSingleItem endif inoremap <silent><script><buffer> <Plug>VimwikiDecreaseLvlSingleItem \ <C-O>:VimwikiListChangeLvl decrease 0<CR> if !hasmapto('<Plug>VimwikiIncreaseLvlSingleItem', 'i') - imap <silent><buffer> <C-T> - \ <Plug>VimwikiIncreaseLvlSingleItem + imap <silent><buffer> <C-T> <Plug>VimwikiIncreaseLvlSingleItem endif inoremap <silent><script><buffer> <Plug>VimwikiIncreaseLvlSingleItem \ <C-O>:VimwikiListChangeLvl increase 0<CR> if !hasmapto('<Plug>VimwikiListNextSymbol', 'i') - imap <silent><buffer> <C-L><C-J> - \ <Plug>VimwikiListNextSymbol + imap <silent><buffer> <C-L><C-J> <Plug>VimwikiListNextSymbol endif inoremap <silent><script><buffer> <Plug>VimwikiListNextSymbol \ <C-O>:VimwikiListChangeSymbolI next<CR> if !hasmapto('<Plug>VimwikiListPrevSymbol', 'i') - imap <silent><buffer> <C-L><C-K> - \ <Plug>VimwikiListPrevSymbol + imap <silent><buffer> <C-L><C-K> <Plug>VimwikiListPrevSymbol endif inoremap <silent><script><buffer> <Plug>VimwikiListPrevSymbol \ <C-O>:VimwikiListChangeSymbolI prev<CR> @@ -503,15 +490,13 @@ nnoremap <silent> <buffer> O :<C-U>call vimwiki#lst#kbd_O()<CR> if !hasmapto('<Plug>VimwikiRenumberList') nmap <silent><buffer> glr <Plug>VimwikiRenumberList endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiRenumberList :VimwikiRenumberList<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiRenumberList :VimwikiRenumberList<CR> if !hasmapto('<Plug>VimwikiRenumberAllLists') nmap <silent><buffer> gLr <Plug>VimwikiRenumberAllLists nmap <silent><buffer> gLR <Plug>VimwikiRenumberAllLists endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiRenumberAllLists :VimwikiRenumberAllLists<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiRenumberAllLists :VimwikiRenumberAllLists<CR> if !hasmapto('<Plug>VimwikiDecreaseLvlSingleItem') map <silent><buffer> glh <Plug>VimwikiDecreaseLvlSingleItem @@ -542,16 +527,14 @@ noremap <silent><script><buffer> if !hasmapto('<Plug>VimwikiRemoveSingleCB') map <silent><buffer> gl<Space> <Plug>VimwikiRemoveSingleCB endif -noremap <silent><script><buffer> - \ <Plug>VimwikiRemoveSingleCB :VimwikiRemoveSingleCB<CR> +noremap <silent><script><buffer> <Plug>VimwikiRemoveSingleCB :VimwikiRemoveSingleCB<CR> if !hasmapto('<Plug>VimwikiRemoveCBInList') map <silent><buffer> gL<Space> <Plug>VimwikiRemoveCBInList endif -noremap <silent><script><buffer> - \ <Plug>VimwikiRemoveCBInList :VimwikiRemoveCBInList<CR> +noremap <silent><script><buffer> <Plug>VimwikiRemoveCBInList :VimwikiRemoveCBInList<CR> -for s:char in keys(g:vimwiki_bullet_types) +for s:char in vimwiki#vars#get_syntaxlocal('bullet_types') if !hasmapto(':VimwikiChangeSymbolTo '.s:char.'<CR>') exe 'noremap <silent><buffer> gl'.s:char.' :VimwikiChangeSymbolTo '.s:char.'<CR>' endif @@ -560,7 +543,7 @@ for s:char in keys(g:vimwiki_bullet_types) endif endfor -for s:typ in g:vimwiki_number_types +for s:typ in vimwiki#vars#get_syntaxlocal('number_types') if !hasmapto(':VimwikiChangeSymbolTo '.s:typ.'<CR>') exe 'noremap <silent><buffer> gl'.s:typ[0].' :VimwikiChangeSymbolTo '.s:typ.'<CR>' endif @@ -570,9 +553,8 @@ for s:typ in g:vimwiki_number_types endfor - -function! s:CR(normal, just_mrkr) "{{{ - if g:vimwiki_table_mappings +function! s:CR(normal, just_mrkr) + if vimwiki#vars#get_global('table_mappings') let res = vimwiki#tbl#kbd_cr() if res != "" exe "normal! " . res . "\<Right>" @@ -581,7 +563,7 @@ function! s:CR(normal, just_mrkr) "{{{ endif endif call vimwiki#lst#kbd_cr(a:normal, a:just_mrkr) -endfunction "}}} +endfunction if !hasmapto('VimwikiReturn', 'i') if maparg('<CR>', 'i') !~? '<Esc>:VimwikiReturn' @@ -593,7 +575,7 @@ if !hasmapto('VimwikiReturn', 'i') endif "Table mappings - if g:vimwiki_table_mappings + if vimwiki#vars#get_global('table_mappings') inoremap <expr> <buffer> <Tab> vimwiki#tbl#kbd_tab() inoremap <expr> <buffer> <S-Tab> vimwiki#tbl#kbd_shift_tab() endif @@ -605,8 +587,7 @@ nnoremap <buffer> gww :VimwikiTableAlignW<CR> if !hasmapto('<Plug>VimwikiTableMoveColumnLeft') nmap <silent><buffer> <A-Left> <Plug>VimwikiTableMoveColumnLeft endif -nnoremap <silent><script><buffer> - \ <Plug>VimwikiTableMoveColumnLeft :VimwikiTableMoveColumnLeft<CR> +nnoremap <silent><script><buffer> <Plug>VimwikiTableMoveColumnLeft :VimwikiTableMoveColumnLeft<CR> if !hasmapto('<Plug>VimwikiTableMoveColumnRight') nmap <silent><buffer> <A-Right> <Plug>VimwikiTableMoveColumnRight endif @@ -615,12 +596,21 @@ nnoremap <silent><script><buffer> -" Text objects {{{ -onoremap <silent><buffer> ah :<C-U>call vimwiki#base#TO_header(0, 0)<CR> -vnoremap <silent><buffer> ah :<C-U>call vimwiki#base#TO_header(0, 1)<CR> +" ------------------------------------------------ +" Text objects +" ------------------------------------------------ -onoremap <silent><buffer> ih :<C-U>call vimwiki#base#TO_header(1, 0)<CR> -vnoremap <silent><buffer> ih :<C-U>call vimwiki#base#TO_header(1, 1)<CR> +onoremap <silent><buffer> ah :<C-U>call vimwiki#base#TO_header(0, 0, v:count1)<CR> +vnoremap <silent><buffer> ah :<C-U>call vimwiki#base#TO_header(0, 0, v:count1)<CR> + +onoremap <silent><buffer> ih :<C-U>call vimwiki#base#TO_header(1, 0, v:count1)<CR> +vnoremap <silent><buffer> ih :<C-U>call vimwiki#base#TO_header(1, 0, v:count1)<CR> + +onoremap <silent><buffer> aH :<C-U>call vimwiki#base#TO_header(0, 1, v:count1)<CR> +vnoremap <silent><buffer> aH :<C-U>call vimwiki#base#TO_header(0, 1, v:count1)<CR> + +onoremap <silent><buffer> iH :<C-U>call vimwiki#base#TO_header(1, 1, v:count1)<CR> +vnoremap <silent><buffer> iH :<C-U>call vimwiki#base#TO_header(1, 1, v:count1)<CR> onoremap <silent><buffer> a\ :<C-U>call vimwiki#base#TO_table_cell(0, 0)<CR> vnoremap <silent><buffer> a\ :<C-U>call vimwiki#base#TO_table_cell(0, 1)<CR> @@ -643,8 +633,7 @@ vnoremap <silent><buffer> il :<C-U>call vimwiki#lst#TO_list_item(1, 1)<CR> if !hasmapto('<Plug>VimwikiAddHeaderLevel') nmap <silent><buffer> = <Plug>VimwikiAddHeaderLevel endif -nnoremap <silent><buffer> <Plug>VimwikiAddHeaderLevel : - \<C-U>call vimwiki#base#AddHeaderLevel()<CR> +nnoremap <silent><buffer> <Plug>VimwikiAddHeaderLevel :<C-U>call vimwiki#base#AddHeaderLevel()<CR> if !hasmapto('<Plug>VimwikiRemoveHeaderLevel') nmap <silent><buffer> - <Plug>VimwikiRemoveHeaderLevel @@ -652,43 +641,59 @@ endif nnoremap <silent><buffer> <Plug>VimwikiRemoveHeaderLevel : \<C-U>call vimwiki#base#RemoveHeaderLevel()<CR> +if !hasmapto('<Plug>VimwikiGoToParentHeader') + nmap <silent><buffer> ]u <Plug>VimwikiGoToParentHeader + nmap <silent><buffer> [u <Plug>VimwikiGoToParentHeader +endif +nnoremap <silent><buffer> <Plug>VimwikiGoToParentHeader : + \<C-u>call vimwiki#base#goto_parent_header()<CR> + +if !hasmapto('<Plug>VimwikiGoToNextHeader') + nmap <silent><buffer> ]] <Plug>VimwikiGoToNextHeader +endif +nnoremap <silent><buffer> <Plug>VimwikiGoToNextHeader : + \<C-u>call vimwiki#base#goto_next_header()<CR> -" }}} +if !hasmapto('<Plug>VimwikiGoToPrevHeader') + nmap <silent><buffer> [[ <Plug>VimwikiGoToPrevHeader +endif +nnoremap <silent><buffer> <Plug>VimwikiGoToPrevHeader : + \<C-u>call vimwiki#base#goto_prev_header()<CR> -" KEYBINDINGS }}} +if !hasmapto('<Plug>VimwikiGoToNextSiblingHeader') + nmap <silent><buffer> ]= <Plug>VimwikiGoToNextSiblingHeader +endif +nnoremap <silent><buffer> <Plug>VimwikiGoToNextSiblingHeader : + \<C-u>call vimwiki#base#goto_sibling(+1)<CR> -" AUTOCOMMANDS {{{ -if VimwikiGet('auto_export') +if !hasmapto('<Plug>VimwikiGoToPrevSiblingHeader') + nmap <silent><buffer> [= <Plug>VimwikiGoToPrevSiblingHeader +endif +nnoremap <silent><buffer> <Plug>VimwikiGoToPrevSiblingHeader : + \<C-u>call vimwiki#base#goto_sibling(-1)<CR> + + + +if vimwiki#vars#get_wikilocal('auto_export') " Automatically generate HTML on page write. augroup vimwiki au BufWritePost <buffer> - \ call vimwiki#html#Wiki2HTML(expand(VimwikiGet('path_html')), + \ call vimwiki#html#Wiki2HTML(expand(vimwiki#vars#get_wikilocal('path_html')), \ expand('%')) augroup END endif -if VimwikiGet('auto_toc') +if vimwiki#vars#get_wikilocal('auto_toc') " Automatically update the TOC *before* the file is written augroup vimwiki au BufWritePre <buffer> call vimwiki#base#table_of_contents(0) augroup END endif -if VimwikiGet('auto_tags') +if vimwiki#vars#get_wikilocal('auto_tags') " Automatically update tags metadata on page write. augroup vimwiki au BufWritePost <buffer> call vimwiki#tags#update_tags(0, '') augroup END endif -" AUTOCOMMANDS }}} - -" PASTE, CAT URL {{{ -" html commands -command! -buffer VimwikiPasteUrl call vimwiki#html#PasteUrl(expand('%:p')) -command! -buffer VimwikiCatUrl call vimwiki#html#CatUrl(expand('%:p')) -" }}} -" DEBUGGING {{{ -command! VimwikiPrintWikiState call vimwiki#base#print_wiki_state() -command! VimwikiReadLocalOptions call vimwiki#base#read_wiki_options(1) -" }}} diff --git a/plugin/vimwiki.vim b/plugin/vimwiki.vim @@ -1,462 +1,263 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki plugin file " Home: https://github.com/vimwiki/vimwiki/ " GetLatestVimScripts: 2226 1 :AutoInstall: vimwiki + if exists("g:loaded_vimwiki") || &cp finish endif let g:loaded_vimwiki = 1 + let s:old_cpo = &cpo set cpo&vim -" HELPER functions {{{ -function! s:default(varname, value) "{{{ - if !exists('g:vimwiki_'.a:varname) - let g:vimwiki_{a:varname} = a:value - endif -endfunction "}}} +if exists('g:vimwiki_autowriteall') + let s:vimwiki_autowriteall_saved = g:vimwiki_autowriteall +else + let s:vimwiki_autowriteall_saved = 1 +endif -function! s:path_html(idx) "{{{ - let path_html = VimwikiGet('path_html', a:idx) - if !empty(path_html) - return path_html - else - let path = VimwikiGet('path', a:idx) - return substitute(path, '[/\\]\+$', '', '').'_html/' + +" this is called when the cursor leaves the buffer +function! s:setup_buffer_leave() + " don't do anything if it's not managed by Vimwiki (that is, when it's not in + " a registered wiki and not a temporary wiki) + if vimwiki#vars#get_bufferlocal('wiki_nr') == -1 + return endif -endfunction "}}} -function! s:normalize_path(path) "{{{ - " resolve doesn't work quite right with symlinks ended with / or \ - let path = substitute(a:path, '[/\\]\+$', '', '') - if path !~# '^scp:' - return resolve(expand(path)).'/' - else - return path.'/' + let &autowriteall = s:vimwiki_autowriteall_saved + + if vimwiki#vars#get_global('menu') != "" + exe 'nmenu disable '.vimwiki#vars#get_global('menu').'.Table' endif -endfunction "}}} - -function! Validate_wiki_options(idx) " {{{ - call VimwikiSet('path', s:normalize_path(VimwikiGet('path', a:idx)), a:idx) - call VimwikiSet('path_html', s:normalize_path(s:path_html(a:idx)), a:idx) - call VimwikiSet('template_path', - \ s:normalize_path(VimwikiGet('template_path', a:idx)), a:idx) - call VimwikiSet('diary_rel_path', - \ s:normalize_path(VimwikiGet('diary_rel_path', a:idx)), a:idx) -endfunction " }}} - -function! s:vimwiki_idx() " {{{ - if exists('b:vimwiki_idx') - return b:vimwiki_idx +endfunction + + +" create a new temporary wiki for the current buffer +function! s:create_temporary_wiki() + let path = expand('%:p:h') + let ext = '.'.expand('%:e') + + let syntax_mapping = vimwiki#vars#get_global('ext2syntax') + if has_key(syntax_mapping, ext) + let syntax = syntax_mapping[ext] else - return -1 + let syntax = vimwiki#vars#get_wikilocal_default('syntax') endif -endfunction " }}} -function! s:setup_buffer_leave() "{{{ - if &filetype ==? 'vimwiki' - " cache global vars of current state XXX: SLOW!? - call vimwiki#base#cache_buffer_state() - endif + let new_temp_wiki_settings = {'path': path, + \ 'ext': ext, + \ 'syntax': syntax, + \ } - let &autowriteall = s:vimwiki_autowriteall + call vimwiki#vars#add_temporary_wiki(new_temp_wiki_settings) - " Set up menu - if g:vimwiki_menu != "" - exe 'nmenu disable '.g:vimwiki_menu.'.Table' - endif -endfunction "}}} + " 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 -function! s:setup_filetype() "{{{ - " Find what wiki current buffer belongs to. - let path = expand('%:p:h') - let idx = vimwiki#base#find_wiki(path) - if idx == -1 && g:vimwiki_global_ext == 0 - return - endif - "XXX when idx = -1? (an orphan page has been detected) - - "TODO: refactor (same code in setup_buffer_enter) - " The buffer's file is not in the path and user *does* want his wiki - " extension(s) to be global -- Add new wiki. - if idx == -1 - let ext = '.'.expand('%:e') - " lookup syntax using g:vimwiki_ext2syntax - if has_key(g:vimwiki_ext2syntax, ext) - let syn = g:vimwiki_ext2syntax[ext] +" This function is called when Vim opens a new buffer with a known wiki +" extension. Both when the buffer has never been opened in this session and +" when it has. +function! s:setup_new_wiki_buffer() + let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr') + if wiki_nr == -1 " it's not in a known wiki directory + if vimwiki#vars#get_global('global_ext') + call s:create_temporary_wiki() else - let syn = s:vimwiki_defaults.syntax - endif - call add(g:vimwiki_list, {'path': path, 'ext': ext, 'syntax': syn, 'temp': 1}) - let idx = len(g:vimwiki_list) - 1 - call Validate_wiki_options(idx) - endif - " initialize and cache global vars of current state - call vimwiki#base#setup_buffer_state(idx) - - unlet! b:vimwiki_fs_rescan - set filetype=vimwiki -endfunction "}}} - -function! s:setup_buffer_enter() "{{{ - if !vimwiki#base#recall_buffer_state() - " Find what wiki current buffer belongs to. - " If wiki does not exist in g:vimwiki_list -- add new wiki there with - " buffer's path and ext. - " Else set g:vimwiki_current_idx to that wiki index. - let path = expand('%:p:h') - let idx = vimwiki#base#find_wiki(path) - - " The buffer's file is not in the path and user *does NOT* want his wiki - " extension to be global -- Do not add new wiki. - if idx == -1 && g:vimwiki_global_ext == 0 + " the user does not want a temporary wiki, so do nothing return endif - - "TODO: refactor (same code in setup_filetype) - " The buffer's file is not in the path and user *does* want his wiki - " extension(s) to be global -- Add new wiki. - if idx == -1 - let ext = '.'.expand('%:e') - " lookup syntax using g:vimwiki_ext2syntax - if has_key(g:vimwiki_ext2syntax, ext) - let syn = g:vimwiki_ext2syntax[ext] - else - let syn = s:vimwiki_defaults.syntax - endif - call add(g:vimwiki_list, {'path': path, 'ext': ext, 'syntax': syn, 'temp': 1}) - let idx = len(g:vimwiki_list) - 1 - call Validate_wiki_options(idx) - endif - " initialize and cache global vars of current state - call vimwiki#base#setup_buffer_state(idx) - endif - " If you have - " au GUIEnter * VimwikiIndex - " Then change it to - " au GUIEnter * nested VimwikiIndex - if &filetype == '' - set filetype=vimwiki - elseif &syntax ==? 'vimwiki' - " to force a rescan of the filesystem which may have changed - " and update VimwikiLinks syntax group that depends on it; - " b:vimwiki_fs_rescan indicates that setup_filetype() has not been run - if exists("b:vimwiki_fs_rescan") && VimwikiGet('maxhi') - set syntax=vimwiki - endif - let b:vimwiki_fs_rescan = 1 + if vimwiki#vars#get_wikilocal('maxhi') + call vimwiki#vars#set_bufferlocal('existing_wikifiles', vimwiki#base#get_wikilinks(wiki_nr, 1)) + call vimwiki#vars#set_bufferlocal('existing_wikidirs', + \ vimwiki#base#get_wiki_directories(wiki_nr)) endif - " Settings foldmethod, foldexpr and foldtext are local to window. Thus in a - " new tab with the same buffer folding is reset to vim defaults. So we - " insist vimwiki folding here. - if g:vimwiki_folding ==? 'expr' - setlocal fdm=expr - setlocal foldexpr=VimwikiFoldLevel(v:lnum) - setlocal foldtext=VimwikiFoldText() - elseif g:vimwiki_folding ==? 'list' || g:vimwiki_folding ==? 'lists' - setlocal fdm=expr - setlocal foldexpr=VimwikiFoldListLevel(v:lnum) - setlocal foldtext=VimwikiFoldText() - elseif g:vimwiki_folding ==? 'syntax' - setlocal fdm=syntax - setlocal foldtext=VimwikiFoldText() - elseif g:vimwiki_folding ==? 'custom' - " do nothing - else - setlocal fdm=manual - normal! zE - endif + " this makes that ftplugin/vimwiki.vim and afterwards syntax/vimwiki.vim are + " sourced + setfiletype vimwiki - " And conceal level too. - if g:vimwiki_conceallevel && exists("+conceallevel") - let &conceallevel = g:vimwiki_conceallevel - endif +endfunction - " Set up menu - if g:vimwiki_menu != "" - exe 'nmenu enable '.g:vimwiki_menu.'.Table' - endif -endfunction "}}} -function! s:setup_buffer_reenter() "{{{ - if !vimwiki#base#recall_buffer_state() - " Do not repeat work of s:setup_buffer_enter() and s:setup_filetype() - " Once should be enough ... +" this is called when the cursor enters the buffer +function! s:setup_buffer_enter() + " don't do anything if it's not managed by Vimwiki (that is, when it's not in + " a registered wiki and not a temporary wiki) + if vimwiki#vars#get_bufferlocal('wiki_nr') == -1 + return endif - if !exists("s:vimwiki_autowriteall") - let s:vimwiki_autowriteall = &autowriteall + + if &filetype != 'vimwiki' + setfiletype vimwiki endif - let &autowriteall = g:vimwiki_autowriteall -endfunction "}}} -function! s:setup_cleared_syntax() "{{{ highlight groups that get cleared + call s:set_global_options() + + call s:set_windowlocal_options() +endfunction + + +function! s:setup_cleared_syntax() + " highlight groups that get cleared " on colorscheme change because they are not linked to Vim-predefined groups hi def VimwikiBold term=bold cterm=bold gui=bold hi def VimwikiItalic term=italic cterm=italic gui=italic hi def VimwikiBoldItalic term=bold cterm=bold gui=bold,italic hi def VimwikiUnderline gui=underline - if g:vimwiki_hl_headers == 1 + if vimwiki#vars#get_global('hl_headers') == 1 for i in range(1,6) - execute 'hi def VimwikiHeader'.i.' guibg=bg guifg='.g:vimwiki_hcolor_guifg_{&bg}[i-1].' gui=bold ctermfg='.g:vimwiki_hcolor_ctermfg_{&bg}[i-1].' term=bold cterm=bold' + execute 'hi def VimwikiHeader'.i.' guibg=bg guifg=' + \ . vimwiki#vars#get_global('hcolor_guifg_'.&bg)[i-1] + \ .' gui=bold ctermfg='.vimwiki#vars#get_global('hcolor_ctermfg_'.&bg)[i-1] + \ .' term=bold cterm=bold' endfor endif -endfunction "}}} - -" OPTION get/set functions {{{ -" return complete list of options -function! VimwikiGetOptionNames() "{{{ - return keys(s:vimwiki_defaults) -endfunction "}}} - -function! VimwikiGetOptions(...) "{{{ - let idx = a:0 == 0 ? g:vimwiki_current_idx : a:1 - let option_dict = {} - for kk in keys(s:vimwiki_defaults) - let option_dict[kk] = VimwikiGet(kk, idx) +endfunction + + +function! s:vimwiki_get_known_extensions() + " Getting all extensions that different wikis could have + let extensions = {} + for idx in range(vimwiki#vars#number_of_wikis()) + let ext = vimwiki#vars#get_wikilocal('ext', idx) + let extensions[ext] = 1 endfor - return option_dict -endfunction "}}} - -" Return value of option for current wiki or if second parameter exists for -" wiki with a given index. -" If the option is not found, it is assumed to have been previously cached in a -" buffer local dictionary, that acts as a cache. -" If the option is not found in the buffer local dictionary, an error is thrown -function! VimwikiGet(option, ...) "{{{ - let idx = a:0 == 0 ? g:vimwiki_current_idx : a:1 - - if has_key(g:vimwiki_list[idx], a:option) - let val = g:vimwiki_list[idx][a:option] - elseif has_key(s:vimwiki_defaults, a:option) - let val = s:vimwiki_defaults[a:option] - let g:vimwiki_list[idx][a:option] = val - else - let val = b:vimwiki_list[a:option] + " append extensions from g:vimwiki_ext2syntax + for ext in keys(vimwiki#vars#get_global('ext2syntax')) + let extensions[ext] = 1 + endfor + return keys(extensions) +endfunction + + +" Set settings which are global for Vim, but should only be executed for +" Vimwiki buffers. So they must be set when the cursor enters a Vimwiki buffer +" and reset when the cursor leaves the buffer. +function! s:set_global_options() + let s:vimwiki_autowriteall_saved = &autowriteall + let &autowriteall = vimwiki#vars#get_global('autowriteall') + + if vimwiki#vars#get_global('menu') !=# '' + exe 'nmenu enable '.vimwiki#vars#get_global('menu').'.Table' endif +endfunction - " XXX no call to vimwiki#base here or else the whole autoload/base gets loaded! - return val -endfunction "}}} - -" Set option for current wiki or if third parameter exists for -" wiki with a given index. -" If the option is not found or recognized (i.e. does not exist in -" s:vimwiki_defaults), it is saved in a buffer local dictionary, that acts -" as a cache. -" If the option is not found in the buffer local dictionary, an error is thrown -function! VimwikiSet(option, value, ...) "{{{ - let idx = a:0 == 0 ? g:vimwiki_current_idx : a:1 - - if has_key(s:vimwiki_defaults, a:option) || - \ has_key(g:vimwiki_list[idx], a:option) - let g:vimwiki_list[idx][a:option] = a:value - elseif exists('b:vimwiki_list') - let b:vimwiki_list[a:option] = a:value + +" Set settings which are local to a window. In a new tab they would be reset to +" Vim defaults. So we enforce our settings here when the cursor enters a +" Vimwiki buffer. +function! s:set_windowlocal_options() + let foldmethod = vimwiki#vars#get_global('folding') + if foldmethod =~? '^expr.*' + setlocal foldmethod=expr + setlocal foldexpr=VimwikiFoldLevel(v:lnum) + setlocal foldtext=VimwikiFoldText() + elseif foldmethod =~? '^list.*' || foldmethod =~? '^lists.*' + setlocal foldmethod=expr + setlocal foldexpr=VimwikiFoldListLevel(v:lnum) + setlocal foldtext=VimwikiFoldText() + elseif foldmethod =~? '^syntax.*' + setlocal foldmethod=syntax + setlocal foldtext=VimwikiFoldText() + elseif foldmethod =~? '^custom.*' + " do nothing else - let b:vimwiki_list = {} - let b:vimwiki_list[a:option] = a:value + setlocal foldmethod=manual + normal! zE endif -endfunction "}}} - -" Clear option for current wiki or if second parameter exists for -" wiki with a given index. -" Currently, only works if option was previously saved in the buffer local -" dictionary, that acts as a cache. -function! VimwikiClear(option, ...) "{{{ - let idx = a:0 == 0 ? g:vimwiki_current_idx : a:1 + if vimwiki#vars#get_global('conceallevel') && exists("+conceallevel") + let &conceallevel = vimwiki#vars#get_global('conceallevel') + endif - if exists('b:vimwiki_list') && has_key(b:vimwiki_list, a:option) - call remove(b:vimwiki_list, a:option) + if vimwiki#vars#get_global('auto_chdir') + exe 'lcd' vimwiki#vars#get_wikilocal('path') endif +endfunction -endfunction "}}} -" }}} -function! s:vimwiki_get_known_extensions() " {{{ - " Getting all extensions that different wikis could have - let extensions = {} - for wiki in g:vimwiki_list - if has_key(wiki, 'ext') - let extensions[wiki.ext] = 1 - else - let extensions['.wiki'] = 1 - endif - endfor - " append map g:vimwiki_ext2syntax - for ext in keys(g:vimwiki_ext2syntax) - let extensions[ext] = 1 - endfor - return keys(extensions) -endfunction " }}} -" }}} -" CALLBACK functions "{{{ -" User can redefine it. -if !exists("*VimwikiLinkHandler") "{{{ +" Initialization of Vimwiki starts here. Make sure everything below does not +" cause autoload/vimwiki/base.vim to be loaded + +call vimwiki#vars#init() + + +" Define callback functions which the user can redefine +if !exists("*VimwikiLinkHandler") function VimwikiLinkHandler(url) return 0 endfunction -endif "}}} +endif -if !exists("*VimwikiLinkConverter") "{{{ +if !exists("*VimwikiLinkConverter") function VimwikiLinkConverter(url, source, target) " Return the empty string when unable to process link return '' endfunction -endif "}}} +endif -if !exists("*VimwikiWikiIncludeHandler") "{{{ - function! VimwikiWikiIncludeHandler(value) "{{{ +if !exists("*VimwikiWikiIncludeHandler") + function! VimwikiWikiIncludeHandler(value) return '' - endfunction "}}} -endif "}}} -" CALLBACK }}} - -" DEFAULT wiki {{{ -let s:vimwiki_defaults = {} -let s:vimwiki_defaults.path = '~/vimwiki/' -let s:vimwiki_defaults.path_html = '' " '' is replaced by derived path.'_html/' -let s:vimwiki_defaults.css_name = 'style.css' -let s:vimwiki_defaults.index = 'index' -let s:vimwiki_defaults.ext = '.wiki' -let s:vimwiki_defaults.maxhi = 0 -let s:vimwiki_defaults.syntax = 'default' - -let s:vimwiki_defaults.template_path = '~/vimwiki/templates/' -let s:vimwiki_defaults.template_default = 'default' -let s:vimwiki_defaults.template_ext = '.tpl' - -let s:vimwiki_defaults.nested_syntaxes = {} -let s:vimwiki_defaults.automatic_nested_syntaxes = 1 -let s:vimwiki_defaults.auto_export = 0 -let s:vimwiki_defaults.auto_toc = 0 -" is wiki temporary -- was added to g:vimwiki_list by opening arbitrary wiki -" file. -let s:vimwiki_defaults.temp = 0 - -" diary -let s:vimwiki_defaults.diary_rel_path = 'diary/' -let s:vimwiki_defaults.diary_index = 'diary' -let s:vimwiki_defaults.diary_header = 'Diary' -let s:vimwiki_defaults.diary_sort = 'desc' - -" Do not change this! Will wait till vim become more datetime awareable. -let s:vimwiki_defaults.diary_link_fmt = '%Y-%m-%d' - -" NEW! in v2.0 -" custom_wiki2html -let s:vimwiki_defaults.custom_wiki2html = '' -" -let s:vimwiki_defaults.list_margin = -1 - -let s:vimwiki_defaults.auto_tags = 0 -"}}} - -" DEFAULT options {{{ -call s:default('list', [s:vimwiki_defaults]) -call s:default('use_mouse', 0) -call s:default('folding', '') -call s:default('menu', 'Vimwiki') -call s:default('global_ext', 1) -call s:default('ext2syntax', {}) " syntax map keyed on extension -call s:default('hl_headers', 0) -call s:default('hl_cb_checked', 0) -call s:default('list_ignore_newline', 1) -call s:default('text_ignore_newline', 1) -call s:default('listsyms', ' .oOX') -call s:default('use_calendar', 1) -call s:default('table_mappings', 1) -call s:default('table_auto_fmt', 1) -call s:default('w32_dir_enc', '') -call s:default('CJK_length', 0) -call s:default('dir_link', '') -call s:default('valid_html_tags', 'b,i,s,u,sub,sup,kbd,br,hr,div,center,strong,em') -call s:default('user_htmls', '') -call s:default('autowriteall', 1) -call s:default('toc_header', 'Contents') - -call s:default('html_header_numbering', 0) -call s:default('html_header_numbering_sym', '') -call s:default('conceallevel', 2) -call s:default('url_maxsave', 15) - -call s:default('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' - \ }) - -call s:default('map_prefix', '<Leader>w') - -call s:default('current_idx', 0) - -call s:default('auto_chdir', 0) - -" Scheme regexes should 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 -" Scheme regexes {{{ -call s:default('schemes', 'wiki\d\+,diary,local') -call s:default('web_schemes1', 'http,https,file,ftp,gopher,telnet,nntp,ldap,'. - \ 'rsync,imap,pop,irc,ircs,cvs,svn,svn+ssh,git,ssh,fish,sftp') -call s:default('web_schemes2', 'mailto,news,xmpp,sip,sips,doi,urn,tel,data') - -let s:rxSchemes = '\%('. - \ join(split(g:vimwiki_schemes, '\s*,\s*'), '\|').'\|'. - \ join(split(g:vimwiki_web_schemes1, '\s*,\s*'), '\|').'\|'. - \ join(split(g:vimwiki_web_schemes2, '\s*,\s*'), '\|'). - \ '\)' - -call s:default('rxSchemeUrl', s:rxSchemes.':.*') -call s:default('rxSchemeUrlMatchScheme', '\zs'.s:rxSchemes.'\ze:.*') -call s:default('rxSchemeUrlMatchUrl', s:rxSchemes.':\zs.*\ze') -" scheme regexes }}} - -for s:idx in range(len(g:vimwiki_list)) - call Validate_wiki_options(s:idx) -endfor -"}}} - -" AUTOCOMMANDS for all known wiki extensions {{{ - -augroup filetypedetect - " clear FlexWiki's stuff - au! * *.wiki -augroup end + endfunction +endif + + + +" Define autocommands for all known wiki extensions + +let s:known_extensions = s:vimwiki_get_known_extensions() + +if index(s:known_extensions, '.wiki') > -1 + augroup filetypedetect + " clear FlexWiki's stuff + au! * *.wiki + augroup end +endif augroup vimwiki autocmd! - for s:ext in s:vimwiki_get_known_extensions() - exe 'autocmd BufEnter *'.s:ext.' call s:setup_buffer_reenter()' - exe 'autocmd BufWinEnter *'.s:ext.' call s:setup_buffer_enter()' - exe 'autocmd BufLeave,BufHidden *'.s:ext.' call s:setup_buffer_leave()' - exe 'autocmd BufNewFile,BufRead, *'.s:ext.' call s:setup_filetype()' + for s:ext in s:known_extensions + exe 'autocmd BufNewFile,BufRead *'.s:ext.' call s:setup_new_wiki_buffer()' + exe 'autocmd BufEnter *'.s:ext.' call s:setup_buffer_enter()' + 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 " autowrap tables. - if g:vimwiki_table_auto_fmt + if vimwiki#vars#get_global('table_auto_fmt') exe 'autocmd InsertLeave *'.s:ext.' call vimwiki#tbl#format(line("."))' exe 'autocmd InsertEnter *'.s:ext.' call vimwiki#tbl#reset_tw(line("."))' endif + if vimwiki#vars#get_global('folding') =~? ':quick$' + " from http://vim.wikia.com/wiki/Keep_folds_closed_while_inserting_text + " Don't screw up folds when inserting text that might affect them, until + " leaving insert mode. Foldmethod is local to the window. Protect against + " screwing up folding when switching between windows. + exe 'autocmd InsertEnter *'.s:ext.' if !exists("w:last_fdm") | let w:last_fdm=&foldmethod'. + \ ' | setlocal foldmethod=manual | endif' + exe 'autocmd InsertLeave,WinLeave *'.s:ext.' if exists("w:last_fdm") |'. + \ 'let &l:foldmethod=w:last_fdm | unlet w:last_fdm | endif' + endif endfor augroup END -"}}} -" COMMANDS {{{ + + command! VimwikiUISelect call vimwiki#base#ui_select() -" XXX: why not using <count> instead of v:count1? -" See Issue 324. +" why not using <count> instead of v:count1? +" See https://github.com/vimwiki-backup/vimwiki/issues/324 command! -count=1 VimwikiIndex \ call vimwiki#base#goto_index(v:count1) command! -count=1 VimwikiTabIndex @@ -465,73 +266,83 @@ command! -count=1 VimwikiTabIndex command! -count=1 VimwikiDiaryIndex \ call vimwiki#diary#goto_diary_index(v:count1) command! -count=1 VimwikiMakeDiaryNote - \ call vimwiki#diary#make_note(v:count1) + \ call vimwiki#diary#make_note(v:count) command! -count=1 VimwikiTabMakeDiaryNote - \ call vimwiki#diary#make_note(v:count1, 1) + \ call vimwiki#diary#make_note(v:count, 1) command! -count=1 VimwikiMakeYesterdayDiaryNote - \ call vimwiki#diary#make_note(v:count1, 0, strftime(VimwikiGet('diary_link_fmt', v:count1 - 1), localtime() - 60*60*24)) + \ call vimwiki#diary#make_note(v:count, 0, + \ vimwiki#diary#diary_date_link(localtime() - 60*60*24)) +command! -count=1 VimwikiMakeTomorrowDiaryNote + \ call vimwiki#diary#make_note(v:count, 0, + \ vimwiki#diary#diary_date_link(localtime() + 60*60*24)) command! VimwikiDiaryGenerateLinks \ call vimwiki#diary#generate_diary_section() -"}}} -" MAPPINGS {{{ + + +let s:map_prefix = vimwiki#vars#get_global('map_prefix') + if !hasmapto('<Plug>VimwikiIndex') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'w <Plug>VimwikiIndex' + exe 'nmap <silent><unique> '.s:map_prefix.'w <Plug>VimwikiIndex' endif nnoremap <unique><script> <Plug>VimwikiIndex :VimwikiIndex<CR> if !hasmapto('<Plug>VimwikiTabIndex') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'t <Plug>VimwikiTabIndex' + exe 'nmap <silent><unique> '.s:map_prefix.'t <Plug>VimwikiTabIndex' endif nnoremap <unique><script> <Plug>VimwikiTabIndex :VimwikiTabIndex<CR> if !hasmapto('<Plug>VimwikiUISelect') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'s <Plug>VimwikiUISelect' + exe 'nmap <silent><unique> '.s:map_prefix.'s <Plug>VimwikiUISelect' endif nnoremap <unique><script> <Plug>VimwikiUISelect :VimwikiUISelect<CR> if !hasmapto('<Plug>VimwikiDiaryIndex') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'i <Plug>VimwikiDiaryIndex' + exe 'nmap <silent><unique> '.s:map_prefix.'i <Plug>VimwikiDiaryIndex' endif nnoremap <unique><script> <Plug>VimwikiDiaryIndex :VimwikiDiaryIndex<CR> if !hasmapto('<Plug>VimwikiDiaryGenerateLinks') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'<Leader>i <Plug>VimwikiDiaryGenerateLinks' + exe 'nmap <silent><unique> '.s:map_prefix.'<Leader>i <Plug>VimwikiDiaryGenerateLinks' endif nnoremap <unique><script> <Plug>VimwikiDiaryGenerateLinks :VimwikiDiaryGenerateLinks<CR> if !hasmapto('<Plug>VimwikiMakeDiaryNote') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'<Leader>w <Plug>VimwikiMakeDiaryNote' + exe 'nmap <silent><unique> '.s:map_prefix.'<Leader>w <Plug>VimwikiMakeDiaryNote' endif nnoremap <unique><script> <Plug>VimwikiMakeDiaryNote :VimwikiMakeDiaryNote<CR> if !hasmapto('<Plug>VimwikiTabMakeDiaryNote') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'<Leader>t <Plug>VimwikiTabMakeDiaryNote' + exe 'nmap <silent><unique> '.s:map_prefix.'<Leader>t <Plug>VimwikiTabMakeDiaryNote' endif nnoremap <unique><script> <Plug>VimwikiTabMakeDiaryNote \ :VimwikiTabMakeDiaryNote<CR> if !hasmapto('<Plug>VimwikiMakeYesterdayDiaryNote') - exe 'nmap <silent><unique> '.g:vimwiki_map_prefix.'<Leader>y <Plug>VimwikiMakeYesterdayDiaryNote' + exe 'nmap <silent><unique> '.s:map_prefix.'<Leader>y <Plug>VimwikiMakeYesterdayDiaryNote' endif nnoremap <unique><script> <Plug>VimwikiMakeYesterdayDiaryNote \ :VimwikiMakeYesterdayDiaryNote<CR> -"}}} +if !hasmapto('<Plug>VimwikiMakeTomorrowDiaryNote') + exe 'nmap <silent><unique> '.s:map_prefix.'<Leader>m <Plug>VimwikiMakeTomorrowDiaryNote' +endif +nnoremap <unique><script> <Plug>VimwikiMakeTomorrowDiaryNote + \ :VimwikiMakeTomorrowDiaryNote<CR> + + + -" MENU {{{ function! s:build_menu(topmenu) - let idx = 0 - while idx < len(g:vimwiki_list) - let norm_path = fnamemodify(VimwikiGet('path', idx), ':h:t') + for idx in range(vimwiki#vars#number_of_wikis()) + let norm_path = fnamemodify(vimwiki#vars#get_wikilocal('path', idx), ':h:t') let norm_path = escape(norm_path, '\ \.') execute 'menu '.a:topmenu.'.Open\ index.'.norm_path. - \ ' :call vimwiki#base#goto_index('.(idx + 1).')<CR>' + \ ' :call vimwiki#base#goto_index('.(idx+1).')<CR>' execute 'menu '.a:topmenu.'.Open/Create\ diary\ note.'.norm_path. - \ ' :call vimwiki#diary#make_note('.(idx + 1).')<CR>' - let idx += 1 - endwhile + \ ' :call vimwiki#diary#make_note('.(idx+1).')<CR>' + endfor endfunction function! s:build_table_menu(topmenu) @@ -539,23 +350,23 @@ function! s:build_table_menu(topmenu) exe 'menu '.a:topmenu.'.Table.Create\ (enter\ cols\ rows) :VimwikiTable ' exe 'nmenu '.a:topmenu.'.Table.Format<tab>gqq gqq' exe 'nmenu '.a:topmenu.'.Table.Move\ column\ left<tab><A-Left> :VimwikiTableMoveColumnLeft<CR>' - exe 'nmenu '.a:topmenu.'.Table.Move\ column\ right<tab><A-Right> :VimwikiTableMoveColumnRight<CR>' + exe 'nmenu '.a:topmenu. + \ '.Table.Move\ column\ right<tab><A-Right> :VimwikiTableMoveColumnRight<CR>' exe 'nmenu disable '.a:topmenu.'.Table' endfunction -"XXX make sure anything below does not cause autoload/base to be loaded -if !empty(g:vimwiki_menu) - call s:build_menu(g:vimwiki_menu) - call s:build_table_menu(g:vimwiki_menu) + +if !empty(vimwiki#vars#get_global('menu')) + call s:build_menu(vimwiki#vars#get_global('menu')) + call s:build_table_menu(vimwiki#vars#get_global('menu')) endif -" }}} -" CALENDAR Hook "{{{ -if g:vimwiki_use_calendar + +" Hook for calendar.vim +if vimwiki#vars#get_global('use_calendar') let g:calendar_action = 'vimwiki#diary#calendar_action' let g:calendar_sign = 'vimwiki#diary#calendar_sign' endif -"}}} let &cpo = s:old_cpo diff --git a/syntax/omnipresent_syntax.vim b/syntax/omnipresent_syntax.vim @@ -1,35 +0,0 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 -" Vimwiki syntax file -" Desc: Syntax definitions which are always available -" Home: https://github.com/vimwiki/vimwiki/ - - -" Define Regexes of anchors for every syntax. -" This has to be separated from vimwiki_default.vim, vimwiki_markdown.vim, etc. -" because the latter are only loaded and available if the current wiki has the -" corresponding syntax -let g:vimwiki_default_header_search = '^\s*\(=\{1,6}\)\([^=].*[^=]\)\1\s*$' -let g:vimwiki_default_header_match = '^\s*\(=\{1,6}\)=\@!\s*__Header__\s*\1=\@!\s*$' -let g:vimwiki_default_bold_search = '\%(^\|\s\|[[:punct:]]\)\@<=\*\zs\%([^*`[:space:]][^*`]*[^*`[:space:]]\|[^*`[:space:]]\)\ze\*\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_default_bold_match = '\%(^\|\s\|[[:punct:]]\)\@<=\*__Text__\*\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_default_wikilink = '\[\[\zs[^\\\]|]\+\ze\%(|[^\\\]]\+\)\?\]\]' -let g:vimwiki_default_tag_search = '\(^\|\s\)\zs:\([^:''[:space:]]\+:\)\+\ze\(\s\|$\)' -let g:vimwiki_default_tag_match = '\(^\|\s\):\([^:''[:space:]]\+:\)*__Tag__:\([^:[:space:]]\+:\)*\(\s\|$\)' - -let g:vimwiki_markdown_header_search = '^\s*\(#\{1,6}\)\([^#].*\)$' -let g:vimwiki_markdown_header_match = '^\s*\(#\{1,6}\)#\@!\s*__Header__\s*$' -let g:vimwiki_markdown_bold_search = '\%(^\|\s\|[[:punct:]]\)\@<=\*\zs\%([^*`[:space:]][^*`]*[^*`[:space:]]\|[^*`[:space:]]\)\ze\*\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_markdown_bold_match = '\%(^\|\s\|[[:punct:]]\)\@<=\*__Text__\*\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_markdown_wikilink = g:vimwiki_default_wikilink "XXX plus markdown-style links -let g:vimwiki_markdown_tag_search = g:vimwiki_default_tag_search -let g:vimwiki_markdown_tag_match = g:vimwiki_default_tag_match - -let g:vimwiki_media_header_search = '^\s*\(=\{1,6}\)\([^=].*[^=]\)\1\s*$' -let g:vimwiki_media_header_match = '^\s*\(=\{1,6}\)=\@!\s*__Header__\s*\1=\@!\s*$' -let g:vimwiki_media_bold_search = "'''\\zs[^']\\+\\ze'''" -let g:vimwiki_media_bold_match = '''''''__Text__''''''' -" ^- this strange looking thing is equivalent to "'''__Text__'''" but since we later -" want to call escape() on this string, we must keep it in single quotes -let g:vimwiki_media_wikilink = g:vimwiki_default_wikilink -let g:vimwiki_media_tag_search = g:vimwiki_default_tag_search " XXX rework to mediawiki categories format? -let g:vimwiki_media_tag_match = g:vimwiki_default_tag_match " XXX rework to mediawiki categories format? diff --git a/syntax/vimwiki.vim b/syntax/vimwiki.vim @@ -1,398 +1,242 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki syntax file " Home: https://github.com/vimwiki/vimwiki/ + " Quit if syntax file is already loaded -if version < 600 +if v:version < 600 syntax clear elseif exists("b:current_syntax") finish endif -"TODO do nothing if ...? (?) -if VimwikiGet('maxhi') - let b:existing_wikifiles = - \ vimwiki#base#get_wikilinks(g:vimwiki_current_idx, 1) - let b:existing_wikidirs = - \ vimwiki#base#get_wiki_directories(g:vimwiki_current_idx) -endif - "let b:xxx = 1 - "TODO ? update wikilink syntax group here if really needed (?) for :e and such - "if VimwikiGet('maxhi') - " ... - "endif - -" LINKS: assume this is common to all syntaxes "{{{ - -" LINKS: WebLinks {{{ -" match URL for common protocols; -" see http://en.wikipedia.org/wiki/URI_scheme http://tools.ietf.org/html/rfc3986 -let g:vimwiki_rxWebProtocols = ''. - \ '\%('. - \ '\%('. - \ '\%('.join(split(g:vimwiki_web_schemes1, '\s*,\s*'), '\|').'\):'. - \ '\%(//\)'. - \ '\)'. - \ '\|'. - \ '\%('.join(split(g:vimwiki_web_schemes2, '\s*,\s*'), '\|').'\):'. - \ '\)' -" -let g:vimwiki_rxWeblinkUrl = g:vimwiki_rxWebProtocols . - \ '\S\{-1,}'. '\%(([^ \t()]*)\)\=' -" }}} - -" }}} - -call vimwiki#u#reload_regexes() - -" LINKS: setup of larger regexes {{{ - -" LINKS: setup wikilink regexps {{{ -let s:wikilink_prefix = '[[' -let s:wikilink_suffix = ']]' -let s:wikilink_separator = '|' -let s:rx_wikilink_prefix = vimwiki#u#escape(s:wikilink_prefix) -let s:rx_wikilink_suffix = vimwiki#u#escape(s:wikilink_suffix) -let s:rx_wikilink_separator = vimwiki#u#escape(s:wikilink_separator) - -" templates for the creation of wiki links -" [[URL]] -let g:vimwiki_WikiLinkTemplate1 = s:wikilink_prefix . '__LinkUrl__'. - \ s:wikilink_suffix -" [[URL|DESCRIPTION]] -let g:vimwiki_WikiLinkTemplate2 = s:wikilink_prefix . '__LinkUrl__'. - \ s:wikilink_separator . '__LinkDescription__' . s:wikilink_suffix - -" template for matching all wiki links with a given target file -let g:vimwiki_WikiLinkMatchUrlTemplate = - \ s:rx_wikilink_prefix . - \ '\zs__LinkUrl__\ze\%(#.*\)\?' . - \ s:rx_wikilink_suffix . - \ '\|' . - \ s:rx_wikilink_prefix . - \ '\zs__LinkUrl__\ze\%(#.*\)\?' . - \ s:rx_wikilink_separator . - \ '.*' . - \ s:rx_wikilink_suffix - -let s:valid_chars = '[^\\\]]' -let g:vimwiki_rxWikiLinkUrl = s:valid_chars.'\{-}' -let g:vimwiki_rxWikiLinkDescr = s:valid_chars.'\{-}' - -" this regexp defines what can form a link when the user presses <CR> in the -" buffer (and not on a link) to create a link -" basically, it's Ascii alphanumeric characters plus #|./@-_~ plus all -" non-Ascii characters -let g:vimwiki_rxWord = '[^[:blank:]!"$%&''()*+,:;<=>?\[\]\\^`{}]\+' - - -" [[URL]], or [[URL|DESCRIPTION]] -" a) match [[URL|DESCRIPTION]] -let g:vimwiki_rxWikiLink = s:rx_wikilink_prefix. - \ g:vimwiki_rxWikiLinkUrl.'\%('.s:rx_wikilink_separator. - \ g:vimwiki_rxWikiLinkDescr.'\)\?'.s:rx_wikilink_suffix -" b) match URL within [[URL|DESCRIPTION]] -let g:vimwiki_rxWikiLinkMatchUrl = s:rx_wikilink_prefix. - \ '\zs'. g:vimwiki_rxWikiLinkUrl.'\ze\%('. s:rx_wikilink_separator. - \ g:vimwiki_rxWikiLinkDescr.'\)\?'.s:rx_wikilink_suffix -" c) match DESCRIPTION within [[URL|DESCRIPTION]] -let g:vimwiki_rxWikiLinkMatchDescr = s:rx_wikilink_prefix. - \ g:vimwiki_rxWikiLinkUrl.s:rx_wikilink_separator.'\%('. - \ '\zs'. g:vimwiki_rxWikiLinkDescr. '\ze\)\?'. s:rx_wikilink_suffix -" }}} - -" LINKS: Syntax helper {{{ -let s:rx_wikilink_prefix1 = s:rx_wikilink_prefix . g:vimwiki_rxWikiLinkUrl . - \ s:rx_wikilink_separator -let s:rx_wikilink_suffix1 = s:rx_wikilink_suffix -" }}} - - -" LINKS: setup of wikiincl regexps {{{ -let g:vimwiki_rxWikiInclPrefix = '{{' -let g:vimwiki_rxWikiInclSuffix = '}}' -let g:vimwiki_rxWikiInclSeparator = '|' -" -" '{{__LinkUrl__}}' -let g:vimwiki_WikiInclTemplate1 = g:vimwiki_rxWikiInclPrefix . '__LinkUrl__'. - \ g:vimwiki_rxWikiInclSuffix -" '{{__LinkUrl____LinkDescription__}}' -let g:vimwiki_WikiInclTemplate2 = g:vimwiki_rxWikiInclPrefix . '__LinkUrl__'. - \ '__LinkDescription__'. - \ g:vimwiki_rxWikiInclSuffix - - -let s:valid_chars = '[^\\\}]' -let g:vimwiki_rxWikiInclUrl = s:valid_chars.'\{-}' -let g:vimwiki_rxWikiInclArg = s:valid_chars.'\{-}' -let g:vimwiki_rxWikiInclArgs = '\%('. g:vimwiki_rxWikiInclSeparator. g:vimwiki_rxWikiInclArg. '\)'.'\{-}' -" -" -" *. {{URL}[{...}]} - i.e. {{URL}}, {{URL|ARG1}}, {{URL|ARG1|ARG2}}, etc. -" *a) match {{URL}[{...}]} -let g:vimwiki_rxWikiIncl = g:vimwiki_rxWikiInclPrefix. - \ g:vimwiki_rxWikiInclUrl. - \ g:vimwiki_rxWikiInclArgs. g:vimwiki_rxWikiInclSuffix -" *b) match URL within {{URL}[{...}]} -let g:vimwiki_rxWikiInclMatchUrl = g:vimwiki_rxWikiInclPrefix. - \ '\zs'. g:vimwiki_rxWikiInclUrl. '\ze'. - \ g:vimwiki_rxWikiInclArgs. g:vimwiki_rxWikiInclSuffix -" }}} - -" LINKS: Syntax helper {{{ -let g:vimwiki_rxWikiInclPrefix1 = g:vimwiki_rxWikiInclPrefix. - \ g:vimwiki_rxWikiInclUrl.g:vimwiki_rxWikiInclSeparator -let g:vimwiki_rxWikiInclSuffix1 = g:vimwiki_rxWikiInclArgs. - \ g:vimwiki_rxWikiInclSuffix -" }}} - -" LINKS: Setup weblink regexps {{{ -" 0. URL : free-standing links: keep URL UR(L) strip trailing punct: URL; URL) UR(L)) -" let g:vimwiki_rxWeblink = '[\["(|]\@<!'. g:vimwiki_rxWeblinkUrl . - " \ '\%([),:;.!?]\=\%([ \t]\|$\)\)\@=' -" Maxim: -" Simplify free-standing links: URL starts with non(letter|digit)scheme till -" the whitespace. -" Stuart, could you check it with markdown templated links? [](http://...), as -" the last bracket is the part of URL now? -let g:vimwiki_rxWeblink = '\<'. g:vimwiki_rxWeblinkUrl . '\S*' -" 0a) match URL within URL -let g:vimwiki_rxWeblinkMatchUrl = g:vimwiki_rxWeblink -" 0b) match DESCRIPTION within URL -let g:vimwiki_rxWeblinkMatchDescr = '' -" }}} - - -" LINKS: Setup anylink regexps {{{ -let g:vimwiki_rxAnyLink = g:vimwiki_rxWikiLink.'\|'. - \ g:vimwiki_rxWikiIncl.'\|'.g:vimwiki_rxWeblink -" }}} - - -" }}} end of Links - -" LINKS: highlighting is complicated due to "nonexistent" links feature {{{ -function! s:add_target_syntax_ON(target, type) " {{{ + +let s:current_syntax = vimwiki#vars#get_wikilocal('syntax') + + +call vimwiki#vars#populate_syntax_vars(s:current_syntax) + + +" LINKS: highlighting is complicated due to "nonexistent" links feature +function! s:add_target_syntax_ON(target, type) let prefix0 = 'syntax match '.a:type.' `' let suffix0 = '` display contains=@NoSpell,VimwikiLinkRest,'.a:type.'Char' let prefix1 = 'syntax match '.a:type.'T `' let suffix1 = '` display contained' execute prefix0. a:target. suffix0 execute prefix1. a:target. suffix1 -endfunction "}}} +endfunction + -function! s:add_target_syntax_OFF(target) " {{{ +function! s:add_target_syntax_OFF(target) let prefix0 = 'syntax match VimwikiNoExistsLink `' let suffix0 = '` display contains=@NoSpell,VimwikiLinkRest,VimwikiLinkChar' let prefix1 = 'syntax match VimwikiNoExistsLinkT `' let suffix1 = '` display contained' execute prefix0. a:target. suffix0 execute prefix1. a:target. suffix1 -endfunction "}}} +endfunction -function! s:highlight_existing_links() "{{{ + +function! s:highlight_existing_links() " Wikilink " Conditional highlighting that depends on the existence of a wiki file or " directory is only available for *schemeless* wiki links " Links are set up upon BufEnter (see plugin/...) - let safe_links = '\%('.vimwiki#base#file_pattern(b:existing_wikifiles) . - \ '\%(#[^|]*\)\?\|#[^|]*\)' + let safe_links = '\%('.vimwiki#base#file_pattern( + \ vimwiki#vars#get_bufferlocal('existing_wikifiles')) . '\%(#[^|]*\)\?\|#[^|]*\)' " Wikilink Dirs set up upon BufEnter (see plugin/...) - let safe_dirs = vimwiki#base#file_pattern(b:existing_wikidirs) + let safe_dirs = vimwiki#base#file_pattern(vimwiki#vars#get_bufferlocal('existing_wikidirs')) " match [[URL]] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLinkTemplate1), - \ safe_links, g:vimwiki_rxWikiLinkDescr, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiLinkTemplate1')), + \ safe_links, vimwiki#vars#get_global('rxWikiLinkDescr'), '') call s:add_target_syntax_ON(target, 'VimwikiLink') " match [[URL|DESCRIPTION]] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLinkTemplate2), - \ safe_links, g:vimwiki_rxWikiLinkDescr, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiLinkTemplate2')), + \ safe_links, vimwiki#vars#get_global('rxWikiLinkDescr'), '') call s:add_target_syntax_ON(target, 'VimwikiLink') " match {{URL}} let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiInclTemplate1), - \ safe_links, g:vimwiki_rxWikiInclArgs, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiInclTemplate1')), + \ safe_links, vimwiki#vars#get_global('rxWikiInclArgs'), '') call s:add_target_syntax_ON(target, 'VimwikiLink') " match {{URL|...}} let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiInclTemplate2), - \ safe_links, g:vimwiki_rxWikiInclArgs, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiInclTemplate2')), + \ safe_links, vimwiki#vars#get_global('rxWikiInclArgs'), '') call s:add_target_syntax_ON(target, 'VimwikiLink') " match [[DIRURL]] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLinkTemplate1), - \ safe_dirs, g:vimwiki_rxWikiLinkDescr, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiLinkTemplate1')), + \ safe_dirs, vimwiki#vars#get_global('rxWikiLinkDescr'), '') call s:add_target_syntax_ON(target, 'VimwikiLink') " match [[DIRURL|DESCRIPTION]] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLinkTemplate2), - \ safe_dirs, g:vimwiki_rxWikiLinkDescr, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiLinkTemplate2')), + \ safe_dirs, vimwiki#vars#get_global('rxWikiLinkDescr'), '') call s:add_target_syntax_ON(target, 'VimwikiLink') -endfunction "}}} +endfunction " use max highlighting - could be quite slow if there are too many wikifiles -if VimwikiGet('maxhi') +if vimwiki#vars#get_wikilocal('maxhi') " WikiLink - call s:add_target_syntax_OFF(g:vimwiki_rxWikiLink) + call s:add_target_syntax_OFF(vimwiki#vars#get_syntaxlocal('rxWikiLink')) " WikiIncl - call s:add_target_syntax_OFF(g:vimwiki_rxWikiIncl) + call s:add_target_syntax_OFF(vimwiki#vars#get_global('rxWikiIncl')) " Subsequently, links verified on vimwiki's path are highlighted as existing call s:highlight_existing_links() else " Wikilink - call s:add_target_syntax_ON(g:vimwiki_rxWikiLink, 'VimwikiLink') + call s:add_target_syntax_ON(vimwiki#vars#get_syntaxlocal('rxWikiLink'), 'VimwikiLink') " WikiIncl - call s:add_target_syntax_ON(g:vimwiki_rxWikiIncl, 'VimwikiLink') + call s:add_target_syntax_ON(vimwiki#vars#get_global('rxWikiIncl'), 'VimwikiLink') endif + " Weblink -call s:add_target_syntax_ON(g:vimwiki_rxWeblink, 'VimwikiLink') +call s:add_target_syntax_ON(vimwiki#vars#get_syntaxlocal('rxWeblink'), 'VimwikiLink') + " WikiLink " All remaining schemes are highlighted automatically let s:rxSchemes = '\%('. - \ join(split(g:vimwiki_schemes, '\s*,\s*'), '\|').'\|'. - \ join(split(g:vimwiki_web_schemes1, '\s*,\s*'), '\|'). + \ vimwiki#vars#get_global('schemes') . '\|'. + \ vimwiki#vars#get_global('web_schemes1'). \ '\):' " a) match [[nonwiki-scheme-URL]] let s:target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLinkTemplate1), - \ s:rxSchemes.g:vimwiki_rxWikiLinkUrl, g:vimwiki_rxWikiLinkDescr, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiLinkTemplate1')), + \ s:rxSchemes.vimwiki#vars#get_global('rxWikiLinkUrl'), + \ vimwiki#vars#get_global('rxWikiLinkDescr'), '') call s:add_target_syntax_ON(s:target, 'VimwikiLink') " b) match [[nonwiki-scheme-URL|DESCRIPTION]] let s:target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLinkTemplate2), - \ s:rxSchemes.g:vimwiki_rxWikiLinkUrl, g:vimwiki_rxWikiLinkDescr, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiLinkTemplate2')), + \ s:rxSchemes.vimwiki#vars#get_global('rxWikiLinkUrl'), + \ vimwiki#vars#get_global('rxWikiLinkDescr'), '') call s:add_target_syntax_ON(s:target, 'VimwikiLink') " a) match {{nonwiki-scheme-URL}} let s:target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiInclTemplate1), - \ s:rxSchemes.g:vimwiki_rxWikiInclUrl, g:vimwiki_rxWikiInclArgs, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiInclTemplate1')), + \ s:rxSchemes.vimwiki#vars#get_global('rxWikiInclUrl'), + \ vimwiki#vars#get_global('rxWikiInclArgs'), '') call s:add_target_syntax_ON(s:target, 'VimwikiLink') " b) match {{nonwiki-scheme-URL}[{...}]} let s:target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiInclTemplate2), - \ s:rxSchemes.g:vimwiki_rxWikiInclUrl, g:vimwiki_rxWikiInclArgs, '') + \ vimwiki#u#escape(vimwiki#vars#get_global('WikiInclTemplate2')), + \ s:rxSchemes.vimwiki#vars#get_global('rxWikiInclUrl'), + \ vimwiki#vars#get_global('rxWikiInclArgs'), '') call s:add_target_syntax_ON(s:target, 'VimwikiLink') -" }}} -" generic headers "{{{ -if g:vimwiki_symH - "" symmetric - for s:i in range(1,6) - let g:vimwiki_rxH{s:i}_Template = repeat(g:vimwiki_rxH, s:i).' __Header__ '.repeat(g:vimwiki_rxH, s:i) - let g:vimwiki_rxH{s:i} = '^\s*'.g:vimwiki_rxH.'\{'.s:i.'}[^'.g:vimwiki_rxH.'].*[^'.g:vimwiki_rxH.']'.g:vimwiki_rxH.'\{'.s:i.'}\s*$' - let g:vimwiki_rxH{s:i}_Start = '^\s*'.g:vimwiki_rxH.'\{'.s:i.'}[^'.g:vimwiki_rxH.'].*[^'.g:vimwiki_rxH.']'.g:vimwiki_rxH.'\{'.s:i.'}\s*$' - let g:vimwiki_rxH{s:i}_End = '^\s*'.g:vimwiki_rxH.'\{1,'.s:i.'}[^'.g:vimwiki_rxH.'].*[^'.g:vimwiki_rxH.']'.g:vimwiki_rxH.'\{1,'.s:i.'}\s*$' - endfor - let g:vimwiki_rxHeader = '^\s*\('.g:vimwiki_rxH.'\{1,6}\)\zs[^'.g:vimwiki_rxH.'].*[^'.g:vimwiki_rxH.']\ze\1\s*$' -else - " asymmetric - for s:i in range(1,6) - let g:vimwiki_rxH{s:i}_Template = repeat(g:vimwiki_rxH, s:i).' __Header__' - let g:vimwiki_rxH{s:i} = '^\s*'.g:vimwiki_rxH.'\{'.s:i.'}[^'.g:vimwiki_rxH.'].*$' - let g:vimwiki_rxH{s:i}_Start = '^\s*'.g:vimwiki_rxH.'\{'.s:i.'}[^'.g:vimwiki_rxH.'].*$' - let g:vimwiki_rxH{s:i}_End = '^\s*'.g:vimwiki_rxH.'\{1,'.s:i.'}[^'.g:vimwiki_rxH.'].*$' - endfor - let g:vimwiki_rxHeader = '^\s*\('.g:vimwiki_rxH.'\{1,6}\)\zs[^'.g:vimwiki_rxH.'].*\ze$' -endif " Header levels, 1-6 for s:i in range(1,6) - execute 'syntax match VimwikiHeader'.s:i.' /'.g:vimwiki_rxH{s:i}.'/ contains=VimwikiTodo,VimwikiHeaderChar,VimwikiNoExistsLink,VimwikiCode,VimwikiLink,@Spell' - execute 'syntax region VimwikiH'.s:i.'Folding start=/'.g:vimwiki_rxH{s:i}_Start. - \ '/ end=/'.g:vimwiki_rxH{s:i}_End.'/me=s-1 transparent fold' + execute 'syntax match VimwikiHeader'.s:i + \ . ' /'.vimwiki#vars#get_syntaxlocal('rxH'.s:i, s:current_syntax). + \ '/ contains=VimwikiTodo,VimwikiHeaderChar,VimwikiNoExistsLink,VimwikiCode,'. + \ 'VimwikiLink,@Spell' + execute 'syntax region VimwikiH'.s:i.'Folding start=/'. + \ vimwiki#vars#get_syntaxlocal('rxH'.s:i.'_Start', s:current_syntax).'/ end=/'. + \ vimwiki#vars#get_syntaxlocal('rxH'.s:i.'_End', s:current_syntax). + \ '/me=s-1 transparent fold' endfor -" }}} -let g:vimwiki_rxPreStart = '^\s*'.g:vimwiki_rxPreStart -let g:vimwiki_rxPreEnd = '^\s*'.g:vimwiki_rxPreEnd.'\s*$' +" possibly concealed chars +let s:conceal = exists("+conceallevel") ? ' conceal' : '' -let g:vimwiki_rxMathStart = '^\s*'.g:vimwiki_rxMathStart -let g:vimwiki_rxMathEnd = '^\s*'.g:vimwiki_rxMathEnd.'\s*$' +execute 'syn match VimwikiEqInChar contained /'. + \ vimwiki#vars#get_syntaxlocal('char_eqin').'/'.s:conceal +execute 'syn match VimwikiBoldChar contained /'. + \ vimwiki#vars#get_syntaxlocal('char_bold').'/'.s:conceal +execute 'syn match VimwikiItalicChar contained /'. + \ vimwiki#vars#get_syntaxlocal('char_italic').'/'.s:conceal +execute 'syn match VimwikiBoldItalicChar contained /'. + \ vimwiki#vars#get_syntaxlocal('char_bolditalic').'/'.s:conceal +execute 'syn match VimwikiItalicBoldChar contained /'. + \ vimwiki#vars#get_syntaxlocal('char_italicbold').'/'.s:conceal +execute 'syn match VimwikiCodeChar contained /'. + \ vimwiki#vars#get_syntaxlocal('char_code').'/'.s:conceal +execute 'syn match VimwikiDelTextChar contained /'. + \ vimwiki#vars#get_syntaxlocal('char_deltext').'/'.s:conceal +execute 'syn match VimwikiSuperScript contained /'. + \ vimwiki#vars#get_syntaxlocal('char_superscript').'/'.s:conceal +execute 'syn match VimwikiSubScript contained /'. + \ vimwiki#vars#get_syntaxlocal('char_subscript').'/'.s:conceal -" possibly concealed chars " {{{ -let s:conceal = exists("+conceallevel") ? ' conceal' : '' -execute 'syn match VimwikiEqInChar contained /'.g:vimwiki_char_eqin.'/'.s:conceal -execute 'syn match VimwikiBoldChar contained /'.g:vimwiki_char_bold.'/'.s:conceal -execute 'syn match VimwikiItalicChar contained /'.g:vimwiki_char_italic.'/'.s:conceal -execute 'syn match VimwikiBoldItalicChar contained /'.g:vimwiki_char_bolditalic.'/'.s:conceal -execute 'syn match VimwikiItalicBoldChar contained /'.g:vimwiki_char_italicbold.'/'.s:conceal -execute 'syn match VimwikiCodeChar contained /'.g:vimwiki_char_code.'/'.s:conceal -execute 'syn match VimwikiDelTextChar contained /'.g:vimwiki_char_deltext.'/'.s:conceal -execute 'syn match VimwikiSuperScript contained /'.g:vimwiki_char_superscript.'/'.s:conceal -execute 'syn match VimwikiSubScript contained /'.g:vimwiki_char_subscript.'/'.s:conceal -" }}} -" concealed link parts " {{{ -" define the conceal attribute for links only if Vim is new enough to handle it -" and the user has g:vimwiki_url_maxsave > 0 let s:options = ' contained transparent contains=NONE' -" + " A shortener for long URLs: LinkRest (a middle part of the URL) is concealed " VimwikiLinkRest group is left undefined if link shortening is not desired -if exists("+conceallevel") && g:vimwiki_url_maxsave > 0 +if exists("+conceallevel") && vimwiki#vars#get_global('url_maxsave') > 0 let s:options .= s:conceal execute 'syn match VimwikiLinkRest `\%(///\=[^/ \t]\+/\)\zs\S\+\ze' - \.'\%([/#?]\w\|\S\{'.g:vimwiki_url_maxsave.'}\)`'.' cchar=~'.s:options + \.'\%([/#?]\w\|\S\{'.vimwiki#vars#get_global('url_maxsave').'}\)`'.' cchar=~'.s:options endif " VimwikiLinkChar is for syntax markers (and also URL when a description " is present) and may be concealed " conceal wikilinks -execute 'syn match VimwikiLinkChar /'.s:rx_wikilink_prefix.'/'.s:options -execute 'syn match VimwikiLinkChar /'.s:rx_wikilink_suffix.'/'.s:options -execute 'syn match VimwikiLinkChar /'.s:rx_wikilink_prefix1.'/'.s:options -execute 'syn match VimwikiLinkChar /'.s:rx_wikilink_suffix1.'/'.s:options +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rx_wikilink_prefix').'/'.s:options +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rx_wikilink_suffix').'/'.s:options +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rx_wikilink_prefix1').'/'.s:options +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rx_wikilink_suffix1').'/'.s:options " conceal wikiincls -execute 'syn match VimwikiLinkChar /'.g:vimwiki_rxWikiInclPrefix.'/'.s:options -execute 'syn match VimwikiLinkChar /'.g:vimwiki_rxWikiInclSuffix.'/'.s:options -execute 'syn match VimwikiLinkChar /'.g:vimwiki_rxWikiInclPrefix1.'/'.s:options -execute 'syn match VimwikiLinkChar /'.g:vimwiki_rxWikiInclSuffix1.'/'.s:options -" }}} - -" non concealed chars " {{{ -execute 'syn match VimwikiHeaderChar contained /\%(^\s*'.g:vimwiki_rxH.'\+\)\|\%('.g:vimwiki_rxH.'\+\s*$\)/' -execute 'syn match VimwikiEqInCharT contained /'.g:vimwiki_char_eqin.'/' -execute 'syn match VimwikiBoldCharT contained /'.g:vimwiki_char_bold.'/' -execute 'syn match VimwikiItalicCharT contained /'.g:vimwiki_char_italic.'/' -execute 'syn match VimwikiBoldItalicCharT contained /'.g:vimwiki_char_bolditalic.'/' -execute 'syn match VimwikiItalicBoldCharT contained /'.g:vimwiki_char_italicbold.'/' -execute 'syn match VimwikiCodeCharT contained /'.g:vimwiki_char_code.'/' -execute 'syn match VimwikiDelTextCharT contained /'.g:vimwiki_char_deltext.'/' -execute 'syn match VimwikiSuperScriptT contained /'.g:vimwiki_char_superscript.'/' -execute 'syn match VimwikiSubScriptT contained /'.g:vimwiki_char_subscript.'/' - -" Emoticons -"syntax match VimwikiEmoticons /\%((.)\|:[()|$@]\|:-[DOPS()\]|$@]\|;)\|:'(\)/ - -let g:vimwiki_rxTodo = '\C\%(TODO:\|DONE:\|STARTED:\|FIXME:\|FIXED:\|XXX:\)' -execute 'syntax match VimwikiTodo /'. g:vimwiki_rxTodo .'/' -" }}} - -" main syntax groups {{{ +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rxWikiInclPrefix').'/'.s:options +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rxWikiInclSuffix').'/'.s:options +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rxWikiInclPrefix1').'/'.s:options +execute 'syn match VimwikiLinkChar /'.vimwiki#vars#get_global('rxWikiInclSuffix1').'/'.s:options + + +" non concealed chars +execute 'syn match VimwikiHeaderChar contained /\%(^\s*'. + \ vimwiki#vars#get_syntaxlocal('rxH').'\+\)\|\%('.vimwiki#vars#get_syntaxlocal('rxH'). + \ '\+\s*$\)/' +execute 'syn match VimwikiEqInCharT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_eqin').'/' +execute 'syn match VimwikiBoldCharT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_bold').'/' +execute 'syn match VimwikiItalicCharT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_italic').'/' +execute 'syn match VimwikiBoldItalicCharT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_bolditalic').'/' +execute 'syn match VimwikiItalicBoldCharT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_italicbold').'/' +execute 'syn match VimwikiCodeCharT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_code').'/' +execute 'syn match VimwikiDelTextCharT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_deltext').'/' +execute 'syn match VimwikiSuperScriptT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_superscript').'/' +execute 'syn match VimwikiSubScriptT contained /' + \ .vimwiki#vars#get_syntaxlocal('char_subscript').'/' + + +execute 'syntax match VimwikiTodo /'. vimwiki#vars#get_global('rxTodo') .'/' + + " Tables syntax match VimwikiTableRow /^\s*|.\+|\s*$/ \ transparent contains=VimwikiCellSeparator, \ VimwikiLinkT, \ VimwikiNoExistsLinkT, - \ VimwikiEmoticons, \ VimwikiTodo, \ VimwikiBoldT, \ VimwikiItalicT, @@ -407,82 +251,110 @@ syntax match VimwikiTableRow /^\s*|.\+|\s*$/ syntax match VimwikiCellSeparator \ /\%(|\)\|\%(-\@<=+\-\@=\)\|\%([|+]\@<=-\+\)/ contained + " Lists -execute 'syntax match VimwikiList /'.g:vimwiki_rxListItemWithoutCB.'/' -execute 'syntax match VimwikiList /'.g:vimwiki_rxListDefine.'/' -execute 'syntax match VimwikiListTodo /'.g:vimwiki_rxListItem.'/' - -if g:vimwiki_hl_cb_checked == 1 - execute 'syntax match VimwikiCheckBoxDone /'.g:vimwiki_rxListItemWithoutCB.'\s*\['.g:vimwiki_listsyms_list[-1].'\]\s.*$/ '. - \ 'contains=VimwikiNoExistsLink,VimwikiLink,@Spell' -elseif g:vimwiki_hl_cb_checked == 2 - execute 'syntax match VimwikiCheckBoxDone /'.g:vimwiki_rxListItemAndChildren.'/ contains=VimwikiNoExistsLink,VimwikiLink,@Spell' +execute 'syntax match VimwikiList /'.vimwiki#vars#get_syntaxlocal('rxListItemWithoutCB').'/' +execute 'syntax match VimwikiList /'.vimwiki#vars#get_syntaxlocal('rxListDefine').'/' +execute 'syntax match VimwikiListTodo /'.vimwiki#vars#get_syntaxlocal('rxListItem').'/' + +if vimwiki#vars#get_global('hl_cb_checked') == 1 + execute 'syntax match VimwikiCheckBoxDone /'.vimwiki#vars#get_syntaxlocal('rxListItemWithoutCB') + \ . '\s*\[['.vimwiki#vars#get_syntaxlocal('listsyms_list')[-1] + \ . vimwiki#vars#get_global('listsym_rejected') + \ . ']\]\s.*$/ contains=VimwikiNoExistsLink,VimwikiLink,@Spell' +elseif vimwiki#vars#get_global('hl_cb_checked') == 2 + execute 'syntax match VimwikiCheckBoxDone /' + \ . vimwiki#vars#get_syntaxlocal('rxListItemAndChildren') + \ .'/ contains=VimwikiNoExistsLink,VimwikiLink,@Spell' endif -execute 'syntax match VimwikiEqIn /'.g:vimwiki_rxEqIn.'/ contains=VimwikiEqInChar' -execute 'syntax match VimwikiEqInT /'.g:vimwiki_rxEqIn.'/ contained contains=VimwikiEqInCharT' +execute 'syntax match VimwikiEqIn /'.vimwiki#vars#get_syntaxlocal('rxEqIn'). + \ '/ contains=VimwikiEqInChar' +execute 'syntax match VimwikiEqInT /'.vimwiki#vars#get_syntaxlocal('rxEqIn'). + \ '/ contained contains=VimwikiEqInCharT' + +execute 'syntax match VimwikiBold /'.vimwiki#vars#get_syntaxlocal('rxBold'). + \ '/ contains=VimwikiBoldChar,@Spell' +execute 'syntax match VimwikiBoldT /'.vimwiki#vars#get_syntaxlocal('rxBold'). + \ '/ contained contains=VimwikiBoldCharT,@Spell' -execute 'syntax match VimwikiBold /'.g:vimwiki_rxBold.'/ contains=VimwikiBoldChar,@Spell' -execute 'syntax match VimwikiBoldT /'.g:vimwiki_rxBold.'/ contained contains=VimwikiBoldCharT,@Spell' +execute 'syntax match VimwikiItalic /'.vimwiki#vars#get_syntaxlocal('rxItalic'). + \ '/ contains=VimwikiItalicChar,@Spell' +execute 'syntax match VimwikiItalicT /'.vimwiki#vars#get_syntaxlocal('rxItalic'). + \ '/ contained contains=VimwikiItalicCharT,@Spell' -execute 'syntax match VimwikiItalic /'.g:vimwiki_rxItalic.'/ contains=VimwikiItalicChar,@Spell' -execute 'syntax match VimwikiItalicT /'.g:vimwiki_rxItalic.'/ contained contains=VimwikiItalicCharT,@Spell' +execute 'syntax match VimwikiBoldItalic /'.vimwiki#vars#get_syntaxlocal('rxBoldItalic'). + \ '/ contains=VimwikiBoldItalicChar,VimwikiItalicBoldChar,@Spell' +execute 'syntax match VimwikiBoldItalicT /'.vimwiki#vars#get_syntaxlocal('rxBoldItalic'). + \ '/ contained contains=VimwikiBoldItalicChatT,VimwikiItalicBoldCharT,@Spell' -execute 'syntax match VimwikiBoldItalic /'.g:vimwiki_rxBoldItalic.'/ contains=VimwikiBoldItalicChar,VimwikiItalicBoldChar,@Spell' -execute 'syntax match VimwikiBoldItalicT /'.g:vimwiki_rxBoldItalic.'/ contained contains=VimwikiBoldItalicChatT,VimwikiItalicBoldCharT,@Spell' +execute 'syntax match VimwikiItalicBold /'.vimwiki#vars#get_syntaxlocal('rxItalicBold'). + \ '/ contains=VimwikiBoldItalicChar,VimwikiItalicBoldChar,@Spell' +execute 'syntax match VimwikiItalicBoldT /'.vimwiki#vars#get_syntaxlocal('rxItalicBold'). + \ '/ contained contains=VimwikiBoldItalicCharT,VimsikiItalicBoldCharT,@Spell' -execute 'syntax match VimwikiItalicBold /'.g:vimwiki_rxItalicBold.'/ contains=VimwikiBoldItalicChar,VimwikiItalicBoldChar,@Spell' -execute 'syntax match VimwikiItalicBoldT /'.g:vimwiki_rxItalicBold.'/ contained contains=VimwikiBoldItalicCharT,VimsikiItalicBoldCharT,@Spell' +execute 'syntax match VimwikiDelText /'.vimwiki#vars#get_syntaxlocal('rxDelText'). + \ '/ contains=VimwikiDelTextChar,@Spell' +execute 'syntax match VimwikiDelTextT /'.vimwiki#vars#get_syntaxlocal('rxDelText'). + \ '/ contained contains=VimwikiDelTextChar,@Spell' -execute 'syntax match VimwikiDelText /'.g:vimwiki_rxDelText.'/ contains=VimwikiDelTextChar,@Spell' -execute 'syntax match VimwikiDelTextT /'.g:vimwiki_rxDelText.'/ contained contains=VimwikiDelTextChar,@Spell' +execute 'syntax match VimwikiSuperScript /'.vimwiki#vars#get_syntaxlocal('rxSuperScript'). + \ '/ contains=VimwikiSuperScriptChar,@Spell' +execute 'syntax match VimwikiSuperScriptT /'.vimwiki#vars#get_syntaxlocal('rxSuperScript'). + \ '/ contained contains=VimwikiSuperScriptCharT,@Spell' -execute 'syntax match VimwikiSuperScript /'.g:vimwiki_rxSuperScript.'/ contains=VimwikiSuperScriptChar,@Spell' -execute 'syntax match VimwikiSuperScriptT /'.g:vimwiki_rxSuperScript.'/ contained contains=VimwikiSuperScriptCharT,@Spell' +execute 'syntax match VimwikiSubScript /'.vimwiki#vars#get_syntaxlocal('rxSubScript'). + \ '/ contains=VimwikiSubScriptChar,@Spell' +execute 'syntax match VimwikiSubScriptT /'.vimwiki#vars#get_syntaxlocal('rxSubScript'). + \ '/ contained contains=VimwikiSubScriptCharT,@Spell' -execute 'syntax match VimwikiSubScript /'.g:vimwiki_rxSubScript.'/ contains=VimwikiSubScriptChar,@Spell' -execute 'syntax match VimwikiSubScriptT /'.g:vimwiki_rxSubScript.'/ contained contains=VimwikiSubScriptCharT,@Spell' +execute 'syntax match VimwikiCode /'.vimwiki#vars#get_syntaxlocal('rxCode'). + \ '/ contains=VimwikiCodeChar' +execute 'syntax match VimwikiCodeT /'.vimwiki#vars#get_syntaxlocal('rxCode'). + \ '/ contained contains=VimwikiCodeCharT' -execute 'syntax match VimwikiCode /'.g:vimwiki_rxCode.'/ contains=VimwikiCodeChar' -execute 'syntax match VimwikiCodeT /'.g:vimwiki_rxCode.'/ contained contains=VimwikiCodeCharT' " <hr> horizontal rule -execute 'syntax match VimwikiHR /'.g:vimwiki_rxHR.'/' +execute 'syntax match VimwikiHR /'.vimwiki#vars#get_syntaxlocal('rxHR').'/' -execute 'syntax region VimwikiPre start=/'.g:vimwiki_rxPreStart. - \ '/ end=/'.g:vimwiki_rxPreEnd.'/ contains=@Spell' +execute 'syntax region VimwikiPre start=/'.vimwiki#vars#get_syntaxlocal('rxPreStart'). + \ '/ end=/'.vimwiki#vars#get_syntaxlocal('rxPreEnd').'/ contains=@Spell' -execute 'syntax region VimwikiMath start=/'.g:vimwiki_rxMathStart. - \ '/ end=/'.g:vimwiki_rxMathEnd.'/ contains=@Spell' +execute 'syntax region VimwikiMath start=/'.vimwiki#vars#get_syntaxlocal('rxMathStart'). + \ '/ end=/'.vimwiki#vars#get_syntaxlocal('rxMathEnd').'/ contains=@Spell' " placeholders syntax match VimwikiPlaceholder /^\s*%nohtml\s*$/ -syntax match VimwikiPlaceholder /^\s*%title\ze\%(\s.*\)\?$/ nextgroup=VimwikiPlaceholderParam skipwhite -syntax match VimwikiPlaceholder /^\s*%date\ze\%(\s.*\)\?$/ nextgroup=VimwikiPlaceholderParam skipwhite -syntax match VimwikiPlaceholder /^\s*%template\ze\%(\s.*\)\?$/ nextgroup=VimwikiPlaceholderParam skipwhite +syntax match VimwikiPlaceholder + \ /^\s*%title\ze\%(\s.*\)\?$/ nextgroup=VimwikiPlaceholderParam skipwhite +syntax match VimwikiPlaceholder + \ /^\s*%date\ze\%(\s.*\)\?$/ nextgroup=VimwikiPlaceholderParam skipwhite +syntax match VimwikiPlaceholder + \ /^\s*%template\ze\%(\s.*\)\?$/ nextgroup=VimwikiPlaceholderParam skipwhite syntax match VimwikiPlaceholderParam /.*/ contained + " html tags -if g:vimwiki_valid_html_tags != '' - let s:html_tags = join(split(g:vimwiki_valid_html_tags, '\s*,\s*'), '\|') +if vimwiki#vars#get_global('valid_html_tags') != '' + let s:html_tags = join(split(vimwiki#vars#get_global('valid_html_tags'), '\s*,\s*'), '\|') exe 'syntax match VimwikiHTMLtag #\c</\?\%('.s:html_tags.'\)\%(\s\{-1}\S\{-}\)\{-}\s*/\?>#' execute 'syntax match VimwikiBold #\c<b>.\{-}</b># contains=VimwikiHTMLTag' execute 'syntax match VimwikiItalic #\c<i>.\{-}</i># contains=VimwikiHTMLTag' execute 'syntax match VimwikiUnderline #\c<u>.\{-}</u># contains=VimwikiHTMLTag' - execute 'syntax match VimwikiComment /'.g:vimwiki_rxComment.'/ contains=@Spell' + execute 'syntax match VimwikiComment /'.vimwiki#vars#get_syntaxlocal('rxComment'). + \ '/ contains=@Spell,VimwikiTodo' endif " tags -execute 'syntax match VimwikiTag /'.g:vimwiki_rxTags.'/' +execute 'syntax match VimwikiTag /'.vimwiki#vars#get_syntaxlocal('rxTags').'/' -" }}} -" header groups highlighting "{{{ -if g:vimwiki_hl_headers == 0 +" header groups highlighting +if vimwiki#vars#get_global('hl_headers') == 0 " Strangely in default colorscheme Title group is not set to bold for cterm... if !exists("g:colors_name") hi Title cterm=bold @@ -491,19 +363,14 @@ if g:vimwiki_hl_headers == 0 execute 'hi def link VimwikiHeader'.s:i.' Title' endfor else - " default colors when headers of different levels are highlighted differently - " not making it yet another option; needed by ColorScheme autocommand - let g:vimwiki_hcolor_guifg_light = ['#aa5858','#507030','#1030a0','#103040','#505050','#636363'] - let g:vimwiki_hcolor_ctermfg_light = ['DarkRed','DarkGreen','DarkBlue','Black','Black','Black'] - let g:vimwiki_hcolor_guifg_dark = ['#e08090','#80e090','#6090e0','#c0c0f0','#e0e0f0','#f0f0f0'] - let g:vimwiki_hcolor_ctermfg_dark = ['Red','Green','Blue','White','White','White'] for s:i in range(1,6) - execute 'hi def VimwikiHeader'.s:i.' guibg=bg guifg='.g:vimwiki_hcolor_guifg_{&bg}[s:i-1].' gui=bold ctermfg='.g:vimwiki_hcolor_ctermfg_{&bg}[s:i-1].' term=bold cterm=bold' + execute 'hi def VimwikiHeader'.s:i.' guibg=bg guifg=' + \ .vimwiki#vars#get_global('hcolor_guifg_'.&bg)[s:i-1].' gui=bold ctermfg=' + \ .vimwiki#vars#get_global('hcolor_ctermfg_'.&bg)[s:i-1].' term=bold cterm=bold' endfor endif -"}}} -" syntax group highlighting "{{{ + hi def link VimwikiMarkers Normal @@ -541,7 +408,6 @@ hi def link VimwikiLinkT VimwikiLink hi def link VimwikiList Identifier hi def link VimwikiListTodo VimwikiList hi def link VimwikiCheckBoxDone Comment -hi def link VimwikiEmoticons Character hi def link VimwikiHR Identifier hi def link VimwikiTag Keyword @@ -585,33 +451,37 @@ hi def link VimwikiCodeCharT VimwikiMarkers hi def link VimwikiHeaderCharT VimwikiMarkers hi def link VimwikiLinkCharT VimwikiLinkT hi def link VimwikiNoExistsLinkCharT VimwikiNoExistsLinkT -"}}} + " Load syntax-specific functionality call vimwiki#u#reload_regexes_custom() + " FIXME it now does not make sense to pretend there is a single syntax "vimwiki" let b:current_syntax="vimwiki" -" EMBEDDED syntax setup "{{{ -let s:nested = VimwikiGet('nested_syntaxes') -if VimwikiGet('automatic_nested_syntaxes') + +" EMBEDDED syntax setup +let s:nested = vimwiki#vars#get_wikilocal('nested_syntaxes') +if vimwiki#vars#get_wikilocal('automatic_nested_syntaxes') let s:nested = extend(s:nested, vimwiki#base#detect_nested_syntax(), "keep") endif if !empty(s:nested) for [s:hl_syntax, s:vim_syntax] in items(s:nested) call vimwiki#base#nested_syntax(s:vim_syntax, - \ g:vimwiki_rxPreStart.'\%(.*[[:blank:][:punct:]]\)\?'. + \ vimwiki#vars#get_syntaxlocal('rxPreStart').'\%(.*[[:blank:][:punct:]]\)\?'. \ s:hl_syntax.'\%([[:blank:][:punct:]].*\)\?', - \ g:vimwiki_rxPreEnd, 'VimwikiPre') + \ vimwiki#vars#get_syntaxlocal('rxPreEnd'), 'VimwikiPre') endfor endif + + " LaTeX call vimwiki#base#nested_syntax('tex', - \ g:vimwiki_rxMathStart.'\%(.*[[:blank:][:punct:]]\)\?'. + \ vimwiki#vars#get_syntaxlocal('rxMathStart').'\%(.*[[:blank:][:punct:]]\)\?'. \ '\%([[:blank:][:punct:]].*\)\?', - \ g:vimwiki_rxMathEnd, 'VimwikiMath') -"}}} + \ vimwiki#vars#get_syntaxlocal('rxMathEnd'), 'VimwikiMath') syntax spell toplevel + diff --git a/syntax/vimwiki_default.vim b/syntax/vimwiki_default.vim @@ -1,95 +1,110 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki syntax file -" Desc: Defines default syntax +" Description: Defines default syntax " Home: https://github.com/vimwiki/vimwiki/ + +" s:default_syntax is kind of a reference to the dict in +" g:vimwiki_syntax_variables['default']. It is used here simply as an +" abbreviation for the latter. +let s:default_syntax = g:vimwiki_syntax_variables['default'] + + + " text: $ equation_inline $ -let g:vimwiki_rxEqIn = '\$[^$`]\+\$' -let g:vimwiki_char_eqin = '\$' +let s:default_syntax.rxEqIn = '\$[^$`]\+\$' +let s:default_syntax.char_eqin = '\$' " text: *strong* -" let g:vimwiki_rxBold = '\*[^*]\+\*' -let g:vimwiki_rxBold = '\%(^\|\s\|[[:punct:]]\)\@<='. +" let s:default_syntax.rxBold = '\*[^*]\+\*' +let s:default_syntax.rxBold = '\%(^\|\s\|[[:punct:]]\)\@<='. \'\*'. \'\%([^*`[:space:]][^*`]*[^*`[:space:]]\|[^*`[:space:]]\)'. \'\*'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_bold = '*' +let s:default_syntax.char_bold = '*' " text: _emphasis_ -" let g:vimwiki_rxItalic = '_[^_]\+_' -let g:vimwiki_rxItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. +" let s:default_syntax.rxItalic = '_[^_]\+_' +let s:default_syntax.rxItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. \'_'. \'\%([^_`[:space:]][^_`]*[^_`[:space:]]\|[^_`[:space:]]\)'. \'_'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_italic = '_' +let s:default_syntax.char_italic = '_' " text: *_bold italic_* or _*italic bold*_ -let g:vimwiki_rxBoldItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. +let s:default_syntax.rxBoldItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. \'\*_'. \'\%([^*_`[:space:]][^*_`]*[^*_`[:space:]]\|[^*_`[:space:]]\)'. \'_\*'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_bolditalic = '\*_' +let s:default_syntax.char_bolditalic = '\*_' -let g:vimwiki_rxItalicBold = '\%(^\|\s\|[[:punct:]]\)\@<='. +let s:default_syntax.rxItalicBold = '\%(^\|\s\|[[:punct:]]\)\@<='. \'_\*'. \'\%([^*_`[:space:]][^*_`]*[^*_`[:space:]]\|[^*_`[:space:]]\)'. \'\*_'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_italicbold = '_\*' +let s:default_syntax.char_italicbold = '_\*' " text: `code` -let g:vimwiki_rxCode = '`[^`]\+`' -let g:vimwiki_char_code = '`' +let s:default_syntax.rxCode = '`[^`]\+`' +let s:default_syntax.char_code = '`' " text: ~~deleted text~~ -let g:vimwiki_rxDelText = '\~\~[^~`]\+\~\~' -let g:vimwiki_char_deltext = '\~\~' +let s:default_syntax.rxDelText = '\~\~[^~`]\+\~\~' +let s:default_syntax.char_deltext = '\~\~' " text: ^superscript^ -let g:vimwiki_rxSuperScript = '\^[^^`]\+\^' -let g:vimwiki_char_superscript = '^' +let s:default_syntax.rxSuperScript = '\^[^^`]\+\^' +let s:default_syntax.char_superscript = '^' " text: ,,subscript,, -let g:vimwiki_rxSubScript = ',,[^,`]\+,,' -let g:vimwiki_char_subscript = ',,' +let s:default_syntax.rxSubScript = ',,[^,`]\+,,' +let s:default_syntax.char_subscript = ',,' " generic headers -let g:vimwiki_rxH = '=' -let g:vimwiki_symH = 1 +let s:default_syntax.rxH = '=' +let s:default_syntax.symH = 1 " <hr>, horizontal rule -let g:vimwiki_rxHR = '^-----*$' +let s:default_syntax.rxHR = '^-----*$' " Tables. Each line starts and ends with '|'; each cell is separated by '|' -let g:vimwiki_rxTableSep = '|' +let s:default_syntax.rxTableSep = '|' " Lists -"1 means multiple bullets, like * ** *** -let g:vimwiki_bullet_types = { '-':0, '*':0, '#':0 } -let g:vimwiki_number_types = ['1)', '1.', 'i)', 'I)', 'a)', 'A)'] +let s:default_syntax.bullet_types = ['-', '*', '#'] +" 1 means the bullets can be repeatet to indicate the level, like * ** *** +" 0 means the bullets stand on their own and the level is indicated by the indentation +let s:default_syntax.recurring_bullets = 0 +let s:default_syntax.number_types = ['1)', '1.', 'i)', 'I)', 'a)', 'A)'] "this should contain at least one element "it is used for i_<C-L><C-J> among other things -let g:vimwiki_list_markers = ['-', '1.', '*', 'I)', 'a)'] -let g:vimwiki_rxListDefine = '::\(\s\|$\)' -call vimwiki#lst#setup_marker_infos() - -let g:vimwiki_rxListItemWithoutCB = '^\s*\%(\('.g:vimwiki_rxListBullet.'\)\|\('.g:vimwiki_rxListNumber.'\)\)\s' -let g:vimwiki_rxListItem = g:vimwiki_rxListItemWithoutCB . '\+\%(\[\(['.g:vimwiki_listsyms.']\)\]\s\)\?' -let g:vimwiki_rxListItemAndChildren = '^\(\s*\)\%('.g:vimwiki_rxListBullet.'\|'.g:vimwiki_rxListNumber.'\)\s\+\['.g:vimwiki_listsyms_list[-1].'\]\s.*\%(\n\%(\1\s.*\|^$\)\)*' +let s:default_syntax.list_markers = ['-', '1.', '*', 'I)', 'a)'] +let s:default_syntax.rxListDefine = '::\(\s\|$\)' " Preformatted text -let g:vimwiki_rxPreStart = '{{{' -let g:vimwiki_rxPreEnd = '}}}' +let s:default_syntax.rxPreStart = '{{{' +let s:default_syntax.rxPreEnd = '}}}' " Math block -let g:vimwiki_rxMathStart = '{{\$' -let g:vimwiki_rxMathEnd = '}}\$' - -let g:vimwiki_rxComment = '^\s*%%.*$' -let g:vimwiki_rxTags = '\%(^\|\s\)\@<=:\%([^:''[:space:]]\+:\)\+\%(\s\|$\)\@=' -" see also g:vimwiki_default_tag_search +let s:default_syntax.rxMathStart = '{{\$' +let s:default_syntax.rxMathEnd = '}}\$' + +let s:default_syntax.rxComment = '^\s*%%.*$' +let s:default_syntax.rxTags = '\%(^\|\s\)\@<=:\%([^:''[:space:]]\+:\)\+\%(\s\|$\)\@=' + +let s:default_syntax.header_search = '^\s*\(=\{1,6}\)\([^=].*[^=]\)\1\s*$' +let s:default_syntax.header_match = '^\s*\(=\{1,6}\)=\@!\s*__Header__\s*\1=\@!\s*$' +let s:default_syntax.bold_search = '\%(^\|\s\|[[:punct:]]\)\@<=\*\zs\%([^*`[:space:]][^*`]*'. + \ '[^*`[:space:]]\|[^*`[:space:]]\)\ze\*\%([[:punct:]]\|\s\|$\)\@=' +let s:default_syntax.bold_match = '\%(^\|\s\|[[:punct:]]\)\@<=\*__Text__\*'. + \ '\%([[:punct:]]\|\s\|$\)\@=' +let s:default_syntax.wikilink = '\[\[\zs[^\\\]|]\+\ze\%(|[^\\\]]\+\)\?\]\]' +let s:default_syntax.tag_search = '\(^\|\s\)\zs:\([^:''[:space:]]\+:\)\+\ze\(\s\|$\)' +let s:default_syntax.tag_match = '\(^\|\s\):\([^:''[:space:]]\+:\)*__Tag__:'. + \ '\([^:[:space:]]\+:\)*\(\s\|$\)' diff --git a/syntax/vimwiki_markdown.vim b/syntax/vimwiki_markdown.vim @@ -1,91 +1,104 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki syntax file -" Desc: Defines markdown syntax +" Description: Defines markdown syntax " Home: https://github.com/vimwiki/vimwiki/ + +" see the comments in vimwiki_default.vim for some info about this file + + +let s:markdown_syntax = g:vimwiki_syntax_variables['markdown'] + " text: $ equation_inline $ -let g:vimwiki_rxEqIn = '\$[^$`]\+\$' -let g:vimwiki_char_eqin = '\$' +let s:markdown_syntax.rxEqIn = '\$[^$`]\+\$' +let s:markdown_syntax.char_eqin = '\$' " text: *strong* -" let g:vimwiki_rxBold = '\*[^*]\+\*' -let g:vimwiki_rxBold = '\%(^\|\s\|[[:punct:]]\)\@<='. +" let s:markdown_syntax.rxBold = '\*[^*]\+\*' +let s:markdown_syntax.rxBold = '\%(^\|\s\|[[:punct:]]\)\@<='. \'\*'. \'\%([^*`[:space:]][^*`]*[^*`[:space:]]\|[^*`[:space:]]\)'. \'\*'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_bold = '*' +let s:markdown_syntax.char_bold = '*' " text: _emphasis_ -" let g:vimwiki_rxItalic = '_[^_]\+_' -let g:vimwiki_rxItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. +" let s:markdown_syntax.rxItalic = '_[^_]\+_' +let s:markdown_syntax.rxItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. \'_'. \'\%([^_`[:space:]][^_`]*[^_`[:space:]]\|[^_`[:space:]]\)'. \'_'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_italic = '_' +let s:markdown_syntax.char_italic = '_' " text: *_bold italic_* or _*italic bold*_ -let g:vimwiki_rxBoldItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. +let s:markdown_syntax.rxBoldItalic = '\%(^\|\s\|[[:punct:]]\)\@<='. \'\*_'. \'\%([^*_`[:space:]][^*_`]*[^*_`[:space:]]\|[^*_`[:space:]]\)'. \'_\*'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_bolditalic = '\*_' +let s:markdown_syntax.char_bolditalic = '\*_' -let g:vimwiki_rxItalicBold = '\%(^\|\s\|[[:punct:]]\)\@<='. +let s:markdown_syntax.rxItalicBold = '\%(^\|\s\|[[:punct:]]\)\@<='. \'_\*'. \'\%([^*_`[:space:]][^*_`]*[^*_`[:space:]]\|[^*_`[:space:]]\)'. \'\*_'. \'\%([[:punct:]]\|\s\|$\)\@=' -let g:vimwiki_char_italicbold = '_\*' +let s:markdown_syntax.char_italicbold = '_\*' " text: `code` -let g:vimwiki_rxCode = '`[^`]\+`' -let g:vimwiki_char_code = '`' +let s:markdown_syntax.rxCode = '`[^`]\+`' +let s:markdown_syntax.char_code = '`' " text: ~~deleted text~~ -let g:vimwiki_rxDelText = '\~\~[^~`]\+\~\~' -let g:vimwiki_char_deltext = '\~\~' +let s:markdown_syntax.rxDelText = '\~\~[^~`]\+\~\~' +let s:markdown_syntax.char_deltext = '\~\~' " text: ^superscript^ -let g:vimwiki_rxSuperScript = '\^[^^`]\+\^' -let g:vimwiki_char_superscript = '^' +let s:markdown_syntax.rxSuperScript = '\^[^^`]\+\^' +let s:markdown_syntax.char_superscript = '^' " text: ,,subscript,, -let g:vimwiki_rxSubScript = ',,[^,`]\+,,' -let g:vimwiki_char_subscript = ',,' +let s:markdown_syntax.rxSubScript = ',,[^,`]\+,,' +let s:markdown_syntax.char_subscript = ',,' " generic headers -let g:vimwiki_rxH = '#' -let g:vimwiki_symH = 0 +let s:markdown_syntax.rxH = '#' +let s:markdown_syntax.symH = 0 " <hr>, horizontal rule -let g:vimwiki_rxHR = '^-----*$' +let s:markdown_syntax.rxHR = '^-----*$' " Tables. Each line starts and ends with '|'; each cell is separated by '|' -let g:vimwiki_rxTableSep = '|' +let s:markdown_syntax.rxTableSep = '|' " Lists -let g:vimwiki_bullet_types = { '-':0, '*':0, '+':0 } -let g:vimwiki_number_types = ['1.'] -let g:vimwiki_list_markers = ['-', '*', '+', '1.'] -let g:vimwiki_rxListDefine = '::\%(\s\|$\)' -call vimwiki#lst#setup_marker_infos() - -let g:vimwiki_rxListItemWithoutCB = '^\s*\%(\('.g:vimwiki_rxListBullet.'\)\|\('.g:vimwiki_rxListNumber.'\)\)\s' -let g:vimwiki_rxListItem = g:vimwiki_rxListItemWithoutCB . '\+\%(\[\(['.g:vimwiki_listsyms.']\)\]\s\)\?' -let g:vimwiki_rxListItemAndChildren = '^\(\s*\)\%('.g:vimwiki_rxListBullet.'\|'.g:vimwiki_rxListNumber.'\)\s\+\['.g:vimwiki_listsyms_list[-1].'\]\s.*\%(\n\%(\1\s.*\|^$\)\)*' +let s:markdown_syntax.bullet_types = ['-', '*', '+'] +let s:markdown_syntax.recurring_bullets = 0 +let s:markdown_syntax.number_types = ['1.'] +let s:markdown_syntax.list_markers = ['-', '*', '+', '1.'] +let s:markdown_syntax.rxListDefine = '::\%(\s\|$\)' " Preformatted text -let g:vimwiki_rxPreStart = '```' -let g:vimwiki_rxPreEnd = '```' +let s:markdown_syntax.rxPreStart = '```' +let s:markdown_syntax.rxPreEnd = '```' " Math block -let g:vimwiki_rxMathStart = '\$\$' -let g:vimwiki_rxMathEnd = '\$\$' - -let g:vimwiki_rxComment = '^\s*%%.*$' -let g:vimwiki_rxTags = '\%(^\|\s\)\@<=:\%([^:[:space:]]\+:\)\+\%(\s\|$\)\@=' +let s:markdown_syntax.rxMathStart = '\$\$' +let s:markdown_syntax.rxMathEnd = '\$\$' + +let s:markdown_syntax.rxComment = '^\s*%%.*$\|<!--[^>]*-->' +let s:markdown_syntax.rxTags = '\%(^\|\s\)\@<=:\%([^:[:space:]]\+:\)\+\%(\s\|$\)\@=' + +let s:markdown_syntax.header_search = '^\s*\(#\{1,6}\)\([^#].*\)$' +let s:markdown_syntax.header_match = '^\s*\(#\{1,6}\)#\@!\s*__Header__\s*$' +let s:markdown_syntax.bold_search = '\%(^\|\s\|[[:punct:]]\)\@<=\*\zs'. + \ '\%([^*`[:space:]][^*`]*[^*`[:space:]]\|[^*`[:space:]]\)\ze\*\%([[:punct:]]\|\s\|$\)\@=' +let s:markdown_syntax.bold_match = '\%(^\|\s\|[[:punct:]]\)\@<=\*__Text__\*'. + \ '\%([[:punct:]]\|\s\|$\)\@=' +let s:markdown_syntax.wikilink = '\[\[\zs[^\\\]|]\+\ze\%(|[^\\\]]\+\)\?\]\]' +let s:markdown_syntax.tag_search = '\(^\|\s\)\zs:\([^:''[:space:]]\+:\)\+\ze\(\s\|$\)' +let s:markdown_syntax.tag_match = '\(^\|\s\):\([^:''[:space:]]\+:\)*__Tag__:'. + \ '\([^:[:space:]]\+:\)*\(\s\|$\)' diff --git a/syntax/vimwiki_markdown_custom.vim b/syntax/vimwiki_markdown_custom.vim @@ -1,329 +1,138 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 -" Vimwiki syntax file -" Desc: Special stuff for markdown syntax -" Home: https://github.com/vimwiki/vimwiki/ - -" LINKS: assume this is common to all syntaxes "{{{ - -" }}} - -" ------------------------------------------------------------------------- -" Load concrete Wiki syntax: sets regexes and templates for headers and links - -" ------------------------------------------------------------------------- - - - -" LINKS: setup of larger regexes {{{ - -" LINKS: setup wikilink0 regexps {{{ -" 0. [[URL]], or [[URL|DESCRIPTION]] - -" 0a) match [[URL|DESCRIPTION]] -let g:vimwiki_rxWikiLink0 = g:vimwiki_rxWikiLink -" 0b) match URL within [[URL|DESCRIPTION]] -let g:vimwiki_rxWikiLink0MatchUrl = g:vimwiki_rxWikiLinkMatchUrl -" 0c) match DESCRIPTION within [[URL|DESCRIPTION]] -let g:vimwiki_rxWikiLink0MatchDescr = g:vimwiki_rxWikiLinkMatchDescr -" }}} - -" LINKS: setup wikilink1 regexps {{{ -" 1. [URL][], or [DESCRIPTION][URL] - -let s:wikilink_md_prefix = '[' -let s:wikilink_md_suffix = ']' -let s:wikilink_md_separator = '][' -let s:rx_wikilink_md_prefix = vimwiki#u#escape(s:wikilink_md_prefix) -let s:rx_wikilink_md_suffix = vimwiki#u#escape(s:wikilink_md_suffix) -let s:rx_wikilink_md_separator = vimwiki#u#escape(s:wikilink_md_separator) - -" [URL][] -let g:vimwiki_WikiLink1Template1 = s:wikilink_md_prefix . '__LinkUrl__'. - \ s:wikilink_md_separator. s:wikilink_md_suffix -" [DESCRIPTION][URL] -let g:vimwiki_WikiLink1Template2 = s:wikilink_md_prefix. '__LinkDescription__'. - \ s:wikilink_md_separator. '__LinkUrl__'. - \ s:wikilink_md_suffix -" -let g:vimwiki_WikiLinkMatchUrlTemplate .= - \ '\|' . - \ s:rx_wikilink_md_prefix . - \ '.*' . - \ s:rx_wikilink_md_separator . - \ '\zs__LinkUrl__\ze\%(#.*\)\?' . - \ s:rx_wikilink_md_suffix . - \ '\|' . - \ s:rx_wikilink_md_prefix . - \ '\zs__LinkUrl__\ze\%(#.*\)\?' . - \ s:rx_wikilink_md_separator . - \ s:rx_wikilink_md_suffix - -let s:valid_chars = '[^\\\[\]]' -let g:vimwiki_rxWikiLink1Url = s:valid_chars.'\{-}' -let g:vimwiki_rxWikiLink1Descr = s:valid_chars.'\{-}' - -let g:vimwiki_rxWikiLink1InvalidPrefix = '[\]\[]\@<!' -let g:vimwiki_rxWikiLink1InvalidSuffix = '[\]\[]\@!' -let s:rx_wikilink_md_prefix = g:vimwiki_rxWikiLink1InvalidPrefix. - \ s:rx_wikilink_md_prefix -let s:rx_wikilink_md_suffix = s:rx_wikilink_md_suffix. - \ g:vimwiki_rxWikiLink1InvalidSuffix - -" -" 1. [URL][], [DESCRIPTION][URL] -" 1a) match [URL][], [DESCRIPTION][URL] -let g:vimwiki_rxWikiLink1 = s:rx_wikilink_md_prefix. - \ g:vimwiki_rxWikiLink1Url. s:rx_wikilink_md_separator. - \ s:rx_wikilink_md_suffix. - \ '\|'. s:rx_wikilink_md_prefix. - \ g:vimwiki_rxWikiLink1Descr.s:rx_wikilink_md_separator. - \ g:vimwiki_rxWikiLink1Url.s:rx_wikilink_md_suffix -" 1b) match URL within [URL][], [DESCRIPTION][URL] -let g:vimwiki_rxWikiLink1MatchUrl = s:rx_wikilink_md_prefix. - \ '\zs'. g:vimwiki_rxWikiLink1Url. '\ze'. s:rx_wikilink_md_separator. - \ s:rx_wikilink_md_suffix. - \ '\|'. s:rx_wikilink_md_prefix. - \ g:vimwiki_rxWikiLink1Descr. s:rx_wikilink_md_separator. - \ '\zs'. g:vimwiki_rxWikiLink1Url. '\ze'. s:rx_wikilink_md_suffix -" 1c) match DESCRIPTION within [DESCRIPTION][URL] -let g:vimwiki_rxWikiLink1MatchDescr = s:rx_wikilink_md_prefix. - \ '\zs'. g:vimwiki_rxWikiLink1Descr.'\ze'. s:rx_wikilink_md_separator. - \ g:vimwiki_rxWikiLink1Url.s:rx_wikilink_md_suffix -" }}} - -" LINKS: Syntax helper {{{ -let g:vimwiki_rxWikiLink1Prefix1 = s:rx_wikilink_md_prefix -let g:vimwiki_rxWikiLink1Suffix1 = s:rx_wikilink_md_separator. - \ g:vimwiki_rxWikiLink1Url.s:rx_wikilink_md_suffix -" }}} - -" *. ANY wikilink {{{ -" *a) match ANY wikilink -let g:vimwiki_rxWikiLink = ''. - \ g:vimwiki_rxWikiLink0.'\|'. - \ g:vimwiki_rxWikiLink1 -" *b) match URL within ANY wikilink -let g:vimwiki_rxWikiLinkMatchUrl = ''. - \ g:vimwiki_rxWikiLink0MatchUrl.'\|'. - \ g:vimwiki_rxWikiLink1MatchUrl -" *c) match DESCRIPTION within ANY wikilink -let g:vimwiki_rxWikiLinkMatchDescr = ''. - \ g:vimwiki_rxWikiLink0MatchDescr.'\|'. - \ g:vimwiki_rxWikiLink1MatchDescr -" }}} - -" LINKS: setup of wikiincl regexps {{{ -" }}} - -" LINKS: Syntax helper {{{ -" }}} - -" LINKS: Setup weblink0 regexps {{{ -" 0. URL : free-standing links: keep URL UR(L) strip trailing punct: URL; URL) UR(L)) -let g:vimwiki_rxWeblink0 = g:vimwiki_rxWeblink -" 0a) match URL within URL -let g:vimwiki_rxWeblinkMatchUrl0 = g:vimwiki_rxWeblinkMatchUrl -" 0b) match DESCRIPTION within URL -let g:vimwiki_rxWeblinkMatchDescr0 = g:vimwiki_rxWeblinkMatchDescr -" }}} - -" LINKS: Setup weblink1 regexps {{{ -let g:vimwiki_rxWeblink1Prefix = '[' -let g:vimwiki_rxWeblink1Suffix = ')' -let g:vimwiki_rxWeblink1Separator = '](' -" [DESCRIPTION](URL) -let g:vimwiki_Weblink1Template = g:vimwiki_rxWeblink1Prefix . '__LinkDescription__'. - \ g:vimwiki_rxWeblink1Separator. '__LinkUrl__'. - \ g:vimwiki_rxWeblink1Suffix - -let s:valid_chars = '[^\\]' - -let g:vimwiki_rxWeblink1Prefix = vimwiki#u#escape(g:vimwiki_rxWeblink1Prefix) -let g:vimwiki_rxWeblink1Suffix = vimwiki#u#escape(g:vimwiki_rxWeblink1Suffix) -let g:vimwiki_rxWeblink1Separator = vimwiki#u#escape(g:vimwiki_rxWeblink1Separator) -let g:vimwiki_rxWeblink1Url = s:valid_chars.'\{-}' -let g:vimwiki_rxWeblink1Descr = s:valid_chars.'\{-}' - -" -" " 2012-02-04 TODO not starting with [[ or ][ ? ... prefix = '[\[\]]\@<!\[' -" 1. [DESCRIPTION](URL) -" 1a) match [DESCRIPTION](URL) -let g:vimwiki_rxWeblink1 = g:vimwiki_rxWeblink1Prefix. - \ g:vimwiki_rxWeblink1Url.g:vimwiki_rxWeblink1Separator. - \ g:vimwiki_rxWeblink1Descr.g:vimwiki_rxWeblink1Suffix -" 1b) match URL within [DESCRIPTION](URL) -let g:vimwiki_rxWeblink1MatchUrl = g:vimwiki_rxWeblink1Prefix. - \ g:vimwiki_rxWeblink1Descr. g:vimwiki_rxWeblink1Separator. - \ '\zs'.g:vimwiki_rxWeblink1Url.'\ze'. g:vimwiki_rxWeblink1Suffix -" 1c) match DESCRIPTION within [DESCRIPTION](URL) -let g:vimwiki_rxWeblink1MatchDescr = g:vimwiki_rxWeblink1Prefix. - \ '\zs'.g:vimwiki_rxWeblink1Descr.'\ze'. g:vimwiki_rxWeblink1Separator. - \ g:vimwiki_rxWeblink1Url. g:vimwiki_rxWeblink1Suffix -" }}} - -" Syntax helper {{{ -" TODO: image links too !! -" let g:vimwiki_rxWeblink1Prefix1 = '!\?'. g:vimwiki_rxWeblink1Prefix -let g:vimwiki_rxWeblink1Prefix1 = g:vimwiki_rxWeblink1Prefix -let g:vimwiki_rxWeblink1Suffix1 = g:vimwiki_rxWeblink1Separator. - \ g:vimwiki_rxWeblink1Url.g:vimwiki_rxWeblink1Suffix -" }}} - -" *. ANY weblink {{{ -" *a) match ANY weblink -let g:vimwiki_rxWeblink = ''. - \ g:vimwiki_rxWeblink1.'\|'. - \ g:vimwiki_rxWeblink0 -" *b) match URL within ANY weblink -let g:vimwiki_rxWeblinkMatchUrl = ''. - \ g:vimwiki_rxWeblink1MatchUrl.'\|'. - \ g:vimwiki_rxWeblinkMatchUrl0 -" *c) match DESCRIPTION within ANY weblink -let g:vimwiki_rxWeblinkMatchDescr = ''. - \ g:vimwiki_rxWeblink1MatchDescr.'\|'. - \ g:vimwiki_rxWeblinkMatchDescr0 -" }}} - - -" LINKS: Setup anylink regexps {{{ -let g:vimwiki_rxAnyLink = g:vimwiki_rxWikiLink.'\|'. - \ g:vimwiki_rxWikiIncl.'\|'.g:vimwiki_rxWeblink -" }}} - - -" LINKS: setup wikilink1 reference link definitions {{{ -let g:vimwiki_rxMkdRef = '\['.g:vimwiki_rxWikiLinkDescr.']:\%(\s\+\|\n\)'. - \ g:vimwiki_rxWeblink0 -let g:vimwiki_rxMkdRefMatchDescr = '\[\zs'.g:vimwiki_rxWikiLinkDescr.'\ze]:\%(\s\+\|\n\)'. - \ g:vimwiki_rxWeblink0 -let g:vimwiki_rxMkdRefMatchUrl = '\['.g:vimwiki_rxWikiLinkDescr.']:\%(\s\+\|\n\)\zs'. - \ g:vimwiki_rxWeblink0.'\ze' -" }}} - -" }}} end of Links - -" LINKS: highlighting is complicated due to "nonexistent" links feature {{{ -function! s:add_target_syntax_ON(target, type) " {{{ + + + + + + +function! s:add_target_syntax_ON(target, type) let prefix0 = 'syntax match '.a:type.' `' let suffix0 = '` display contains=@NoSpell,VimwikiLinkRest,'.a:type.'Char' let prefix1 = 'syntax match '.a:type.'T `' let suffix1 = '` display contained' execute prefix0. a:target. suffix0 execute prefix1. a:target. suffix1 -endfunction "}}} +endfunction -function! s:add_target_syntax_OFF(target, type) " {{{ + +function! s:add_target_syntax_OFF(target, type) let prefix0 = 'syntax match VimwikiNoExistsLink `' let suffix0 = '` display contains=@NoSpell,VimwikiLinkRest,'.a:type.'Char' let prefix1 = 'syntax match VimwikiNoExistsLinkT `' let suffix1 = '` display contained' execute prefix0. a:target. suffix0 execute prefix1. a:target. suffix1 -endfunction "}}} +endfunction + -function! s:wrap_wikilink1_rx(target) "{{{ - return g:vimwiki_rxWikiLink1InvalidPrefix.a:target. - \ g:vimwiki_rxWikiLink1InvalidSuffix -endfunction "}}} +function! s:wrap_wikilink1_rx(target) + return vimwiki#vars#get_syntaxlocal('rxWikiLink1InvalidPrefix') . a:target. + \ vimwiki#vars#get_syntaxlocal('rxWikiLink1InvalidSuffix') +endfunction -function! s:existing_mkd_refs() "{{{ - call vimwiki#markdown_base#reset_mkd_refs() - return keys(vimwiki#markdown_base#get_reflinks()) -endfunction "}}} -function! s:highlight_existing_links() "{{{ +function! s:existing_mkd_refs() + return keys(vimwiki#markdown_base#scan_reflinks()) +endfunction + + +function! s:highlight_existing_links() " Wikilink1 " Conditional highlighting that depends on the existence of a wiki file or " directory is only available for *schemeless* wiki links " Links are set up upon BufEnter (see plugin/...) - let safe_links = '\%('.vimwiki#base#file_pattern(b:existing_wikifiles) . + let safe_links = '\%('. + \ vimwiki#base#file_pattern(vimwiki#vars#get_bufferlocal('existing_wikifiles')) . \ '\%(#[^|]*\)\?\|#[^|]*\)' " Wikilink1 Dirs set up upon BufEnter (see plugin/...) - let safe_dirs = vimwiki#base#file_pattern(b:existing_wikidirs) + let safe_dirs = vimwiki#base#file_pattern(vimwiki#vars#get_bufferlocal('existing_wikidirs')) " Ref links are cached let safe_reflinks = vimwiki#base#file_pattern(s:existing_mkd_refs()) " match [URL][] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template1), - \ safe_links, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template1')), + \ safe_links, vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(target), 'VimwikiWikiLink1') " match [DESCRIPTION][URL] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template2), - \ safe_links, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template2')), + \ safe_links, vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(target), 'VimwikiWikiLink1') " match [DIRURL][] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template1), - \ safe_dirs, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template1')), + \ safe_dirs, vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(target), 'VimwikiWikiLink1') " match [DESCRIPTION][DIRURL] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template2), - \ safe_dirs, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template2')), + \ safe_dirs, vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(target), 'VimwikiWikiLink1') " match [MKDREF][] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template1), - \ safe_reflinks, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template1')), + \ safe_reflinks, vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(target), 'VimwikiWikiLink1') " match [DESCRIPTION][MKDREF] let target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template2), - \ safe_reflinks, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template2')), + \ safe_reflinks, vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(target), 'VimwikiWikiLink1') -endfunction "}}} +endfunction " use max highlighting - could be quite slow if there are too many wikifiles -if VimwikiGet('maxhi') +if vimwiki#vars#get_wikilocal('maxhi') " WikiLink - call s:add_target_syntax_OFF(g:vimwiki_rxWikiLink1, 'VimwikiWikiLink1') + call s:add_target_syntax_OFF(vimwiki#vars#get_syntaxlocal('rxWikiLink1'), 'VimwikiWikiLink1') " Subsequently, links verified on vimwiki's path are highlighted as existing call s:highlight_existing_links() else " Wikilink - call s:add_target_syntax_ON(g:vimwiki_rxWikiLink1, 'VimwikiWikiLink1') + call s:add_target_syntax_ON(vimwiki#vars#get_syntaxlocal('rxWikiLink1'), 'VimwikiWikiLink1') endif + " Weblink -call s:add_target_syntax_ON(g:vimwiki_rxWeblink1, 'VimwikiWeblink1') +call s:add_target_syntax_ON(vimwiki#vars#get_syntaxlocal('rxWeblink1'), 'VimwikiWeblink1') + " WikiLink " All remaining schemes are highlighted automatically let s:rxSchemes = '\%('. - \ join(split(g:vimwiki_schemes, '\s*,\s*'), '\|').'\|'. - \ join(split(g:vimwiki_web_schemes1, '\s*,\s*'), '\|'). + \ vimwiki#vars#get_global('schemes') . '\|'. + \ vimwiki#vars#get_global('web_schemes1'). \ '\):' " a) match [nonwiki-scheme-URL] let s:target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template1), - \ s:rxSchemes.g:vimwiki_rxWikiLink1Url, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template1')), + \ s:rxSchemes . vimwiki#vars#get_syntaxlocal('rxWikiLink1Url'), + \ vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(s:target), 'VimwikiWikiLink1') " b) match [DESCRIPTION][nonwiki-scheme-URL] let s:target = vimwiki#base#apply_template( - \ vimwiki#u#escape(g:vimwiki_WikiLink1Template2), - \ s:rxSchemes.g:vimwiki_rxWikiLink1Url, g:vimwiki_rxWikiLink1Descr, '') + \ vimwiki#u#escape(vimwiki#vars#get_syntaxlocal('WikiLink1Template2')), + \ s:rxSchemes . vimwiki#vars#get_syntaxlocal('rxWikiLink1Url'), + \ vimwiki#vars#get_syntaxlocal('rxWikiLink1Descr'), '') call s:add_target_syntax_ON(s:wrap_wikilink1_rx(s:target), 'VimwikiWikiLink1') -" }}} -" generic headers "{{{ " Header levels, 1-6 for s:i in range(1,6) - execute 'syntax match VimwikiHeader'.s:i.' /'.g:vimwiki_rxH{s:i}.'/ contains=VimwikiTodo,VimwikiHeaderChar,VimwikiNoExistsLink,VimwikiCode,VimwikiLink,VimwikiWeblink1,VimwikiWikiLink1,@Spell' + execute 'syntax match VimwikiHeader'.s:i.' /'.vimwiki#vars#get_syntaxlocal('rxH'.s:i). + \ '/ contains=VimwikiTodo,VimwikiHeaderChar,VimwikiNoExistsLink,VimwikiCode,'. + \ 'VimwikiLink,VimwikiWeblink1,VimwikiWikiLink1,@Spell' endfor -" }}} -" concealed chars " {{{ + +" concealed chars if exists("+conceallevel") syntax conceal on endif @@ -334,24 +143,26 @@ syntax spell toplevel " is present) and may be concealed let s:options = ' contained transparent contains=NONE' " conceal wikilink1 -execute 'syn match VimwikiWikiLink1Char /'.s:rx_wikilink_md_prefix.'/'.s:options -execute 'syn match VimwikiWikiLink1Char /'.s:rx_wikilink_md_suffix.'/'.s:options -execute 'syn match VimwikiWikiLink1Char /'.g:vimwiki_rxWikiLink1Prefix1.'/'.s:options -execute 'syn match VimwikiWikiLink1Char /'.g:vimwiki_rxWikiLink1Suffix1.'/'.s:options +execute 'syn match VimwikiWikiLink1Char /'. + \ vimwiki#vars#get_syntaxlocal('rx_wikilink_md_prefix').'/'.s:options +execute 'syn match VimwikiWikiLink1Char /'. + \ vimwiki#vars#get_syntaxlocal('rx_wikilink_md_suffix').'/'.s:options +execute 'syn match VimwikiWikiLink1Char /'. + \ vimwiki#vars#get_syntaxlocal('rxWikiLink1Prefix1').'/'.s:options +execute 'syn match VimwikiWikiLink1Char /'. + \ vimwiki#vars#get_syntaxlocal('rxWikiLink1Suffix1').'/'.s:options " conceal weblink1 -execute 'syn match VimwikiWeblink1Char "'.g:vimwiki_rxWeblink1Prefix1.'"'.s:options -execute 'syn match VimwikiWeblink1Char "'.g:vimwiki_rxWeblink1Suffix1.'"'.s:options +execute 'syn match VimwikiWeblink1Char "'. + \ vimwiki#vars#get_syntaxlocal('rxWeblink1Prefix1').'"'.s:options +execute 'syn match VimwikiWeblink1Char "'. + \ vimwiki#vars#get_syntaxlocal('rxWeblink1Suffix1').'"'.s:options if exists("+conceallevel") syntax conceal off endif -" }}} -" non concealed chars " {{{ -" }}} -" main syntax groups {{{ " Tables syntax match VimwikiTableRow /^\s*|.\+|\s*$/ @@ -360,7 +171,6 @@ syntax match VimwikiTableRow /^\s*|.\+|\s*$/ \ VimwikiWeblink1T, \ VimwikiWikiLink1T, \ VimwikiNoExistsLinkT, - \ VimwikiEmoticons, \ VimwikiTodo, \ VimwikiBoldT, \ VimwikiItalicT, @@ -373,22 +183,12 @@ syntax match VimwikiTableRow /^\s*|.\+|\s*$/ \ VimwikiEqInT, \ @Spell -" }}} - -" header groups highlighting "{{{ -"}}} -" syntax group highlighting "{{{ +" syntax group highlighting hi def link VimwikiWeblink1 VimwikiLink hi def link VimwikiWeblink1T VimwikiLink hi def link VimwikiWikiLink1 VimwikiLink hi def link VimwikiWikiLink1T VimwikiLink -"}}} - - -" EMBEDDED syntax setup "{{{ -"}}} -" diff --git a/syntax/vimwiki_media.vim b/syntax/vimwiki_media.vim @@ -1,72 +1,85 @@ -" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79 +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 " Vimwiki syntax file -" Desc: Defines mediaWiki syntax +" Description: Defines mediaWiki syntax " Home: https://github.com/vimwiki/vimwiki/ + +" see the comments in vimwiki_default.vim for some info about this file + + +let s:media_syntax = g:vimwiki_syntax_variables['media'] + " text: $ equation_inline $ -let g:vimwiki_rxEqIn = '\$[^$`]\+\$' -let g:vimwiki_char_eqin = '\$' +let s:media_syntax.rxEqIn = '\$[^$`]\+\$' +let s:media_syntax.char_eqin = '\$' " text: '''strong''' -let g:vimwiki_rxBold = "'''[^']\\+'''" -let g:vimwiki_char_bold = "'''" +let s:media_syntax.rxBold = "'''[^']\\+'''" +let s:media_syntax.char_bold = "'''" " text: ''emphasis'' -let g:vimwiki_rxItalic = "''[^']\\+''" -let g:vimwiki_char_italic = "''" +let s:media_syntax.rxItalic = "''[^']\\+''" +let s:media_syntax.char_italic = "''" " text: '''''strong italic''''' -let g:vimwiki_rxBoldItalic = "'''''[^']\\+'''''" -let g:vimwiki_rxItalicBold = g:vimwiki_rxBoldItalic -let g:vimwiki_char_bolditalic = "'''''" -let g:vimwiki_char_italicbold = g:vimwiki_char_bolditalic +let s:media_syntax.rxBoldItalic = "'''''[^']\\+'''''" +let s:media_syntax.rxItalicBold = s:media_syntax.rxBoldItalic +let s:media_syntax.char_bolditalic = "'''''" +let s:media_syntax.char_italicbold = s:media_syntax.char_bolditalic " text: `code` -let g:vimwiki_rxCode = '`[^`]\+`' -let g:vimwiki_char_code = '`' +let s:media_syntax.rxCode = '`[^`]\+`' +let s:media_syntax.char_code = '`' " text: ~~deleted text~~ -let g:vimwiki_rxDelText = '\~\~[^~]\+\~\~' -let g:vimwiki_char_deltext = '\~\~' +let s:media_syntax.rxDelText = '\~\~[^~]\+\~\~' +let s:media_syntax.char_deltext = '\~\~' " text: ^superscript^ -let g:vimwiki_rxSuperScript = '\^[^^]\+\^' -let g:vimwiki_char_superscript = '^' +let s:media_syntax.rxSuperScript = '\^[^^]\+\^' +let s:media_syntax.char_superscript = '^' " text: ,,subscript,, -let g:vimwiki_rxSubScript = ',,[^,]\+,,' -let g:vimwiki_char_subscript = ',,' +let s:media_syntax.rxSubScript = ',,[^,]\+,,' +let s:media_syntax.char_subscript = ',,' " generic headers -let g:vimwiki_rxH = '=' -let g:vimwiki_symH = 1 +let s:media_syntax.rxH = '=' +let s:media_syntax.symH = 1 " <hr>, horizontal rule -let g:vimwiki_rxHR = '^-----*$' +let s:media_syntax.rxHR = '^-----*$' " Tables. Each line starts and ends with '|'; each cell is separated by '|' -let g:vimwiki_rxTableSep = '|' +let s:media_syntax.rxTableSep = '|' " Lists -let g:vimwiki_bullet_types = { '*':1, '#':1 } -let g:vimwiki_number_types = [] -let g:vimwiki_list_markers = ['*', '#'] -let g:vimwiki_rxListDefine = '^\%(;\|:\)\s' -call vimwiki#lst#setup_marker_infos() - -let g:vimwiki_rxListItemWithoutCB = '^\s*\%(\('.g:vimwiki_rxListBullet.'\)\|\('.g:vimwiki_rxListNumber.'\)\)\s' -let g:vimwiki_rxListItem = g:vimwiki_rxListItemWithoutCB . '\+\%(\[\(['.g:vimwiki_listsyms.']\)\]\s\)\?' -let g:vimwiki_rxListItemAndChildren = '^\('.g:vimwiki_rxListBullet.'\)\s\+\['.g:vimwiki_listsyms_list[-1].'\]\s.*\%(\n\%(\1\%('.g:vimwiki_rxListBullet.'\).*\|^$\|\s.*\)\)*' +let s:media_syntax.bullet_types = ['*', '#'] +let s:media_syntax.recurring_bullets = 1 +let s:media_syntax.number_types = [] +let s:media_syntax.list_markers = ['*', '#'] +let s:media_syntax.rxListDefine = '^\%(;\|:\)\s' " Preformatted text -let g:vimwiki_rxPreStart = '<pre>' -let g:vimwiki_rxPreEnd = '<\/pre>' +let s:media_syntax.rxPreStart = '<pre>' +let s:media_syntax.rxPreEnd = '<\/pre>' " Math block -let g:vimwiki_rxMathStart = '{{\$' -let g:vimwiki_rxMathEnd = '}}\$' - -let g:vimwiki_rxComment = '^\s*%%.*$' -let g:vimwiki_rxTags = '\%(^\|\s\)\@<=:\%([^:[:space:]]\+:\)\+\%(\s\|$\)\@=' +let s:media_syntax.rxMathStart = '{{\$' +let s:media_syntax.rxMathEnd = '}}\$' + +let s:media_syntax.rxComment = '^\s*%%.*$' +let s:media_syntax.rxTags = '\%(^\|\s\)\@<=:\%([^:[:space:]]\+:\)\+\%(\s\|$\)\@=' + +let s:media_syntax.header_search = '^\s*\(=\{1,6}\)\([^=].*[^=]\)\1\s*$' +let s:media_syntax.header_match = '^\s*\(=\{1,6}\)=\@!\s*__Header__\s*\1=\@!\s*$' +let s:media_syntax.bold_search = "'''\\zs[^']\\+\\ze'''" +let s:media_syntax.bold_match = '''''''__Text__''''''' +" ^- this strange looking thing is equivalent to "'''__Text__'''" but since we later +" want to call escape() on this string, we must keep it in single quotes +let s:media_syntax.wikilink = '\[\[\zs[^\\\]|]\+\ze\%(|[^\\\]]\+\)\?\]\]' +let s:media_syntax.tag_search = '\(^\|\s\)\zs:\([^:''[:space:]]\+:\)\+\ze\(\s\|$\)' +let s:media_syntax.tag_match = '\(^\|\s\):\([^:''[:space:]]\+:\)*__Tag__:'. + \ '\([^:[:space:]]\+:\)*\(\s\|$\)'