From 575c9f45ec0f338e1d22032b98773d3ff3386bc9 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Tue, 4 Dec 2012 04:06:45 +0100 Subject: search-replace command with default replacement string (FR) * based on FS command * default replacement string is stored in global register "-" --- main.cpp | 2 ++ parser.cpp | 1 + search.cpp | 38 ++++++++++++++++++++++++++++++++++---- search.h | 23 ++++++++++++++++++----- 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 + #include #include @@ -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 -- cgit v1.2.3