vimwiki

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

commit c8bb65836047306cd9ce0f2704ce7fe439377e3c
parent 241126631dd902e3efde34060bb4d2f8c6cda4ab
Author: Rane Brown <ranebrown@users.noreply.github.com>
Date:   Tue, 19 Nov 2019 20:50:52 -0700

Merge pull request #766 from tinmarino/fix_multiple_link_back

Allow VimwikiGoBackLink to store multiple jumps per page (links to headers) Fix #691
Diffstat:
Mautoload/vimwiki/base.vim | 37+++++++++++++++++++++++++------------
Mautoload/vimwiki/vars.vim | 4++--
Atest/link_markdown_multiple_per_file.vader | 225+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 252 insertions(+), 14 deletions(-)

diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim @@ -104,6 +104,12 @@ function! vimwiki#base#find_wiki(path) endfunction +" helper: check if a link a well formed wiki link +function! s:is_wiki_link(link_infos) + return a:link_infos.scheme =~# '\mwiki\d\+' || a:link_infos.scheme ==# 'diary' +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 @@ -147,7 +153,7 @@ function! vimwiki#base#resolve_link(link_text, ...) let link_text = matchstr(link_text, '^'.vimwiki#vars#get_global('rxSchemes').':\zs.*\ze') endif - let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' || link_infos.scheme ==# 'diary' + let is_wiki_link = s:is_wiki_link(link_infos) " extract anchor if is_wiki_link @@ -328,14 +334,11 @@ function! vimwiki#base#open_link(cmd, link, ...) return endif - 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()) + let is_wiki_link = s:is_wiki_link(link_infos) let vimwiki_prev_link = [] " update previous link for wiki pages - if update_prev_link + if is_wiki_link if a:0 let vimwiki_prev_link = [a:1, []] elseif &ft ==# 'vimwiki' @@ -346,7 +349,7 @@ function! vimwiki#base#open_link(cmd, link, ...) " open/edit if is_wiki_link call vimwiki#base#edit_file(a:cmd, link_infos.filename, link_infos.anchor, - \ vimwiki_prev_link, update_prev_link) + \ vimwiki_prev_link, is_wiki_link) else call vimwiki#base#system_open_link(link_infos.filename) endif @@ -855,7 +858,9 @@ 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 - call vimwiki#vars#set_bufferlocal('prev_link', a:1) + let prev_links = vimwiki#vars#get_bufferlocal('prev_links') + call insert(prev_links, a:1) + call vimwiki#vars#set_bufferlocal('prev_links', prev_links) endif endfunction @@ -1034,7 +1039,7 @@ function! s:get_wiki_buffers() " 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)] + let bitem = [bname, vimwiki#vars#get_bufferlocal('prev_links', bcount)] call add(blist, bitem) endif endif @@ -1047,7 +1052,7 @@ endfunction function! s:open_wiki_buffer(item) call vimwiki#base#edit_file(':e', a:item[0], '') if !empty(a:item[1]) - call vimwiki#vars#set_bufferlocal('prev_link', a:item[1], a:item[0]) + call vimwiki#vars#set_bufferlocal('prev_links', a:item[1], a:item[0]) endif endfunction @@ -1347,7 +1352,15 @@ endfunction function! vimwiki#base#go_back_link() - let prev_link = vimwiki#vars#get_bufferlocal('prev_link') + " try pop previous link from buffer list + let prev_links = vimwiki#vars#get_bufferlocal('prev_links') + if !empty(prev_links) + let prev_link = remove(prev_links, 0) + call vimwiki#vars#set_bufferlocal('prev_links', prev_links) + else + let prev_link = [] + endif + if !empty(prev_link) " go back to saved wiki link call vimwiki#base#edit_file(':e ', prev_link[0], '') @@ -1479,7 +1492,7 @@ function! vimwiki#base#rename_link() let &buftype="nofile" - let cur_buffer = [expand('%:p'), vimwiki#vars#get_bufferlocal('prev_link')] + let cur_buffer = [expand('%:p'), vimwiki#vars#get_bufferlocal('prev_links')] let blist = s:get_wiki_buffers() diff --git a/autoload/vimwiki/vars.vim b/autoload/vimwiki/vars.vim @@ -905,8 +905,8 @@ function! vimwiki#vars#get_bufferlocal(key, ...) 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 ==# 'prev_links' + call setbufvar(buffer, 'vimwiki_prev_links', []) elseif a:key ==# 'markdown_refs' call setbufvar(buffer, 'vimwiki_markdown_refs', vimwiki#markdown_base#scan_reflinks()) else diff --git a/test/link_markdown_multiple_per_file.vader b/test/link_markdown_multiple_per_file.vader @@ -0,0 +1,225 @@ +Include: vader_includes/vader_setup.vader + +Given vimwiki (Internal links + one link to filenew): + # Contents + + - [Test1](#Test1) + - [Test2](#Test2) + + # Test1 + + - [Test1](#Test1) + - [Test2](#Test2) + - [filenew](filenew) + + # Test2 + + - [Test1](#Test1) + - [Test2](#Test2) + - [filenew](filenew) + +Execute (Set filename wiki_test.md): + file wiki_test.md + call SetSyntax('markdown') + +Do (Navigate with <Tab>): + A more Contents\<Esc> + \<Tab> + \<Enter> + A more Test1\<Esc> + \<Tab> + \<Tab> + \<Enter> + A more Test2\<Esc> + +Expect (Content added to titles): + # Contents more Contents + + - [Test1](#Test1) + - [Test2](#Test2) + + # Test1 more Test1 + + - [Test1](#Test1) + - [Test2](#Test2) + - [filenew](filenew) + + # Test2 more Test2 + + - [Test1](#Test1) + - [Test2](#Test2) + - [filenew](filenew) + +Do (Navigate with <Tab> and <Enter> and come back with <Bs>): + \<Tab> + \<Enter> +# Cursor at Test1 + \<Tab> + \<Tab> + \<Enter> +# Cursor at Test2 + \<Tab> + \<Tab> + \<Tab> +# Cursor at Test2/filenew + A not yet\<Esc> + \<Bs> +# Cursor at Test1/test2 + A near Test1/test2 + \<Esc> + \<Bs> +# Cursor at Contents/test1 + A near Contents/test1 + \<Esc> + +Expect (Vimwiki links): + # Contents + + - [Test1](#Test1) near Contents/test1 + - [Test2](#Test2) + + # Test1 + + - [Test1](#Test1) + - [Test2](#Test2) near Test1/test2 + - [filenew](filenew) + + # Test2 + + - [Test1](#Test1) + - [Test2](#Test2) + - [filenew](filenew) not yet + +Do (Navigate with <Tab> comeback with <Bs> from filenew): + \<Tab> + A first shot\<Esc> + 0\<Tab> +# Cursor at Contents/test1 + \<Enter> + \<Tab> + \<Tab> + A first shot\<Esc> + 0\<Tab> +# Cursor at Test1/test2 + \<Enter> + G +# Cursor at Test2/filenew + A first shot\<Esc> + 0\<Tab> +# Cursor at Test2/filenew + \<Enter> +# Cursor in filenew (a new file) + A anything in filenew: empirically it does not count\<Esc> + \<Bs> +# Cursor at Test2/filenew + \<Bs> +# Cursor at Test1/test2 + \<Bs> +# Cursor at Contents/test1 + A second shot + +Expect (Just Contents/test1 got the second shot): + # Contents + + - [Test1](#Test1) first shot second shot + - [Test2](#Test2) + + # Test1 + + - [Test1](#Test1) + - [Test2](#Test2) first shot + - [filenew](filenew) + + # Test2 + + - [Test1](#Test1) + - [Test2](#Test2) + - [filenew](filenew) first shot + +Execute (Delete filenew buffer): + bd! /testplugin/filenew.md + +Do (Navigate with <Tab> comeback with <Bs> too far): + \<Tab> +# Cursor at Contents/test1 + \<Enter> + \<Tab> + \<Tab> +# Cursor at Test1/test2 + \<Enter> + \<Tab> +# Cursor at Test2/test1 + \<Enter> + \<Tab> + \<Tab> +# Cursor at Test1/test2 + \<Enter> + A first test2\<Esc> + \<Tab> +# Cursor at Test2/test1 + \<Enter> + A first test1\<Esc> +# Back + \<Bs> +# Cursor at Test2/test1 + A second test2/test1\<Esc> + \<Bs> +# Cursor at Test1/test2 + A second test1/test2\<Esc> + \<Bs> +# Cursor at Test2/test1 + \<Bs> +# Cursor at Test1/test2 + \<Bs> +# Cursor at Contents/test1 +# Finished + \<Bs> + \<Bs> + \<Bs> + \<Bs> + A 1\<Esc> + \<Bs> + A 2\<Esc> + \<Bs> + A 3\<Esc> + \<Bs> + A 4\<Esc> + +Expect (After too many <Bs>, cursor stays at the first <Enter> spot in first file: Contents/test1): + # Contents + + - [Test1](#Test1) 1 2 3 4 + - [Test2](#Test2) + + # Test1 first test1 + + - [Test1](#Test1) + - [Test2](#Test2) second test1/test2 + - [filenew](filenew) + + # Test2 first test2 + + - [Test1](#Test1) second test2/test1 + - [Test2](#Test2) + - [filenew](filenew) + +Given vimwiki (link to self): + - [Bad link](Very bad.html) + - [My own file](wiki_test) + - [Test1](#Test1) + - [Test2](#Test2) + +Do (Follow link to self and append chars): + \<Tab> + \<Tab> + \<Enter> + a this_is_18_chars \<Esc> + +Expect (Some chars appended at self link): + - [Bad link](Very bad.html) + - [ this_is_18_chars My own file](wiki_test) + - [Test1](#Test1) + - [Test2](#Test2) + + +Include: vader_includes/vader_teardown.vader