[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Nano-devel] [PATCH] text: copy leading quote characters when automatic
From: |
Benno Schulenberg |
Subject: |
[Nano-devel] [PATCH] text: copy leading quote characters when automatic hard-wrapping occurs |
Date: |
Sat, 27 Apr 2019 17:54:03 +0200 |
When the user is typing a long text and --breaklonglines is in effect,
then any leading comment or quoting characters are automatically added
to each automatic new line.
This fulfills https://savannah.gnu.org/bugs/?56042.
Requested-by: Sébastien Desreux <address@hidden>
[If this is a useful feature, then the question is: should this be
the standard behavior, or should it be behind an option, or should
it be the default behavior that can be disabled with an option?]
---
src/text.c | 44 +++++++++++++++++++++++++++++++++++++++++---
1 file changed, 41 insertions(+), 3 deletions(-)
diff --git a/src/text.c b/src/text.c
index 84a05aab..999c5124 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1407,6 +1407,9 @@ void update_undo(undo_type action)
}
#endif /* !NANO_TINY */
+// Temporary forward declaration.
+size_t quote_length(const char *line);
+
#ifdef ENABLE_WRAPPING
/* When the current line is overlong, hard-wrap it at the furthest possible
* whitespace character, and (if possible) prepend the remainder of the line
@@ -1446,6 +1449,12 @@ bool do_wrap(void)
return FALSE;
add_undo(SPLIT_BEGIN);
+
+ bool autowhite = ISSET(AUTOINDENT);
+ size_t lead_len = quote_length(line->data);
+
+ if (lead_len > 0)
+ UNSET(AUTOINDENT);
#endif
/* The remainder is the text that will be wrapped to the next line. */
@@ -1476,10 +1485,19 @@ bool do_wrap(void)
#endif
}
- /* Join the next line to this one, and delete any extra blanks.
*/
- do {
+ /* Join the next line to this one. */
+ do_delete();
+
+#ifndef NANO_TINY
+ /* If the quoting part of the current line equals the quoting
part of
+ * what was the next line, then strip this second quoting part.
*/
+ if (strncmp(line->data, line->data + openfile->current_x,
lead_len) == 0)
+ for (size_t i = lead_len; i > 0; i--)
+ do_delete();
+#endif
+ /* Remove any extra blanks. */
+ while (is_blank_mbchar(&line->data[openfile->current_x]))
do_delete();
- } while (is_blank_mbchar(&line->data[openfile->current_x]));
}
/* Go to the wrap location. */
@@ -1501,6 +1519,26 @@ bool do_wrap(void)
/* Now split the line. */
do_enter();
+#ifndef NANO_TINY
+ /* If the original line has quoting, copy it to the spillage line. */
+ if (lead_len > 0) {
+ lead_len += indent_length(line->data + lead_len);
+
+ line = line->next;
+ line_len = strlen(line->data);
+ line->data = charealloc(line->data, lead_len + line_len + 1);
+
+ charmove(line->data + lead_len, line->data, line_len + 1);
+ strncpy(line->data, line->prev->data, lead_len);
+
+ openfile->current_x += lead_len;
+ update_undo(ENTER);
+
+ if (autowhite)
+ SET(AUTOINDENT);
+ }
+#endif
+
openfile->spillage_line = openfile->current;
if (cursor_x < wrap_loc) {
--
2.20.1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Nano-devel] [PATCH] text: copy leading quote characters when automatic hard-wrapping occurs,
Benno Schulenberg <=