]> granicus.if.org Git - vim/commitdiff
patch 7.4.2274 v7.4.2274
authorBram Moolenaar <Bram@vim.org>
Sat, 27 Aug 2016 19:55:13 +0000 (21:55 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 27 Aug 2016 19:55:13 +0000 (21:55 +0200)
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
src/testdir/test_cmdline.vim
src/version.c

index 8cb3b6fd91afda83a9916aa226aa9a69518f6d89..d9f02b7bb645a388481f49a898a19561437a1410 100644 (file)
@@ -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(&regmatch, 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(&regmatch, 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(&regmatch, 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))
        {
index 3a35637b7eaddff278eb27eca3fb9bb45632c282..f6721d523aff5e4cadcd33b2a8ea834412ac5cdb 100644 (file)
@@ -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\<Tab>\<CR>", 'xt')
+  call assert_equal('find a/b/fileXname', getreg(':'))
+  call delete('a', 'rf')
+endfunc
index 4a190972a5ad9259abf3d987769df65aaecc8f13..9987b952d05f9cccb22566b1347a4b1880481d46 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2274,
 /**/
     2273,
 /**/