vi: fix changes to word at end of line. Closes 11796
As reported in bug 11796 BusyBox vi incorrectly handles changes to a word at the end of a line. If the following line starts with whitespace changing or deleting the last word of a line with the 'cw' or 'dw' commands causes the lines to be joined. This happens because the range for the change returned by find_range() covers all whitespace after the word, including newlines. The problem can be fixed by setting 'ml' to zero to indicate to yank_delete() that processing should stop at the end of the current line. However, this results in a new problem. 'dw' correctly deletes all whitespace following the word but so does 'cw', which should preserve the trailing whitespace. To fix this the code to omit whitespace from the change is modified to include all whitespace not just blanks. function old new delta do_cmd 5034 5069 +35 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 35/0) Total: 35 bytes Reported-by: David Kelly <david.kelly@liberica.ch> Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
93f0b39a07
commit
4b49422a08
@ -3770,11 +3770,10 @@ static void do_cmd(int c)
|
|||||||
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 (strchr("wW", c1)) {
|
||||||
|
ml = 0; // multi-line ranges aren't allowed for words
|
||||||
if (c == 'c') {
|
if (c == 'c') {
|
||||||
// don't include trailing WS as part of word
|
// don't include trailing WS as part of word
|
||||||
while (isblank(*q)) {
|
while (isspace(*q) && q > p) {
|
||||||
if (q <= text || q[-1] == '\n')
|
|
||||||
break;
|
|
||||||
q--;
|
q--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user