Patch 7.3.872

90 views
Skip to first unread message

Bram Moolenaar

unread,
Mar 19, 2013, 11:49:37 AM3/19/13
to vim...@googlegroups.com

Patch 7.3.872
Problem: On some systems case of file names is always ignored, on others
never.
Solution: Add the 'fileignorecase' option to control this at runtime.
Implies 'wildignorecase'.
Files: src/buffer.c, src/edit.c, src/ex_cmds2.c, src/ex_getln.c,
src/fileio.c, src/misc1.c, src/misc2.c, src/option.c,
src/option.h, src/vim.h, runtime/doc/options.txt


*** ../vim-7.3.871/src/buffer.c 2013-03-19 14:25:50.000000000 +0100
--- src/buffer.c 2013-03-19 16:03:42.000000000 +0100
***************
*** 2401,2412 ****
if (name != NULL)
{
regmatch.regprog = prog;
! #ifdef CASE_INSENSITIVE_FILENAME
! regmatch.rm_ic = TRUE; /* Always ignore case */
! #else
! regmatch.rm_ic = FALSE; /* Never ignore case */
! #endif
!
if (vim_regexec(&regmatch, name, (colnr_T)0))
match = name;
else
--- 2401,2407 ----
if (name != NULL)
{
regmatch.regprog = prog;
! regmatch.rm_ic = p_fic; /* ignore case when 'fileignorecase' is set */
if (vim_regexec(&regmatch, name, (colnr_T)0))
match = name;
else
*** ../vim-7.3.871/src/edit.c 2013-03-19 13:33:18.000000000 +0100
--- src/edit.c 2013-03-19 15:43:19.000000000 +0100
***************
*** 4336,4348 ****

/* May change home directory back to "~". */
tilde_replace(compl_pattern, num_matches, matches);
! ins_compl_add_matches(num_matches, matches,
! #ifdef CASE_INSENSITIVE_FILENAME
! TRUE
! #else
! FALSE
! #endif
! );
}
break;

--- 4336,4342 ----

/* May change home directory back to "~". */
tilde_replace(compl_pattern, num_matches, matches);
! ins_compl_add_matches(num_matches, matches, p_fic || p_wic);
}
break;

