summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2010-07-11 20:46:53 +0200
committerBram Moolenaar <Bram@vim.org>2010-07-11 20:46:53 +0200
commita9dc375744c80d882d380c40bf05a8db6a17993e (patch)
tree82c973a7fb8792d775e9f972cdfe698cbf17edec
parenta3f41662865d5a0582c4ccd22a38317907b59154 (diff)
Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
Toft)
-rw-r--r--runtime/doc/cmdline.txt5
-rw-r--r--runtime/doc/options.txt4
-rw-r--r--runtime/doc/todo.txt11
-rw-r--r--src/ex_getln.c5
-rw-r--r--src/misc1.c2
-rw-r--r--src/proto/search.pro1
-rw-r--r--src/search.c78
7 files changed, 59 insertions, 47 deletions
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
index 8abb16b8c4..08fb10fcc1 100644
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -416,7 +416,10 @@ CTRL-L A match is done on the pattern in front of the cursor. If
than the pattern, no completion is done.
When 'incsearch' is set, entering a search pattern for "/" or
"?" and the current match is displayed then CTRL-L will add
- one character from the end of the current match.
+ one character from the end of the current match. If
+ 'ignorecase' and 'smartcase' are set and the command line has
+ no uppercase characters, the added character is converted to
+ lowercase.
The 'wildchar' option defaults to <Tab> (CTRL-E when in Vi compatible mode; in
a previous version <Esc> was used). In the pattern standard wildcards '*' and
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index cf37387631..d8f4dfbaf1 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -3976,7 +3976,9 @@ A jump table for the options with a short description can be found at |Q_op|.
The highlighting can be set with the 'i' flag in 'highlight'.
See also: 'hlsearch'.
CTRL-L can be used to add one character from after the current match
- to the command line.
+ to the command line. If 'ignorecase' and 'smartcase' are set and the
+ command line has no uppercase characters, the added character is
+ converted to lowercase.
CTRL-R CTRL-W can be used to add the word at the end of the current
match, excluding the characters that were already typed.
NOTE: This option is reset when 'compatible' is set.
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 24799a36ce..e8a42a51d5 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1088,14 +1088,16 @@ Patch to support horizontal scroll wheel in GTK. Untested. (Bjorn Winckler,
2010 Jun 30)
+Before (beta) release 7.3:
+- Add fixes for 7.2 to version7.txt
+- Rename vim73 branch to default (hints: Xavier de Gaye, 2010 May 23)
+
Vim 7.3:
+ configure: -pthread appears in cproto arguments, from GTK
- Soon: remove UF_VERSION_CRYPT_PREV and UF_VERSION_PREV.
- Conceal feature: no update when moving to another window. (Dominique Pelle,
2010 Jul 5) Vince will look into it.
Patches to possibly include:
-- Patch for gtk main_loop() to enable GtkFileChooser. (James Vega, 2010 Jun 28)
- Same as this one? GTK: file chooser is disabled. Patch by Tim Starling,
- 2009 Nov 13.
- Patch to make CTRL-L work better with 'ignorecase' and 'smartcase'. (Martin
Toft, 2010 Jun 8, Jun 16, Jun 30)
- Patch to add diff functionality to 2html.vim. (Christian Brabandt, 2009 Dec
@@ -1157,9 +1159,6 @@ Probably not now:
- Use timestamps for undo, so that a version a certain time ago can be found
and info before some time/date can be flushed. 'undopersist' gives maximum
time to keep undo: "3h", "1d", "2w", "1y", etc.
-Before (beta) release:
-- Add fixes for 7.2 to version7.txt
-- Rename vim73 branch to default (hints: Xavier de Gaye, 2010 May 23)
More patches:
diff --git a/src/ex_getln.c b/src/ex_getln.c
index e6ed44a41e..b2e89e1927 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -1411,6 +1411,11 @@ getcmdline(firstc, count, indent)
&& !equalpos(curwin->w_cursor, old_cursor))
{
c = gchar_cursor();
+ /* If 'ignorecase' and 'smartcase' are set and the
+ * command line has no uppercase characters, convert
+ * the character to lowercase */
+ if (p_ic && p_scs && !pat_has_uppercase(ccline.cmdbuff))
+ c = MB_TOLOWER(c);
if (c != NUL)
{
if (c == firstc || vim_strchr((char_u *)(
diff --git a/src/misc1.c b/src/misc1.c
index 31511249b7..d87696d5cd 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -9606,7 +9606,7 @@ FreeWild(count, files)
}
/*
- * return TRUE when need to go to Insert mode because of 'insertmode'.
+ * Return TRUE when need to go to Insert mode because of 'insertmode'.
* Don't do this when still processing a command or a mapping.
* Don't do this when inside a ":normal" command.
*/
diff --git a/src/proto/search.pro b/src/proto/search.pro
index 76ae054198..7f3947ca60 100644
--- a/src/proto/search.pro
+++ b/src/proto/search.pro
@@ -6,6 +6,7 @@ void save_search_patterns __ARGS((void));
void restore_search_patterns __ARGS((void));
void free_search_patterns __ARGS((void));
int ignorecase __ARGS((char_u *pat));
+int pat_has_uppercase __ARGS((char_u *pat));
char_u *last_search_pat __ARGS((void));
void reset_search_dir __ARGS((void));
void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
diff --git a/src/search.c b/src/search.c
index 3ad9140c12..86958d4771 100644
--- a/src/search.c
+++ b/src/search.c
@@ -365,56 +365,58 @@ free_search_patterns()
ignorecase(pat)
char_u *pat;
{
- char_u *p;
- int ic;
+ int ic = p_ic;
- ic = p_ic;
if (ic && !no_smartcase && p_scs
#ifdef FEAT_INS_EXPAND
&& !(ctrl_x_mode && curbuf->b_p_inf)
#endif
)
+ ic = !pat_has_uppercase(pat);
+ no_smartcase = FALSE;
+
+ return ic;
+}
+
+/*
+ * Return TRUE if patter "pat" has an uppercase character.
+ */
+ int
+pat_has_uppercase(pat)
+ char_u *pat;
+{
+ char_u *p = pat;
+
+ while (*p != NUL)
{
- /* don't ignore case if pattern has uppercase */
- for (p = pat; *p; )
- {
#ifdef FEAT_MBYTE
- int l;
+ int l;
- if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
- {
- if (enc_utf8 && utf_isupper(utf_ptr2char(p)))
- {
- ic = FALSE;
- break;
- }
- p += l;
- }
- else
+ if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
+ {
+ if (enc_utf8 && utf_isupper(utf_ptr2char(p)))
+ return TRUE;
+ p += l;
+ }
+ else
#endif
- if (*p == '\\')
- {
- if (p[1] == '_' && p[2] != NUL) /* skip "\_X" */
- p += 3;
- else if (p[1] == '%' && p[2] != NUL) /* skip "\%X" */
- p += 3;
- else if (p[1] != NUL) /* skip "\X" */
- p += 2;
- else
- p += 1;
- }
- else if (MB_ISUPPER(*p))
- {
- ic = FALSE;
- break;
- }
- else
- ++p;
+ if (*p == '\\')
+ {
+ if (p[1] == '_' && p[2] != NUL) /* skip "\_X" */
+ p += 3;
+ else if (p[1] == '%' && p[2] != NUL) /* skip "\%X" */
+ p += 3;
+ else if (p[1] != NUL) /* skip "\X" */
+ p += 2;
+ else
+ p += 1;
}
+ else if (MB_ISUPPER(*p))
+ return TRUE;
+ else
+ ++p;
}
- no_smartcase = FALSE;
-
- return ic;
+ return FALSE;
}
char_u *