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:
26
src/search.c
26
src/search.c
@@ -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] == '<')
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user