diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim
index 7e1ea4d..1d563c5 100644
--- a/autoload/vimwiki/base.vim
+++ b/autoload/vimwiki/base.vim
@@ -326,8 +326,14 @@ endfunction " }}}
" vimwiki#base#resolve_scheme
function! vimwiki#base#resolve_scheme(lnk, as_html) " {{{ Resolve scheme
- " if link is schemeless add wikiN: scheme
let lnk = a:lnk
+
+ " a link starting with # means current file with an anchor
+ if lnk =~ '^#'
+ let lnk = expand('%:t:r').lnk
+ endif
+
+ " if link is schemeless add wikiN: scheme
let is_schemeless = lnk !~ g:vimwiki_rxSchemeUrl
let lnk = (is_schemeless ? 'wiki'.g:vimwiki_current_idx.':'.lnk : lnk)
@@ -339,11 +345,23 @@ function! vimwiki#base#resolve_scheme(lnk, as_html) " {{{ Resolve scheme
let subdir = ''
let ext = ''
let idx = -1
+ let anchor = ''
+
+ "extract anchor
+ if scheme =~ 'wiki' || scheme =~ 'diary'
+ let split_lnk = split(lnk, '#', 1)
+ let lnk = split_lnk[0]
+ if len(split_lnk) <= 1 || split_lnk[-1] == ''
+ let anchor = ''
+ else
+ let anchor = join(split_lnk[1:], '#')
+ endif
+ endif
" do nothing if scheme is unknown to vimwiki
if !(scheme =~ 'wiki.*' || scheme =~ 'diary' || scheme =~ 'local'
\ || scheme =~ 'file')
- return [idx, scheme, path, subdir, lnk, ext, scheme.':'.lnk]
+ return [idx, scheme, path, subdir, lnk, ext, scheme.':'.lnk, anchor]
endif
" scheme behaviors
@@ -351,7 +369,7 @@ function! vimwiki#base#resolve_scheme(lnk, as_html) " {{{ Resolve scheme
let idx = eval(matchstr(scheme, '\D\+\zs\d\+\ze'))
if idx < 0 || idx >= len(g:vimwiki_list)
echom 'Vimwiki Error: Numbered scheme refers to a non-existent wiki!'
- return [idx,'','','','','','']
+ return [idx,'','','','','','', '']
else
if idx != g:vimwiki_current_idx
call vimwiki#base#validate_wiki_options(idx)
@@ -440,7 +458,7 @@ function! vimwiki#base#resolve_scheme(lnk, as_html) " {{{ Resolve scheme
endif
" result
- return [idx, scheme, path, subdir, lnk, ext, url]
+ return [idx, scheme, path, subdir, lnk, ext, url, anchor]
endfunction "}}}
" vimwiki#base#system_open_link
@@ -474,21 +492,20 @@ endfunction "}}}
" vimwiki#base#open_link
function! vimwiki#base#open_link(cmd, link, ...) "{{{
- let [idx, scheme, path, subdir, lnk, ext, url] =
+ let [idx, scheme, path, subdir, lnk, ext, url, anchor] =
\ vimwiki#base#resolve_scheme(a:link, 0)
if url == ''
if g:vimwiki_debug
- echom 'open_link: idx='.idx.', scheme='.scheme.', path='.path.', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url
+ echom 'open_link: idx='.idx.', scheme='.scheme.', path='.path.', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url.', anchor='.anchor
endif
echom 'Vimwiki Error: Unable to resolve link!'
return
endif
- let update_prev_link = (
- \ scheme == '' ||
- \ scheme =~ 'wiki' ||
- \ scheme =~ 'diary' ? 1 : 0)
+ let update_prev_link = ( (scheme == '' || scheme =~ 'wiki' || scheme =~ 'diary')
+ \ && lnk != expand('%:t:r')
+ \ ? 1 : 0)
let use_system_open = (
\ scheme == '' ||
@@ -507,13 +524,13 @@ function! vimwiki#base#open_link(cmd, link, ...) "{{{
" open/edit
if g:vimwiki_debug
- echom 'open_link: idx='.idx.', scheme='.scheme.', path='.path.', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url
+ echom 'open_link: idx='.idx.', scheme='.scheme.', path='.path.', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url.'anchor='.anchor
endif
if use_system_open
call vimwiki#base#system_open_link(url)
else
- call vimwiki#base#edit_file(a:cmd, url,
+ call vimwiki#base#edit_file(a:cmd, url, anchor,
\ vimwiki_prev_link, update_prev_link)
if idx != g:vimwiki_current_idx
" this call to setup_buffer_state may not be necessary
@@ -551,11 +568,15 @@ function! vimwiki#base#generate_links() "{{{only get links from the current dir
endfunction " }}}
" vimwiki#base#goto
-function! vimwiki#base#goto(key) "{{{
- call vimwiki#base#edit_file(':e',
- \ VimwikiGet('path').
- \ a:key.
- \ VimwikiGet('ext'))
+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'),
+ \ anchor)
endfunction "}}}
" vimwiki#base#backlinks
@@ -642,8 +663,31 @@ function! vimwiki#base#get_links(pat) "{{{ return string-list for files
return globlinks
endfunction "}}}
+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."'", '')
+
+ if !search(anchor_header, 'c') && !search(anchor_bold, 'c')
+ call setpos('.', oldpos)
+ break
+ endif
+ let oldpos = getpos('.')
+ endfor
+endfunction
+
" vimwiki#base#edit_file
-function! vimwiki#base#edit_file(command, filename, ...) "{{{
+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.
@@ -655,7 +699,16 @@ function! vimwiki#base#edit_file(command, filename, ...) "{{{
let fname = escape(a:filename, '% *|#')
let dir = fnamemodify(a:filename, ":p:h")
if vimwiki#base#mkdir(dir, 1)
- execute a:command.' '.fname
+ " 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 ' && a:filename == expand('%:p'))
+ execute a:command.' '.fname
+ endif
+ if a:anchor != ''
+ call s:jump_to_anchor(a:anchor)
+ endif
else
echom ' '
echom 'Vimwiki: Unable to edit file in non-existent directory: '.dir
@@ -769,9 +822,9 @@ function! s:update_wiki_links_dir(dir, old_fname, new_fname) " {{{
let new_fname_r = new_fname
let old_fname_r = vimwiki#base#apply_template(g:vimwiki_WikiLinkTemplate1,
- \ '\zs'.old_fname.'\ze', '.*', '').
+ \ '\zs'.old_fname.'\ze\%(#.*\)\?', '.*', '').
\ '\|'. vimwiki#base#apply_template(g:vimwiki_WikiLinkTemplate2,
- \ '\zs'.old_fname.'\ze', '.*', '')
+ \ '\zs'.old_fname.'\ze\%(#.*\)\?', '.*', '')
let files = split(glob(VimwikiGet('path').a:dir.'*'.VimwikiGet('ext')), '\n')
for fname in files
@@ -839,7 +892,7 @@ endfunction " }}}
" s:open_wiki_buffer
function! s:open_wiki_buffer(item) "{{{
- call vimwiki#base#edit_file(':e', a:item[0])
+ 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])
endif
@@ -1004,7 +1057,8 @@ function! vimwiki#base#goto_index(wnum, ...) "{{{
call vimwiki#base#validate_wiki_options(idx)
call vimwiki#base#edit_file(cmd,
\ VimwikiGet('path', idx).VimwikiGet('index', idx).
- \ VimwikiGet('ext', idx))
+ \ VimwikiGet('ext', idx),
+ \ '')
call vimwiki#base#setup_buffer_state(idx)
endfunction "}}}
@@ -1432,6 +1486,90 @@ function! vimwiki#base#RemoveHeaderLevel() "{{{
call setline(lnum, line)
endif
endfunction " }}}
+
+"creates or updates TOC in current file
+function! vimwiki#base#table_of_contents()
+ let old_cursor_pos = getpos('.')
+ let bullet = vimwiki#lst#default_symbol().' '
+ let rx_bullet = vimwiki#u#escape(bullet)
+ let toc_line = 0
+ let whitespaces = ''
+
+ " delete old TOC
+ let toc_header = '^\s*'.substitute(g:vimwiki_rxH1_Template, '__Header__',
+ \ '\='."'".g:vimwiki_toc_string."'", '').'\s*$'
+ let lnum = 1
+ while lnum <= &modelines + 2 && lnum <= line('$')
+ let line_content = getline(lnum)
+ if line_content =~# toc_header
+ let toc_line = lnum - 1
+ let whitespaces = matchstr(line_content, '^\s*')
+ let tl = lnum
+ while 1
+ let tl += 1
+ if tl > line('$') || getline(tl) !~ '^\s*'.rx_bullet.g:vimwiki_rxWikiLink.'\s*$'
+ silent exe lnum.','.string(tl-1).'delete _'
+ break
+ endif
+ endwhile
+ break
+ endif
+ let lnum += 1
+ endwhile
+
+ " collect new headers
+ let toc_lines = []
+ let headers_levels = [['', 0], ['', 0], ['', 0], ['', 0], ['', 0], ['', 0]]
+ for lnum in range(1, line('$'))
+ let line_content = getline(lnum)
+ if line_content !~ g:vimwiki_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))
+ let headers_levels[h_level-1] = [h_text, headers_levels[h_level-1][1]+1]
+ for idx in range(h_level, 5) | let headers_levels[idx] = ['', 0] | endfor
+
+ let h_complete_id = ''
+ for l in range(h_level-1)
+ if headers_levels[l][0] != ''
+ let h_complete_id .= headers_levels[l][0].'#'
+ endif
+ 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
+ let h_text = h_number.' '.h_text
+ endif
+
+ call add(toc_lines, [h_level, h_complete_id, h_text])
+ endfor
+
+ " write new TOC
+ call append(toc_line, whitespaces . substitute(g:vimwiki_rxH1_Template,
+ \ '__Header__', '\='."'".g:vimwiki_toc_string."'", ''))
+ let toc_line += 1
+
+ let startindent = repeat(' ', vimwiki#lst#get_list_margin())
+ let indentstring = repeat(' ', &shiftwidth)
+ for [lvl, link, desc] in toc_lines
+ 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."'", '')
+ call append(toc_line, startindent.repeat(indentstring, lvl-1).bullet.link)
+ let toc_line += 1
+ endfor
+ if getline(toc_line+1) !~ '^\s*$'
+ call append(toc_line, '')
+ endif
+ call setpos('.', old_cursor_pos)
+endfunction
"}}}
" LINK functions {{{
diff --git a/autoload/vimwiki/diary.vim b/autoload/vimwiki/diary.vim
index 2f25698..36d59de 100644
--- a/autoload/vimwiki/diary.vim
+++ b/autoload/vimwiki/diary.vim
@@ -266,7 +266,7 @@ function! vimwiki#diary#goto_diary_index(wnum) "{{{
endif
call vimwiki#base#validate_wiki_options(idx)
- call vimwiki#base#edit_file('e', s:diary_index(idx))
+ call vimwiki#base#edit_file('e', s:diary_index(idx), '')
call vimwiki#base#setup_buffer_state(idx)
endfunction "}}}
diff --git a/autoload/vimwiki/html.vim b/autoload/vimwiki/html.vim
index 31644d1..939f9e0 100644
--- a/autoload/vimwiki/html.vim
+++ b/autoload/vimwiki/html.vim
@@ -128,13 +128,21 @@ function! s:get_html_template(wikifile, template) "{{{
return lines
endfunction "}}}
-function! s:safe_html_tags(line) "{{{
+function! s:safe_html_preformatted(line) "{{{
let line = substitute(a:line,'<','\<', 'g')
let line = substitute(line,'>','\>', 'g')
return line
endfunction "}}}
-function! s:safe_html(line) "{{{
+function! s:safe_html_anchor(string) "{{{
+ let string = substitute(a:string, '"', '\"', 'g')
+ let string = substitute(string, "'", '\'', 'g')
+ let string = substitute(string, '/', '\/', 'g')
+ let string = substitute(string, '\t', ' ', 'g') " doesn't work
+ return string
+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()
@@ -173,7 +181,7 @@ function! s:mid(value, cnt) "{{{
return strpart(a:value, a:cnt, len(a:value) - 2 * a:cnt)
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.
@@ -184,7 +192,11 @@ function! s:subst_func(line, regexp, func) " {{{
let res_line = res_line.line
let matched = matchstr(a:line, a:regexp, pos)
if matched != ""
- let res_line = res_line.{a:func}(matched)
+ if a:0
+ let res_line = res_line.{a:func}(matched, a:1)
+ else
+ let res_line = res_line.{a:func}(matched)
+ endif
endif
let pos = matchend(a:line, a:regexp, pos)
endfor
@@ -197,61 +209,6 @@ function! s:save_vimwiki_buffer() "{{{
endif
endfunction "}}}
-function! s:get_html_toc(toc_list) "{{{
- " toc_list is list of [level, header_text, header_id]
- " ex: [[1, "Header", "toc1"], [2, "Header2", "toc2"], ...]
- function! s:close_list(toc, plevel, level) "{{{
- let plevel = a:plevel
- while plevel > a:level
- call add(a:toc, '')
- let plevel -= 1
- endwhile
- return plevel
- endfunction "}}}
-
- if empty(a:toc_list)
- return []
- endif
-
- let toc = ['
']
- let level = 0
- let plevel = 0
- for [level, text, id] in a:toc_list
- if level > plevel
- call add(toc, '
')
- elseif level < plevel
- let plevel = s:close_list(toc, plevel, level)
- endif
-
- let toc_text = s:process_tags_remove_links(text)
- let toc_text = s:process_tags_typefaces(toc_text)
- call add(toc, '- '.toc_text.'')
- let plevel = level
- endfor
- call s:close_list(toc, level, 0)
- call add(toc, '
')
- return toc
-endfunction "}}}
-
-" insert toc into dest.
-function! s:process_toc(dest, placeholders, toc) "{{{
- let toc_idx = 0
- if !empty(a:placeholders)
- for [placeholder, row, idx] in a:placeholders
- let [type, param] = placeholder
- if type == 'toc'
- let toc = a:toc[:]
- if !empty(param)
- call insert(toc, ''.param.'
')
- endif
- let shift = toc_idx * len(toc)
- call extend(a:dest, toc, row + shift)
- let toc_idx += 1
- endif
- endfor
- endif
-endfunction "}}}
-
" get title.
function! s:process_title(placeholders, default_title) "{{{
if !empty(a:placeholders)
@@ -316,8 +273,21 @@ function! s:tag_em(value) "{{{
return ''.s:mid(a:value, 1).''
endfunction "}}}
-function! s:tag_strong(value) "{{{
- return ''.s:mid(a:value, 1).''
+function! s:tag_strong(value, header_ids) "{{{
+ let text = s:mid(a:value, 1)
+ let id = s:safe_html_anchor(text)
+ let complete_id = ''
+ for l in range(6)
+ if a:header_ids[l][0] != ''
+ let complete_id .= a:header_ids[l][0].'-'
+ endif
+ endfor
+ if a:header_ids[5][0] == ''
+ let complete_id = complete_id[:-2]
+ endif
+ let complete_id .= '-'.id
+ return ''.text.''
endfunction "}}}
function! s:tag_todo(value) "{{{
@@ -337,7 +307,7 @@ function! s:tag_sub(value) "{{{
endfunction "}}}
function! s:tag_code(value) "{{{
- return ''.s:safe_html_tags(s:mid(a:value, 1)).'
'
+ return ''.s:safe_html_preformatted(s:mid(a:value, 1)).'
'
endfunction "}}}
"function! s:tag_pre(value) "{{{
@@ -365,7 +335,7 @@ endfunction
"}}}
function! vimwiki#html#linkify_link(src, descr) "{{{
- let src_str = ' href="'.a:src.'"'
+ let src_str = ' href="'.s:safe_html_anchor(a:src).'"'
let descr = substitute(a:descr,'^\s*\(.*\)\s*$','\1','')
let descr = (descr == "" ? a:src : descr)
let descr_str = (descr =~ g:vimwiki_rxWikiIncl
@@ -404,7 +374,7 @@ function! s:tag_wikiincl(value) "{{{
let descr = matchstr(str, vimwiki#html#incl_match_arg(1))
let verbatim_str = matchstr(str, vimwiki#html#incl_match_arg(2))
" resolve url
- let [idx, scheme, path, subdir, lnk, ext, url] =
+ let [idx, scheme, path, subdir, lnk, ext, url, anchor] =
\ vimwiki#base#resolve_scheme(url_0, 1)
" generate html output
" TODO: migrate non-essential debugging messages into g:VimwikiLog
@@ -426,18 +396,20 @@ function! s:tag_wikiincl(value) "{{{
endfunction "}}}
function! s:tag_wikilink(value) "{{{
- " [[url]] -> url
- " [[url|descr]] -> descr
- " [[url|{{...}}]] -> ...
- " [[fileurl.ext|descr]] -> descr
- " [[dirurl/|descr]] -> descr
+ " [[url]] -> url
+ " [[url|descr]] -> descr
+ " [[url|{{...}}]] -> ...
+ " [[fileurl.ext|descr]] -> descr
+ " [[dirurl/|descr]] -> descr
+ " [[url#a1#a2]] -> url#a1#a2
+ " [[#a1#a2]] -> #a1#a2
let str = a:value
let url = matchstr(str, g:vimwiki_rxWikiLinkMatchUrl)
let descr = matchstr(str, g:vimwiki_rxWikiLinkMatchDescr)
let descr = (substitute(descr,'^\s*\(.*\)\s*$','\1','') != '' ? descr : url)
" resolve url
- let [idx, scheme, path, subdir, lnk, ext, url] =
+ let [idx, scheme, path, subdir, lnk, ext, url, anchor] =
\ vimwiki#base#resolve_scheme(url, 1)
" generate html output
@@ -445,7 +417,8 @@ function! s:tag_wikilink(value) "{{{
if g:vimwiki_debug > 1
echom '[[idx='.idx.', scheme='.scheme.', path='.path.', subdir='.subdir.', lnk='.lnk.', ext='.ext.']]'
endif
- let line = vimwiki#html#linkify_link(url, descr)
+ let anchor = substitute(anchor, '#', '-', 'g')
+ let line = vimwiki#html#linkify_link(url.'#'.anchor, descr)
return line
endfunction "}}}
"}}}
@@ -496,7 +469,7 @@ function! s:tag_remove_external_link(value) "{{{
return line
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
@@ -521,7 +494,11 @@ function! s:make_tag(line, regexp, func) "{{{
let lines = split(a:line, patt_splitter, 1)
let res_line = ""
for line in lines
- let res_line = res_line.s:subst_func(line, a:regexp, a:func)
+ if a:0
+ let res_line = res_line.s:subst_func(line, a:regexp, a:func, a:1)
+ else
+ let res_line = res_line.s:subst_func(line, a:regexp, a:func)
+ endif
let res_line = res_line.matchstr(a:line, patt_splitter, pos)
let pos = matchend(a:line, patt_splitter, pos)
endfor
@@ -536,10 +513,10 @@ function! s:process_tags_remove_links(line) " {{{
return line
endfunction " }}}
-function! s:process_tags_typefaces(line) "{{{
+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')
+ 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')
@@ -557,9 +534,9 @@ function! s:process_tags_links(line) " {{{
return line
endfunction " }}}
-function! s:process_inline_tags(line) "{{{
+function! s:process_inline_tags(line, header_ids) "{{{
let line = s:process_tags_links(a:line)
- let line = s:process_tags_typefaces(line)
+ let line = s:process_tags_typefaces(line, a:header_ids)
return line
endfunction " }}}
"}}}
@@ -597,7 +574,7 @@ function! s:close_tag_para(para, ldest) "{{{
return a:para
endfunction "}}}
-function! s:close_tag_table(table, ldest) "{{{
+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',
@@ -654,7 +631,7 @@ function! s:close_tag_table(table, ldest) "{{{
endfor
endfunction "}}}
- function! s:close_tag_row(row, header, ldest) "{{{
+ function! s:close_tag_row(row, header, ldest, header_ids) "{{{
call add(a:ldest, '')
" Set tag element of columns
@@ -682,7 +659,7 @@ function! s:close_tag_table(table, ldest) "{{{
endif
call add(a:ldest, '<' . tag_name . rowspan_attr . colspan_attr .'>')
- call add(a:ldest, s:process_inline_tags(cell.body))
+ call add(a:ldest, s:process_inline_tags(cell.body, a:header_ids))
call add(a:ldest, ''. tag_name . '>')
endfor
@@ -715,15 +692,15 @@ function! s:close_tag_table(table, ldest) "{{{
if head > 0
for row in table[1 : head-1]
if !empty(filter(row, '!empty(v:val)'))
- call s:close_tag_row(row, 1, ldest)
+ call s:close_tag_row(row, 1, ldest, a:header_ids)
endif
endfor
for row in table[head+1 :]
- call s:close_tag_row(row, 0, ldest)
+ call s:close_tag_row(row, 0, ldest, a:header_ids)
endfor
else
for row in table[1 :]
- call s:close_tag_row(row, 0, ldest)
+ call s:close_tag_row(row, 0, ldest, a:header_ids)
endfor
endif
call add(ldest, "")
@@ -774,7 +751,7 @@ function! s:process_tag_pre(line, pre) "{{{
let processed = 1
"XXX destroys indent in general!
"call add(lines, substitute(a:line, '^\s\{'.pre[1].'}', '', ''))
- call add(lines, s:safe_html_tags(a:line))
+ call add(lines, s:safe_html_preformatted(a:line))
endif
return [processed, lines, pre]
endfunction "}}}
@@ -977,26 +954,48 @@ function! s:process_tag_h(line, id) "{{{
let h_level = vimwiki#u#count_first_sym(a:line)
endif
if h_level > 0
- let a:id[h_level] += 1
- " reset higher level ids
- for level in range(h_level+1, 6)
- let a:id[level] = 0
- endfor
- let centered = 0
- if a:line =~ '^\s\+'
- let centered = 1
+ let h_text = vimwiki#u#trim(matchstr(line, g:vimwiki_rxHeader))
+ let h_number = ''
+ let h_complete_id = ''
+ let h_id = s:safe_html_anchor(h_text)
+ let centered = (a:line =~ '^\s')
+
+ if h_text != g:vimwiki_toc_string
+
+ let a:id[h_level-1] = [h_text, a:id[h_level-1][1]+1]
+
+ " reset higher level ids
+ for level in range(h_level, 5)
+ let a:id[level] = ['', 0]
+ endfor
+
+ for l in range(h_level-1)
+ let h_number .= a:id[l][1].'.'
+ if a:id[l][0] != ''
+ let h_complete_id .= a:id[l][0].'-'
+ endif
+ endfor
+ 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
+ let num = matchstr(h_number,
+ \ '^\(\d.\)\{'.(g:vimwiki_html_header_numbering-1).'}\zs.*')
+ if !empty(num)
+ let num .= g:vimwiki_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_part = '
'
- if g:vimwiki_html_header_numbering
- let num = matchstr(h_number,
- \ '^\(\d.\)\{'.(g:vimwiki_html_header_numbering-1).'}\zs.*')
- if !empty(num)
- let num .= g:vimwiki_html_header_numbering_sym
- endif
- let h_text = num.' '.h_text
- endif
-
- let line = h_part.h_text.''
let processed = 1
endif
- return [processed, line, h_level, h_text, h_id]
+ return [processed, line]
endfunction "}}}
function! s:process_tag_hr(line) "{{{
@@ -1031,7 +1020,7 @@ function! s:process_tag_hr(line) "{{{
return [processed, line]
endfunction "}}}
-function! s:process_tag_table(line, table) "{{{
+function! s:process_tag_table(line, table, header_ids) "{{{
function! s:table_empty_cell(value) "{{{
let cell = {}
@@ -1085,7 +1074,7 @@ function! s:process_tag_table(line, table) "{{{
call map(cells, 's:table_empty_cell(v:val)')
call extend(table[-1], cells)
else
- let table = s:close_tag_table(table, lines)
+ let table = s:close_tag_table(table, lines, a:header_ids)
endif
return [processed, lines, table]
endfunction "}}}
@@ -1105,12 +1094,11 @@ function! s:parse_line(line, state) " {{{
let state.lists = a:state.lists[:]
let state.deflist = a:state.deflist
let state.placeholder = a:state.placeholder
- let state.toc = a:state.toc
- let state.toc_id = a:state.toc_id
+ let state.header_ids = a:state.header_ids
let res_lines = []
- let line = s:safe_html(a:line)
+ let line = s:safe_html_line(a:line)
let processed = 0
@@ -1147,16 +1135,6 @@ function! s:parse_line(line, state) " {{{
endif
"}}}
- " toc -- placeholder "{{{
- if !processed
- if line =~ '^\s*%toc'
- let processed = 1
- let param = matchstr(line, '^\s*%toc\s\zs.*')
- let state.placeholder = ['toc', param]
- endif
- endif
- "}}}
-
" pres "{{{
if !processed
let [processed, lines, state.pre] = s:process_tag_pre(line, state.pre)
@@ -1168,7 +1146,7 @@ function! s:parse_line(line, state) " {{{
let [processed, lines, state.math] = s:process_tag_math(line, state.math)
endif
if processed && len(state.table)
- let state.table = s:close_tag_table(state.table, lines)
+ let state.table = s:close_tag_table(state.table, lines, state.header_ids)
endif
if processed && state.deflist
let state.deflist = s:close_tag_def_list(state.deflist, lines)
@@ -1196,7 +1174,7 @@ function! s:parse_line(line, state) " {{{
let state.math = s:close_tag_math(state.math, lines)
endif
if processed && len(state.table)
- let state.table = s:close_tag_table(state.table, lines)
+ let state.table = s:close_tag_table(state.table, lines, state.header_ids)
endif
if processed && state.deflist
let state.deflist = s:close_tag_def_list(state.deflist, lines)
@@ -1205,7 +1183,7 @@ function! s:parse_line(line, state) " {{{
let state.para = s:close_tag_para(state.para, lines)
endif
- call map(lines, 's:process_inline_tags(v:val)')
+ call map(lines, 's:process_inline_tags(v:val, state.header_ids)')
call extend(res_lines, lines)
endif
@@ -1213,28 +1191,27 @@ function! s:parse_line(line, state) " {{{
" headers "{{{
if !processed
- let [processed, line, h_level, h_text, h_id] = s:process_tag_h(line, state.toc_id)
+ 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)
+ 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)
let state.para = s:close_tag_para(state.para, res_lines)
- let line = s:process_inline_tags(line)
+ let line = s:process_inline_tags(line, state.header_ids)
call add(res_lines, line)
-
- " gather information for table of contents
- call add(state.toc, [h_level, h_text, h_id])
endif
endif
"}}}
" tables "{{{
if !processed
- let [processed, lines, state.table] = s:process_tag_table(line, state.table)
+ let [processed, lines, state.table] = s:process_tag_table(line,
+ \ state.table, state.header_ids)
call extend(res_lines, lines)
endif
"}}}
@@ -1249,7 +1226,7 @@ function! s:parse_line(line, state) " {{{
let state.deflist = s:close_tag_def_list(state.deflist, lines)
endif
if processed && len(state.table)
- let state.table = s:close_tag_table(state.table, lines)
+ let state.table = s:close_tag_table(state.table, lines, state.header_ids)
endif
if processed && state.pre[0]
let state.pre = s:close_tag_pre(state.pre, lines)
@@ -1261,7 +1238,7 @@ function! s:parse_line(line, state) " {{{
let state.para = s:close_tag_para(state.para, lines)
endif
- call map(lines, 's:process_inline_tags(v:val)')
+ call map(lines, 's:process_inline_tags(v:val, state.header_ids)')
call extend(res_lines, lines)
endif
@@ -1272,7 +1249,8 @@ function! s:parse_line(line, state) " {{{
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)
+ 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)
@@ -1284,7 +1262,7 @@ function! s:parse_line(line, state) " {{{
if !processed
let [processed, lines, state.deflist] = s:process_tag_def_list(line, state.deflist)
- call map(lines, 's:process_inline_tags(v:val)')
+ call map(lines, 's:process_inline_tags(v:val, state.header_ids)')
call extend(res_lines, lines)
endif
@@ -1306,10 +1284,11 @@ 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)
+ let state.table = s:close_tag_table(state.table, res_lines,
+ \ state.header_ids)
endif
- call map(lines, 's:process_inline_tags(v:val)')
+ call map(lines, 's:process_inline_tags(v:val, state.header_ids)')
call extend(res_lines, lines)
endif
@@ -1390,10 +1369,10 @@ function! vimwiki#html#Wiki2HTML(path_html, wikifile) "{{{
let state.deflist = 0
let state.lists = []
let state.placeholder = []
- let state.toc = []
- let state.toc_id = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0 }
+ let state.header_ids = [['', 0], ['', 0], ['', 0], ['', 0], ['', 0], ['', 0]]
+ " [last seen header text in this level, number]
- " prepare constants for s:safe_html()
+ " prepare constants for s:safe_html_line()
let s:lt_pattern = '<'
let s:gt_pattern = '>'
if g:vimwiki_valid_html_tags != ''
@@ -1439,8 +1418,6 @@ function! vimwiki#html#Wiki2HTML(path_html, wikifile) "{{{
return
endif
- let toc = s:get_html_toc(state.toc)
- call s:process_toc(ldest, placeholders, toc)
call s:remove_blank_lines(ldest)
"" process end of file
@@ -1452,7 +1429,7 @@ function! vimwiki#html#Wiki2HTML(path_html, wikifile) "{{{
call s:close_tag_math(state.math, lines)
call s:close_tag_list(state.lists, lines)
call s:close_tag_def_list(state.deflist, lines)
- call s:close_tag_table(state.table, lines)
+ call s:close_tag_table(state.table, lines, state.header_ids)
call extend(ldest, lines)
let title = s:process_title(placeholders, fnamemodify(a:wikifile, ":t:r"))
diff --git a/doc/vimwiki.txt b/doc/vimwiki.txt
index 5f3f990..8350311 100644
--- a/doc/vimwiki.txt
+++ b/doc/vimwiki.txt
@@ -43,15 +43,16 @@ CONTENTS *vimwiki-contents*
8. Lists |vimwiki-lists|
9. Tables |vimwiki-tables|
10. Diary |vimwiki-diary|
- 11. Options |vimwiki-options|
- 11.1. Registered Wiki |vimwiki-register-wiki|
- 11.2. Temporary Wiki |vimwiki-temporary-wiki|
- 11.3. Per-Wiki Options |vimwiki-local-options|
- 11.4. Global Options |vimwiki-global-options|
- 12. Help |vimwiki-help|
- 13. Developers |vimwiki-developers|
- 14. Changelog |vimwiki-changelog|
- 15. License |vimwiki-license|
+ 11. Anchors |vimwiki-anchors|
+ 12. Options |vimwiki-options|
+ 12.1. Registered Wiki |vimwiki-register-wiki|
+ 12.2. Temporary Wiki |vimwiki-temporary-wiki|
+ 12.3. Per-Wiki Options |vimwiki-local-options|
+ 12.4. Global Options |vimwiki-global-options|
+ 13. Help |vimwiki-help|
+ 14. Developers |vimwiki-developers|
+ 15. Changelog |vimwiki-changelog|
+ 16. License |vimwiki-license|
==============================================================================
@@ -755,6 +756,16 @@ Raw URLs are also supported: >
mailto:habamax@gmail.com
ftp://vim.org
+Anchors~
+
+A URL can be followed by a '#' and the name of an anchor. When opening a
+link, Vimwiki then jumps to the anchor. >
+ [[Todo List#Tomorrow|Tasks for tomorrow]]
+
+To jump inside the current wiki file you can omit the file: >
+ [[#Tomorrow]]
+
+See |vimwiki-anchors|.
Markdown Links~
@@ -795,6 +806,10 @@ as a wiki page.
To scan the page for new or changed definitions for reference-links, simply
re-open the page ":e".
+Typing wikilinks can be simplified by using Vim's omni completion (see
+|compl-omni|) like so: >
+ [[ind
+which opens up a popup menu with all the wiki files starting with "ind".
------------------------------------------------------------------------------
5.3. Headers *vimwiki-syntax-headers*
@@ -1565,9 +1580,42 @@ Get it from http://www.vim.org/scripts/script.php?script_id=52
See |g:vimwiki_use_calendar| option to turn it off/on.
+==============================================================================
+12. Anchors *vimwiki-anchors*
+
+Every header and every bold text is an anchor. To jump to it, use a wikilink
+of the form >
+ [[file#anchor]]
+
+For example, consider the following file "Todo.wiki": >
+ = My tasks =
+ == Home ==
+ - [ ] bathe my *dog*
+ == Work ==
+ - [ ] beg for *pay rise*
+ == Knitting club =
+ === Knitting projects ===
+ - [ ] a funny *pig*
+ - [ ] a scary *dog*
+
+Then, to jump from your index.wiki directly to your knitting projects, use: >
+ [[Todo#Knitting projects]]
+
+Or, to jump to an individual project, use this link: >
+ [[Todo#pig]]
+
+If there are multiple instances of an anchor, you can use the long form which
+consists of the complete header hierarchy, separated by '#': >
+ [[Todo#My Tasks#Knitting club#Knitting projects#dog]]
+
+If you don't feel like typing the whole stuff, type just [[Todo# and then
+|i_CTRL-X_CTRL-O| to start the omni completion of anchors.
+
+For jumping inside a single file, you can omit the file in the link: >
+ [[#pay rise]]
==============================================================================
-11. Options *vimwiki-options*
+12. Options *vimwiki-options*
There are global options and local (per-wiki) options available to tune
vimwiki.
@@ -1583,7 +1631,7 @@ described in |vimwiki-temporary-wiki|. For a list of per-wiki options, see
------------------------------------------------------------------------------
-11.1 Registered Wiki *g:vimwiki_list* *vimwiki-register-wiki*
+12.1 Registered Wiki *g:vimwiki_list* *vimwiki-register-wiki*
One or more wikis can be registered using the |g:vimwiki_list| variable.
@@ -1624,7 +1672,7 @@ For clarity, in your .vimrc file you can define wiki options using separate
------------------------------------------------------------------------------
-11.2 Temporary Wiki *vimwiki-temporary-wiki*
+12.2 Temporary Wiki *vimwiki-temporary-wiki*
The creation of temporary wikis allows you to open files that would not
@@ -1651,7 +1699,7 @@ NOTE: Vimwiki assumes that the locations of distinct wikis do not overlap.
------------------------------------------------------------------------------
-11.3 Per-Wiki Options *vimwiki-local-options*
+12.3 Per-Wiki Options *vimwiki-local-options*
*vimwiki-option-path*
@@ -1967,7 +2015,7 @@ Note: if you use MediaWiki syntax, you probably would like to set this option
to 0, because every indented line is considered verbatim text.
------------------------------------------------------------------------------
-11.4 Global Options *vimwiki-global-options*
+12.4 Global Options *vimwiki-global-options*
Global options are configured using the following pattern: >
@@ -2176,17 +2224,18 @@ similar to 'local:' and 'file:' schemes, but are always opened with Vim: >
else
return 0
endif
- let [idx, scheme, path, subdir, lnk, ext, url] =
+ let [idx, scheme, path, subdir, lnk, ext, url, anchor] =
\ vimwiki#base#resolve_scheme(link, 0)
if g:vimwiki_debug
echom 'LinkHandler: idx='.idx.', scheme=[v]'.scheme.', path='.path.
- \ ', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url
+ \ ', subdir='.subdir.', lnk='.lnk.', ext='.ext.', url='.url.
+ \ ', anchor='.anchor
endif
if url == ''
echom 'Vimwiki Error: Unable to resolve link!'
return 0
else
- call vimwiki#base#edit_file('tabnew', url, [], 0)
+ call vimwiki#base#edit_file('tabnew', url, '', [], 0)
return 1
endif
endfunction " }}}
@@ -2208,7 +2257,7 @@ cannot otherwise convert the link. A customized handler might look like this: >
" complete URL
let url_0 = matchstr(str, g:vimwiki_rxWikiInclMatchUrl)
" URL parts
- let [scheme, path, subdir, lnk, ext, url] =
+ let [scheme, path, subdir, lnk, ext, url, anchor] =
\ vimwiki#base#resolve_scheme(url_0, VimwikiGet('ext'))
let arg1 = matchstr(str, VimwikiWikiInclMatchArg(1))
let arg2 = matchstr(str, VimwikiWikiInclMatchArg(2))
@@ -2471,7 +2520,7 @@ let g:vimwiki_diary_months = {
==============================================================================
-12. Help *vimwiki-help*
+13. Help *vimwiki-help*
Your help in making vimwiki better is really appreciated!
Any help, whether it is a spelling correction or a code snippet to patch --
@@ -2481,7 +2530,7 @@ Issues can be filed at http://code.google.com/p/vimwiki/issues .
==============================================================================
-13. Developers *vimwiki-developers*
+14. Developers *vimwiki-developers*
- Maxim Kim as original author.
- Stuart Andrews
@@ -2494,7 +2543,7 @@ Vim plugins: http://www.vim.org/scripts/script.php?script_id=2226
==============================================================================
-14. Changelog *vimwiki-changelog*
+15. Changelog *vimwiki-changelog*
???~
@@ -2644,7 +2693,7 @@ http://code.google.com/p/vimwiki/issues/list
* First public version.
==============================================================================
-15. License *vimwiki-license*
+16. License *vimwiki-license*
The MIT Licence
http://www.opensource.org/licenses/mit-license.php
diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim
index 089238b..0ef0ec3 100644
--- a/ftplugin/vimwiki.vim
+++ b/ftplugin/vimwiki.vim
@@ -26,13 +26,156 @@ if g:vimwiki_conceallevel && exists("+conceallevel")
let &l:conceallevel = g:vimwiki_conceallevel
endif
-" MISC }}}
-
" GOTO FILE: gf {{{
execute 'setlocal suffixesadd='.VimwikiGet('ext')
setlocal isfname-=[,]
" gf}}}
+" omnicomplete function for wiki files and anchors {{{
+
+" XXX move to an appropriate place
+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_markdown_header_search = '^\s*\(#\{1,6}\)\([^#].*\)$'
+let g:vimwiki_markdown_header_match = '^\s*\(#\{1,6}\)#\@!\s*__Header__\s*$'
+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_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_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_media_bold_search = "'''\\zs[^']\\+\\ze'''"
+let g:vimwiki_media_bold_match = '''''''__Text__'''''''
+" ^- looks strange, but is equivalent to "'''__Text__'''" but since we later
+" want to call escape() on this string, we must keep it in single quotes
+
+function! g:complete_wikifiles(findstart, base)
+ if a:findstart == 1
+ let column = col('.')-1
+ let line = getline('.')[:column]
+ let startoflink = match(line, '\[\[\zs[^\\[]*$')
+ if startoflink != -1
+ return startoflink
+ endif
+ if VimwikiGet('syntax') == 'markdown'
+ let startofinlinelink = match(line, '\[.*\](\zs.*$')
+ if startofinlinelink != -1
+ return startofinlinelink
+ endif
+ endif
+ return -1
+ else
+ if a:base !~ '#'
+ " we look for wiki files
+
+ if a:base =~# '^wiki\d:'
+ let wikinumber = eval(matchstr(a:base, '^wiki\zs\d'))
+ let directory = VimwikiGet('path', wikinumber)
+ let ext = VimwikiGet('ext', wikinumber)
+ let prefix = matchstr(a:base, '^wiki\d:\zs.*')
+ let scheme = matchstr(a:base, '^wiki\d:\ze')
+ elseif a:base =~# '^diary:'
+ let directory = VimwikiGet('path').'/'.VimwikiGet('diary_rel_path')
+ let ext = VimwikiGet('ext')
+ let prefix = matchstr(a:base, '^diary:\zs.*')
+ let scheme = matchstr(a:base, '^diary:\ze')
+ else
+ let directory = VimwikiGet('path')
+ let ext = VimwikiGet('ext')
+ let prefix = a:base
+ let scheme = ''
+ endif
+
+ let result = []
+ for wikifile in split(globpath(directory, '**/*'.ext), '\n')
+ " get the filename relative to the wiki path:
+ let subdir_filename = substitute(fnamemodify(wikifile, ':p:r'),
+ \ '\V'.fnamemodify(directory, ':p'), '', '')
+ if subdir_filename =~ '^'.prefix
+ call add(result, scheme . subdir_filename)
+ endif
+ endfor
+ return result
+
+ else
+ " we look for anchors in the given wikifile
+
+ let segments = split(a:base, '#', 1)
+ let link_infos = vimwiki#base#resolve_scheme(segments[0].'#', 0)
+ let wikifile = link_infos[6]
+ let syntax = VimwikiGet('syntax', link_infos[0])
+ let rxheader = g:vimwiki_{syntax}_header_search
+ let rxbold = g:vimwiki_{syntax}_bold_search
+ if !filereadable(wikifile)
+ return []
+ endif
+ let filecontent = readfile(wikifile)
+ let anchor_level = ['', '', '', '', '', '', '']
+ let anchors = []
+
+ for line in filecontent
+
+ " collect headers
+ let h_match = matchlist(line, rxheader)
+ if !empty(h_match)
+ let header = vimwiki#u#trim(h_match[2])
+ let level = len(h_match[1])
+ let anchor_level[level-1] = header
+ for l in range(level, 6)
+ let anchor_level[l] = ''
+ endfor
+ call add(anchors, header)
+ let complete_anchor = ''
+ for l in range(level-1)
+ if anchor_level[l] != ''
+ let complete_anchor .= anchor_level[l].'#'
+ endif
+ endfor
+ let complete_anchor .= header
+ call add(anchors, complete_anchor)
+ endif
+
+ " collect bold text (there can be several in one line)
+ let bold_count = 0
+ let bold_end = 0
+ while 1
+ let bold_text = matchstr(line, rxbold, bold_end, bold_count)
+ let bold_end = matchend(line, rxbold, bold_end, bold_count) + 1
+ if bold_text == ""
+ break
+ endif
+ let anchor_level[6] = bold_text
+ call add(anchors, bold_text)
+ let complete_anchor = ''
+ for l in range(6)
+ if anchor_level[l] != ''
+ let complete_anchor .= anchor_level[l].'#'
+ endif
+ endfor
+ let complete_anchor .= bold_text
+ call add(anchors, complete_anchor)
+ let bold_count += 1
+ endwhile
+
+ endfor
+
+ let filtered_anchors = []
+ let given_anchor = join(segments[1:], '#')
+ for anchor in anchors
+ if anchor =~# '^'.given_anchor
+ call add(filtered_anchors, segments[0].'#'.anchor)
+ endif
+ endfor
+
+ return filtered_anchors
+ endif
+ endif
+endfunction
+setlocal omnifunc=g:complete_wikifiles
+" omnicomplete }}}
+
+" MISC }}}
+
" LIST STUFF {{{
" settings necessary for the automatic formatting of lists
setlocal autoindent
@@ -156,6 +299,8 @@ command! -buffer Vimwiki2HTMLBrowse
command! -buffer VimwikiAll2HTML
\ call vimwiki#html#WikiAll2HTML(expand(VimwikiGet('path_html')))
+command! -buffer VimwikiTOC call vimwiki#base#table_of_contents()
+
command! -buffer VimwikiNextLink call vimwiki#base#find_next_link()
command! -buffer VimwikiPrevLink call vimwiki#base#find_prev_link()
command! -buffer VimwikiDeleteLink call vimwiki#base#delete_link()
@@ -180,7 +325,7 @@ exe 'command! -buffer -nargs=* VimwikiSearch lvimgrep '.
exe 'command! -buffer -nargs=* VWS lvimgrep '.
\ escape(VimwikiGet('path').'**/*'.VimwikiGet('ext'), ' ')
-command! -buffer -nargs=1 VimwikiGoto call vimwiki#base#goto("")
+command! -buffer -nargs=+ VimwikiGoto call vimwiki#base#goto()
" list commands
diff --git a/plugin/vimwiki.vim b/plugin/vimwiki.vim
index b300572..8dc97fc 100644
--- a/plugin/vimwiki.vim
+++ b/plugin/vimwiki.vim
@@ -401,6 +401,7 @@ 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_string', 'Contents')
call s:default('html_header_numbering', 0)
call s:default('html_header_numbering_sym', '')
diff --git a/syntax/vimwiki.vim b/syntax/vimwiki.vim
index e5a3f18..a64826e 100644
--- a/syntax/vimwiki.vim
+++ b/syntax/vimwiki.vim
@@ -449,7 +449,6 @@ execute 'syntax region VimwikiMath start=/^\s*'.g:vimwiki_rxMathStart.
" placeholders
-syntax match VimwikiPlaceholder /^\s*%toc\%(\s.*\)\?$/ contains=VimwikiPlaceholderParam
syntax match VimwikiPlaceholder /^\s*%nohtml\s*$/
syntax match VimwikiPlaceholder /^\s*%title\%(\s.*\)\?$/ contains=VimwikiPlaceholderParam
syntax match VimwikiPlaceholder /^\s*%template\%(\s.*\)\?$/ contains=VimwikiPlaceholderParam