commit 6a047cb067138671d5c6a1e38c26c1039338bc73
parent 2a51d833972e7b36523040b5d512253db0730072
Author: Rane Brown <ranebrown@users.noreply.github.com>
Date: Sun, 15 Dec 2019 19:47:54 -0700
Merge pull request #785 from tinmarino/merge_goto_nested
VimwikiGoto completion works with part of filename and in nested directories
Diffstat:
3 files changed, 54 insertions(+), 13 deletions(-)
diff --git a/autoload/vimwiki/base.vim b/autoload/vimwiki/base.vim
@@ -356,25 +356,28 @@ function! vimwiki#base#open_link(cmd, link, ...)
endfunction
-function! vimwiki#base#get_globlinks_escaped() abort
+function! vimwiki#base#get_globlinks_escaped(...) abort
+ let s_arg_lead = a:0 > 0 ? a:1 : ""
" 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('*'.vimwiki#vars#get_wikilocal('ext'), 1)."\n"
+ let globlinks = glob('**/*'.vimwiki#vars#get_wikilocal('ext'), 1)."\n"
" remove extensions
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
let lst = split(globlinks, '\n')
+ " Filter files whose path matches the user's argument leader
+ " " use smart case matching
+ let r_arg = substitute(s_arg_lead, '\u', '[\0\l\0]', 'g')
+ call filter(lst, '-1 != match(v:val, r_arg)')
" Apply fnameescape() to each item
call map(lst, 'fnameescape(v:val)')
- " Convert back to newline-separated list
- let globlinks = join(lst, "\n")
- " return all escaped links as a single newline-separated string
- return globlinks
+ " Return list (for customlist completion)
+ return lst
endfunction
@@ -427,9 +430,14 @@ function! vimwiki#base#goto(...)
let key = a:0 > 0 ? a:1 : input('Enter name: ')
let anchor = a:0 > 1 ? a:2 : ''
+ " Save current file pos
+ let vimwiki_prev_link = [vimwiki#path#current_wiki_file(), getpos('.')]
+
call vimwiki#base#edit_file(':e',
\ vimwiki#vars#get_wikilocal('path') . key . vimwiki#vars#get_wikilocal('ext'),
- \ anchor)
+ \ anchor,
+ \ vimwiki_prev_link,
+ \ &ft ==# 'vimwiki')
endfunction
@@ -2279,9 +2287,7 @@ endfunction
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()
+ return vimwiki#base#get_globlinks_escaped(a:ArgLead)
endfunction
diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim
@@ -261,7 +261,7 @@ command! -buffer -nargs=0 VWB call vimwiki#base#backlinks()
command! -buffer -nargs=* VimwikiSearch call vimwiki#base#search(<q-args>)
command! -buffer -nargs=* VWS call vimwiki#base#search(<q-args>)
-command! -buffer -nargs=* -complete=custom,vimwiki#base#complete_links_escaped
+command! -buffer -nargs=* -complete=customlist,vimwiki#base#complete_links_escaped
\ VimwikiGoto call vimwiki#base#goto(<f-args>)
command! -buffer VimwikiCheckLinks call vimwiki#base#check_links()
diff --git a/test/command_goto.vader b/test/command_goto.vader
@@ -17,13 +17,48 @@ Do (VimwikiGoto <CR> buzz_bozz && Assert):
buzz_bozz\<CR>
:AssertEqual $HOME . '/testmarkdown/buzz_bozz.md', expand('%')\<CR>
-
Execute (:VimwikiGoto + Completion):
VimwikiIndex 2
AssertEqual $HOME . '/testmarkdown/index.md', expand('%')
- let s_complete=vimwiki#base#get_globlinks_escaped()
+ let s_complete=string(vimwiki#base#get_globlinks_escaped())
Assert -1 != stridx(s_complete, 'buzz_bozz')
+Execute (Create dir1/dir2/test_goto_file.md):
+ call system("mkdir $HOME/testmarkdown/dir1")
+ call system("mkdir $HOME/testmarkdown/dir1/dir2")
+ edit $HOME/testmarkdown/dir1/dir2/test_goto_file.md
+ call WriteMe()
+
+Execute (:VimwikiGoto + Completion in directory):
+ " Return to base
+ VimwikiIndex 2
+ AssertEqual $HOME . '/testmarkdown/index.md', expand('%')
+
+ " Complete without argment
+ let s_complete1=string(vimwiki#base#get_globlinks_escaped())
+ Assert -1 != stridx(s_complete1, 'test_goto_file')
+
+ " Complete with file argument
+ let s_complete2=string(vimwiki#base#get_globlinks_escaped('test_goto_file'))
+ Assert -1 != stridx(s_complete2, 'test_goto_file')
+
+ " Complete with start of file argument
+ let s_complete3=string(vimwiki#base#get_globlinks_escaped('test_got'))
+ Assert -1 != stridx(s_complete3, 'test_goto_file')
+
+ " Complete with (nested) dir2 argument
+ let s_complete4=string(vimwiki#base#get_globlinks_escaped('dir2'))
+ Assert -1 != stridx(s_complete4, 'test_goto_file')
+
+ " Complete with bad argument
+ let l_complete5=vimwiki#base#get_globlinks_escaped('this_string_is_nowhere')
+ let s_complete5=string(l_complete5)
+ Assert -1 == stridx(s_complete5, 'test_goto_file')
+ AssertEqual 0, len(l_complete5)
+
+Execute (Clean):
+ Log "End: Clean"
+ call system("rm $HOME/testmarkdown/dir1")
Include: vader_includes/vader_teardown.vader
# vim: sw=2 ft=conf foldmethod=indent foldlevel=30 foldignore=