--disable-justify again. (DLR; found by Mike Frysinger)
- nano.c:
do_justify()
- - If all the text from the next line has been moved to the
- current line and the next line has been deleted, continue the
- justification loop from there and skip the respacing routine
- in order to avoid running it more than once on the same line
- (since it assumes that we've moved to the next line, which
- isn't true in that case). (DLR)
+ - Add on_next_line flag, used to indicate when we've moved to
+ the next line after justifying the current line, and only run
+ the respacing routine when it's true. This keeps the
+ respacing routine from erroneously being run more than once on
+ the same line. (DLR)
do_exit()
- Tweak for efficiency. (David Benbennick)
- proto.h:
/* When the paragraph gets modified, all lines from the changed
* one down are stored in the cutbuffer. We back up the
* original to restore it later. */
+ int allow_respacing;
+ /* Whether we should change the spacing at the end of a line
+ * after justifying it. This should be TRUE whenever we move
+ * to the next line after justifying the current line. */
/* We save these global variables to be restored if the user
* unjustifies. Note we don't need to save totlines. */
int break_pos;
/* Where we will break the line. */
+ /* We'll be moving to the next line after justifying the
+ * current line in almost all cases, so allow changing the
+ * spacing at the ends of justified lines by default. */
+ allow_respacing = TRUE;
+
indent_len = quote_len + indent_length(current->data +
quote_len);
}
#endif
null_at(¤t->data, break_pos);
+
+ /* Go to the next line. */
current = current->next;
} else if (display_len < fill && par_len > 1) {
size_t next_line_len;
totsize -= indent_len;
current_y--;
- /* Don't go to the next line, since there isn't one
- * anymore. Just continue the loop from here. */
- continue;
+ /* Don't go to the next line. Accordingly, don't
+ * allow changing the spacing at the end of the
+ * previous justified line, since we've already done
+ * it once. */
+ allow_respacing = FALSE;
} else {
charmove(current->next->data + indent_len,
current->next->data + indent_len + break_pos + 1,
/* Go to the next line. */
current = current->next;
- /* If we've gone to the next line, the line we were on
- * before still exists, and it was not the last line of the
- * paragraph, add a space to the end of it to replace the
- * one removed or left out by justify_format(). If it was
- * the last line of the paragraph, and justify_format() left
- * a space on the end of it, remove the space. */
- if (current->prev != NULL) {
+ /* We've moved to the next line after justifying the
+ * current line. If the justified line was not the last
+ * line of the paragraph, add a space to the end of it to
+ * replace the one removed or left out by justify_format().
+ * If it was the last line of the paragraph, and
+ * justify_format() left a space on the end of it, remove
+ * the space. */
+ if (allow_respacing) {
size_t prev_line_len = strlen(current->prev->data);
if (par_len > 1) {