aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-11 04:35:36 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-11-11 04:35:36 +0100
commitc88e635842f0d172514d73f17f128dc91e3c65f4 (patch)
tree5dd5b99e11f03abc8c1f1d3af195571301b036de
parent46316ece115c100a8146303957a3bec07a1d2dde (diff)
downloadsciteco-c88e635842f0d172514d73f17f128dc91e3c65f4.tar.gz
support EQx<filename>$ command: load filename into Q register without changing the current buffer
-rw-r--r--cmdline.cpp9
-rw-r--r--qbuffers.cpp55
-rw-r--r--qbuffers.h8
3 files changed, 60 insertions, 12 deletions
diff --git a/cmdline.cpp b/cmdline.cpp
index 171b2e3..a0c6fec 100644
--- a/cmdline.cpp
+++ b/cmdline.cpp
@@ -100,15 +100,16 @@ process_edit_cmd(gchar key)
}
case '\t':
- if (States::current == &States::file) {
+ if (States::current == &States::file ||
+ States::current == &States::loadqreg) {
gchar *new_chars = filename_complete(strings[0], escape_char);
if (new_chars)
g_stpcpy(insert, new_chars);
g_free(new_chars);
- break;
+ } else {
+ insert[0] = key;
+ insert[1] = '\0';
}
- insert[0] = key;
- insert[1] = '\0';
break;
case '\x1B':
diff --git a/qbuffers.cpp b/qbuffers.cpp
index c907330..9e8b065 100644
--- a/qbuffers.cpp
+++ b/qbuffers.cpp
@@ -18,11 +18,36 @@
namespace States {
StateFile file;
StateEQCommand eqcommand;
+ StateLoadQReg loadqreg;
}
Ring ring;
QRegisterTable qregisters;
+bool
+QRegister::load(const gchar *filename)
+{
+ gchar *contents;
+ 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_APPENDTEXT, size, (sptr_t)contents);
+ g_free(contents);
+
+ if (ring.current)
+ ring.current->edit();
+ else /* qregisters.current != NULL */
+ qregisters.current->edit();
+
+ return true;
+}
+
void
QRegisterTable::initialize(void)
{
@@ -232,19 +257,33 @@ StateFile::done(const gchar *str)
return &States::start;
}
-/*
- * TODO: expect filename to read into Q-register
- */
+static QRegister *eq_register = NULL;
+
State *
StateEQCommand::got_register(QRegister *reg)
{
+ BEGIN_EXEC(&States::loadqreg);
+
+ undo.push_var<QRegister*>(eq_register);
+ eq_register = reg;
+
+ return &States::loadqreg;
+}
+
+State *
+StateLoadQReg::done(const gchar *str)
+{
BEGIN_EXEC(&States::start);
- if (ring.current)
- ring.undo_edit();
- else /* qregisters.current != NULL */
- qregisters.undo_edit();
- qregisters.edit(reg);
+ if (*str) {
+ eq_register->load(str);
+ } else {
+ if (ring.current)
+ ring.undo_edit();
+ else /* qregisters.current != NULL */
+ qregisters.undo_edit();
+ qregisters.edit(eq_register);
+ }
return &States::start;
}
diff --git a/qbuffers.h b/qbuffers.h
index 6a120e7..0dd2f9d 100644
--- a/qbuffers.h
+++ b/qbuffers.h
@@ -59,6 +59,8 @@ public:
undo.push_msg(SCI_GOTOPOS, dot);
undo.push_msg(SCI_SETDOCPOINTER, 0, (sptr_t)get_string());
}
+
+ bool load(const gchar *filename);
};
extern class QRegisterTable : public RBTree {
@@ -234,9 +236,15 @@ private:
State *got_register(QRegister *reg);
};
+class StateLoadQReg : public StateExpectString {
+private:
+ State *done(const gchar *str);
+};
+
namespace States {
extern StateFile file;
extern StateEQCommand eqcommand;
+ extern StateLoadQReg loadqreg;
}
/*