From 58059e6807a9c2682fa12be3a912ef15b1cf1fb2 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Wed, 8 Feb 2023 15:41:36 +0900 Subject: [PATCH 1/4] Trigger incsearch on cmdline paste Inserting register literally (e.g. `Ctrl-R +` or `Ctrl-R Ctrl-R "`) in commandline didn't trigger incsearch or hlsearch. Steps to reproduce: 1. `vim --clean --cmd 'set incsearch hlsearch | let @"="text" | put'` 2. Type `/` to start searching then type `Ctrl-R Ctrl-R "`. Unexpectedly, `text` is not highlighted. I also found that `cmdline_insert_reg()` returns only `CMDLINE_NOT_CHANGED` or `GOTO_NORMAL_MODE`. So, the checks of the returned value was redundant and the `goto cmdline_changed;` line was not executed. This PR fixes them. (I'm not sure how to add a test for this...) --- src/ex_getln.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ex_getln.c b/src/ex_getln.c index 6d0b3c5db6272..9e0b1dde2ad5b 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -2081,11 +2081,12 @@ getcmdline_int( case Ctrl_R: // insert register res = cmdline_insert_reg(&gotesc); - if (res == CMDLINE_NOT_CHANGED) - goto cmdline_not_changed; - else if (res == GOTO_NORMAL_MODE) + if (res == GOTO_NORMAL_MODE) goto returncmd; - goto cmdline_changed; +#ifdef FEAT_SEARCH_EXTRA + is_state.incsearch_postponed = TRUE; +#endif + goto cmdline_not_changed; case Ctrl_D: if (showmatches(&xpc, FALSE) == EXPAND_NOTHING) From d3d6fd93c52def18c61080c8ec1ccd8b88819f4d Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Wed, 8 Feb 2023 16:27:01 +0900 Subject: [PATCH 2/4] Fix tests --- src/ex_getln.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ex_getln.c b/src/ex_getln.c index 9e0b1dde2ad5b..2934c45b6f67d 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -1183,6 +1183,7 @@ cmdline_insert_reg(int *gotesc UNUSED) { int i; int c; + int literally = FALSE; #ifdef FEAT_EVAL int save_new_cmdpos = new_cmdpos; #endif @@ -1220,7 +1221,8 @@ cmdline_insert_reg(int *gotesc UNUSED) #endif if (c != ESC) // use ESC to cancel inserting register { - cmdline_paste(c, i == Ctrl_R, FALSE); + literally = i == Ctrl_R; + cmdline_paste(c, literally, FALSE); #ifdef FEAT_EVAL // When there was a serious error abort getting the @@ -1252,7 +1254,7 @@ cmdline_insert_reg(int *gotesc UNUSED) redrawcmd(); // The text has been stuffed, the command line didn't change yet. - return CMDLINE_NOT_CHANGED; + return literally ? CMDLINE_NOT_CHANGED : CMDLINE_CHANGED; } /* @@ -2081,12 +2083,16 @@ getcmdline_int( case Ctrl_R: // insert register res = cmdline_insert_reg(&gotesc); - if (res == GOTO_NORMAL_MODE) - goto returncmd; + if (res == CMDLINE_NOT_CHANGED) + { #ifdef FEAT_SEARCH_EXTRA - is_state.incsearch_postponed = TRUE; + is_state.incsearch_postponed = TRUE; #endif - goto cmdline_not_changed; + goto cmdline_not_changed; + } + else if (res == GOTO_NORMAL_MODE) + goto returncmd; + goto cmdline_changed; case Ctrl_D: if (showmatches(&xpc, FALSE) == EXPAND_NOTHING) From 3d3fb2ec0bef906485b3e802f10e26ec9dc1502c Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Wed, 8 Feb 2023 16:34:27 +0900 Subject: [PATCH 3/4] Fix tests --- src/ex_getln.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ex_getln.c b/src/ex_getln.c index 2934c45b6f67d..07eb09bcf043f 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -2092,7 +2092,7 @@ getcmdline_int( } else if (res == GOTO_NORMAL_MODE) goto returncmd; - goto cmdline_changed; + goto cmdline_not_changed; case Ctrl_D: if (showmatches(&xpc, FALSE) == EXPAND_NOTHING) From 32f0211752b8271aa1b0be22ac8ad88e8b00b0c3 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Wed, 8 Feb 2023 16:39:42 +0900 Subject: [PATCH 4/4] Simplify the conditions --- src/ex_getln.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ex_getln.c b/src/ex_getln.c index 07eb09bcf043f..48db66197ed2e 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -2083,15 +2083,12 @@ getcmdline_int( case Ctrl_R: // insert register res = cmdline_insert_reg(&gotesc); - if (res == CMDLINE_NOT_CHANGED) - { + if (res == GOTO_NORMAL_MODE) + goto returncmd; #ifdef FEAT_SEARCH_EXTRA + if (res == CMDLINE_NOT_CHANGED) is_state.incsearch_postponed = TRUE; #endif - goto cmdline_not_changed; - } - else if (res == GOTO_NORMAL_MODE) - goto returncmd; goto cmdline_not_changed; case Ctrl_D: