aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--parser.cpp1
-rw-r--r--qbuffers.cpp67
-rw-r--r--qbuffers.h20
3 files changed, 75 insertions, 13 deletions
diff --git a/parser.cpp b/parser.cpp
index b3733d6..870a611 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -508,6 +508,7 @@ StateStart::custom(gchar chr)
StateControl::StateControl() : State()
{
transitions['\0'] = this;
+ transitions['U'] = &States::ctlucommand;
}
State *
diff --git a/qbuffers.cpp b/qbuffers.cpp
index 9e8b065..be32c96 100644
--- a/qbuffers.cpp
+++ b/qbuffers.cpp
@@ -16,14 +16,34 @@
#include "qbuffers.h"
namespace States {
- StateFile file;
- StateEQCommand eqcommand;
- StateLoadQReg loadqreg;
+ StateFile file;
+ StateEQCommand eqcommand;
+ StateLoadQReg loadqreg;
+ StateCtlUCommand ctlucommand;
+ StateSetQRegString setqregstring;
}
Ring ring;
QRegisterTable qregisters;
+static QRegister *register_argument = NULL;
+
+void
+QRegister::set_string(const gchar *str)
+{
+ edit();
+ dot = 0;
+
+ editor_msg(SCI_BEGINUNDOACTION);
+ editor_msg(SCI_SETTEXT, 0, (sptr_t)str);
+ editor_msg(SCI_ENDUNDOACTION);
+
+ if (ring.current)
+ ring.current->edit();
+ else /* qregisters.current != NULL */
+ qregisters.current->edit();
+}
+
bool
QRegister::load(const gchar *filename)
{
@@ -31,13 +51,17 @@ QRegister::load(const gchar *filename)
gsize size;
edit();
- editor_msg(SCI_CLEARALL);
dot = 0;
/* FIXME: prevent excessive allocations by reading file into buffer */
if (!g_file_get_contents(filename, &contents, &size, NULL))
return false;
+
+ editor_msg(SCI_BEGINUNDOACTION);
+ editor_msg(SCI_CLEARALL);
editor_msg(SCI_APPENDTEXT, size, (sptr_t)contents);
+ editor_msg(SCI_ENDUNDOACTION);
+
g_free(contents);
if (ring.current)
@@ -257,15 +281,13 @@ StateFile::done(const gchar *str)
return &States::start;
}
-static QRegister *eq_register = NULL;
-
State *
StateEQCommand::got_register(QRegister *reg)
{
BEGIN_EXEC(&States::loadqreg);
- undo.push_var<QRegister*>(eq_register);
- eq_register = reg;
+ undo.push_var<QRegister*>(register_argument);
+ register_argument = reg;
return &States::loadqreg;
}
@@ -276,14 +298,39 @@ StateLoadQReg::done(const gchar *str)
BEGIN_EXEC(&States::start);
if (*str) {
- eq_register->load(str);
+ undo.push_var<gint>(register_argument->dot);
+ undo.push_msg(SCI_UNDO);
+ register_argument->load(str);
} else {
if (ring.current)
ring.undo_edit();
else /* qregisters.current != NULL */
qregisters.undo_edit();
- qregisters.edit(eq_register);
+ qregisters.edit(register_argument);
}
return &States::start;
}
+
+State *
+StateCtlUCommand::got_register(QRegister *reg)
+{
+ BEGIN_EXEC(&States::setqregstring);
+
+ undo.push_var<QRegister*>(register_argument);
+ register_argument = reg;
+
+ return &States::setqregstring;
+}
+
+State *
+StateSetQRegString::done(const gchar *str)
+{
+ BEGIN_EXEC(&States::start);
+
+ undo.push_var<gint>(register_argument->dot);
+ undo.push_msg(SCI_UNDO);
+ register_argument->set_string(str);
+
+ return &States::start;
+}
diff --git a/qbuffers.h b/qbuffers.h
index 0dd2f9d..a901e01 100644
--- a/qbuffers.h
+++ b/qbuffers.h
@@ -39,6 +39,7 @@ public:
return g_strcmp0(name, ((QRegister &)entry).name);
}
+ void set_string(const gchar *str);
inline document *
get_string(void)
{
@@ -241,10 +242,23 @@ private:
State *done(const gchar *str);
};
+class StateCtlUCommand : public StateExpectQReg {
+private:
+ State *got_register(QRegister *reg);
+};
+
+class StateSetQRegString : public StateExpectString {
+private:
+ State *done(const gchar *str);
+};
+
+
namespace States {
- extern StateFile file;
- extern StateEQCommand eqcommand;
- extern StateLoadQReg loadqreg;
+ extern StateFile file;
+ extern StateEQCommand eqcommand;
+ extern StateLoadQReg loadqreg;
+ extern StateCtlUCommand ctlucommand;
+ extern StateSetQRegString setqregstring;
}
/*