]> granicus.if.org Git - vim/commitdiff
Fixes for :find completion.
authorBram Moolenaar <Bram@vim.org>
Wed, 11 Aug 2010 20:05:57 +0000 (22:05 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 11 Aug 2010 20:05:57 +0000 (22:05 +0200)
src/misc1.c
src/testdir/test73.in

index fd4e4fe669700ec9c859de76d3470c1138a032ea..400ecf158d0af4b6f15693b1503f137319512877 100644 (file)
@@ -9457,6 +9457,7 @@ uniquefy_paths(gap, pattern)
        char_u      *path = fnames[i];
        int         is_in_curdir;
        char_u      *dir_end = gettail(path);
+       char_u      *short_name;
 
        len = (int)STRLEN(path);
        while (dir_end > path &&
@@ -9475,12 +9476,17 @@ uniquefy_paths(gap, pattern)
         * and it is not unique,
         * reduce it to ./{filename}
         *        FIXME ^ Is this portable?
+        *
+        * Note: If the full filename is /curdir/foo/bar/{filename}, we don't
+        * want to shorten it to ./foo/bar/{filename} yet because 'path' might
+        * contain ". / * *", in which case the shortened filename could be
+        * shorter than ./foo/bar/{filename}.
         */
        if (is_in_curdir)
        {
            char_u *rel_path;
-           char_u *short_name = shorten_fname(path, curdir);
 
+           short_name = shorten_fname(path, curdir);
            if (short_name == NULL)
                short_name = path;
            if (is_unique(short_name, gap, i))
@@ -9533,6 +9539,29 @@ uniquefy_paths(gap, pattern)
                    break;
                }
        }
+
+       if (mch_isFullName(path))
+       {
+           /*
+            * Last resort: shorten relative to curdir if possible.
+            * 'possible' means:
+            * 1. It is under the current directory.
+            * 2. The result is actually shorter than the original.
+            *
+            *      Before                curdir        After
+            *      /foo/bar/file.txt     /foo/bar      ./file.txt
+            *      c:\foo\bar\file.txt   c:\foo\bar    .\file.txt
+            *      /file.txt             /             /file.txt
+            *      c:\file.txt           c:\           .\file.txt
+            */
+           short_name = shorten_fname(path, curdir);
+           if (short_name != NULL && short_name > path + 1)
+           {
+               STRCPY(path, ".");
+               add_pathsep(path);
+               STRCAT(path, short_name);
+           }
+       }
     }
 
 theend:
@@ -9711,7 +9740,7 @@ gen_expand_wildcards(num_pat, pat, num_file, file, flags)
            /*
             * First expand environment variables, "~/" and "~user/".
             */
-           if (vim_strpbrk(p, (char_u *)"$~") != NULL)
+           if (vim_strchr(p, '$') != NULL || *p == '~')
            {
                p = expand_env_save_opt(p, TRUE);
                if (p == NULL)
@@ -9722,7 +9751,7 @@ gen_expand_wildcards(num_pat, pat, num_file, file, flags)
                 * variable, use the shell to do that.  Discard previously
                 * found file names and start all over again.
                 */
-               else if (vim_strpbrk(p, (char_u *)"$~") != NULL)
+               else if (vim_strchr(p, '$') != NULL || *p == '~')
                {
                    vim_free(p);
                    ga_clear_strings(&ga);
index 943807600ff56451e5c15c9749dedd294448db9a..cb2604e681726dadedc3ea539ed0fc6505cee3e4 100644 (file)
@@ -9,7 +9,7 @@ STARTTEST
 :set nocp viminfo+=nviminfo visualbell
 :"
 :function! DeleteDirectory(dir)
-: if has("win16") || has("win32") || has("win64")
+: if has("win16") || has("win32") || has("win64") || has("dos16") || has("dos32")
 :  exec "silent !rmdir /Q /S " . a:dir
 : else
 :  exec "silent !rm -rf " . a:dir