From 4b8a387529ad75134c6fa160d4d5299f552a412b Mon Sep 17 00:00:00 2001 From: Benno Schulenberg <bensberg@telfort.nl> Date: Mon, 18 Dec 2017 17:40:07 +0100 Subject: [PATCH] text: let indenting/commenting skip the last line if its x is zero If the marked region ends at the start of a line, do not include that line in the indenting/undenting or commenting/uncommenting. This is closer to what the eye would expect. --- src/proto.h | 2 ++ src/text.c | 12 ++++++------ src/utils.c | 11 +++++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/proto.h b/src/proto.h index 0e2e5641..a2d523d8 100644 --- a/src/proto.h +++ b/src/proto.h @@ -609,6 +609,8 @@ void remove_magicline(void); #ifndef NANO_TINY void mark_order(const filestruct **top, size_t *top_x, const filestruct **bot, size_t *bot_x, bool *right_side_up); +void get_region(const filestruct **top, size_t *top_x, + const filestruct **bot, size_t *bot_x); #endif size_t get_totsize(const filestruct *begin, const filestruct *end); #ifndef NANO_TINY diff --git a/src/text.c b/src/text.c index 84e432e0..3da83ccd 100644 --- a/src/text.c +++ b/src/text.c @@ -300,8 +300,8 @@ void do_indent(void) /* Use either all the marked lines or just the current line. */ if (openfile->mark) - mark_order((const filestruct **)&top, &top_x, - (const filestruct **)&bot, &bot_x, NULL); + get_region((const filestruct **)&top, &top_x, + (const filestruct **)&bot, &bot_x); else { top = openfile->current; bot = top; @@ -405,8 +405,8 @@ void do_unindent(void) /* Use either all the marked lines or just the current line. */ if (openfile->mark) - mark_order((const filestruct **)&top, &top_x, - (const filestruct **)&bot, &bot_x, NULL); + get_region((const filestruct **)&top, &top_x, + (const filestruct **)&bot, &bot_x); else { top = openfile->current; bot = top; @@ -509,8 +509,8 @@ void do_comment(void) /* Determine which lines to work on. */ if (openfile->mark) - mark_order((const filestruct **)&top, &top_x, - (const filestruct **)&bot, &bot_x, NULL); + get_region((const filestruct **)&top, &top_x, + (const filestruct **)&bot, &bot_x); else { top = openfile->current; bot = top; diff --git a/src/utils.c b/src/utils.c index d16c5e8a..a926f248 100644 --- a/src/utils.c +++ b/src/utils.c @@ -532,6 +532,17 @@ void mark_order(const filestruct **top, size_t *top_x, const filestruct } } +/* Get the start and end points of the marked region, but + * push the end point back if it's at the start of a line. */ +void get_region(const filestruct **top, size_t *top_x, + const filestruct **bot, size_t *bot_x) +{ + mark_order(top, top_x, bot, bot_x, NULL); + + if (*bot_x == 0) + *bot = (*bot)->prev; +} + /* Given a line number, return a pointer to the corresponding struct. */ filestruct *fsfromline(ssize_t lineno) { -- GitLab