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 | |
parent | 46316ece115c100a8146303957a3bec07a1d2dde (diff) | |
download | sciteco-c88e635842f0d172514d73f17f128dc91e3c65f4.tar.gz |
support EQx<filename>$ command: load filename into Q register without changing the current buffer
-rw-r--r-- | cmdline.cpp | 9 | ||||
-rw-r--r-- | qbuffers.cpp | 55 | ||||
-rw-r--r-- | qbuffers.h | 8 |
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; } @@ -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; } /* |