text: add an undo item before starting to comment or uncomment lines
By moving the test for the only situation where do_comment() does nothing (when only the magic line is selected) further up front, the add_undo() can be called before the commenting/uncommenting starts and two variables and an extra function are made unnecessary.
Этот коммит содержится в:
родитель
5dee9fb2c6
Коммит
9192b7fe8c
@ -749,8 +749,6 @@ void discard_until(const undo *thisitem, openfilestruct *thefile);
|
||||
void add_undo(undo_type action);
|
||||
void update_undo(undo_type action);
|
||||
#ifndef DISABLE_COMMENT
|
||||
void add_comment_undo(undo_type action, const char *comment_seq, size_t was_x,
|
||||
size_t was_size);
|
||||
void update_comment_undo(ssize_t lineno);
|
||||
bool comment_line(undo_type action, filestruct *f, const char *comment_seq);
|
||||
#endif
|
||||
|
52
src/text.c
52
src/text.c
@ -454,12 +454,9 @@ void do_comment()
|
||||
const char *comment_seq = "#";
|
||||
undo_type action = UNCOMMENT;
|
||||
filestruct *top, *bot, *f;
|
||||
size_t top_x, bot_x, was_x, was_size;
|
||||
size_t top_x, bot_x;
|
||||
bool empty, all_empty = TRUE;
|
||||
|
||||
bool file_changed = FALSE;
|
||||
/* Whether any comment has been added or deleted. */
|
||||
|
||||
assert(openfile->current != NULL && openfile->current->data != NULL);
|
||||
|
||||
#ifndef DISABLE_COLOR
|
||||
@ -482,9 +479,11 @@ void do_comment()
|
||||
bot = top;
|
||||
}
|
||||
|
||||
/* Remember cursor position and file size, to be restored when undoing. */
|
||||
was_x = openfile->current_x;
|
||||
was_size = openfile->totsize;
|
||||
/* If only the magic line is selected, don't do anything. */
|
||||
if (top == bot && bot == openfile->filebot && !ISSET(NO_NEWLINES)) {
|
||||
statusbar(_("Cannot comment past end of file"));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Figure out whether to comment or uncomment the selected line or lines. */
|
||||
for (f = top; f != bot->next; f = f->next) {
|
||||
@ -501,24 +500,21 @@ void do_comment()
|
||||
/* If all selected lines are blank, we comment them. */
|
||||
action = all_empty ? COMMENT : action;
|
||||
|
||||
add_undo(action);
|
||||
|
||||
/* Store the comment sequence used for the operation, because it could
|
||||
* change when the file name changes; we need to know what it was. */
|
||||
openfile->current_undo->strdata = mallocstrcpy(NULL, comment_seq);
|
||||
|
||||
/* Process the selected line or lines. */
|
||||
for (f = top; f != bot->next; f = f->next) {
|
||||
if (comment_line(action, f, comment_seq)) {
|
||||
if (!file_changed) {
|
||||
/* Start building undo data on the first modified line. */
|
||||
add_comment_undo(action, comment_seq, was_x, was_size);
|
||||
file_changed = TRUE;
|
||||
}
|
||||
/* Add undo data for each modified line. */
|
||||
/* Comment/uncomment a line, and add undo data when line changed. */
|
||||
if (comment_line(action, f, comment_seq))
|
||||
update_comment_undo(f->lineno);
|
||||
}
|
||||
}
|
||||
|
||||
if (file_changed) {
|
||||
set_modified();
|
||||
refresh_needed = TRUE;
|
||||
} else
|
||||
statusbar(_("Cannot comment past end of file"));
|
||||
set_modified();
|
||||
refresh_needed = TRUE;
|
||||
}
|
||||
|
||||
/* Test whether the given line can be uncommented, or add or remove a comment,
|
||||
@ -1284,22 +1280,6 @@ void add_undo(undo_type action)
|
||||
}
|
||||
|
||||
#ifdef ENABLE_COMMENT
|
||||
/* Add a comment undo item. This should be called once for each use
|
||||
* of the comment/uncomment feature that modifies the document. */
|
||||
void add_comment_undo(undo_type action, const char *comment_seq, size_t was_x,
|
||||
size_t was_size)
|
||||
{
|
||||
add_undo(action);
|
||||
|
||||
/* Store the comment sequence used for the operation, because it could
|
||||
* change when the file name changes; we need to know what it was. */
|
||||
openfile->current_undo->strdata = mallocstrcpy(NULL, comment_seq);
|
||||
|
||||
/* Store cursor position and file size from before the change. */
|
||||
openfile->current_undo->begin = was_x;
|
||||
openfile->current_undo->wassize= was_size;
|
||||
}
|
||||
|
||||
/* Update a comment undo item. This should be called once for each line
|
||||
* affected by the comment/uncomment feature. */
|
||||
void update_comment_undo(ssize_t lineno)
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user