Hi Birger, On Sat, Aug 31, 2019 at 2:23 PM Birger Skogeng Pedersen <birger.sp@xxxxxxxxx> wrote: > > The user cannot change focus between the list of files, the diff view and > the commit message widgets without using the mouse (clicking either of > the four widgets ). that bugged me two, but never come up with a good idea. > > Hotkeys CTRL/CMD+number (1-4) now focuses a previously selected path from > either the "Unstaged Changes" or "Staged Changes", the diff view or the > commit message dialog widgets, respectively. This enables the user to > select/unselect files, view the diff and create a commit in git-gui > using keyboard-only. But I don't understand this in full. Does this mean pressing CTRL+1 or +2 does also changes the file selection? Why isn't it sufficient to just focus the respective file list widget? And than have bindings to change the selection? Bert > > Signed-off-by: Birger Skogeng Pedersen <birger.sp@xxxxxxxxx> > --- > git-gui/git-gui.sh | 57 +++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 56 insertions(+), 1 deletion(-) > > diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh > index 6de74ce639..cbd0b69804 100755 > --- a/git-gui/git-gui.sh > +++ b/git-gui/git-gui.sh > @@ -2494,7 +2494,7 @@ proc force_first_diff {after} { > > proc toggle_or_diff {mode w args} { > global file_states file_lists current_diff_path ui_index ui_workdir > - global last_clicked selected_paths > + global last_clicked selected_paths file_lists_last_clicked > > if {$mode eq "click"} { > foreach {x y} $args break > @@ -2551,6 +2551,8 @@ proc toggle_or_diff {mode w args} { > $ui_index tag remove in_sel 0.0 end > $ui_workdir tag remove in_sel 0.0 end > > + set file_lists_last_clicked($w) $lno > + > # Determine the state of the file > if {[info exists file_states($path)]} { > set state [lindex $file_states($path) 0] > @@ -2664,6 +2666,51 @@ proc show_less_context {} { > } > } > > +proc select_first_path {w} { > + global file_lists last_clicked selected_paths ui_workdir > + global file_lists_last_clicked > + > + set _list_length [llength $file_lists($w)] > + > + if {$_list_length > 0} { > + > + set _index $file_lists_last_clicked($w) > + > + if {$_index eq {}} { > + set _index 1 > + } elseif {$_index > $_list_length} { > + set _index $_list_length > + } > + > + focus $w > + set last_clicked [list $w $_index] > + set path [lindex $file_lists($w) [expr $_index - 1]] > + array unset selected_paths > + set selected_paths($path) 1 > + show_diff $path $w > + } > +} > + > +proc select_first_unstaged_changes_path {} { > + global ui_workdir > + select_first_path $ui_workdir > +} > + > +proc select_first_staged_changes_path {} { > + global ui_index > + select_first_path $ui_index > +} > + > +proc focus_diff {} { > + global ui_diff > + focus $ui_diff > +} > + > +proc focus_commit_message {} { > + global ui_comm > + focus $ui_comm > +} > + > ###################################################################### > ## > ## ui construction > @@ -3877,6 +3924,14 @@ foreach i [list $ui_index $ui_workdir] { > } > unset i > > +bind . <$M1B-Key-1> {select_first_unstaged_changes_path} > +bind . <$M1B-Key-2> {select_first_staged_changes_path} > +bind . <$M1B-Key-3> {focus_diff} > +bind . <$M1B-Key-4> {focus_commit_message} > + > +set file_lists_last_clicked($ui_index) {} > +set file_lists_last_clicked($ui_workdir) {} > + > set file_lists($ui_index) [list] > set file_lists($ui_workdir) [list] > > -- > 2.23.0.37.g745f681289 >