chiark / gitweb /
Change my mind about how to extend backwards.
authorSimon Tatham <anakin@pobox.com>
Fri, 15 Dec 2023 12:25:47 +0000 (12:25 +0000)
committerSimon Tatham <anakin@pobox.com>
Fri, 15 Dec 2023 12:25:47 +0000 (12:25 +0000)
I think pressing [0] at the top of the file is better than double-[B].
Firstly, it's fewer keystrokes to do on purpose; secondly, it's not a
key you would have been repeating already. Now I can hold down [B]
safely to page up through the existing text, _and_ if I want to keep
extending backwards I can do it more easily than before.

cursesclient.py
text.py

index 83b4b54baea43ae6c68d0ff5cc20b9acd589608d..eae42f17554070551f64d65019f9114f5ff2cc28 100644 (file)
@@ -486,8 +486,6 @@ class File(Activity):
 
     def handle_key(self, ch):
         backward_keys = {'-', 'b', 'B', curses.KEY_PPAGE, curses.KEY_LEFT}
-        if not (self.mode == 'normal' and ch in backward_keys):
-            self.unprime()
 
         if self.mode == 'normal':
             if ch in {' ', curses.KEY_NPAGE, curses.KEY_RIGHT}:
@@ -583,8 +581,6 @@ class File(Activity):
             self.search_re is not None):
             self.search(self.search_direction, self.search_re)
 
-    def unprime(self):
-        pass # not supported
     def send_mode(self):
         pass # not supported
     def favourite_mode(self):
@@ -620,12 +616,21 @@ class ObjectFile(File):
         self.select_target = None
         self.old_display_state = None
         self.index_by_line = []
-        self.primed_to_extend = False
+
+    def top_line_pos(self):
+        return max(0, self.linepos - (self.cc.scr_h - 1))
+
+    def primed_to_extend(self):
+        if self.linepos is None:
+            return False # we haven't set up at all yet
+        if self.history_closed:
+            return False # we can't be primed to extend if we can't extend
+        return self.top_line_pos() == 0
 
     def iter_text_indexed(self):
         yield self.header, None
         if not self.history_closed:
-            yield text.ExtendableIndicator(self.primed_to_extend), None
+            yield text.ExtendableIndicator(self.primed_to_extend()), None
         for i in range(self.minpos, self.maxpos):
             for thing in self.statuses[i].text():
                 yield thing, i # FIXME: maybe just yield the last?
@@ -658,7 +663,8 @@ class ObjectFile(File):
 
         # If not that, and also nothing _else_ has changed, we don't
         # need to do anything at all.
-        display_state = (self.mode, self.select_target, self.primed_to_extend)
+        display_state = (self.mode, self.select_target,
+                         self.primed_to_extend())
         if not recompute_line and display_state == self.old_display_state:
             return
 
@@ -701,7 +707,7 @@ class ObjectFile(File):
 
     def render(self):
         self.regenerate_lines(self.cc.scr_w)
-        topline = max(0, self.linepos - (self.cc.scr_h - 1))
+        topline = self.top_line_pos()
         for y, line in enumerate(self.lines[topline:topline+self.cc.scr_h-1]):
             self.cc.print_at(y, 0, line)
 
@@ -887,23 +893,16 @@ class ObjectFile(File):
         return self.move_to(self.linepos + delta)
 
     def down_screen(self): return self.move_by(max(1, self.cc.scr_h - 3))
+    def up_screen(self): self.move_by(-max(1, self.cc.scr_h - 3))
     def down_line(self): return self.move_by(+1)
     def up_line(self): return self.move_by(-1)
-    def goto_top(self): return self.move_to(0)
+    def goto_top(self):
+        if self.primed_to_extend():
+            if self.feed.extend_past() is False: # None does not count
+                self.history_closed = True
+        return self.move_to(0)
     def goto_bottom(self): return self.move_to(len(self.lines))
 
-    def up_screen(self):
-        success = self.move_by(-max(1, self.cc.scr_h - 3))
-        if not success and not self.history_closed:
-            if not self.primed_to_extend:
-                self.primed_to_extend = True
-            else:
-                if self.feed.extend_past() is False: # None does not count
-                    self.history_closed = True
-                self.primed_to_extend = False
-    def unprime(self):
-        self.primed_to_extend = False
-
     def search(self, direction, re):
         pos = self.linepos - 1
         while True:
diff --git a/text.py b/text.py
index 1543124d54c4594737e5477e9e50aeacae7743ff..3135abddb6abd3c612987070c39ccea81280d317 100644 (file)
--- a/text.py
+++ b/text.py
@@ -247,10 +247,10 @@ class ExtendableIndicator:
 
     def render(self, width):
         if self.primed:
-            message = ColouredString("Press [B] once more to extend",
-                                     "HHHHHHHKHHHHHHHHHHHHHHHHHHHHH")
+            message = ColouredString("Press [0] to extend",
+                                     "HHHHHHHKHHHHHHHHHHH")
         else:
-            message = ColouredString("Press [B] twice to extend",
+            message = ColouredString("Press [0] twice to extend",
                                      "HHHHHHHKHHHHHHHHHHHHHHHHH")
         space = width - message.width
         lspace = space // 2 + 1