aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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;
}