diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-01-20 15:59:03 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-01-20 16:03:52 +0100 |
commit | 70c6c430a2cd990cad899024c3bab0c8208328b1 (patch) | |
tree | 26a71fecaf6a29d0a67e562e11639f95da24b0ed | |
parent | 1e55387482bd501770aafc4230cbcad870d3abf3 (diff) | |
download | sciteco-70c6c430a2cd990cad899024c3bab0c8208328b1.tar.gz |
fixed search-replace commands if search fails (do not insert then)
* updated TODO
-rw-r--r-- | TODO | 10 | ||||
-rw-r--r-- | src/search.cpp | 43 | ||||
-rw-r--r-- | src/search.h | 18 |
3 files changed, 64 insertions, 7 deletions
@@ -1,16 +1,17 @@ Known Bugs: * Dot is not always restored properly (e.g. after closing file) - * FS broken in loops - inserts even if search failed * Strange behaviour after loop interruption (e.g. "<%a>") * Null-byte in strings not always handled transparently + * safe-point mechanism discards file attributes (must be applied to new files) Features: * Progress indication in commandline cursor * catch OOM errors (can happen easily due to infinite loops) * undo-tokens per char limit (additional infinite loop safety) - * Function-key support + * Function-key support, configurable * generic function-key substitution, or - * function-key encoding (e.g. Page-down -> ^FPD) + * function-key encoding (e.g. Page-down -> ^FPD), or + * function-key to ASCII/UTF mapping (as command executes macro of the same name) * extended Q-Register namespace * 2 char q-registers like in Troff (e.g. "Q(xy") * arbitrary length names (e.g. "Q$xyz$", see ITS TECO) @@ -22,6 +23,9 @@ Features: * multiline commandline * improve GTK interface * modifier for toggling string building processing + * simplify parser (static jump tables are unnecessary!) + * ??? optional modified-detection based on hash sums ??? + * backup files Documentation: * Code docs (Doxygen) diff --git a/src/search.cpp b/src/search.cpp index 060a765..30ae5e7 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -37,10 +37,14 @@ namespace States { StateSearchAll searchall; StateSearchKill searchkill; StateSearchDelete searchdelete; + StateReplace replace; StateReplace_insert replace_insert; + StateReplace_ignore replace_ignore; + StateReplaceDefault replacedefault; StateReplaceDefault_insert replacedefault_insert; + StateReplaceDefault_ignore replacedefault_ignore; } /* @@ -561,15 +565,35 @@ StateSearchDelete::done(const gchar *str) throw (Error) State * StateReplace::done(const gchar *str) throw (Error) { + BEGIN_EXEC(&States::replace_ignore); + + QRegister *search_reg = QRegisters::globals["_"]; + StateSearchDelete::done(str); - return &States::replace_insert; + + return IS_SUCCESS(search_reg->get_integer()) + ? (State *)&States::replace_insert + : (State *)&States::replace_ignore; +} + +State * +StateReplace_ignore::done(const gchar *str __attribute__((unused))) throw (Error) +{ + return &States::start; } State * StateReplaceDefault::done(const gchar *str) throw (Error) { + BEGIN_EXEC(&States::replacedefault_ignore); + + QRegister *search_reg = QRegisters::globals["_"]; + StateSearchDelete::done(str); - return &States::replacedefault_insert; + + return IS_SUCCESS(search_reg->get_integer()) + ? (State *)&States::replacedefault_insert + : (State *)&States::replacedefault_ignore; } State * @@ -590,3 +614,18 @@ StateReplaceDefault_insert::done(const gchar *str) throw (Error) return &States::start; } + +State * +StateReplaceDefault_ignore::done(const gchar *str) throw (Error) +{ + BEGIN_EXEC(&States::start); + + if (*str) { + QRegister *replace_reg = QRegisters::globals["-"]; + + replace_reg->undo_set_string(); + replace_reg->set_string(str); + } + + return &States::start; +} diff --git a/src/search.h b/src/search.h index 096e419..4506d7c 100644 --- a/src/search.h +++ b/src/search.h @@ -91,6 +91,11 @@ private: void initial(void) throw (Error) {} }; +class StateReplace_ignore : public StateExpectString { +private: + State *done(const gchar *str) throw (Error); +}; + class StateReplaceDefault : public StateSearchDelete { public: StateReplaceDefault() : StateSearchDelete(false) {} @@ -105,15 +110,24 @@ private: State *done(const gchar *str) throw (Error); }; +class StateReplaceDefault_ignore : public StateExpectString { +private: + State *done(const gchar *str) throw (Error); +}; + namespace States { extern StateSearch search; extern StateSearchAll searchall; extern StateSearchKill searchkill; - extern StateSearchDelete searchdelete; + extern StateSearchDelete searchdelete; + extern StateReplace replace; extern StateReplace_insert replace_insert; + extern StateReplace_ignore replace_ignore; + extern StateReplaceDefault replacedefault; - extern StateReplaceDefault_insert replacedefault_insert; + extern StateReplaceDefault_insert replacedefault_insert; + extern StateReplaceDefault_ignore replacedefault_ignore; } #endif |