From 1159971baa28ed3a9934cf92f4b22e9d0681bdce Mon Sep 17 00:00:00 2001 From: Bert Wesarg Date: Fri, 14 Oct 2011 10:14:52 +0200 Subject: [PATCH] git-gui: add search history to searchbar Use the up/down keys to browse the history. Signed-off-by: Bert Wesarg Signed-off-by: Pat Thoyts --- lib/search.tcl | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/lib/search.tcl b/lib/search.tcl index 9268ec325b..15f99d8e5f 100644 --- a/lib/search.tcl +++ b/lib/search.tcl @@ -13,6 +13,9 @@ field casesensitive field default_casesensitive field searchdirn -forwards +field history +field history_index + field smarktop field smarkbot @@ -28,6 +31,8 @@ constructor new {i_w i_text args} { set default_casesensitive 1 } + set history [list] + ${NS}::frame $w ${NS}::label $w.l -text [mc Find:] entry $w.ent -textvariable ${__this}::searchstring -background lightgreen @@ -50,6 +55,8 @@ constructor new {i_w i_text args} { trace add variable searchstring write [cb _incrsearch_cb] bind $w.ent [cb find_next] bind $w.ent [cb find_prev] + bind $w.ent [cb _prev_search] + bind $w.ent [cb _next_search] bind $w [list delete_this $this] return $this @@ -58,8 +65,10 @@ constructor new {i_w i_text args} { method show {} { if {![visible $this]} { grid $w + $w.ent delete 0 end set regexpsearch $default_regexpsearch set casesensitive $default_casesensitive + set history_index [llength $history] } focus -force $w.ent } @@ -68,6 +77,7 @@ method hide {} { if {[visible $this]} { focus $ctext grid remove $w + _save_search $this } } @@ -160,6 +170,55 @@ method _incrsearch {} { } } +method _save_search {} { + if {$searchstring eq {}} { + return + } + if {[llength $history] > 0} { + foreach {s_regexp s_case s_expr} [lindex $history end] break + } else { + set s_regexp $regexpsearch + set s_case $casesensitive + set s_expr "" + } + if {$searchstring eq $s_expr} { + # update modes + set history [lreplace $history end end \ + [list $regexpsearch $casesensitive $searchstring]] + } else { + lappend history [list $regexpsearch $casesensitive $searchstring] + } + set history_index [llength $history] +} + +method _prev_search {} { + if {$history_index > 0} { + incr history_index -1 + foreach {s_regexp s_case s_expr} [lindex $history $history_index] break + $w.ent delete 0 end + $w.ent insert 0 $s_expr + set regexpsearch $s_regexp + set casesensitive $s_case + } +} + +method _next_search {} { + if {$history_index < [llength $history]} { + incr history_index + } + if {$history_index < [llength $history]} { + foreach {s_regexp s_case s_expr} [lindex $history $history_index] break + } else { + set s_regexp $default_regexpsearch + set s_case $default_casesensitive + set s_expr "" + } + $w.ent delete 0 end + $w.ent insert 0 $s_expr + set regexpsearch $s_regexp + set casesensitive $s_case +} + method find_prev {} { find_next $this -backwards } @@ -170,6 +229,7 @@ method find_next {{dir -forwards}} { set searchdirn $dir $ctext mark unset anchor if {$searchstring ne {}} { + _save_search $this set start [_get_new_anchor $this] if {$dir eq "-forwards"} { set start "$start + 1c" -- 2.11.4.GIT