diff options
-rw-r--r-- | src/search.c | 26 | ||||
-rw-r--r-- | src/testdir/test17.in | 97 | ||||
-rw-r--r-- | src/testdir/test17.ok | 30 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 148 insertions, 7 deletions
diff --git a/src/search.c b/src/search.c index e231a3a10..9f9f0c1c2 100644 --- a/src/search.c +++ b/src/search.c @@ -4740,17 +4740,33 @@ find_pattern_in_path(ptr, dir, len, whole, skip_comments, * Isolate the file name. * Include the surrounding "" or <> if present. */ - for (p = incl_regmatch.endp[0]; !vim_isfilec(*p); p++) - ; - for (i = 0; vim_isfilec(p[i]); i++) - ; + if (inc_opt != NULL + && strstr((char *)inc_opt, "\\zs") != NULL) + { + /* pattern contains \zs, use the match */ + p = incl_regmatch.startp[0]; + i = (int)(incl_regmatch.endp[0] + - incl_regmatch.startp[0]); + } + else + { + /* find the file name after the end of the match */ + for (p = incl_regmatch.endp[0]; + *p && !vim_isfilec(*p); p++) + ; + for (i = 0; vim_isfilec(p[i]); i++) + ; + } + if (i == 0) { /* Nothing found, use the rest of the line. */ p = incl_regmatch.endp[0]; i = (int)STRLEN(p); } - else + /* Avoid checking before the start of the line, can + * happen if \zs appears in the regexp. */ + else if (p > line) { if (p[-1] == '"' || p[-1] == '<') { diff --git a/src/testdir/test17.in b/src/testdir/test17.in index e59144ffb..9c25e9991 100644 --- a/src/testdir/test17.in +++ b/src/testdir/test17.in @@ -1,4 +1,6 @@ -Tests for "gf" on ${VAR} +Tests for: +- "gf" on ${VAR}, +- ":checkpath!" with various 'include' settings. STARTTEST :so small.vim @@ -20,8 +22,99 @@ STARTTEST :endif gf :w! test.out -:qa! +:brewind ENDTEST ${CDIR}/test17a.in $TDIR/test17a.in + +STARTTEST +:" check for 'include' without \zs or \ze +:lang C +:!rm -f ./Xbase.a +:!rm -rf ./Xdir1 +:!mkdir -p Xdir1/dir2 +:e Xdir1/dir2/foo.a +i#include "bar.a" +:w +:e Xdir1/dir2/bar.a +i#include "baz.a" +:w +:e Xdir1/dir2/baz.a +i#include "foo.a" +:w +:e Xbase.a +:set path=Xdir1/dir2 +i#include <foo.a> +:w +:redir! >>test.out +:checkpath! +:redir END +:brewind +ENDTEST + +STARTTEST +:" check for 'include' with \zs and \ze +:!rm -f ./Xbase.b +:!rm -rf ./Xdir1 +:!mkdir -p Xdir1/dir2 +:let &include='^\s*%inc\s*/\zs[^/]\+\ze' +:function! DotsToSlashes() +: return substitute(v:fname, '\.', '/', 'g') . '.b' +:endfunction +:let &includeexpr='DotsToSlashes()' +:e Xdir1/dir2/foo.b +i%inc /bar/ +:w +:e Xdir1/dir2/bar.b +i%inc /baz/ +:w +:e Xdir1/dir2/baz.b +i%inc /foo/ +:w +:e Xbase.b +:set path=Xdir1/dir2 +i%inc /foo/ +:w +:redir! >>test.out +:checkpath! +:redir END +:brewind +ENDTEST + +STARTTEST +:" check for 'include' with \zs and no \ze +:!rm -f ./Xbase.c +:!rm -rf ./Xdir1 +:!mkdir -p Xdir1/dir2 +:let &include='^\s*%inc\s*\%([[:upper:]][^[:space:]]*\s\+\)\?\zs\S\+\ze' +:function! StripNewlineChar() +: if v:fname =~ '\n$' +: return v:fname[:-2] +: endif +: return v:fname +:endfunction +:let &includeexpr='StripNewlineChar()' +:e Xdir1/dir2/foo.c +i%inc bar.c +:w +:e Xdir1/dir2/bar.c +i%inc baz.c +:w +:e Xdir1/dir2/baz.c +i%inc foo.c +:w +:e Xdir1/dir2/FALSE.c +i%inc foo.c +:w +:e Xbase.c +:set path=Xdir1/dir2 +i%inc FALSE.c foo.c +:w +:redir! >>test.out +:checkpath! +:redir END +:brewind +:q +ENDTEST + diff --git a/src/testdir/test17.ok b/src/testdir/test17.ok index 7e8936479..79fef07d0 100644 --- a/src/testdir/test17.ok +++ b/src/testdir/test17.ok @@ -1,3 +1,33 @@ This file is just to test "gf" in test 17. The contents is not important. Just testing! + + +--- Included files in path --- +Xdir1/dir2/foo.a +Xdir1/dir2/foo.a --> + Xdir1/dir2/bar.a + Xdir1/dir2/bar.a --> + Xdir1/dir2/baz.a + Xdir1/dir2/baz.a --> + "foo.a" (Already listed) + + +--- Included files in path --- +Xdir1/dir2/foo.b +Xdir1/dir2/foo.b --> + Xdir1/dir2/bar.b + Xdir1/dir2/bar.b --> + Xdir1/dir2/baz.b + Xdir1/dir2/baz.b --> + foo (Already listed) + + +--- Included files in path --- +Xdir1/dir2/foo.c +Xdir1/dir2/foo.c --> + Xdir1/dir2/bar.c + Xdir1/dir2/bar.c --> + Xdir1/dir2/baz.c + Xdir1/dir2/baz.c --> + foo.c^@ (Already listed) diff --git a/src/version.c b/src/version.c index c8a283e06..397d9b09d 100644 --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 609, +/**/ 608, /**/ 607, |