aboutsummaryrefslogtreecommitdiffhomepage
path: root/qbuffers.cpp
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 /qbuffers.cpp
parent46316ece115c100a8146303957a3bec07a1d2dde (diff)
downloadsciteco-c88e635842f0d172514d73f17f128dc91e3c65f4.tar.gz
support EQx<filename>$ command: load filename into Q register without changing the current buffer
Diffstat (limited to 'qbuffers.cpp')
-rw-r--r--qbuffers.cpp55
1 files changed, 47 insertions, 8 deletions
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;
}