aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--main.cpp2
-rw-r--r--parser.cpp1
-rw-r--r--search.cpp38
-rw-r--r--search.h23
4 files changed, 55 insertions, 9 deletions
diff --git a/main.cpp b/main.cpp
index 11358ea..e23eca8 100644
--- a/main.cpp
+++ b/main.cpp
@@ -169,6 +169,8 @@ main(int argc, char **argv)
QRegisters::globals.initialize();
/* search string and status register */
QRegisters::globals.initialize("_");
+ /* replacement string register */
+ QRegisters::globals.initialize("-");
/* current buffer name and number ("*") */
QRegisters::globals.insert(new QRegisterBufferInfo());
diff --git a/parser.cpp b/parser.cpp
index b862973..3f59e16 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -1016,6 +1016,7 @@ StateFCommand::StateFCommand() : State()
{
transitions['\0'] = this;
transitions['S'] = &States::replace;
+ transitions['R'] = &States::replacedefault;
}
State *
diff --git a/search.cpp b/search.cpp
index 6b76825..ceb8e54 100644
--- a/search.cpp
+++ b/search.cpp
@@ -1,3 +1,5 @@
+#include <string.h>
+
#include <glib.h>
#include <glib/gprintf.h>
@@ -9,10 +11,12 @@
#include "search.h"
namespace States {
- StateSearch search;
- StateSearchAll searchall;
- StateReplace replace;
- StateReplace_insert replace_insert;
+ StateSearch search;
+ StateSearchAll searchall;
+ StateReplace replace;
+ StateReplace_insert replace_insert;
+ StateReplaceDefault replacedefault;
+ StateReplaceDefault_insert replacedefault_insert;
}
/*
@@ -505,3 +509,29 @@ StateReplace::done(const gchar *str) throw (Error)
return &States::replace_insert;
}
+
+State *
+StateReplaceDefault::done(const gchar *str) throw (Error)
+{
+ StateReplace::done(str);
+ return &States::replacedefault_insert;
+}
+
+State *
+StateReplaceDefault_insert::done(const gchar *str) throw (Error)
+{
+ BEGIN_EXEC(&States::start);
+
+ QRegister *replace_reg = QRegisters::globals["-"];
+
+ if (*str) {
+ replace_reg->undo_set_string();
+ replace_reg->set_string(str);
+ } else {
+ gchar *replace_str = replace_reg->get_string();
+ StateInsert::process(replace_str, strlen(replace_str));
+ g_free(replace_str);
+ }
+
+ return &States::start;
+}
diff --git a/search.h b/search.h
index 46e37e2..beb20d4 100644
--- a/search.h
+++ b/search.h
@@ -52,7 +52,7 @@ class StateReplace : public StateSearch {
public:
StateReplace() : StateSearch(false) {}
-private:
+protected:
State *done(const gchar *str) throw (Error);
};
@@ -61,11 +61,24 @@ private:
void initial(void) throw (Error) {}
};
+class StateReplaceDefault : public StateReplace {
+private:
+ State *done(const gchar *str) throw (Error);
+};
+
+class StateReplaceDefault_insert : public StateInsert {
+private:
+ void initial(void) throw (Error) {}
+ State *done(const gchar *str) throw (Error);
+};
+
namespace States {
- extern StateSearch search;
- extern StateSearchAll searchall;
- extern StateReplace replace;
- extern StateReplace_insert replace_insert;
+ extern StateSearch search;
+ extern StateSearchAll searchall;
+ extern StateReplace replace;
+ extern StateReplace_insert replace_insert;
+ extern StateReplaceDefault replacedefault;
+ extern StateReplaceDefault_insert replacedefault_insert;
}
#endif