From cfa2107e33e98c35a2f08236ef6816fbae7cc8f1 Mon Sep 17 00:00:00 2001 From: Johan Klokkhammer Helsing Date: Sun, 22 Nov 2015 02:29:14 +0100 Subject: vim-patch:7.4.655 Problem: Text deleted by "dit" depends on indent of closing tag. (Jan Parthey) Solution: Do not adjust oap->end in do_pending_operator(). (Christian Brabandt) https://github.com/vim/vim/commit/b6c2735c56f1541159e1ad95c3f17a52b3a94f1d --- src/nvim/normal.c | 7 +++++++ src/nvim/search.c | 19 ++++++++++++++----- src/nvim/testdir/test53.in | 4 ++++ src/nvim/testdir/test53.ok | 1 + src/nvim/version.c | 2 +- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 78df4ea7ea..1f0fe287bf 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -7474,6 +7474,13 @@ static void nv_object(cmdarg_T *cap) flag = current_block(cap->oap, cap->count1, include, '<', '>'); break; case 't': /* "at" = a tag block (xml and html) */ + // Do not adjust oap->end in do_pending_operator() + // otherwise there are different results for 'dit' + // (note leading whitespace in last line): + // 1) 2) + // foobar foobar + // + cap->retval |= CA_NO_ADJ_OP_END; flag = current_tagblock(cap->oap, cap->count1, include); break; case 'p': /* "ap" = a paragraph */ diff --git a/src/nvim/search.c b/src/nvim/search.c index a44b0e00c7..d742a7a341 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -926,7 +926,7 @@ static int first_submatch(regmmatch_T *rp) * Careful: If spats[0].off.line == TRUE and spats[0].off.off == 0 this * makes the movement linewise without moving the match position. * - * return 0 for failure, 1 for found, 2 for found and line offset added + * Return 0 for failure, 1 for found, 2 for found and line offset added. */ int do_search( oparg_T *oap, /* can be NULL */ @@ -3201,6 +3201,7 @@ current_tagblock ( int do_include = include; bool save_p_ws = p_ws; int retval = FAIL; + int is_inclusive = true; p_ws = false; @@ -3295,9 +3296,16 @@ again: if (inc_cursor() < 0) break; } else { - /* Exclude the '<' of the end tag. */ - if (*get_cursor_pos_ptr() == '<') + char_u *c = get_cursor_pos_ptr(); + // Exclude the '<' of the end tag. + // If the closing tag is on new line, do not decrement cursor, but make + // operation exclusive, so that the linefeed will be selected + if (*c == '<' && !VIsual_active && curwin->w_cursor.col == 0) { + // do not decrement cursor + is_inclusive = false; + } else if (*c == '<') { dec_cursor(); + } } end_pos = curwin->w_cursor; @@ -3342,8 +3350,9 @@ again: * on an empty area. */ curwin->w_cursor = start_pos; oap->inclusive = false; - } else - oap->inclusive = true; + } else { + oap->inclusive = is_inclusive; + } } retval = OK; diff --git a/src/nvim/testdir/test53.in b/src/nvim/testdir/test53.in index 8ca9c9ed29..7c35b2e853 100644 --- a/src/nvim/testdir/test53.in +++ b/src/nvim/testdir/test53.in @@ -23,6 +23,7 @@ jfXdit 0fXdit fXdat 0fXdat +dit :" :put =matchstr(\"abcd\", \".\", 0, 2) " b :put =matchstr(\"abcd\", \"..\", 0, 2) " bc @@ -97,6 +98,9 @@ voo "nah" sdf " asdf" sdf " sdf" sd -asdXasdfasdf- -asdfXasdfasdf- -asdXasdfasdf- +- +innertext object + SEARCH: foobar diff --git a/src/nvim/testdir/test53.ok b/src/nvim/testdir/test53.ok index 0c0b9ded16..05206972a4 100644 --- a/src/nvim/testdir/test53.ok +++ b/src/nvim/testdir/test53.ok @@ -11,6 +11,7 @@ voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd -- -asdfasdf- -- +- b bc diff --git a/src/nvim/version.c b/src/nvim/version.c index d5bbd734f4..65a8f81fa5 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -341,7 +341,7 @@ static int included_patches[] = { // 658, // 657 NA // 656, - // 655, + 655, // 654, 653, // 652 NA -- cgit