commit 5550d15418f90f380f412dbaf56340ecbb01e676
parent 54cab0203075e8e2f5d50eceb9e38e7fc63982c0
Author: Benno Schulenberg <bensberg@telfort.nl>
Date: Fri, 1 Jun 2018 16:45:37 +0200
tweaks: improve a couple of comments, and reshuffle a group of lines
Diffstat:
M | src/text.c | | | 48 | +++++++++++++++++++++++++----------------------- |
1 file changed, 25 insertions(+), 23 deletions(-)
diff --git a/src/text.c b/src/text.c
@@ -1034,16 +1034,15 @@ void do_enter(void)
if (ISSET(AUTOINDENT)) {
#ifdef ENABLE_JUSTIFY
- /* If the next line is in this same paragraph, use its indentation
- * as the model, as it is more likely to be what the user wants. */
+ /* When doing automatic long-line wrapping and the next line is
+ * in this same paragraph, use its indentation as the model. */
if (!ISSET(NO_WRAP) && sampleline->next != NULL &&
inpar(sampleline->next) && !begpar(sampleline->next, 0))
sampleline = sampleline->next;
#endif
extra = indent_length(sampleline->data);
- /* If we are breaking the line in the indentation, limit the new
- * indentation to the current x position. */
+ /* When breaking in the indentation, limit the automatic one. */
if (extra > openfile->current_x)
extra = openfile->current_x;
else if (extra == openfile->current_x)
@@ -1079,9 +1078,11 @@ void do_enter(void)
}
#endif
+ /* Insert the newly created line after the current one and renumber. */
splice_node(openfile->current, newnode);
renumber(newnode);
+ /* Put the cursor on the new line, after any automatic whitespace. */
openfile->current = newnode;
openfile->current_x = extra;
openfile->placewewant = xplustabs();
@@ -1123,7 +1124,7 @@ void send_data(const filestruct *line, int fd)
fclose(tube);
}
-/* Execute command in a shell. Return TRUE on success. */
+/* Execute the given command in a shell. Return TRUE on success. */
bool execute_command(const char *command)
{
int from_fd[2], to_fd[2];
@@ -1295,7 +1296,7 @@ void discard_until(const undo *thisitem, openfilestruct *thefile, bool keep)
thefile->last_saved = (undo *)0xbeeb;
}
-/* Add a new undo struct to the top of the current pile. */
+/* Add a new undo struct of the given type to the top of the current pile. */
void add_undo(undo_type action)
{
undo *u = openfile->current_undo;
@@ -1315,14 +1316,25 @@ void add_undo(undo_type action)
fprintf(stderr, " >> Adding an undo... action = %d\n", action);
#endif
- /* Allocate and initialize a new undo type. */
+ /* Allocate and initialize a new undo item. */
u = (undo *) nmalloc(sizeof(undo));
u->type = action;
+ u->strdata = NULL;
+ u->cutbuffer = NULL;
+ u->cutbottom = NULL;
+ u->lineno = openfile->current->lineno;
+ u->begin = openfile->current_x;
+ u->mark_begin_lineno = openfile->current->lineno;
+ u->mark_begin_x = openfile->current_x;
+ u->wassize = openfile->totsize;
+ u->xflags = 0;
+ u->grouping = NULL;
+
#ifdef ENABLE_WRAPPING
+ /* If some action caused automatic long-line wrapping, insert the
+ * SPLIT_BEGIN item underneath that action's undo item. Otherwise,
+ * just add the new item to the top of the undo stack. */
if (u->type == SPLIT_BEGIN) {
- /* Some action, most likely an ADD, was performed that invoked
- * do_wrap(). Rearrange the undo order so that this previous
- * action is after the SPLIT_BEGIN undo. */
u->next = openfile->undotop->next;
openfile->undotop->next = u;
} else
@@ -1332,20 +1344,9 @@ void add_undo(undo_type action)
openfile->undotop = u;
openfile->current_undo = u;
}
- u->strdata = NULL;
- u->cutbuffer = NULL;
- u->cutbottom = NULL;
- u->lineno = openfile->current->lineno;
- u->begin = openfile->current_x;
- u->mark_begin_lineno = openfile->current->lineno;
- u->mark_begin_x = openfile->current_x;
- u->wassize = openfile->totsize;
- u->xflags = 0;
- u->grouping = NULL;
+ /* Record the info needed to be able to undo each possible action. */
switch (u->type) {
- /* We need to start copying data into the undo buffer
- * or we won't be able to restore it later. */
case ADD:
/* If a new magic line will be added, an undo should remove it. */
if (openfile->current == openfile->filebot)
@@ -1361,6 +1362,8 @@ void add_undo(undo_type action)
openfile->current->data[0] != '\0')
u->xflags = WAS_FINAL_BACKSPACE;
case DEL:
+ /* When not at the end of a line, store the deleted character,
+ * else purposely fall into the line-joining code. */
if (openfile->current->data[openfile->current_x] != '\0') {
char *char_buf = charalloc(MAXCHARLEN + 1);
int char_len = parse_mbchar(&openfile->current->data[u->begin],
@@ -1371,7 +1374,6 @@ void add_undo(undo_type action)
u->mark_begin_x += char_len;
break;
}
- /* Else purposely fall into the line-joining code. */
case JOIN:
if (openfile->current->next) {
if (u->type == BACK) {