Patchwork D6178: crecord: new keys g & G to navigate to the top and bottom respectively

login
register
mail settings
Submitter phabricator
Date April 2, 2019, 5:35 p.m.
Message ID <b7fa45661fdbe06230f7bab16a5d093f@localhost.localdomain>
Download mbox | patch
Permalink /patch/39441/
State Not Applicable
Headers show

Comments

phabricator - April 2, 2019, 5:35 p.m.
arun updated this revision to Diff 14620.
arun edited the summary of this revision.
arun retitled this revision from "crecord: new keys g & G to navigate to the top and bottom hunks respectively" to "crecord: new keys g & G to navigate to the top and bottom respectively".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6178?vs=14615&id=14620

REVISION DETAIL
  https://phab.mercurial-scm.org/D6178

AFFECTED FILES
  mercurial/crecord.py

CHANGE DETAILS




To: arun, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/crecord.py b/mercurial/crecord.py
--- a/mercurial/crecord.py
+++ b/mercurial/crecord.py
@@ -1467,6 +1467,8 @@ 
         pgup/pgdn [K/J] : go to previous/next item of same type
  right/left-arrow [l/h] : go to child item / parent item
  shift-left-arrow   [H] : go to parent header / fold selected header
+                      g : go to the first hunk line
+                      G : go to the last hunk line
                       f : fold / unfold item, hiding/revealing its children
                       F : fold / unfold parent item and all of its ancestors
                  ctrl-l : scroll the selected line to the top of the screen
@@ -1505,6 +1507,45 @@ 
         self.stdscr.refresh()
         self.stdscr.keypad(1) # allow arrow-keys to continue to function
 
+    def handlefirstlineevent(self):
+        """
+        Handle 'g' to navigate to the top most file in the ncurses window.
+        """
+        self.currentselecteditem = self.headerlist[0]
+        currentitem = self.currentselecteditem
+        # select the parent item recursively until we're at a header
+        while True:
+            nextitem = currentitem.parentitem()
+            if nextitem is None:
+                break
+            else:
+                currentitem = nextitem
+
+        self.currentselecteditem = currentitem
+
+    def handlelastlineevent(self):
+        """
+        Handle 'G' to navigate to the bottom most file/hunk/line depending
+        on the whether the fold is active or not.
+
+        If the bottom most file is folded, it navigates to that file and stops there.
+        If the bottom most file is unfolded, it navigates to the bottom most hunk in
+        that file and stops there. If the bottom most hunk is unfolded, it navigates to
+        the bottom most line in that hunk.
+        """
+        currentitem = self.currentselecteditem
+        nextitem = currentitem.nextitem()
+        # select the child item recursively until we're at a footer
+        while nextitem is not None:
+            nextitem = currentitem.nextitem()
+            if nextitem is None:
+                break
+            else:
+                currentitem = nextitem
+
+        self.currentselecteditem = currentitem
+        self.recenterdisplayedarea()
+
     def confirmationwindow(self, windowtext):
         "display an informational window, then wait for and return a keypress."
 
@@ -1725,6 +1766,10 @@ 
             self.togglefolded(foldparent=True)
         elif keypressed in ["m"]:
             self.commitMessageWindow()
+        elif keypressed in ["g"]:
+            self.handlefirstlineevent()
+        elif keypressed in ["G"]:
+            self.handlelastlineevent()
         elif keypressed in ["?"]:
             self.helpwindow()
             self.stdscr.clear()