nano

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

commit d7875cdf4f7636d42e135a8c89f510d80c4797b4
parent dc05defb8ac01bd0ae8a7b9813b6472dd938173e
Author: Benno Schulenberg <bensberg@telfort.nl>
Date:   Mon,  9 Mar 2020 11:33:16 +0100

tweaks: when appropriate, move starting point of justified region back

This makes things simpler, so that I can understand them.

Diffstat:
Msrc/text.c | 46++++++++++++++++++----------------------------
1 file changed, 18 insertions(+), 28 deletions(-)

diff --git a/src/text.c b/src/text.c @@ -1768,6 +1768,10 @@ void do_justify(bool full_justify) lead_len = quote_len + indent_length(startline->data + quote_len); the_lead = measured_copy(startline->data, lead_len); + /* When the region starts IN the lead, take the whole lead. */ + if (start_x <= lead_len) + start_x = 0; + /* Recede over any preceding whitespace. This effectively snips * trailing blanks from what will become the preceding paragraph. */ while (start_x > 0 && is_blank_mbchar(&startline->data[start_x - 1])) @@ -1855,24 +1859,17 @@ void do_justify(bool full_justify) if (openfile->mark) { size_t line_len = strlen(cutbuffer->data), indent_len; - size_t needed_top_extra = (start_x < lead_len ? start_x : lead_len); size_t needed_bot_extra = (end_x < lead_len ? lead_len - end_x : 0); linestruct *line; - /* If the marked region starts in the middle of a line, and this line - * has a leading part, prepend any missing portion of this leading part - * to the first line of the extracted region. */ - if (needed_top_extra > 0) { - cutbuffer->data = charealloc(cutbuffer->data, - line_len + needed_top_extra + 1); - memmove(cutbuffer->data + needed_top_extra, cutbuffer->data, - line_len + 1); - strncpy(cutbuffer->data, the_lead, needed_top_extra); - line_len += needed_top_extra; - - /* When no portion was missing, nothing needs removing later. */ - if (start_x > lead_len) - needed_top_extra = 0; + /* If the marked region started in the middle of a line, and this line + * has a leading part, then prepend this same leading part also to the + * first line of the extracted region. */ + if (start_x > 0 && lead_len > 0) { + cutbuffer->data = charealloc(cutbuffer->data, line_len + lead_len + 1); + memmove(cutbuffer->data + lead_len, cutbuffer->data, line_len + 1); + strncpy(cutbuffer->data, the_lead, lead_len); + line_len += lead_len; } indent_len = indent_length(cutbuffer->data + lead_len); @@ -1900,20 +1897,13 @@ void do_justify(bool full_justify) } else rewrap_paragraph(&line, the_lead, lead_len); - /* If the marked region started after the beginning of a line, insert - * a new line before the new paragraph. But if the region started in - * the middle of the line's leading part, no new line is needed: just - * remove the (now-redundant) addition we made earlier. */ + /* If the marked region started in the middle of a line, + * insert a newline before the new paragraph. */ if (start_x > 0) { - if (needed_top_extra > 0) - memmove(cutbuffer->data, cutbuffer->data + needed_top_extra, - strlen(cutbuffer->data) - needed_top_extra + 1); - else { - cutbuffer->prev = make_new_node(NULL); - cutbuffer->prev->data = copy_of(""); - cutbuffer->prev->next = cutbuffer; - cutbuffer = cutbuffer->prev; - } + cutbuffer->prev = make_new_node(NULL); + cutbuffer->prev->data = copy_of(""); + cutbuffer->prev->next = cutbuffer; + cutbuffer = cutbuffer->prev; } /* If the marked region ended in the middle of a line, insert a new