| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.872 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| 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 |
| |
| |
| |
| |
| |
| *** 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(®match, 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(®match, name, (colnr_T)0)) |
| match = name; |
| else |
| |
| |
| |
| *** 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; |
| |
| |
| |
| |
| *** 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]; |
| |
| |
| |
| *** 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) |
| |
| |
| |
| *** 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 == '<') |
| { |
| |
| |
| |
| *** 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); |
| |
| |
| |
| *** 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] == '\\') |
| |
| |
| |
| *** 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, |
| |
| |
| |
| *** 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' */ |
| |
| |
| |
| *** 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)) |
| |
| |
| |
| *** 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. |
| |
| |
| |
| |
| *** 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 -- Bram@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 /// |