]> git.neil.brown.name Git - edlib.git/commitdiff
compose-email: don't intercept doc:char
authorNeilBrown <neil@brown.name>
Fri, 26 May 2023 23:22:43 +0000 (09:22 +1000)
committerNeilBrown <neil@brown.name>
Fri, 26 May 2023 23:24:29 +0000 (09:24 +1000)
We only intercept doc:char to make the headers intangible.
Instead, catch mark:moving and keep point away from these.

Signed-off-by: NeilBrown <neil@brown.name>
DOC/TODO.md
python/lib-compose-email.py

index 152f4db716d56200de14762e772eec1bf60e8ed0..3db286bfd38d5dba5a4de5c244db3219bea6b9f4 100644 (file)
@@ -77,7 +77,7 @@ Bugs to be fixed
 - [ ] lang-python should put each mode in a separate module
       Maybe PyImport_ExecCodeModuleEx() after reading and compile()ing
       the source file.  Or set up path to find edlib modules.
-- [ ] redefining doc:char but not doc:content in mail-compose causes
+- [X] redefining doc:char but not doc:content in mail-compose causes
       search to get confused.  What should we do?
       Don't redefine doc:char.  Enable mark-moving notification on point
       and on 'refresh' move to appropriate end of a marker if on one
index 0ca8234bcbe57d82b89204efef06f2b4d6281b84..e04cdc90a8c86f5db10eed3d3dfd6984e4124e87 100644 (file)
@@ -63,6 +63,12 @@ class compose_email(edlib.Pane):
             if not self.find_empty_header(m):
                 self.to_body(m)
 
+        # track point movement so it can be moved out of a marker
+        self.point = focus.call("doc:point", ret='mark')
+        self.prev_point = None
+        self.have_prev = False
+        self.call("doc:request:mark:moving")
+
     def add_headers_new(self, key, focus, **a):
         "handle:compose-email:empty-headers"
         fr = focus['email:from']
@@ -446,89 +452,32 @@ class compose_email(edlib.Pane):
             m.step(0)
         return edlib.Efallthrough
 
-    def handle_doc_char(self, key, focus, mark, num, num2, mark2, **a):
-        "handle:doc:char"
-        if not mark:
-            return edlib.Enoarg
-        end = mark2
-        steps = num
-        forward = 1 if steps > 0 else 0
-        if end and end == mark:
-            return 1
-        if end and (end < mark) != (steps < 0):
-            # can never cross 'end'
-            return edlib.Einval
-        ret = edlib.Einval
-        while steps and ret != edlib.WEOF and (not end or mark == end):
-            ret = self.handle_doc_step(key, mark, forward, 1)
-            steps -= forward * 2 - 1
-        if end:
-            return 1 + (num - steps if forward else steps - num)
-        if ret == edlib.WEOF or num2 == 0:
-            return ret
-        if num and (num2 < 0) == (num > 0):
-            return ret
-        # want the next character
-        return self.handle_doc_step(key, mark, 1 if num2 > 0 else 0, 0)
+    def handle_moving(self, key, focus, mark, mark2, **a):
+        "handle:mark:moving"
+        if mark == self.point and not self.have_prev:
+            # We cannot dup because that triggers a recursive notification
+            #self.prev_point = mark.dup()
+            self.prev_point = self.vmark_at_or_before(self.view, mark)
+            self.have_prev = True
+            self.damaged(edlib.DAMAGED_VIEW)
+        return 1
 
-    def handle_doc_step(self, key, mark, num, num2):
-        # if in a marker, only allow a space and newline to be seen
-        if not mark:
-            return edlib.Enoarg
-        m = self.vmark_at_or_before(self.view, mark)
-        if m:
-            if m['compose-type'] and m.next() == m:
-                # undo must have destroyed the region
-                m2 = m.next()
-                m.release()
-                m2.release()
-                return edlib.WEOF
-            if not m['compose-type'] and m.prev() == m:
-                m2 = m.prev()
-                m.release()
-                m2.release()
-                return edlib.WEOF
-        if mark == m:
-            if m['compose-type']:
-                # at start of marker
-                if num > 0:
-                    # forward
-                    if num2:
-                        self.parent.call("doc:EOL", 1, mark)
-                    return ' '
-                else:
-                    # backward
-                    return self.parent.call("doc:char", mark,
-                                            -1 if num2 else 0, 0 if num2 else -1)
-            else:
-                # at end of marker
-                if num > 0:
-                    return self.parent.call("doc:char", mark,
-                                            1 if num2 else 0, 0 if num2 else 1)
-                else:
-                    return self.parent.call("doc:char", mark,
-                                            -1 if num2 else 0, 0 if num2 else -1)
-        if not m or not m['compose-type']:
-            # not in a marker
-            if num > 0:
-                return self.parent.call("doc:char", mark,
-                                        1 if num2 else 0, 0 if num2 else 1)
-            else:
-                return self.parent.call("doc:char", mark,
-                                        -1 if num2 else 0, 0 if num2 else -1)
-
-        # should be just before newline
-        if num > 0:
-            #forward, return newline
-            if num2:
-                self.parent.call("doc:EOL", 1, mark)
-                self.parent.next(mark)
-            return '\n'
-        else:
-            # backward, return space
-            if num2:
-                self.parent.call("doc:EOL", -1, mark)
-            return ' '
+    def handle_review(self, key, focus, **a):
+        "handle:Refresh:view"
+        # if point is in a "header" move it to start or end
+        # opposite prev_point
+        if not self.have_prev:
+            return 1
+        m = self.vmark_at_or_before(self.view, self.point)
+        if m and m != self.point and m['compose-type']:
+            if not self.prev_point or self.prev_point < self.point:
+                # moving toward end of file
+                m = m.next()
+            if self.point != m:
+                self.point.to_mark(m)
+        self.prev_point = None
+        self.have_prev = False
+        return 1
 
     def handle_doc_get_attr(self, key, focus, mark, str, comm2, **a):
         "handle:doc:get-attr"