aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2013-01-29 20:34:15 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2013-01-29 20:34:15 +0100
commit775e91c41924663bc397516565fed2fcdcb52fc8 (patch)
tree11bdc9aa0ff4aa8247a36a504bfe8ff5decce620
parent72c65f59ef95f070442b84cba48be60cbb8195cc (diff)
downloadsciteco-775e91c41924663bc397516565fed2fcdcb52fc8.tar.gz
fixed backward search-and-kill (e.g. -FK...$)
-rw-r--r--src/search.cpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/search.cpp b/src/search.cpp
index a2d7f70..a56ce17 100644
--- a/src/search.cpp
+++ b/src/search.cpp
@@ -524,7 +524,7 @@ StateSearchAll::done(const gchar *str) throw (Error)
State *
StateSearchKill::done(const gchar *str) throw (Error)
{
- gint anchor;
+ gint dot;
BEGIN_EXEC(&States::start);
@@ -532,19 +532,29 @@ StateSearchKill::done(const gchar *str) throw (Error)
StateSearch::done(str);
- if (IS_SUCCESS(search_reg->get_integer())) {
- undo.push_msg(SCI_GOTOPOS, interface.ssm(SCI_GETCURRENTPOS));
- anchor = interface.ssm(SCI_GETANCHOR);
+ if (IS_FAILURE(search_reg->get_integer()))
+ return &States::start;
+
+ dot = interface.ssm(SCI_GETCURRENTPOS);
+
+ interface.ssm(SCI_BEGINUNDOACTION);
+ if (parameters.dot < dot) {
+ /* kill forwards */
+ gint anchor = interface.ssm(SCI_GETANCHOR);
+
+ undo.push_msg(SCI_GOTOPOS, dot);
interface.ssm(SCI_GOTOPOS, anchor);
- interface.ssm(SCI_BEGINUNDOACTION);
interface.ssm(SCI_DELETERANGE,
parameters.dot, anchor - parameters.dot);
- interface.ssm(SCI_ENDUNDOACTION);
- ring.dirtify();
-
- undo.push_msg(SCI_UNDO);
+ } else {
+ /* kill backwards */
+ interface.ssm(SCI_DELETERANGE, dot, parameters.dot - dot);
}
+ interface.ssm(SCI_ENDUNDOACTION);
+ ring.dirtify();
+
+ undo.push_msg(SCI_UNDO);
return &States::start;
}