nano

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

commit 4b8a387529ad75134c6fa160d4d5299f552a412b
parent df41114e0e53f3afd969a6f775c638907e4f474b
Author: Benno Schulenberg <bensberg@telfort.nl>
Date:   Mon, 18 Dec 2017 17:40:07 +0100

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.

Diffstat:
Msrc/proto.h | 2++
Msrc/text.c | 12++++++------
Msrc/utils.c | 11+++++++++++
3 files changed, 19 insertions(+), 6 deletions(-)

diff --git 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 @@ -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 @@ -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) {