undo: when adding text adds a magicline, an undo should remove both
This fixes http://savannah.gnu.org/bugs/?52523.
Этот коммит содержится в:
родитель
d646a3b97b
Коммит
b9638cb7cc
14
src/nano.c
14
src/nano.c
@ -1813,13 +1813,6 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
|
|||||||
if (!allow_cntrls && is_ascii_cntrl_char(*(output + i - char_len)))
|
if (!allow_cntrls && is_ascii_cntrl_char(*(output + i - char_len)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* If we're adding to the magicline, create a new magicline. */
|
|
||||||
if (!ISSET(NO_NEWLINES) && openfile->filebot == openfile->current) {
|
|
||||||
new_magicline();
|
|
||||||
if (margin > 0)
|
|
||||||
refresh_needed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make room for the new character and copy it into the line. */
|
/* Make room for the new character and copy it into the line. */
|
||||||
openfile->current->data = charealloc(openfile->current->data,
|
openfile->current->data = charealloc(openfile->current->data,
|
||||||
current_len + char_len + 1);
|
current_len + char_len + 1);
|
||||||
@ -1856,6 +1849,13 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
|
|||||||
update_undo(ADD);
|
update_undo(ADD);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* If we've added text to the magicline, create a new magicline. */
|
||||||
|
if (openfile->filebot == openfile->current && !ISSET(NO_NEWLINES)) {
|
||||||
|
new_magicline();
|
||||||
|
if (margin > 0)
|
||||||
|
refresh_needed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_WRAPPING
|
#ifdef ENABLE_WRAPPING
|
||||||
/* If text gets wrapped, the edit window needs a refresh. */
|
/* If text gets wrapped, the edit window needs a refresh. */
|
||||||
if (!ISSET(NO_WRAP) && do_wrap(openfile->current))
|
if (!ISSET(NO_WRAP) && do_wrap(openfile->current))
|
||||||
|
@ -607,9 +607,10 @@ enum
|
|||||||
/* Some extra flags for the undo function. */
|
/* Some extra flags for the undo function. */
|
||||||
#define WAS_FINAL_BACKSPACE (1<<1)
|
#define WAS_FINAL_BACKSPACE (1<<1)
|
||||||
#define WAS_WHOLE_LINE (1<<2)
|
#define WAS_WHOLE_LINE (1<<2)
|
||||||
|
#define WAS_FINAL_LINE (1<<3)
|
||||||
/* The flags for the mark need to be the highest. */
|
/* The flags for the mark need to be the highest. */
|
||||||
#define MARK_WAS_SET (1<<3)
|
#define MARK_WAS_SET (1<<4)
|
||||||
#define WAS_MARKED_FORWARD (1<<4)
|
#define WAS_MARKED_FORWARD (1<<5)
|
||||||
#endif /* !NANO_TINY */
|
#endif /* !NANO_TINY */
|
||||||
|
|
||||||
/* The maximum number of entries displayed in the main shortcut list. */
|
/* The maximum number of entries displayed in the main shortcut list. */
|
||||||
|
@ -734,6 +734,8 @@ void do_undo(void)
|
|||||||
/* TRANSLATORS: The next twelve strings describe actions
|
/* TRANSLATORS: The next twelve strings describe actions
|
||||||
* that are undone or redone. It are all nouns, not verbs. */
|
* that are undone or redone. It are all nouns, not verbs. */
|
||||||
undidmsg = _("text add");
|
undidmsg = _("text add");
|
||||||
|
if (u->xflags == WAS_FINAL_LINE && !ISSET(NO_NEWLINES))
|
||||||
|
remove_magicline();
|
||||||
data = charalloc(strlen(f->data) - strlen(u->strdata) + 1);
|
data = charalloc(strlen(f->data) - strlen(u->strdata) + 1);
|
||||||
strncpy(data, f->data, u->begin);
|
strncpy(data, f->data, u->begin);
|
||||||
strcpy(&data[u->begin], &f->data[u->begin + strlen(u->strdata)]);
|
strcpy(&data[u->begin], &f->data[u->begin + strlen(u->strdata)]);
|
||||||
@ -907,6 +909,8 @@ void do_redo(void)
|
|||||||
switch (u->type) {
|
switch (u->type) {
|
||||||
case ADD:
|
case ADD:
|
||||||
redidmsg = _("text add");
|
redidmsg = _("text add");
|
||||||
|
if (u->xflags == WAS_FINAL_LINE && !ISSET(NO_NEWLINES))
|
||||||
|
new_magicline();
|
||||||
data = charalloc(strlen(f->data) + strlen(u->strdata) + 1);
|
data = charalloc(strlen(f->data) + strlen(u->strdata) + 1);
|
||||||
strncpy(data, f->data, u->begin);
|
strncpy(data, f->data, u->begin);
|
||||||
strcpy(&data[u->begin], u->strdata);
|
strcpy(&data[u->begin], u->strdata);
|
||||||
@ -1272,6 +1276,9 @@ void add_undo(undo_type action)
|
|||||||
/* We need to start copying data into the undo buffer
|
/* We need to start copying data into the undo buffer
|
||||||
* or we won't be able to restore it later. */
|
* or we won't be able to restore it later. */
|
||||||
case ADD:
|
case ADD:
|
||||||
|
/* If a new magic line will be added, an undo should remove it. */
|
||||||
|
if (openfile->current == openfile->filebot && openfile->current_x == 0)
|
||||||
|
u->xflags = WAS_FINAL_LINE;
|
||||||
u->wassize--;
|
u->wassize--;
|
||||||
break;
|
break;
|
||||||
case BACK:
|
case BACK:
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user