aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/qregisters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qregisters.cpp')
-rw-r--r--src/qregisters.cpp75
1 files changed, 62 insertions, 13 deletions
diff --git a/src/qregisters.cpp b/src/qregisters.cpp
index d59686b..940ce23 100644
--- a/src/qregisters.cpp
+++ b/src/qregisters.cpp
@@ -45,6 +45,8 @@ namespace States {
StatePopQReg popqreg;
StateEQCommand eqcommand;
StateLoadQReg loadqreg;
+ StateEPctCommand epctcommand;
+ StateSaveQReg saveqreg;
StateCtlUCommand ctlucommand;
StateEUCommand eucommand;
StateSetQRegString setqregstring_nobuilding(false);
@@ -207,24 +209,41 @@ QRegister::execute(bool locals)
void
QRegister::load(const gchar *filename)
{
- gchar *contents;
- gsize size;
+ undo_set_string();
- GError *gerror = NULL;
-
- /* FIXME: prevent excessive allocations by reading file into buffer */
- if (!g_file_get_contents(filename, &contents, &size, &gerror))
- throw GlibError(gerror);
+ if (QRegisters::current)
+ QRegisters::current->string.update(QRegisters::view);
string.edit(QRegisters::view);
string.reset();
- QRegisters::view.ssm(SCI_BEGINUNDOACTION);
- QRegisters::view.ssm(SCI_CLEARALL);
- QRegisters::view.ssm(SCI_APPENDTEXT, size, (sptr_t)contents);
- QRegisters::view.ssm(SCI_ENDUNDOACTION);
+ /*
+ * undo_set_string() pushes undo tokens that restore
+ * the previous document in the view.
+ * So if loading fails, QRegisters::current will be
+ * made the current document again.
+ */
+ QRegisters::view.load(filename);
- g_free(contents);
+ if (QRegisters::current)
+ QRegisters::current->string.edit(QRegisters::view);
+}
+
+void
+QRegister::save(const gchar *filename)
+{
+ if (QRegisters::current)
+ QRegisters::current->string.update(QRegisters::view);
+
+ string.edit(QRegisters::view);
+
+ try {
+ QRegisters::view.save(filename);
+ } catch (...) {
+ if (QRegisters::current)
+ QRegisters::current->string.edit(QRegisters::view);
+ throw; /* forward */
+ }
if (QRegisters::current)
QRegisters::current->string.edit(QRegisters::view);
@@ -600,7 +619,6 @@ StateLoadQReg::done(const gchar *str)
if (*str) {
/* Load file into Q-Register */
- register_argument->undo_load();
register_argument->load(str);
} else {
/* Edit Q-Register */
@@ -612,6 +630,37 @@ StateLoadQReg::done(const gchar *str)
}
/*$
+ * E%q<file>$ -- Save Q-Register string to file
+ *
+ * Saves the string contents of Q-Register <q> to
+ * <file>.
+ * The <file> must always be specified, as Q-Registers
+ * have no notion of associated file names.
+ *
+ * In interactive mode, the E% command may be rubbed out,
+ * restoring the previous state of <file>.
+ * This follows the same rules as with the \fBEW\fP command.
+ *
+ * File names may also be tab-completed and string building
+ * characters are enabled by default.
+ */
+State *
+StateEPctCommand::got_register(QRegister &reg)
+{
+ BEGIN_EXEC(&States::saveqreg);
+ register_argument = &reg;
+ return &States::saveqreg;
+}
+
+State *
+StateSaveQReg::done(const gchar *str)
+{
+ BEGIN_EXEC(&States::start);
+ register_argument->save(str);
+ return &States::start;
+}
+
+/*$
* [c1,c2,...]^Uq[string]$ -- Set or append to Q-Register string without string building
* [c1,c2,...]:^Uq[string]$
*