aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/parser.cpp1
-rw-r--r--src/spawn.cpp41
-rw-r--r--src/spawn.h10
3 files changed, 45 insertions, 7 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index bbaad14..175f281 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -1813,6 +1813,7 @@ StateECommand::StateECommand() : State()
transitions['\0'] = this;
transitions['B'] = &States::editfile;
transitions['C'] = &States::executecommand;
+ transitions['G'] = &States::egcommand;
transitions['M'] = &States::macro_file;
transitions['S'] = &States::scintilla_symbols;
transitions['Q'] = &States::eqcommand;
diff --git a/src/spawn.cpp b/src/spawn.cpp
index 22c6a00..8ade6b2 100644
--- a/src/spawn.cpp
+++ b/src/spawn.cpp
@@ -32,6 +32,7 @@
namespace States {
StateExecuteCommand executecommand;
+ StateEGCommand egcommand;
}
extern "C" {
@@ -42,6 +43,8 @@ static gboolean stdout_watch_cb(GIOChannel *chan,
GIOCondition condition, gpointer data);
}
+static QRegister *register_argument = NULL;
+
gchar **
parse_shell_command_line(const gchar *cmdline, GError **error)
{
@@ -211,17 +214,21 @@ StateExecuteCommand::done(const gchar *str)
&ctx, NULL);
g_source_attach(ctx.stdout_src, ctx.mainctx);
- if (current_doc_must_undo())
- undo.push_msg(SCI_GOTOPOS, interface.ssm(SCI_GETCURRENTPOS));
- interface.ssm(SCI_GOTOPOS, ctx.to);
+ if (!register_argument) {
+ if (current_doc_must_undo())
+ undo.push_msg(SCI_GOTOPOS, interface.ssm(SCI_GETCURRENTPOS));
+ interface.ssm(SCI_GOTOPOS, ctx.to);
+ }
interface.ssm(SCI_BEGINUNDOACTION);
ctx.start = ctx.from;
g_main_loop_run(ctx.mainloop);
- interface.ssm(SCI_DELETERANGE, ctx.from, ctx.to - ctx.from);
+ if (!register_argument)
+ interface.ssm(SCI_DELETERANGE, ctx.from, ctx.to - ctx.from);
interface.ssm(SCI_ENDUNDOACTION);
- if (ctx.start != ctx.from || ctx.text_added) {
+ if (!register_argument &&
+ (ctx.from != ctx.to || ctx.text_added)) {
/* undo action is only effective if it changed anything */
if (current_doc_must_undo())
undo.push_msg(SCI_UNDO);
@@ -267,6 +274,14 @@ gerror:
return &States::start;
}
+State *
+StateEGCommand::got_register(QRegister &reg)
+{
+ BEGIN_EXEC(&States::executecommand);
+ undo.push_var(register_argument) = ®
+ return &States::executecommand;
+}
+
/*
* Glib callbacks
*/
@@ -345,7 +360,7 @@ stdout_watch_cb(GIOChannel *chan, GIOCondition condition, gpointer data)
gchar buffer[1024];
gsize bytes_read;
- switch (g_io_channel_read_chars(chan, buffer, sizeof(buffer),
+ switch (g_io_channel_read_chars(chan, buffer, sizeof(buffer)-1,
&bytes_read,
ctx.error ? NULL : &ctx.error)) {
case G_IO_STATUS_NORMAL:
@@ -359,7 +374,19 @@ stdout_watch_cb(GIOChannel *chan, GIOCondition condition, gpointer data)
return G_SOURCE_CONTINUE;
}
- interface.ssm(SCI_ADDTEXT, bytes_read, (sptr_t)buffer);
+ if (register_argument) {
+ buffer[bytes_read] = '\0';
+
+ if (ctx.text_added) {
+ register_argument->undo_append_string();
+ register_argument->append_string(buffer);
+ } else {
+ register_argument->undo_set_string();
+ register_argument->set_string(buffer);
+ }
+ } else {
+ interface.ssm(SCI_ADDTEXT, bytes_read, (sptr_t)buffer);
+ }
ctx.text_added = true;
return G_SOURCE_CONTINUE;
diff --git a/src/spawn.h b/src/spawn.h
index b6cb298..57b4f72 100644
--- a/src/spawn.h
+++ b/src/spawn.h
@@ -22,6 +22,7 @@
#include "sciteco.h"
#include "parser.h"
+#include "qregisters.h"
gchar **parse_shell_command_line(const gchar *cmdline, GError **error);
@@ -49,8 +50,17 @@ private:
State *done(const gchar *str);
};
+class StateEGCommand : public StateExpectQReg {
+public:
+ StateEGCommand() : StateExpectQReg(true) {}
+
+private:
+ State *got_register(QRegister &reg);
+};
+
namespace States {
extern StateExecuteCommand executecommand;
+ extern StateEGCommand egcommand;
}
#endif