vimwiki

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

commit 6c2f9f999d7970f46f27f630e28893e4e4cb295a
parent 8f5d38365bcd73fc44847b4de5d9f4b10c64461f
Author: Steven Stallion <sstallion@gmail.com>
Date:   Thu, 21 Mar 2019 14:31:04 -0500

Adjust generated header behavior for TOC, etc.

Diffstat:
Mautoload/vimwiki/base.vim | 63++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
Mautoload/vimwiki/diary.vim | 27++++++++++++++++++---------
Mautoload/vimwiki/tags.vim | 50++++++++++++++++++++++++++++++++++++++++----------
Mautoload/vimwiki/vars.vim | 9+++++++++
Mdoc/vimwiki.txt | 49+++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 170 insertions(+), 28 deletions(-)

diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim @@ -9,6 +9,9 @@ endif let g:loaded_vimwiki_auto = 1 +let g:vimwiki_max_scan_for_caption = 5 + + function! s:safesubstitute(text, search, replace, mode) " Substitute regexp but do not interpret replace let escaped = escape(a:replace, '\&') @@ -351,23 +354,34 @@ function! vimwiki#base#generate_links() 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) + let link_infos = vimwiki#base#resolve_link(link) + if !s:is_diary_file(link_infos.filename) if vimwiki#vars#get_wikilocal('syntax') == 'markdown' let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template') else let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1') endif + let link_caption = vimwiki#base#read_caption(link_infos.filename) + if link_caption == '' " default to link if caption not found + let link_caption = link + endif + let entry = s:safesubstitute(link_tpl, '__LinkUrl__', link, '') - let entry = s:safesubstitute(entry, '__LinkDescription__', link, '') + let entry = s:safesubstitute(entry, '__LinkDescription__', link_caption, '') call add(lines, bullet. entry) endif endfor - let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' ' + let links_rx = '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)' - call vimwiki#base#update_listing_in_buffer(lines, 'Generated Links', links_rx, line('$')+1, 1, 1) + call vimwiki#base#update_listing_in_buffer( + \ lines, + \ vimwiki#vars#get_global('links_header'), + \ links_rx, + \ line('$')+1, + \ vimwiki#vars#get_global('links_header_level'), + \ 1) endfunction @@ -1092,6 +1106,11 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header, let start_lnum = a:default_lnum let is_cursor_after_listing = ( cursor_line > a:default_lnum ) let whitespaces_in_first_line = '' + " append newline if not replacing first line + if start_lnum > 1 + keepjumps call append(start_lnum -1, '') + let start_lnum += 1 + endif endif let start_of_listing = start_lnum @@ -1102,13 +1121,24 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header, \ '__Header__', a:start_header, '') keepjumps call append(start_lnum - 1, new_header) let start_lnum += 1 - let lines_diff += 1 + len(a:strings) + let lines_diff += 1 + if vimwiki#vars#get_wikilocal('syntax') == 'markdown' + for _ in range(vimwiki#vars#get_global('markdown_header_style')) + keepjumps call append(start_lnum - 1, '') + let start_lnum += 1 + let lines_diff += 1 + endfor + endif for string in a:strings keepjumps call append(start_lnum - 1, string) let start_lnum += 1 + let lines_diff += 1 endfor - " append an empty line if there is not one - if start_lnum <= line('$') && getline(start_lnum) !~# '\m^\s*$' + + " remove empty line if end of file, otherwise append if needed + if start_lnum == line('$') + silent exe 'keepjumps ' . start_lnum.'delete _' + elseif start_lnum < line('$') && getline(start_lnum) !~# '\m^\s*$' keepjumps call append(start_lnum - 1, '') let lines_diff += 1 endif @@ -1894,7 +1924,7 @@ function! vimwiki#base#table_of_contents(create) call add(lines, startindent.repeat(indentstring, lvl-1).bullet.link) endfor - let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' ' + let links_rx = '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)' call vimwiki#base#update_listing_in_buffer( \ lines, @@ -2114,6 +2144,21 @@ function! vimwiki#base#complete_links_escaped(ArgLead, CmdLine, CursorPos) abort endfunction +function! vimwiki#base#read_caption(file) + let rx_header = vimwiki#vars#get_syntaxlocal('rxHeader') + + if filereadable(a:file) + for line in readfile(a:file, '', g:vimwiki_max_scan_for_caption) + if line =~# rx_header + return vimwiki#u#trim(matchstr(line, rx_header)) + endif + endfor + endif + + return '' +endfunction + + " ------------------------------------------------------------------------- " Load syntax-specific Wiki functionality for s:syn in s:vimwiki_get_known_syntaxes() diff --git a/autoload/vimwiki/diary.vim b/autoload/vimwiki/diary.vim @@ -10,9 +10,6 @@ endif let g:loaded_vimwiki_diary_auto = 1 -let s:vimwiki_max_scan_for_caption = 5 - - function! s:prefix_zero(num) if a:num < 10 return '0'.a:num @@ -67,7 +64,7 @@ function! s:get_first_header(fl) " Get the first header in the file within the first s:vimwiki_max_scan_for_caption lines. let header_rx = vimwiki#vars#get_syntaxlocal('rxHeader') - for line in readfile(a:fl, '', s:vimwiki_max_scan_for_caption) + for line in readfile(a:fl, '', g:vimwiki_max_scan_for_caption) if line =~# header_rx return vimwiki#u#trim(matchstr(line, header_rx)) endif @@ -210,9 +207,13 @@ function! s:format_diary() let links_with_captions = s:read_captions(s:get_diary_files()) let g_files = s:group_links(links_with_captions) + let g_keys = s:sort(keys(g_files)) + + for year in g_keys + if len(result) > 0 + call add(result, '') + endif - for year in s:sort(keys(g_files)) - call add(result, '') call add(result, \ substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', year , '')) @@ -221,6 +222,12 @@ function! s:format_diary() call add(result, substitute(vimwiki#vars#get_syntaxlocal('rxH3_Template'), \ '__Header__', s:get_month_name(month), '')) + if vimwiki#vars#get_wikilocal('syntax') == 'markdown' + for _ in range(vimwiki#vars#get_global('markdown_header_style')) + call add(result, '') + endfor + endif + for [fl, captions] in s:sort(items(g_files[year][month])) let topcap = captions['top'] let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2') @@ -239,9 +246,10 @@ function! s:format_diary() let top_link_tpl = link_tpl endif + let bullet = vimwiki#lst#default_symbol().' ' let entry = substitute(top_link_tpl, '__LinkUrl__', fl, '') let entry = substitute(entry, '__LinkDescription__', topcap, '') - call add(result, repeat(' ', vimwiki#lst#get_list_margin()).'* '.entry) + call add(result, repeat(' ', vimwiki#lst#get_list_margin()).bullet.entry) for [depth, subcap] in captions['rest'] if empty(subcap) @@ -371,9 +379,10 @@ 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*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxHeader').'\)' + let content_rx = '^\%('.vimwiki#vars#get_syntaxlocal('rxHeader').'\)\|'. + \ '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)' call vimwiki#base#update_listing_in_buffer(s:format_diary(), - \ vimwiki#vars#get_wikilocal('diary_header'), content_rx, line('$')+1, 1, 1) + \ vimwiki#vars#get_wikilocal('diary_header'), content_rx, 1, 1, 1) else echomsg 'Vimwiki Error: You can generate diary links only in a diary index page!' endif diff --git a/autoload/vimwiki/tags.vim b/autoload/vimwiki/tags.vim @@ -296,6 +296,7 @@ function! vimwiki#tags#generate_tags(...) abort let need_all_tags = (a:0 == 0) let specific_tags = a:000 + let header_level = vimwiki#vars#get_global('tags_header_level') let metadata = s:load_tags_metadata() " make a dictionary { tag_name: [tag_links, ...] } @@ -310,26 +311,55 @@ function! vimwiki#tags#generate_tags(...) abort endfor endfor + let tag_match = printf('rxH%d', header_level + 1) + let tag_tpl = printf('rxH%d_Template', header_level + 1) + let lines = [] 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(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', tagname, ''), - \ '' ]) + if len(lines) > 0 + call add(lines, '') + endif + + call add(lines, + \ substitute(vimwiki#vars#get_syntaxlocal(tag_tpl), '__Header__', tagname, '')) + + if vimwiki#vars#get_wikilocal('syntax') == 'markdown' + for _ in range(vimwiki#vars#get_global('markdown_header_style')) + call add(lines, '') + endfor + endif + for taglink in sort(tags_entries[tagname]) - call add(lines, bullet . substitute(vimwiki#vars#get_global('WikiLinkTemplate1'), - \ '__LinkUrl__', taglink, '')) + if vimwiki#vars#get_wikilocal('syntax') == 'markdown' + let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink3Template') + let link_infos = vimwiki#base#resolve_link(taglink) + let link_caption = vimwiki#base#read_caption(link_infos.filename) + let link_text = split(taglink, '#', 1)[0] + + let entry = substitute(link_tpl, '__LinkUrl__', link_text, '') + let entry = substitute(entry, '__LinkAnchor__', link_infos.anchor, '') + let entry = substitute(entry, '__LinkDescription__', link_caption, '') + call add(lines, bullet.entry) + else + let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1') + call add(lines, bullet . substitute(link_tpl, '__LinkUrl__', taglink, '')) + endif endfor endif endfor - let links_rx = '\m\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxH2').'\)\|\%(^\s*' - \ .vimwiki#u#escape(vimwiki#lst#default_symbol()).' ' - \ .vimwiki#vars#get_syntaxlocal('rxWikiLink').'$\)' + let links_rx = '^\%('.vimwiki#vars#get_syntaxlocal(tag_match).'\)\|'. + \ '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)' - call vimwiki#base#update_listing_in_buffer(lines, 'Generated Tags', links_rx, line('$')+1, 1, 1) + call vimwiki#base#update_listing_in_buffer( + \ lines, + \ vimwiki#vars#get_global('tags_header'), + \ links_rx, + \ line('$')+1, + \ header_level, + \ 1) endfunction diff --git a/autoload/vimwiki/vars.vim b/autoload/vimwiki/vars.vim @@ -165,13 +165,18 @@ function! s:read_global_settings_from_user() \ 'html_header_numbering_sym': {'type': type(''), 'default': ''}, \ 'list_ignore_newline': {'type': type(0), 'default': 1, 'min': 0, 'max': 1}, \ 'text_ignore_newline': {'type': type(0), 'default': 1, 'min': 0, 'max': 1}, + \ 'links_header': {'type': type(''), 'default': 'Generated Links', 'min_length': 1}, + \ 'links_header_level': {'type': type(0), 'default': 1, 'min': 1, 'max': 6}, \ 'listsyms': {'type': type(''), 'default': ' .oOX', 'min_length': 2}, \ 'listsym_rejected': {'type': type(''), 'default': '-', 'length': 1}, \ 'map_prefix': {'type': type(''), 'default': '<Leader>w'}, + \ 'markdown_header_style': {'type': type(0), 'default': 1, 'min':0, 'max': 2}, \ 'markdown_link_ext': {'type': type(0), 'default': 0, 'min': 0, 'max': 1}, \ 'menu': {'type': type(''), 'default': 'Vimwiki'}, \ 'table_auto_fmt': {'type': type(0), 'default': 1, 'min': 0, 'max': 1}, \ 'table_mappings': {'type': type(0), 'default': 1, 'min': 0, 'max': 1}, + \ 'tags_header': {'type': type(''), 'default': 'Generated Tags', 'min_length': 1}, + \ 'tags_header_level': {'type': type(0), 'default': 1, 'min': 1, 'max': 5}, \ 'toc_header': {'type': type(''), 'default': 'Contents', 'min_length': 1}, \ 'toc_header_level': {'type': type(0), 'default': 1, 'min': 1, 'max': 6}, \ 'url_maxsave': {'type': type(0), 'default': 15, 'min': 0}, @@ -707,6 +712,10 @@ function! s:populate_extra_markdown_vars() " [DESCRIPTION](ANCHOR) let mkd_syntax.Weblink2Template = mkd_syntax.rxWeblink1Prefix . '__LinkDescription__'. \ mkd_syntax.rxWeblink1Separator. '__LinkUrl__'. mkd_syntax.rxWeblink1Suffix + " [DESCRIPTION](FILE#ANCHOR) + let mkd_syntax.Weblink3Template = mkd_syntax.rxWeblink1Prefix . '__LinkDescription__'. + \ mkd_syntax.rxWeblink1Separator. '__LinkUrl__'. mkd_syntax.rxWeblink1Ext. + \ '#__LinkAnchor__'. mkd_syntax.rxWeblink1Suffix let valid_chars = '[^\\]' diff --git a/doc/vimwiki.txt b/doc/vimwiki.txt @@ -2981,6 +2981,54 @@ Value Description~ Default: 0 + +------------------------------------------------------------------------------ +*g:vimwiki_links_header* + +A string with the magic header that tells Vimwiki where the generated links +are located in a file. You can change it to the appropriate word in your +mother tongue like this: > + let g:vimwiki_links_header = 'Generierte Links' + +The default is 'Generated Links'. + + +------------------------------------------------------------------------------ +*g:vimwiki_links_header_level* + +The header level of generated links. Valid values are from 1 to 6. + +The default is 1. + + +------------------------------------------------------------------------------ +*g:vimwiki_tags_header* + +A string with the magic header that tells Vimwiki where the generated tags +are located in a file. You can change it to the appropriate word in your +mother tongue like this: > + let g:vimwiki_tags_header = 'Generierte Stichworte' + +The default is 'Generated Tags'. + + +------------------------------------------------------------------------------ +*g:vimwiki_tags_header_level* + +The header level of generated tags. Valid values are from 1 to 5. + +The default is 1. + + +------------------------------------------------------------------------------ +*g:vimwiki_markdown_header_style* + +The number of newlines to be inserted after a header is generated. Valid +values are from 0 to 2. + +The default is 1. + + ============================================================================== 13. Getting help *vimwiki-help* @@ -3058,6 +3106,7 @@ Contributors and their Github usernames in roughly chronological order: - Zhuang Ma (@mzlogin) - Huy Le (@huynle) - Nick Borden (@hcwndbyw) + - Steven Stallion (@sstallion) ==============================================================================