chiark / gitweb /
Enough editing keys for a single-line editor.
authorSimon Tatham <anakin@pobox.com>
Sun, 31 Dec 2023 20:21:28 +0000 (20:21 +0000)
committerSimon Tatham <anakin@pobox.com>
Sun, 31 Dec 2023 20:21:28 +0000 (20:21 +0000)
src/editor.rs

index 4be69e12c5ec8b96802366042b241f411cd7ad72..bc85f2c3221dedf0003abd3ee0ea9e9014247756 100644 (file)
@@ -114,6 +114,36 @@ impl EditorCore {
         self.point += self.paste_buffer.len();
     }
 
+    fn beginning_of_buffer(&mut self) {
+        self.point = 0;
+    }
+
+    fn end_of_buffer(&mut self) {
+        self.point = self.text.len();
+    }
+
+    fn cut(&mut self, start: usize, end: usize) {
+        assert!(self.is_char_boundary(start));
+        assert!(self.is_char_boundary(end));
+        assert!(end >= start);
+
+        if end == start {
+            return;
+        }
+
+        let new_point = if self.point <= start {
+            self.point
+        } else if self.point <= end {
+            start
+        } else {
+            self.point + start - end
+        };
+
+        self.paste_buffer = self.text[start..end].to_owned();
+        self.text = self.text[..start].to_owned() + &self.text[end..];
+        self.point = new_point;
+    }
+
     fn handle_keypress(&mut self, key: OurKey) {
         match key {
             Left | Ctrl('B') => { self.backward(); },
@@ -221,8 +251,44 @@ fn test_insert() {
     assert_eq!(&ec.text, "Besźel");
     assert_eq!(ec.point, 6);
 
+    // But then moving backwards one character goes back over the
+    // combining char and the printing one before it
+    assert_eq!(ec.backward(), true);
+    assert_eq!(ec.point, 3);
+
     ec.paste_buffer = "PASTE".to_owned();
     ec.paste();
-    assert_eq!(&ec.text, "BesźPASTEel");
-    assert_eq!(ec.point, 11);
+    assert_eq!(&ec.text, "BesPASTEźel");
+    assert_eq!(ec.point, 8);
+}
+
+pub struct SingleLineEditor {
+    core: EditorCore,
+}
+
+impl SingleLineEditor {
+    pub fn new() -> Self {
+        SingleLineEditor {
+            core: EditorCore {
+                text: "".to_owned(),
+                point: 0,
+                paste_buffer: "".to_owned(),
+            },
+        }
+    }
+
+    fn cut_to_end(&mut self) {
+        self.core.cut(self.core.point, self.core.text.len());
+    }
+
+    pub fn handle_keypress(&mut self, key: OurKey) -> bool {
+        match key {
+            Ctrl('A') => { self.core.beginning_of_buffer(); },
+            Ctrl('E') => { self.core.end_of_buffer(); },
+            Ctrl('K') => { self.cut_to_end(); },
+            Return => { return true; },
+            _ => { self.core.handle_keypress(key); }
+        }
+        return false;
+    }
 }