diff options
Diffstat (limited to 'src/nvim/path.c')
| -rw-r--r-- | src/nvim/path.c | 33 | 
1 files changed, 23 insertions, 10 deletions
| diff --git a/src/nvim/path.c b/src/nvim/path.c index a79b7139f1..6149e1ab99 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -903,17 +903,30 @@ static void 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; - -    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; -        memmove(path, pathsep_p + 1, STRLEN(pathsep_p)); -        break; +    // Don't assume all files can be reached without path when search +    // pattern starts with **/, 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; +      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; +          memmove(path, pathsep_p + 1, STRLEN(pathsep_p)); +          break; +        }        } +    }      if (path_is_absolute_path(path)) {        /* | 
