vi: fix word operations across line boundaries
Commit 4b49422a0
(vi: fix changes to word at end of line. Closes
11796) fixed a problem where an operation on a word at the end of
a line followed by a line starting with whitespace incorrectly
joined the lines. However it also broke the case where operating
on multiple words across a line boundary *should* join the lines.
Fix this by detecting when trailing whitepace in a word operation
includes a newline. Whitespace beyond the newline is excluded
from consideration.
function old new delta
do_cmd 5083 5088 +5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 5/0) Total: 5 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
1195782d79
commit
7b4c2276a8
16
editors/vi.c
16
editors/vi.c
@ -3774,14 +3774,16 @@ static void do_cmd(int c)
|
|||||||
place_cursor(0, 0);
|
place_cursor(0, 0);
|
||||||
if (c1 == 27) { // ESC- user changed mind and wants out
|
if (c1 == 27) { // ESC- user changed mind and wants out
|
||||||
c = c1 = 27; // Escape- do nothing
|
c = c1 = 27; // Escape- do nothing
|
||||||
} else if (strchr("wW", c1)) {
|
} else if (c1 == 'w' || c1 == 'W') {
|
||||||
ml = 0; // multi-line ranges aren't allowed for words
|
char *q0 = q;
|
||||||
if (c == 'c') {
|
// don't include trailing WS as part of word
|
||||||
// don't include trailing WS as part of word
|
while (q > p && isspace(*q)) {
|
||||||
while (isspace(*q) && q > p) {
|
if (*q-- == '\n')
|
||||||
q--;
|
q0 = q;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// for non-change operations WS after NL is not part of word
|
||||||
|
if (c != 'c' && q != p && *q != '\n')
|
||||||
|
q = q0;
|
||||||
dot = yank_delete(p, q, ml, yf, ALLOW_UNDO); // delete word
|
dot = yank_delete(p, q, ml, yf, ALLOW_UNDO); // delete word
|
||||||
} else if (strchr("^0bBeEft%$ lh\b\177", c1)) {
|
} else if (strchr("^0bBeEft%$ lh\b\177", c1)) {
|
||||||
// partial line copy text into a register and delete
|
// partial line copy text into a register and delete
|
||||||
|
Loading…
Reference in New Issue
Block a user