*** ../vim-7.3.871/src/ex_cmds2.c 2012-10-03 18:24:55.000000000 +0200
--- src/ex_cmds2.c 2013-03-19 16:03:50.000000000 +0100
***************
*** 1926,1936 ****
* Delete the items: use each item as a regexp and find a match in the
* argument list.
*/
! #ifdef CASE_INSENSITIVE_FILENAME
! regmatch.rm_ic = TRUE; /* Always ignore case */
! #else
! regmatch.rm_ic = FALSE; /* Never ignore case */
! #endif
for (i = 0; i < new_ga.ga_len && !got_int; ++i)
{
p = ((char_u **)new_ga.ga_data)[i];
--- 1926,1932 ----
* Delete the items: use each item as a regexp and find a match in the
* argument list.
*/
! regmatch.rm_ic = p_fic; /* ignore case when 'fileignorecase' is set */
for (i = 0; i < new_ga.ga_len && !got_int; ++i)
{
p = ((char_u **)new_ga.ga_data)[i];
*** ../vim-7.3.871/src/ex_getln.c 2012-11-28 16:49:53.000000000 +0100
--- src/ex_getln.c 2013-03-19 16:03:53.000000000 +0100
***************
*** 3653,3671 ****
{
for (i = 0; i < xp->xp_numfiles; ++i)
{
! #ifdef CASE_INSENSITIVE_FILENAME
! if (xp->xp_context == EXPAND_DIRECTORIES
|| xp->xp_context == EXPAND_FILES
|| xp->xp_context == EXPAND_SHELLCMD
! || xp->xp_context == EXPAND_BUFFERS)
{
if (TOLOWER_LOC(xp->xp_files[i][len]) !=
TOLOWER_LOC(xp->xp_files[0][len]))
break;
}
! else
! #endif
! if (xp->xp_files[i][len] != xp->xp_files[0][len])
break;
}
if (i < xp->xp_numfiles)
--- 3653,3668 ----
{
for (i = 0; i < xp->xp_numfiles; ++i)
{
! if (p_fic && (xp->xp_context == EXPAND_DIRECTORIES
|| xp->xp_context == EXPAND_FILES
|| xp->xp_context == EXPAND_SHELLCMD
! || xp->xp_context == EXPAND_BUFFERS))
{
if (TOLOWER_LOC(xp->xp_files[i][len]) !=
TOLOWER_LOC(xp->xp_files[0][len]))
break;
}
! else if (xp->xp_files[i][len] != xp->xp_files[0][len])
break;
}
if (i < xp->xp_numfiles)
*** ../vim-7.3.871/src/fileio.c 2013-03-19 13:33:18.000000000 +0100
--- src/fileio.c 2013-03-19 15:49:28.000000000 +0100
***************
*** 6485,6493 ****
#ifdef HAVE_ACL
vim_acl_T acl; /* ACL from original file */
#endif
- #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
int use_tmp_file = FALSE;
- #endif

/*
* When the names are identical, there is nothing to do. When they refer
--- 6485,6491 ----
***************
*** 6496,6506 ****
*/
if (fnamecmp(from, to) == 0)
{
! #ifdef CASE_INSENSITIVE_FILENAME
! if (STRCMP(gettail(from), gettail(to)) != 0)
use_tmp_file = TRUE;
else
- #endif
return 0;
}

--- 6494,6502 ----
*/
if (fnamecmp(from, to) == 0)
{
! if (p_fic && STRCMP(gettail(from), gettail(to)) != 0)
use_tmp_file = TRUE;
else
return 0;
}

***************
*** 6539,6545 ****
}
#endif

- #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
if (use_tmp_file)
{
char tempname[MAXPATHL + 1];
--- 6535,6540 ----
***************
*** 6572,6578 ****
}
return -1;
}
- #endif

/*
* Delete the "to" file, this is required on some systems to make the
--- 6567,6572 ----
***************
*** 10007,10017 ****
int match = FALSE;
#endif

! #ifdef CASE_INSENSITIVE_FILENAME
! regmatch.rm_ic = TRUE; /* Always ignore case */
! #else
! regmatch.rm_ic = FALSE; /* Don't ever ignore case */
! #endif
#ifdef FEAT_OSFILETYPE
if (*pattern == '<')
{
--- 10001,10007 ----
int match = FALSE;
#endif

! regmatch.rm_ic = p_fic; /* ignore case if 'fileignorecase' is set */
#ifdef FEAT_OSFILETYPE
if (*pattern == '<')
{
*** ../vim-7.3.871/src/misc1.c 2013-03-16 21:35:28.000000000 +0100
--- src/misc1.c 2013-03-19 16:16:24.000000000 +0100
***************
*** 5026,5041 ****
return retval;
}

- #if (defined(CASE_INSENSITIVE_FILENAME) && defined(BACKSLASH_IN_FILENAME)) \
- || defined(PROTO)
/*
! * Versions of fnamecmp() and fnamencmp() that handle '/' and '\' equally.
*/
int
vim_fnamecmp(x, y)
char_u *x, *y;
{
return vim_fnamencmp(x, y, MAXPATHL);
}

int
--- 5026,5046 ----
return retval;
}

/*
! * Versions of fnamecmp() and fnamencmp() that handle '/' and '\' equally
! * and deal with 'fileignorecase'.
*/
int
vim_fnamecmp(x, y)
char_u *x, *y;
{
+ #ifdef BACKSLASH_IN_FILENAME
return vim_fnamencmp(x, y, MAXPATHL);
+ #else
+ if (p_fic)
+ return MB_STRICMP(x, y);
+ return STRCMP(x, y);
+ #endif
}

int
***************
*** 5043,5051 ****
char_u *x, *y;
size_t len;
{
while (len > 0 && *x && *y)
{
! if (TOLOWER_LOC(*x) != TOLOWER_LOC(*y)
&& !(*x == '/' && *y == '\\')
&& !(*x == '\\' && *y == '/'))
break;
--- 5048,5058 ----
char_u *x, *y;
size_t len;
{
+ #ifdef BACKSLASH_IN_FILENAME
+ /* TODO: multi-byte characters. */
while (len > 0 && *x && *y)
{
! if ((p_fic ? TOLOWER_LOC(*x) != TOLOWER_LOC(*y) : *x != *y)
&& !(*x == '/' && *y == '\\')
&& !(*x == '\\' && *y == '/'))
break;
***************
*** 5056,5063 ****
if (len == 0)
return 0;
return (*x - *y);
! }
#endif

/*
* Concatenate file names fname1 and fname2 into allocated memory.
--- 5063,5074 ----
if (len == 0)
return 0;
return (*x - *y);
! #else
! if (p_fic)
! return MB_STRNICMP(x, y, len);
! return STRNCMP(x, y, len);
#endif
+ }

/*
* Concatenate file names fname1 and fname2 into allocated memory.
***************
*** 9835,9845 ****
}
else if (path_end >= path + wildoff
&& (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL
! #ifndef CASE_INSENSITIVE_FILENAME
! || ((flags & EW_ICASE)
! && isalpha(PTR2CHAR(path_end)))
! #endif
! ))
e = p;
#ifdef FEAT_MBYTE
if (has_mbyte)
--- 9846,9853 ----
}
else if (path_end >= path + wildoff
&& (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL
! || (!p_fic && (flags & EW_ICASE)
! && isalpha(PTR2CHAR(path_end)))))
e = p;
#ifdef FEAT_MBYTE
if (has_mbyte)
***************
*** 9882,9895 ****
}

/* compile the regexp into a program */
- #ifdef CASE_INSENSITIVE_FILENAME
- regmatch.rm_ic = TRUE; /* Behave like Terminal.app */
- #else
if (flags & EW_ICASE)
regmatch.rm_ic = TRUE; /* 'wildignorecase' set */
else
! regmatch.rm_ic = FALSE; /* Don't ignore case */
! #endif
if (flags & (EW_NOERROR | EW_NOTWILD))
++emsg_silent;
regmatch.regprog = vim_regcomp(pat, RE_MAGIC);
--- 9890,9899 ----
}

/* compile the regexp into a program */
if (flags & EW_ICASE)
regmatch.rm_ic = TRUE; /* 'wildignorecase' set */
else
! regmatch.rm_ic = p_fic; /* ignore case when 'fileignorecase' is set */
if (flags & (EW_NOERROR | EW_NOTWILD))
++emsg_silent;
regmatch.regprog = vim_regcomp(pat, RE_MAGIC);
*** ../vim-7.3.871/src/misc2.c 2012-11-28 18:31:49.000000000 +0100
--- src/misc2.c 2013-03-19 16:39:56.000000000 +0100
***************
*** 5362,5374 ****
if (STRLEN(s1) != STRLEN(s2))
return FAIL;

for (i = 0; s1[i] != NUL && s2[i] != NUL; i++)
{
if (s1[i] != s2[i]
! #ifdef CASE_INSENSITIVE_FILENAME
! && TOUPPER_LOC(s1[i]) != TOUPPER_LOC(s2[i])
! #endif
! )
{
if (i >= 2)
if (s1[i-1] == '*' && s1[i-2] == '*')
--- 5362,5372 ----
if (STRLEN(s1) != STRLEN(s2))
return FAIL;

+ /* TODO: handle multi-byte characters. */
for (i = 0; s1[i] != NUL && s2[i] != NUL; i++)
{
if (s1[i] != s2[i]
! && (!p_fic || TOUPPER_LOC(s1[i]) != TOUPPER_LOC(s2[i])))
{
if (i >= 2)
if (s1[i-1] == '*' && s1[i-2] == '*')
***************
*** 6123,6134 ****
break;
}

! if (
! #ifdef CASE_INSENSITIVE_FILENAME
! TOUPPER_LOC(p[i]) != TOUPPER_LOC(q[i])
! #else
! p[i] != q[i]
! #endif
#ifdef BACKSLASH_IN_FILENAME
/* consider '/' and '\\' to be equal */
&& !((p[i] == '/' && q[i] == '\\')
--- 6121,6127 ----
break;
}

! if ((p_fic ? TOUPPER_LOC(p[i]) != TOUPPER_LOC(q[i]) : p[i] != q[i])
#ifdef BACKSLASH_IN_FILENAME
/* consider '/' and '\\' to be equal */
&& !((p[i] == '/' && q[i] == '\\')
*** ../vim-7.3.871/src/option.c 2013-03-13 20:42:28.000000000 +0100
--- src/option.c 2013-03-19 15:40:25.000000000 +0100
***************
*** 1108,1113 ****
--- 1108,1122 ----
(char_u *)&p_ffs, PV_NONE,
{(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM}
SCRIPTID_INIT},
+ {"fileignorecase", "fic", P_BOOL|P_VI_DEF,
+ (char_u *)&p_fic, PV_NONE,
+ {
+ #ifdef CASE_INSENSITIVE_FILENAME
+ (char_u *)TRUE,
+ #else
+ (char_u *)FALSE,
+ #endif
+ (char_u *)0L} SCRIPTID_INIT},
{"filetype", "ft", P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME,
#ifdef FEAT_AUTOCMD
(char_u *)&p_ft, PV_FT,
*** ../vim-7.3.871/src/option.h 2012-08-15 16:20:59.000000000 +0200
--- src/option.h 2013-03-19 15:42:24.000000000 +0100
***************
*** 453,458 ****
--- 453,459 ----
EXTERN char_u *p_fencs; /* 'fileencodings' */
#endif
EXTERN char_u *p_ffs; /* 'fileformats' */
+ EXTERN long p_fic; /* 'fileignorecase' */
#ifdef FEAT_FOLDING
EXTERN char_u *p_fcl; /* 'foldclose' */
EXTERN long p_fdls; /* 'foldlevelstart' */
*** ../vim-7.3.871/src/vim.h 2013-03-19 13:33:18.000000000 +0100
--- src/vim.h 2013-03-19 16:14:29.000000000 +0100
***************
*** 1627,1644 ****
* (this does not account for maximum name lengths and things like "../dir",
* thus it is not 100% accurate!)
*/
! #ifdef CASE_INSENSITIVE_FILENAME
! # ifdef BACKSLASH_IN_FILENAME
! # define fnamecmp(x, y) vim_fnamecmp((x), (y))
! # define fnamencmp(x, y, n) vim_fnamencmp((x), (y), (size_t)(n))
! # else
! # define fnamecmp(x, y) MB_STRICMP((x), (y))
! # define fnamencmp(x, y, n) MB_STRNICMP((x), (y), (n))
! # endif
! #else
! # define fnamecmp(x, y) strcmp((char *)(x), (char *)(y))
! # define fnamencmp(x, y, n) strncmp((char *)(x), (char *)(y), (size_t)(n))
! #endif

#ifdef HAVE_MEMSET
# define vim_memset(ptr, c, size) memset((ptr), (c), (size))
--- 1627,1634 ----
* (this does not account for maximum name lengths and things like "../dir",
* thus it is not 100% accurate!)
*/
! #define fnamecmp(x, y) vim_fnamecmp((char_u *)(x), (char_u *)(y))
! #define fnamencmp(x, y, n) vim_fnamencmp((char_u *)(x), (char_u *)(y), (size_t)(n))

#ifdef HAVE_MEMSET
# define vim_memset(ptr, c, size) memset((ptr), (c), (size))
*** ../vim-7.3.871/runtime/doc/options.txt 2013-01-23 18:37:31.000000000 +0100
--- runtime/doc/options.txt 2013-03-19 16:25:49.000000000 +0100
***************
*** 2895,2900 ****
--- 2941,2954 ----
NOTE: This option is set to the Vi default value when 'compatible' is
set and to the Vim default value when 'compatible' is reset.

+ *'fileignorecase'* *'wic'* *'nofileignorecase'* *'nowic'*
+ 'fileignorecase' 'wic' boolean (default on for systems where case in file
+ names is normally ignored.
+ global
+ {not in Vi}
+ When set case is ignored when using file names and directories.
+ See 'wildignorecase' for only ignoring case when doing completion.
+
*'filetype'* *'ft'*
'filetype' 'ft' string (default: "")
local to buffer
***************
*** 7832,7843 ****
uses another default.


! *'wildignorecase* *'wic'* *'nowildignorecase* *'nowic'*
'wildignorecase' 'wic' boolean (default off)
global
{not in Vi}
When set case is ignored when completing file names and directories.
! Has no effect on systems where file name case is generally ignored.
Does not apply when the shell is used to expand wildcards, which
happens when there are special characters.

--- 7906,7917 ----
uses another default.


! *'wildignorecase'* *'wic'* *'nowildignorecase'* *'nowic'*
'wildignorecase' 'wic' boolean (default off)
global
{not in Vi}
When set case is ignored when completing file names and directories.
! Has no effect when 'fileignorecase' is set.
Does not apply when the shell is used to expand wildcards, which
happens when there are special characters.

*** ../vim-7.3.871/src/version.c 2013-03-19 15:27:43.000000000 +0100
--- src/version.c 2013-03-19 16:22:46.000000000 +0100
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 872,
/**/

--
hundred-and-one symptoms of being an internet addict:
76. Your ISP regards you as a business partner rather than as a customer.

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

Ingo Karkat

unread,
Mar 19, 2013, 12:23:48 PM3/19/13
to vim...@googlegroups.com, Bram Moolenaar
On 19-Mar-13 16:49:37 +0100, Bram Moolenaar wrote:

> Patch 7.3.872
> Problem: On some systems case of file names is always ignored, on others
> never.
> Solution: Add the 'fileignorecase' option to control this at runtime.
> Implies 'wildignorecase'.
> Files: src/buffer.c, src/edit.c, src/ex_cmds2.c, src/ex_getln.c,
> src/fileio.c, src/misc1.c, src/misc2.c, src/option.c,
> src/option.h, src/vim.h, runtime/doc/options.txt

Typo: In the help, the abbrevation 'wic' is mistakenly (re-)used instead of 'fic':

diff -r c2bf5b221b1d runtime/doc/options.txt
--- a/runtime/doc/options.txt Tue Mar 19 16:49:16 2013 +0100
+++ b/runtime/doc/options.txt Tue Mar 19 17:20:49 2013 +0100
@@ -2941,8 +2941,8 @@
NOTE: This option is set to the Vi default value when 'compatible' is
set and to the Vim default value when 'compatible' is reset.

- *'fileignorecase'* *'wic'* *'nofileignorecase'* *'nowic'*
-'fileignorecase' 'wic' boolean (default on for systems where case in file
+ *'fileignorecase'* *'fic'* *'nofileignorecase'* *'nofic'*
+'fileignorecase' 'fic' boolean (default on for systems where case in file
names is normally ignored.
global
{not in Vi}

-- regards, ingo

Bram Moolenaar

unread,
Mar 19, 2013, 12:53:30 PM3/19/13
to Ingo Karkat, vim...@googlegroups.com, Bram Moolenaar

Ingo Karkat wrote:

> On 19-Mar-13 16:49:37 +0100, Bram Moolenaar wrote:
>
> > Patch 7.3.872
> > Problem: On some systems case of file names is always ignored, on others
> > never.
> > Solution: Add the 'fileignorecase' option to control this at runtime.
> > Implies 'wildignorecase'.
> > Files: src/buffer.c, src/edit.c, src/ex_cmds2.c, src/ex_getln.c,
> > src/fileio.c, src/misc1.c, src/misc2.c, src/option.c,
> > src/option.h, src/vim.h, runtime/doc/options.txt
>
> Typo: In the help, the abbrevation 'wic' is mistakenly (re-)used
> instead of 'fic':

Thanks for noticing that mistake.

--
hundred-and-one symptoms of being an internet addict:
79. All of your most erotic dreams have a scrollbar at the right side.

Ben Fritz

unread,
Mar 19, 2013, 1:28:05 PM3/19/13
to vim...@googlegroups.com
On Tuesday, March 19, 2013 10:49:37 AM UTC-5, Bram Moolenaar wrote:
> + *'fileignorecase'* *'wic'* *'nofileignorecase'* *'nowic'*
> + 'fileignorecase' 'wic' boolean (default on for systems where case in file
> + names is normally ignored.
> + global
> + {not in Vi}
> + When set case is ignored when using file names and directories.
> + See 'wildignorecase' for only ignoring case when doing completion.
> +

Another typo: no closing parenthesis for description of default value.

h_east

unread,
Mar 20, 2013, 9:01:29 AM3/20/13
to vim...@googlegroups.com
Hi Bram,

2013/3/20(Wed) 0:49:37 UTC+9 Bram Moolenaar:


> Patch 7.3.872
>
> Problem: On some systems case of file names is always ignored, on others
>
> never.
>
> Solution: Add the 'fileignorecase' option to control this at runtime.
>
> Implies 'wildignorecase'.
>
> Files: src/buffer.c, src/edit.c, src/ex_cmds2.c, src/ex_getln.c,
>
> src/fileio.c, src/misc1.c, src/misc2.c, src/option.c,
>
> src/option.h, src/vim.h, runtime/doc/options.txt

When 'set fic' on linux, file name completion order is strange.
It's different for both case-sensitive and case-insensitive.

How to reproduce (on fedora17)
$ mkdir test_fic
$ cd !$
$ touch I1.txt I2.txt J3.txt J4.txt i1.txt j3.txt
(Necessary: same file name (without case-sensitive) exist.)
$ vim -N -u NONE -i NONE --noplugin -c "set fic"
input i<C-X><C-F>

Actual result
(popup menu list items)
I1.txt
I2.txt
j3.txt
J3.txt
J4.txt
i1.txt

Expect result (like this)
I1.txt
i1.txt
I2.txt
j3.txt
J3.txt
J4.txt

Patch attached. (Thanks for advice from Yukihiro Nakadaira)
Please check.

Best Regards,
Hirohito Higashi

fic_fixed.patch

Bram Moolenaar

unread,
Mar 20, 2013, 4:24:00 PM3/20/13
to h_east, vim...@googlegroups.com
Thanks, I'll look into it later.


--
From "know your smileys":
y:-) Bad toupee

h_east

unread,
Mar 24, 2013, 3:39:56 PM3/24/13
to vim...@googlegroups.com, h_east
Hi Bram,

2013/3/21(Thu) 5:24:00 UTC+9 Bram Moolenaar:


> h_east wrote:
> > 2013/3/20(Wed) 0:49:37 UTC+9 Bram Moolenaar:
> > > Patch 7.3.872
> > >
> > > Problem: On some systems case of file names is always ignored, on others
> > >
> > > never.
> > >
> > > Solution: Add the 'fileignorecase' option to control this at runtime.
> > >
> > > Implies 'wildignorecase'.
> > >
> > > Files: src/buffer.c, src/edit.c, src/ex_cmds2.c, src/ex_getln.c,
> > >
> > > src/fileio.c, src/misc1.c, src/misc2.c, src/option.c,
> > >
> > > src/option.h, src/vim.h, runtime/doc/options.txt
> >
> > When 'set fic' on linux, file name completion order is strange.
> > It's different for both case-sensitive and case-insensitive.
> >
> > How to reproduce (on fedora17)
> > $ mkdir test_fic
> > $ cd !$
> > $ touch I1.txt I2.txt J3.txt J4.txt i1.txt j3.txt
> > (Necessary: same file name (without case-sensitive) exist.)

Sorry, It's doubt.
This condition was not necessary.

I report again below.

How to reproduce (on linux)


$ mkdir test_fic
$ cd !$

$ touch i1.txt I2.txt J3.txt j4.txt

$ vim -N -u NONE -i NONE --noplugin -c "set fic"
input i<C-X><C-F>

Actual result
(popup menu list items)

I2.txt
J3.txt
i1.txt
j4.txt

Expect result
i1.txt
I2.txt
J3.txt
j4.txt

I update a patch. (against multi-byte).

fic_fixed2_mb.patch
Reply all
Reply to author
Forward
0 new messages