On Wed, Jul 21, 2010 at 12:10 AM, Bram Moolenaar <[email protected]> wrote:
>
> Nazri Ramliy wrote:
>
>> On Tue, Jul 20, 2010 at 8:06 AM, Nazri Ramliy <[email protected]> wrote:
>> Attached patch solves the duplicate entry.
>>
>> While fixing this bug I found another:
[snipped description of bug due to ...]
>> The function uniquefy_paths in misc1.c shortens the list of full path
>> file names without taking into account the values in 'path' option.
>>
>> I'll look into fixing this too.
>
> Thanks, this works better. I included this patch and made a few
> cosmetical changes.
>
> I also see duplicates in the form "./term.h" and "term.h". The "./" has
> no effect, thus these two names are the same. The complete list is:
>
> ./term.h include/term.h term.h
Attached are four patches that fix the above problem and refine the behavior of
the find/sfind/tabfind completion. Also I've added note to the documentation on
the limitation of the completion when 'path' has url and directory limiter
(/usr/**2) and upward search (;) notations.
Note that with this patch, the previous (duplicate) completions (done
in vim's src
directory with default 'path' setting):
> ./term.h include/term.h term.h
are now "reduced" to:
term.h
and it does not differentiate between "include/term.h" and "./term.h" due to
because doing ":find include/term.h" would fail with the default 'path' setting
(".,/usr/include,,").
nazri.
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
From bf06811c40d383a940d72f8784815f5fa62f6b00 Mon Sep 17 00:00:00 2001
From: nazri <[email protected]>
Date: Fri, 23 Jul 2010 12:37:29 +0800
Subject: [PATCH 1/4] Fix ./foo and foo duplication for find/sfind/tabfind completion
This is achieved by trimming the corresponding 'path' portion from each
matching filenames.
---
src/ex_getln.c | 29 +++++++++++++++++++++++++++++
src/misc1.c | 6 +++---
src/vim.h | 1 +
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 153271b..e00d8d9 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -3402,6 +3402,7 @@ nextwild(xp, type, options)
* options = WILD_KEEP_ALL: don't remove 'wildignore' entries
* options = WILD_SILENT: don't print warning messages
* options = WILD_ESCAPE: put backslash before special chars
+ * options = WILD_TRIM_PREFIX: trim the 'path' part used as glob prefix
*
* The variables xp->xp_context and xp->xp_backslash must have been set!
*/
@@ -5016,11 +5017,19 @@ globpath(path, file, expand_options)
int num_p;
char_u **p;
char_u *cur = NULL;
+ char_u *trim;
buf = alloc(MAXPATHL);
if (buf == NULL)
return NULL;
+ if (WILD_TRIM_PREFIX|expand_options)
+ {
+ trim = alloc(MAXPATHL);
+ if (trim == NULL)
+ return NULL;
+ }
+
ExpandInit(&xpc);
xpc.xp_context = EXPAND_FILES;
@@ -5034,13 +5043,31 @@ globpath(path, file, expand_options)
if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL)
{
add_pathsep(buf);
+ if (WILD_TRIM_PREFIX|expand_options)
+ STRCPY(trim, buf);
STRCAT(buf, file);
if (ExpandFromContext(&xpc, buf, &num_p, &p,
WILD_SILENT|expand_options) != FAIL && num_p > 0)
{
ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options);
for (len = 0, i = 0; i < num_p; ++i)
+ {
+ if (WILD_TRIM_PREFIX|expand_options)
+ {
+ char_u *p1 = p[i];
+ int c = 0;
+
+ while(p1[c] == trim[c] &&
+ (p1[c] != '\n' || p1[c] != '\0') &&
+ trim[c] != '\0')
+ c++;
+ while(vim_ispathsep(p1[c]))
+ c++;
+ STRMOVE(p[i], &p[i][c]);
+ }
+
len += (int)STRLEN(p[i]) + 1;
+ }
/* Concatenate new results to previous ones. */
if (ga_grow(&ga, len) == OK)
@@ -5061,6 +5088,8 @@ globpath(path, file, expand_options)
if (cur != NULL)
*--cur = 0; /* Replace trailing newline with NUL */
+ if (WILD_TRIM_PREFIX|expand_options)
+ vim_free(trim);
vim_free(buf);
return (char_u *)ga.ga_data;
}
diff --git a/src/misc1.c b/src/misc1.c
index 8e2c656..d154662 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -9416,7 +9416,7 @@ expand_in_path(gap, pattern, flags)
char_u *s; /* start */
char_u *e; /* end */
- files = globpath(path_option, pattern, 0);
+ files = globpath(path_option, pattern, WILD_TRIM_PREFIX);
if (files == NULL)
return 0;
@@ -9428,14 +9428,14 @@ expand_in_path(gap, pattern, flags)
e++;
if (*e == '\0')
{
- addfile(gap, s, flags);
+ addfile(gap, s, EW_NOTFOUND|flags);
break;
}
else
{
/* *e is '\n' */
*e = '\0';
- addfile(gap, s, flags);
+ addfile(gap, s, EW_NOTFOUND|flags);
e++;
s = e;
}
diff --git a/src/vim.h b/src/vim.h
index ce55514..051a4b2 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -797,6 +797,7 @@ extern char *(*dyn_libintl_textdomain)(const char *domainname);
#define WILD_KEEP_ALL 32
#define WILD_SILENT 64
#define WILD_ESCAPE 128
+#define WILD_TRIM_PREFIX 256
/* Flags for expand_wildcards() */
#define EW_DIR 0x01 /* include directory names */
--
1.7.2
From 46b01f72e0492bf1c9955fd4642aaa3854e8018d Mon Sep 17 00:00:00 2001
From: nazri <[email protected]>
Date: Fri, 23 Jul 2010 16:48:22 +0800
Subject: [PATCH 2/4] Support spaces in 'path' option for find/sfind/tabfind completion
---
src/ex_getln.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/ex_getln.c b/src/ex_getln.c
index e00d8d9..57f4121 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -5039,7 +5039,7 @@ globpath(path, file, expand_options)
while (*path != NUL)
{
/* Copy one item of the path to buf[] and concatenate the file name. */
- copy_option_part(&path, buf, MAXPATHL, ",");
+ copy_option_part(&path, buf, MAXPATHL, " ,");
if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL)
{
add_pathsep(buf);
--
1.7.2
From 3174d9a929293b88423f85754b328900d0ab6986 Mon Sep 17 00:00:00 2001
From: nazri <[email protected]>
Date: Fri, 23 Jul 2010 16:44:57 +0800
Subject: [PATCH 3/4] Skip url path when doing completion for find/sfind/tabfind
---
src/ex_getln.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 57f4121..a694106 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -5040,6 +5040,12 @@ globpath(path, file, expand_options)
{
/* Copy one item of the path to buf[] and concatenate the file name. */
copy_option_part(&path, buf, MAXPATHL, " ,");
+ if (path_with_url(buf))
+ continue;
+ /*
+ * FIXME: should we proactively skip 'path' with limiter (/usr/**N) and
+ * upward search (;) notations, just like we did with url above?
+ */
if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL)
{
add_pathsep(buf);
--
1.7.2
From 789b79252665f464f1430aacce9146435baf2ad0 Mon Sep 17 00:00:00 2001
From: nazri <[email protected]>
Date: Fri, 23 Jul 2010 16:17:09 +0800
Subject: [PATCH 4/4] Add note on limitation of find/sfind/tabfind completion
---
runtime/doc/editing.txt | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt
index 0d242ff..23e713e 100644
--- a/runtime/doc/editing.txt
+++ b/runtime/doc/editing.txt
@@ -1625,7 +1625,10 @@ There are three different types of searching:
< This searches: >
/u/user_x/work/release/**
/u/user_x/**
-< This searches the same directories, but in a different order.
+< This searches the same directories, but in a different order. >
+< Note that completion for ":find", ":sfind", and ":tabfind" commands do not
+ currently work with 'path' settings that contain url or use the limiter
+ (/usr/**2) and upward search (;) notations. >
vim:tw=78:ts=8:ft=help:norl:
--
1.7.2