cutting: clear the cutbuffer when the previous operation was copying

The cut and copy operations (^K and M-6) are different operations and
one should not add to the cutbuffer created by the other.

This fixes https://savannah.gnu.org/bugs/?56251.

Bug existed since version 3.0, commit 71f85937.
master
Benno Schulenberg 2019-05-02 09:27:37 +02:00
parent 9bc6bc83c0
commit fd3b3bc1d6
1 changed files with 8 additions and 10 deletions

View File

@ -281,15 +281,20 @@ void do_cut_text(bool copy_text, bool marked, bool cut_till_eof, bool append)
bool right_side_up = TRUE;
/* There *is* no region, *or* it is marked forward. */
#endif
static bool precedent = FALSE;
/* Whether the previous operation was a copying operation. */
/* If cuts were not continuous, or when cutting a region, clear the slate. */
if (!append && (!keep_cutbuffer || marked || cut_till_eof)) {
if ((!keep_cutbuffer || marked || cut_till_eof || copy_text != precedent) &&
!append) {
free_lines(cutbuffer);
cutbuffer = NULL;
/* After a line cut, future line cuts should add to the cutbuffer. */
keep_cutbuffer = !marked && !cut_till_eof;
}
/* After a line operation, future ones should add to the cutbuffer. */
keep_cutbuffer = !marked && !cut_till_eof;
precedent = copy_text;
#ifndef NANO_TINY
if (copy_text) {
/* If the cutbuffer isn't empty, remember where it currently ends. */
@ -394,7 +399,6 @@ void do_cut_text_void(void)
* was moved, blow away previous contents of the cutbuffer. */
void do_copy_text(void)
{
static linestruct *next_contiguous_line = NULL;
bool mark_is_set = (openfile->mark != NULL);
/* Remember the current viewport and cursor position. */
@ -407,14 +411,8 @@ void do_copy_text(void)
if (openfile->current->next == NULL && openfile->current->data[0] == '\0')
return;
if (mark_is_set || openfile->current != next_contiguous_line)
keep_cutbuffer = FALSE;
do_cut_text(TRUE, mark_is_set, FALSE, FALSE);
/* If the mark was set, blow away the cutbuffer on the next copy. */
next_contiguous_line = (mark_is_set ? NULL : openfile->current);
/* If the mark was set, restore the viewport and cursor position. */
if (mark_is_set) {
openfile->edittop = fsfromline(is_edittop_lineno);