From 73d4e4c8922f6f4d256f910a18f47c0c3a48c28b Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 27 Aug 2016 21:55:13 +0200 Subject: patch 7.4.2274 Problem: Command line completion on "find **/filename" drops sub-directory. Solution: Handle this case separately. (Harm te Hennepe, closes #932, closes #939) --- src/misc1.c | 38 +++++++++++++++++++++++++++----------- src/testdir/test_cmdline.vim | 8 ++++++++ src/version.c | 2 ++ 3 files changed, 37 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/misc1.c b/src/misc1.c index 8cb3b6fd9..d9f02b7bb 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -10514,18 +10514,34 @@ uniquefy_paths(garray_T *gap, char_u *pattern) /* Shorten the filename while maintaining its uniqueness */ path_cutoff = get_path_cutoff(path, &path_ga); - /* we start at the end of the path */ - pathsep_p = path + len - 1; + /* Don't assume all files can be reached without path when search + * pattern starts with star star slash, so only remove path_cutoff + * when possible. */ + if (pattern[0] == '*' && pattern[1] == '*' + && vim_ispathsep_nocolon(pattern[2]) + && path_cutoff != NULL + && vim_regexec(®match, path_cutoff, (colnr_T)0) + && is_unique(path_cutoff, gap, i)) + { + sort_again = TRUE; + mch_memmove(path, path_cutoff, STRLEN(path_cutoff) + 1); + } + else + { + /* Here all files can be reached without path, so get shortest + * unique path. We start at the end of the path. */ + pathsep_p = path + len - 1; - while (find_previous_pathsep(path, &pathsep_p)) - if (vim_regexec(®match, pathsep_p + 1, (colnr_T)0) - && is_unique(pathsep_p + 1, gap, i) - && path_cutoff != NULL && pathsep_p + 1 >= path_cutoff) - { - sort_again = TRUE; - mch_memmove(path, pathsep_p + 1, STRLEN(pathsep_p)); - break; - } + while (find_previous_pathsep(path, &pathsep_p)) + if (vim_regexec(®match, pathsep_p + 1, (colnr_T)0) + && is_unique(pathsep_p + 1, gap, i) + && path_cutoff != NULL && pathsep_p + 1 >= path_cutoff) + { + sort_again = TRUE; + mch_memmove(path, pathsep_p + 1, STRLEN(pathsep_p)); + break; + } + } if (mch_isFullName(path)) { diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index 3a35637b7..f6721d523 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -180,3 +180,11 @@ func Test_getcompletion() call assert_fails('call getcompletion("", "burp")', 'E475:') endfunc + +func Test_expand_star_star() + call mkdir('a/b', 'p') + call writefile(['asdfasdf'], 'a/b/fileXname') + call feedkeys(":find **/fileXname\\", 'xt') + call assert_equal('find a/b/fileXname', getreg(':')) + call delete('a', 'rf') +endfunc diff --git a/src/version.c b/src/version.c index 4a190972a..9987b952d 100644 --- a/src/version.c +++ b/src/version.c @@ -763,6 +763,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2274, /**/ 2273, /**/ -- cgit v1.2.1