1
0
forked from aniani/vim

updated for version 7.3.609

Problem:    File names in :checkpath! output are garbled.
Solution:   Check for \zs in the pattern. (Lech Lorens)
This commit is contained in:
Bram Moolenaar
2012-07-25 13:46:30 +02:00
parent 6763c140d6
commit 058bdcfd5d
4 changed files with 148 additions and 7 deletions

View File

@@ -4740,17 +4740,33 @@ find_pattern_in_path(ptr, dir, len, whole, skip_comments,
* Isolate the file name. * Isolate the file name.
* Include the surrounding "" or <> if present. * Include the surrounding "" or <> if present.
*/ */
for (p = incl_regmatch.endp[0]; !vim_isfilec(*p); p++) if (inc_opt != NULL
; && strstr((char *)inc_opt, "\\zs") != NULL)
for (i = 0; vim_isfilec(p[i]); i++) {
; /* 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) if (i == 0)
{ {
/* Nothing found, use the rest of the line. */ /* Nothing found, use the rest of the line. */
p = incl_regmatch.endp[0]; p = incl_regmatch.endp[0];
i = (int)STRLEN(p); 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] == '<') if (p[-1] == '"' || p[-1] == '<')
{ {

View File

@@ -1,4 +1,6 @@
Tests for "gf" on ${VAR} Tests for:
- "gf" on ${VAR},
- ":checkpath!" with various 'include' settings.
STARTTEST STARTTEST
:so small.vim :so small.vim
@@ -20,8 +22,99 @@ STARTTEST
:endif :endif
gf gf
:w! test.out :w! test.out
:qa! :brewind
ENDTEST ENDTEST
${CDIR}/test17a.in ${CDIR}/test17a.in
$TDIR/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

View File

@@ -1,3 +1,33 @@
This file is just to test "gf" in test 17. This file is just to test "gf" in test 17.
The contents is not important. The contents is not important.
Just testing! 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)

View File

@@ -714,6 +714,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
609,
/**/ /**/
608, 608,
/**/ /**/