nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 83b89a49ef60e20a26a4d96a7606758de9192ed1
parent 87a254400e80fe0b03493cb894de0b673a7ecb69
Author: Benno Schulenberg <bensberg@justemail.net>
Date:   Tue,  7 Jun 2016 11:52:57 +0200

text: remove a redundant undo element

Implement its single use case by making better use of another element.

Diffstat:
Msrc/nano.h | 13+++++++------
Msrc/text.c | 9++++-----
2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/nano.h b/src/nano.h @@ -357,13 +357,12 @@ typedef struct undo { /* Copy of the cutbuffer. */ filestruct *cutbottom; /* Copy of cutbottom. */ - bool mark_set; - /* Was the marker set when we cut? */ ssize_t mark_begin_lineno; - /* copy copy copy */ + /* Mostly the line number of the current line; sometimes something else. */ size_t mark_begin_x; - /* Another shadow variable. */ + /* The x position corresponding to the above line number. */ struct undo *next; + /* A pointer to the undo item of the preceding action. */ } undo; #endif /* !NANO_TINY */ @@ -574,8 +573,10 @@ enum /* Some extra flags for the undo function. */ #define WAS_FINAL_BACKSPACE (1<<1) -#define WAS_MARKED_FORWARD (1<<2) -#define WAS_WHOLE_LINE (1<<3) +#define WAS_WHOLE_LINE (1<<2) +/* The flags for the mark need to be the highest. */ +#define MARK_WAS_SET (1<<3) +#define WAS_MARKED_FORWARD (1<<4) #endif /* !NANO_TINY */ /* The maximum number of entries displayed in the main shortcut list. */ diff --git a/src/text.c b/src/text.c @@ -1156,7 +1156,7 @@ void add_undo(undo_type action) * no cursor movement in between -- don't add a new undo item. */ if (u && u->mark_begin_lineno == openfile->current->lineno && action == openfile->last_action && ((action == ADD && u->type == ADD && u->mark_begin_x == openfile->current_x) || - (action == CUT && u->type == CUT && !u->mark_set && keeping_cutbuffer()))) + (action == CUT && u->type == CUT && u->xflags < MARK_WAS_SET && keeping_cutbuffer()))) return; /* Blow away newer undo items if we add somewhere in the middle. */ @@ -1190,7 +1190,6 @@ void add_undo(undo_type action) u->begin = openfile->current_x; u->mark_begin_lineno = openfile->current->lineno; u->mark_begin_x = openfile->current_x; - u->mark_set = FALSE; u->wassize = openfile->totsize; u->xflags = 0; u->grouping = NULL; @@ -1244,10 +1243,10 @@ void add_undo(undo_type action) break; case CUT: cutbuffer_reset(); - u->mark_set = openfile->mark_set; - if (u->mark_set) { + if (openfile->mark_set) { u->mark_begin_lineno = openfile->mark_begin->lineno; u->mark_begin_x = openfile->mark_begin_x; + u->xflags = MARK_WAS_SET; } else if (!ISSET(CUT_TO_END)) { /* The entire line is being cut regardless of the cursor position. */ u->begin = 0; @@ -1379,7 +1378,7 @@ fprintf(stderr, " >> Updating... action = %d, openfile->last_action = %d, openf break; free_filestruct(u->cutbuffer); u->cutbuffer = copy_filestruct(cutbuffer); - if (u->mark_set) { + if (u->xflags == MARK_WAS_SET) { /* If the "marking" operation was from right-->left or * bottom-->top, then swap the mark points. */ if ((u->lineno == u->mark_begin_lineno && u->begin < u->mark_begin_x)