Problem: File names in :checkpath! output are garbled.
Solution: Check for \zs in the pattern. (Lech Lorens)
* 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] == '<')
{
-Tests for "gf" on ${VAR}
+Tests for:
+- "gf" on ${VAR},
+- ":checkpath!" with various 'include' settings.
STARTTEST
:so small.vim
: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"\e
+:w
+:e Xdir1/dir2/bar.a
+i#include "baz.a"\e
+:w
+:e Xdir1/dir2/baz.a
+i#include "foo.a"\e
+:w
+:e Xbase.a
+:set path=Xdir1/dir2
+i#include <foo.a>\e
+: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/\e
+:w
+:e Xdir1/dir2/bar.b
+i%inc /baz/\e
+:w
+:e Xdir1/dir2/baz.b
+i%inc /foo/\e
+:w
+:e Xbase.b
+:set path=Xdir1/dir2
+i%inc /foo/\e
+: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\e
+:w
+:e Xdir1/dir2/bar.c
+i%inc baz.c\e
+:w
+:e Xdir1/dir2/baz.c
+i%inc foo.c\e
+:w
+:e Xdir1/dir2/FALSE.c
+i%inc foo.c\e
+:w
+:e Xbase.c
+:set path=Xdir1/dir2
+i%inc FALSE.c foo.c\e
+:w
+:redir! >>test.out
+:checkpath!
+:redir END
+:brewind
+:q
+ENDTEST
+
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)
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 609,
/**/
608,
/**/