summaryrefslogtreecommitdiff
path: root/src/ex_cmds.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-01-30 16:30:26 +0100
committerBram Moolenaar <Bram@vim.org>2013-01-30 16:30:26 +0100
commit4bc8cf0e7c4c1d2c9d99ac8b3c080b50f239406d (patch)
tree3f2af707a53bf1d46adaa396dd92f2545cf12f61 /src/ex_cmds.c
parent7567646f13beb8c7aad79340f30ad2b5d5c8225f (diff)
downloadvim-git-4bc8cf0e7c4c1d2c9d99ac8b3c080b50f239406d.tar.gz
updated for version 7.3.792v7.3.792
Problem: ":substitute" works differently without confirmation. Solution: Do not change the text when asking for confirmation, only display it.
Diffstat (limited to 'src/ex_cmds.c')
-rw-r--r--src/ex_cmds.c46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index acb4da28d..0b6830969 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -4727,6 +4727,8 @@ do_sub(eap)
}
else
{
+ char_u *orig_line = NULL;
+ int len_change = 0;
#ifdef FEAT_FOLDING
int save_p_fen = curwin->w_p_fen;
@@ -4737,9 +4739,43 @@ do_sub(eap)
temp = RedrawingDisabled;
RedrawingDisabled = 0;
+ if (new_start != NULL)
+ {
+ /* There already was a substitution, we would
+ * like to show this to the user. We cannot
+ * really update the line, it would change
+ * what matches. Temporarily replace the line
+ * and change it back afterwards. */
+ orig_line = vim_strsave(ml_get(lnum));
+ if (orig_line != NULL)
+ {
+ char_u *new_line = concat_str(new_start,
+ sub_firstline + copycol);
+
+ if (new_line == NULL)
+ {
+ vim_free(orig_line);
+ orig_line = NULL;
+ }
+ else
+ {
+ /* Position the cursor relative to the
+ * end of the line, the previous
+ * substitute may have inserted or
+ * deleted characters before the
+ * cursor. */
+ len_change = STRLEN(new_line)
+ - STRLEN(orig_line);
+ curwin->w_cursor.col += len_change;
+ ml_replace(lnum, new_line, FALSE);
+ }
+ }
+ }
+
search_match_lines = regmatch.endpos[0].lnum
- regmatch.startpos[0].lnum;
- search_match_endcol = regmatch.endpos[0].col;
+ search_match_endcol = regmatch.endpos[0].col
+ + len_change;
highlight_match = TRUE;
update_topline();
@@ -4781,6 +4817,10 @@ do_sub(eap)
msg_didout = FALSE; /* don't scroll up */
msg_col = 0;
gotocmdline(TRUE);
+
+ /* restore the line */
+ if (orig_line != NULL)
+ ml_replace(lnum, orig_line, FALSE);
}
need_wait_return = FALSE; /* no hit-return prompt */
@@ -5045,14 +5085,10 @@ skip:
* The check for nmatch_tl is needed for when multi-line
* matching must replace the lines before trying to do another
* match, otherwise "\@<=" won't work.
- * When asking the user we like to show the already replaced
- * text, but don't do it when "\<@=" or "\<@!" is used, it
- * changes what matches.
* When the match starts below where we start searching also
* need to replace the line first (using \zs after \n).
*/
if (lastone
- || (do_ask && !re_lookbehind(regmatch.regprog))
|| nmatch_tl > 0
|| (nmatch = vim_regexec_multi(&regmatch, curwin,
curbuf, sub_firstlnum,