From 78f069c76f01225cb00b9355f896eb4f26835df2 Mon Sep 17 00:00:00 2001 From: Mark Woods Date: Wed, 20 Apr 2022 10:15:53 +0100 Subject: [PATCH] Support tilde expansion when completing files - Expand tilde alone to $HOME (same as vim's built in path completion) - Support completion of paths relative to ~/ (taken from PR #152) This is getting quite messy now, but that's ok, we have some tests! Refactoring can come later, maybe when supporting hidden files/dirs. --- plugin/grepper.vim | 8 +++++++- test/feature/completion.vader | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/plugin/grepper.vim b/plugin/grepper.vim index fbdc417..3e8d750 100644 --- a/plugin/grepper.vim +++ b/plugin/grepper.vim @@ -235,8 +235,14 @@ endfunction " grepper#complete_files() {{{2 function! grepper#complete_files(lead, _line, _pos) let [head, path] = s:extract_path(a:lead) + " tilde expansion to $HOME + if path ==# '~' + return [$HOME] + " handle paths in $HOME (~/foo) + elseif path[0:1] ==# '~/' + return map(split(globpath($HOME, path[2:].'*'), '\n'), 'head . "~" . v:val['.len($HOME).':] . (isdirectory(v:val) ? s:slash : "")') " handle relative paths - if empty(path) || (path =~ '\s$') || (path =~ '^\s*\w\+') + elseif empty(path) || (path =~ '\s$') || (path =~ '^\s*\w\+') return map( \ map(split(globpath('.'.s:slash, path.'*'), '\n'), 'head . "." . v:val[1:] . (isdirectory(v:val) ? s:slash : "")'), \ "substitute(v:val, '^\\s*.'.s:slash, '', '')" diff --git a/test/feature/completion.vader b/test/feature/completion.vader index 2d87fa1..1a81545 100644 --- a/test/feature/completion.vader +++ b/test/feature/completion.vader @@ -33,6 +33,15 @@ Execute (flags, -tool options): Assert len(grepper#complete('', 'Grepper -tool ', v:null)) > 1 AssertEqual count(grepper#complete('', 'Grepper -tool ', v:null), 'grep '), 1 +Execute (path, tilde expansion): + AssertEqual grepper#complete('~', '', v:null), [$HOME] + +Execute (path, relative to $HOME): + let home = $HOME + let $HOME = getcwd() + AssertEqual grepper#complete('~/f', '', v:null), ['~/foo/'] + let $HOME = home + Execute (relative path, empty string): AssertEqual grepper#complete('', '', v:null), ['foo/']