diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-11 04:35:36 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-11-11 04:35:36 +0100 |
commit | c88e635842f0d172514d73f17f128dc91e3c65f4 (patch) | |
tree | 5dd5b99e11f03abc8c1f1d3af195571301b036de /qbuffers.cpp | |
parent | 46316ece115c100a8146303957a3bec07a1d2dde (diff) | |
download | sciteco-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.cpp | 55 |
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; } |