From ff060cf43647171420183cafe75ece24983cf617 Mon Sep 17 00:00:00 2001
From: gwenn <gtreguier@gmail.com>
Date: Sun, 22 Apr 2018 11:50:20 +0200
Subject: [PATCH] Undo: ignore empty change and keep tx boundaries

---
 src/undo.rs | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/undo.rs b/src/undo.rs
index 8e5b4233..b7b887f0 100644
--- a/src/undo.rs
+++ b/src/undo.rs
@@ -151,9 +151,12 @@ impl Changeset {
         self.undos.push(last_change);
     }
 
-    pub fn insert_str<S: Into<String> + Debug>(&mut self, idx: usize, string: S) {
+    pub fn insert_str<S: AsRef<str> + Into<String> + Debug>(&mut self, idx: usize, string: S) {
         debug!(target: "rustyline", "Changeset::insert_str({}, {:?})", idx, string);
         self.redos.clear();
+        if string.as_ref().is_empty() {
+            return;
+        }
         self.undos.push(Change::Insert {
             idx,
             text: string.into(),
@@ -163,6 +166,9 @@ impl Changeset {
     pub fn delete<S: AsRef<str> + Into<String> + Debug>(&mut self, indx: usize, string: S) {
         debug!(target: "rustyline", "Changeset::delete({}, {:?})", indx, string);
         self.redos.clear();
+        if string.as_ref().is_empty() {
+            return;
+        }
 
         if !Self::single_char(string.as_ref())
             || !self.undos
@@ -246,10 +252,10 @@ impl Changeset {
                     }
                     _ => {
                         change.undo(line);
-                        self.redos.push(change);
                         undone = true;
                     }
                 };
+                self.redos.push(change);
             } else {
                 break;
             }
@@ -280,10 +286,10 @@ impl Changeset {
                     }
                     _ => {
                         change.redo(line);
-                        self.undos.push(change);
                         redone = true;
                     }
                 };
+                self.undos.push(change);
             } else {
                 break;
             }
-- 
GitLab