diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo index b3bf11f5c..714e8a1a1 100644 --- a/Doc/Zsh/options.yo +++ b/Doc/Zsh/options.yo @@ -474,6 +474,22 @@ item(tt(CASE_MATCH) )( Make regular expressions using the tt(zsh/regex) module (including matches with tt(=~)) sensitive to case. ) +pindex(CASE_PATHS) +pindex(NO_CASE_PATHS) +pindex(CASEPATHS) +pindex(NOCASEPATHS) +cindex(case-sensitive globbing, option) +item(tt(CASE_PATHS))( +If tt(CASE_PATHS) is not set (the default), tt(CASE_GLOB) affects the +interpretation of em(every) path component, whenever a special +character appears in em(any) component. When tt(CASE_PATHS) is set, +file path components that do em(not) contain special filename +generation characters are always sensitive to case, thus restricting +tt(NO_CASE_GLOB) to components that contain globbing characters. + +Note that if the filesystem itself is not sensitive to case, then +tt(CASE_PATHS) has no effect. +) pindex(CSH_NULL_GLOB) pindex(NO_CSH_NULL_GLOB) pindex(CSHNULLGLOB) diff --git a/Src/options.c b/Src/options.c index fba021e7d..6ea6290e5 100644 --- a/Src/options.c +++ b/Src/options.c @@ -105,6 +105,7 @@ static struct optname optns[] = { {{NULL, "bsdecho", OPT_EMULATE|OPT_SH}, BSDECHO}, {{NULL, "caseglob", OPT_ALL}, CASEGLOB}, {{NULL, "casematch", OPT_ALL}, CASEMATCH}, +{{NULL, "casepaths", 0}, CASEPATHS}, {{NULL, "cbases", 0}, CBASES}, {{NULL, "cprecedences", OPT_EMULATE|OPT_NONZSH}, CPRECEDENCES}, {{NULL, "cdablevars", OPT_EMULATE}, CDABLEVARS}, diff --git a/Src/pattern.c b/Src/pattern.c index c7c2c8bea..053d2a627 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -509,7 +509,7 @@ void patcompstart(void) { patcompcharsset(); - if (isset(CASEGLOB)) + if (isset(CASEGLOB) || isset(CASEPATHS)) patglobflags = 0; else patglobflags = GF_IGNCASE; @@ -632,6 +632,13 @@ patcompile(char *exp, int inflags, char **endexp) p->patmlen = len; p->patnpar = patnpar-1; +#ifndef __CYGWIN__ /* The filesystem itself is case-insensitive on Cygwin */ + if ((patflags & PAT_FILE) && !isset(CASEGLOB) && !(patflags & PAT_PURES)) { + p->globflags |= GF_IGNCASE; + p->globend |= GF_IGNCASE; + } +#endif + if (!strp) { pscan = (Upat)(patout + startoff); diff --git a/Src/zsh.h b/Src/zsh.h index 6cf1b4186..5acbddea4 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -2387,6 +2387,7 @@ enum { BSDECHO, CASEGLOB, CASEMATCH, + CASEPATHS, CBASES, CDABLEVARS, CDSILENT,