Patchwork [v4] crecord: add an event that scrolls the selected line to the top of the screen

login
register
mail settings
Submitter Nathan Goldbaum
Date Sept. 19, 2016, 10:23 p.m.
Message ID <94afc22065e475ab1a61.1474323813@ROUS2>
Download mbox | patch
Permalink /patch/16676/
State Superseded
Headers show

Comments

Nathan Goldbaum - Sept. 19, 2016, 10:23 p.m.
# HG changeset patch
# User Nathan Goldbaum <ngoldbau@illinois.edu>
# Date 1474321033 18000
#      Mon Sep 19 16:37:13 2016 -0500
# Node ID 94afc22065e475ab1a61f68012be44f6dbbd0d64
# Parent  285a8c3e53f2183438f0cdbc238e4ab851d0d110
crecord: add an event that scrolls the selected line to the top of the screen

Using ctrl-l for this purpose seems to be a fairly widely used practice,
presumably following emacs. This doesn't scroll the selected line all
the way to the top of the window, instead it leaves a 3 line buffer for
context. Use curses.unctrl() to resolve keypressed to '^L' to avoid
hard-coding hexadecimal key codes.
Pierre-Yves David - Sept. 20, 2016, 2:01 p.m.
On 09/20/2016 12:23 AM, Nathan Goldbaum wrote:
> # HG changeset patch
> # User Nathan Goldbaum <ngoldbau@illinois.edu>
> # Date 1474321033 18000
> #      Mon Sep 19 16:37:13 2016 -0500
> # Node ID 94afc22065e475ab1a61f68012be44f6dbbd0d64
> # Parent  285a8c3e53f2183438f0cdbc238e4ab851d0d110
> crecord: add an event that scrolls the selected line to the top of the screen
>
> Using ctrl-l for this purpose seems to be a fairly widely used practice,
> presumably following emacs. This doesn't scroll the selected line all
> the way to the top of the window, instead it leaves a 3 line buffer for
> context. Use curses.unctrl() to resolve keypressed to '^L' to avoid
> hard-coding hexadecimal key codes.
>
> diff -r 285a8c3e53f2 -r 94afc22065e4 mercurial/crecord.py
> --- a/mercurial/crecord.py	Tue May 03 13:36:12 2016 +0900
> +++ b/mercurial/crecord.py	Mon Sep 19 16:37:13 2016 -0500
> @@ -715,6 +715,10 @@ class curseschunkselector(object):
>
>          self.currentselecteditem = currentitem
>
> +    def topscroll(self):
> +        "scroll so the currently selected line is at the top of the screen"
> +        self.scrolllines(self.selecteditemstartline)
> +
>      def updatescroll(self):
>          "scroll the screen to fully show the currently-selected"
>          selstart = self.selecteditemstartline
> @@ -1338,6 +1342,7 @@ the following are valid keystrokes:
>   shift-left-arrow   [H] : go to parent header / fold selected header
>                        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
>                        m : edit / resume editing the commit message
>                        e : edit the currently selected hunk
>                        a : toggle amend mode, only with commit -i
> @@ -1582,6 +1587,8 @@ are you sure you want to review/edit and
>              self.helpwindow()
>              self.stdscr.clear()
>              self.stdscr.refresh()
> +        elif curses.unctrl(keypressed) in ["^L"]:
> +            self.topscroll()

any reason why we use 'in' instead of "==" here?

Also, I'm not sure if the 'topscroll' method is that useful as it a 
one-liner. Should just call that code in the if clause?

Cheers,
Nathan Goldbaum - Sept. 20, 2016, 2:26 p.m.
On Tuesday, September 20, 2016, Pierre-Yves David <
pierre-yves.david@ens-lyon.org> wrote:

>
>
> On 09/20/2016 12:23 AM, Nathan Goldbaum wrote:
>
>> # HG changeset patch
>> # User Nathan Goldbaum <ngoldbau@illinois.edu>
>> # Date 1474321033 18000
>> #      Mon Sep 19 16:37:13 2016 -0500
>> # Node ID 94afc22065e475ab1a61f68012be44f6dbbd0d64
>> # Parent  285a8c3e53f2183438f0cdbc238e4ab851d0d110
>> crecord: add an event that scrolls the selected line to the top of the
>> screen
>>
>> Using ctrl-l for this purpose seems to be a fairly widely used practice,
>> presumably following emacs. This doesn't scroll the selected line all
>> the way to the top of the window, instead it leaves a 3 line buffer for
>> context. Use curses.unctrl() to resolve keypressed to '^L' to avoid
>> hard-coding hexadecimal key codes.
>>
>> diff -r 285a8c3e53f2 -r 94afc22065e4 mercurial/crecord.py
>> --- a/mercurial/crecord.py      Tue May 03 13:36:12 2016 +0900
>> +++ b/mercurial/crecord.py      Mon Sep 19 16:37:13 2016 -0500
>> @@ -715,6 +715,10 @@ class curseschunkselector(object):
>>
>>          self.currentselecteditem = currentitem
>>
>> +    def topscroll(self):
>> +        "scroll so the currently selected line is at the top of the
>> screen"
>> +        self.scrolllines(self.selecteditemstartline)
>> +
>>      def updatescroll(self):
>>          "scroll the screen to fully show the currently-selected"
>>          selstart = self.selecteditemstartline
>> @@ -1338,6 +1342,7 @@ the following are valid keystrokes:
>>   shift-left-arrow   [H] : go to parent header / fold selected header
>>                        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
>>                        m : edit / resume editing the commit message
>>                        e : edit the currently selected hunk
>>                        a : toggle amend mode, only with commit -i
>> @@ -1582,6 +1587,8 @@ are you sure you want to review/edit and
>>              self.helpwindow()
>>              self.stdscr.clear()
>>              self.stdscr.refresh()
>> +        elif curses.unctrl(keypressed) in ["^L"]:
>> +            self.topscroll()
>>
>
> any reason why we use 'in' instead of "==" here?


Following the other branches of the if/elif block in this function.


>
> Also, I'm not sure if the 'topscroll' method is that useful as it a
> one-liner. Should just call that code in the if clause?


Sure, I can send a v5


>
> Cheers,
>
> --
> Pierre-Yves David
>

Patch

diff -r 285a8c3e53f2 -r 94afc22065e4 mercurial/crecord.py
--- a/mercurial/crecord.py	Tue May 03 13:36:12 2016 +0900
+++ b/mercurial/crecord.py	Mon Sep 19 16:37:13 2016 -0500
@@ -715,6 +715,10 @@  class curseschunkselector(object):
 
         self.currentselecteditem = currentitem
 
+    def topscroll(self):
+        "scroll so the currently selected line is at the top of the screen"
+        self.scrolllines(self.selecteditemstartline)
+
     def updatescroll(self):
         "scroll the screen to fully show the currently-selected"
         selstart = self.selecteditemstartline
@@ -1338,6 +1342,7 @@  the following are valid keystrokes:
  shift-left-arrow   [H] : go to parent header / fold selected header
                       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
                       m : edit / resume editing the commit message
                       e : edit the currently selected hunk
                       a : toggle amend mode, only with commit -i
@@ -1582,6 +1587,8 @@  are you sure you want to review/edit and
             self.helpwindow()
             self.stdscr.clear()
             self.stdscr.refresh()
+        elif curses.unctrl(keypressed) in ["^L"]:
+            self.topscroll()
 
     def main(self, stdscr):
         """