aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/regexp.c
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2021-04-10 18:14:42 +0200
committerGitHub <noreply@github.com>2021-04-10 18:14:42 +0200
commit6435b46b4894f6137937ee78ef9944f185daf018 (patch)
treee5fd795f9dd03123884713275eaab8f82dc5b9f1 /src/nvim/regexp.c
parent1b030f889ccc3be9ced67bcbe3e817f20536d072 (diff)
parent343ee2d2545b86488d9b027ebb42186c368e57e6 (diff)
downloadrneovim-6435b46b4894f6137937ee78ef9944f185daf018.tar.gz
rneovim-6435b46b4894f6137937ee78ef9944f185daf018.tar.bz2
rneovim-6435b46b4894f6137937ee78ef9944f185daf018.zip
Merge pull request #14317 from chentau/extmark_sub
extmark: correct extmark_splice call with substitute and inccommand when replacing with escaped backslashes
Diffstat (limited to 'src/nvim/regexp.c')
-rw-r--r--src/nvim/regexp.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index d7693c7a6f..184f5da97d 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -6665,6 +6665,10 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest,
int len = 0; /* init for GCC */
static char_u *eval_result = NULL;
+ // We need to keep track of how many backslashes we escape, so that the byte
+ // counts for `extmark_splice` are correct.
+ int num_escaped = 0;
+
// Be paranoid...
if ((source == NULL && expr == NULL) || dest == NULL) {
EMSG(_(e_null));
@@ -6840,6 +6844,7 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest,
// later. Used to insert a literal CR.
default:
if (backslash) {
+ num_escaped += 1;
if (copy) {
*dst = '\\';
}
@@ -6979,7 +6984,7 @@ static int vim_regsub_both(char_u *source, typval_T *expr, char_u *dest,
*dst = NUL;
exit:
- return (int)((dst - dest) + 1);
+ return (int)((dst - dest) + 1 - num_escaped);
}