aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2013-01-20 15:59:03 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2013-01-20 16:03:52 +0100
commit70c6c430a2cd990cad899024c3bab0c8208328b1 (patch)
tree26a71fecaf6a29d0a67e562e11639f95da24b0ed
parent1e55387482bd501770aafc4230cbcad870d3abf3 (diff)
downloadsciteco-70c6c430a2cd990cad899024c3bab0c8208328b1.tar.gz
fixed search-replace commands if search fails (do not insert then)
* updated TODO
-rw-r--r--TODO10
-rw-r--r--src/search.cpp43
-rw-r--r--src/search.h18
3 files changed, 64 insertions, 7 deletions
diff --git a/TODO b/TODO
index 5538c44..096036e 100644
--- a/TODO
+++ b/TODO
@@ -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