diff options
-rw-r--r-- | src/main.cpp | 3 | ||||
-rw-r--r-- | src/parser.cpp | 40 | ||||
-rw-r--r-- | src/parser.h | 2 |
3 files changed, 20 insertions, 25 deletions
diff --git a/src/main.cpp b/src/main.cpp index 42ebc71..b8e87a0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -231,6 +231,9 @@ main(int argc, char **argv) /* * If munged file didn't quit, switch into interactive mode */ + /* commandline replacement string register */ + QRegisters::globals.initialize("\x1B"); + Goto::table = &cmdline_goto_table; interface.ssm(SCI_EMPTYUNDOBUFFER); undo.enabled = true; diff --git a/src/parser.cpp b/src/parser.cpp index d63f0f7..314c156 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -170,9 +170,11 @@ Execute::file(const gchar *filename, bool locals) return true; } -ReplaceCmdline::ReplaceCmdline(gchar *_new_cmdline) - : new_cmdline(_new_cmdline) +ReplaceCmdline::ReplaceCmdline() { + QRegister *cmdline_reg = QRegisters::globals["\x1B"]; + + new_cmdline = cmdline_reg->get_string(); for (pos = 0; cmdline[pos] && cmdline[pos] == new_cmdline[pos]; pos++); pos++; } @@ -832,45 +834,35 @@ StateStart::custom(gchar chr) throw (Error, ReplaceCmdline) /* * Command-line editing */ - case '{': { - void *document; - + case '{': BEGIN_EXEC(this); if (!undo.enabled) throw Error("Command-line editing only possible in " "interactive mode"); - current_save_dot(); - if (ring.current) - ring.current->undo_edit(); - else if (QRegisters::current) - QRegisters::current->undo_edit(); + ring.undo_edit(); + else /* QRegisters::current != NULL */ + QRegisters::undo_edit(); + QRegisters::globals.edit("\x1B"); - document = (void *)interface.ssm(SCI_CREATEDOCUMENT); - interface.ssm(SCI_SETDOCPOINTER, 0, (sptr_t)document); + interface.ssm(SCI_BEGINUNDOACTION); + interface.ssm(SCI_CLEARALL); interface.ssm(SCI_ADDTEXT, cmdline_pos-1, (sptr_t)cmdline); + /* FIXME: scroll into view */ + interface.ssm(SCI_ENDUNDOACTION); - undo.push_msg(SCI_RELEASEDOCUMENT, 0, (sptr_t)document); + undo.push_msg(SCI_UNDO); break; - } - - case '}': { - gint size; - gchar *new_cmdline; + case '}': BEGIN_EXEC(this); if (!undo.enabled) throw Error("Command-line editing only possible in " "interactive mode"); - size = interface.ssm(SCI_GETLENGTH) + 1; - new_cmdline = (gchar *)g_malloc(size); - interface.ssm(SCI_GETTEXT, size, (sptr_t)new_cmdline); - /* replace cmdline in the outer macro environment */ - throw ReplaceCmdline(new_cmdline); - } + throw ReplaceCmdline(); /* * modifiers diff --git a/src/parser.h b/src/parser.h index 865cf85..d2e570b 100644 --- a/src/parser.h +++ b/src/parser.h @@ -32,7 +32,7 @@ public: gchar *new_cmdline; gint pos; - ReplaceCmdline(gchar *_new_cmdline); + ReplaceCmdline(); }; class State { |