diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-08-02 21:33:37 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-08-02 21:33:37 +0200 |
commit | bdc975cdfe38521ba6359fa9df1dea5372c53d94 (patch) | |
tree | d69a32d5445c681479d3b64ab863b886df351b11 /src | |
parent | bbdcb4848a7f9329393c972d27b282ff77861a44 (diff) | |
download | vim-bdc975cdfe38521ba6359fa9df1dea5372c53d94.zip |
Improvements for :find completion. (Nazri Ramliy)
Diffstat (limited to 'src')
-rw-r--r-- | src/misc1.c | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/src/misc1.c b/src/misc1.c index 11c2b1b5a..e564c5cec 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -9317,6 +9317,7 @@ expand_path_option(curdir, gap) char_u *path_option = *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path; char_u *buf; + char_u *p; ga_init2(gap, (int)sizeof(char_u *), 1); @@ -9350,7 +9351,12 @@ expand_path_option(curdir, gap) STRMOVE(buf + curdir_len, buf + curdir_len + 1); } - addfile(gap, buf, EW_NOTFOUND|EW_DIR|EW_FILE); + if (ga_grow(gap, 1) == FAIL) + break; + p = vim_strsave(buf); + if (p == NULL) + break; + ((char_u **)gap->ga_data)[gap->ga_len++] = p; } vim_free(buf); @@ -9378,8 +9384,11 @@ get_path_cutoff(fname, gap) { int j = 0; - while (fname[j] == path_part[i][j] && fname[j] != NUL - && path_part[i][j] != NUL) + while ((fname[j] == path_part[i][j] +#if defined(WIN3264) + || (vim_ispathsep(fname[j]) && vim_ispathsep(path_part[i][j])) +#endif + ) && fname[j] != NUL && path_part[i][j] != NUL) j++; if (j > maxlen) { @@ -9389,8 +9398,15 @@ get_path_cutoff(fname, gap) } /* Skip to the file or directory name */ - while (cutoff != NULL && vim_ispathsep(*cutoff) && *cutoff != NUL) - mb_ptr_adv(cutoff); + if (cutoff != NULL) + while ( +#if defined(WIN3264) + *cutoff == '/' +#else + vim_ispathsep(*cutoff) +#endif + ) + mb_ptr_adv(cutoff); return cutoff; } @@ -9454,7 +9470,13 @@ uniquefy_paths(gap, pattern) char_u *dir_end = gettail(path); len = (int)STRLEN(path); - while (dir_end > path && !vim_ispathsep(*dir_end)) + while (dir_end > path && +#if defined(WIN3264) + *dir_end != '/' +#else + !vim_ispathsep(*dir_end) +#endif + ) mb_ptr_back(path, dir_end); is_in_curdir = STRNCMP(curdir, path, dir_end - path) == 0 && curdir[dir_end - path] == NUL; @@ -9537,8 +9559,8 @@ theend: } /* - * Calls globpath with 'path' values for the given pattern and stores - * the result in gap. + * Calls globpath() or mch_expandpath() with 'path' values for the given + * pattern and stores the result in gap. * Returns the total number of matches. */ static int @@ -9547,15 +9569,18 @@ expand_in_path(gap, pattern, flags) char_u *pattern; int flags; /* EW_* flags */ { - int c = 0; - char_u *files = NULL; - char_u *s; /* start */ - char_u *e; /* end */ - char_u *paths = NULL; char_u **path_list; char_u *curdir; garray_T path_ga; int i; +# ifdef WIN3264 + char_u *file_pattern; +# else + char_u *files = NULL; + char_u *s; /* start */ + char_u *e; /* end */ + char_u *paths = NULL; +# endif if ((curdir = alloc((int)(MAXPATHL))) == NULL) return 0; @@ -9564,6 +9589,17 @@ expand_in_path(gap, pattern, flags) expand_path_option(curdir, &path_ga); vim_free(curdir); path_list = (char_u **)(path_ga.ga_data); +# ifdef WIN3264 + for (i = 0; i < path_ga.ga_len; i++) + { + if (STRLEN(path_list[i]) + STRLEN(pattern) + 2 > MAXPATHL) + continue; + STRCPY(file_pattern, path_list[i]); + STRCAT(file_pattern, "/"); + STRCAT(file_pattern, pattern); + mch_expandpath(gap, file_pattern, EW_DIR|EW_ADDSLASH|EW_FILE); + } +# else for (i = 0; i < path_ga.ga_len; i++) { if (paths == NULL) @@ -9609,10 +9645,10 @@ expand_in_path(gap, pattern, flags) } } - c = gap->ga_len; vim_free(files); +# endif - return c; + return gap->ga_len; } #endif |