proc find {w what tag _status} { upvar #0 $_status status foreach {from to} [$w tag ranges $tag] { $w tag remove $tag $from $to } set pos [$w search -count n -- $what insert+2c] if {$pos eq ""} { set status "not found: $what" } else { set status "found at $pos: $what" $w mark set insert $pos $w see $pos $w tag add $tag $pos $pos+${n}c } }
JOB - 2018-03-05The following procedure searches for all instances of a given search string all in one go. Note: the function was copied over from the tk widget demo and slightly adopted to have the same interface as the above function.
proc findall {w what tag _status} { upvar #0 $_status status $w tag remove $tag 0.0 end if {$what == ""} { set status "" return } set cnt 0 set cur 0.0 while 1 { set cur [$w search -count length -- $what $cur end] if {$cur == ""} { break } $w tag add $tag $cur "$cur + $length char" set cur [$w index "$cur + $length char"] incr cnt } if {$cnt == 0} { set status "no search result for: $what" } else { set status "search result: $cnt item(s) selected" } }Demo with an entry for the search term, a text, and a label for the status string:
package require Tk pack [entry .e -textvariable Find] -fill x bind .e <Return> {find .t $Find hilite state} pack [text .t -wrap word] -fill both -expand true .t tag configure hilite -background orange pack [label .l -textvariable state] -anchor w # fill text widget with some content set fp [open [info script] "r"] .t insert 0.0 [read $fp] close $fp # run the search.. set Find "proc" findall .t $Find hilite state
WJG(05/03/18) The Gnocl text widget has search command. e.g.
gnocl::window -child [gnocl::text -name TEXT -wrapMode word] TEXT verse ;# insert some default text TEXT tag create found -background yellow set ranges [TEXT search remember -tags found]Apart from the words being tagged in the buffer, the command returns a list of the ranges occupied by the search string.
See also Simple search and replaceSee also Incremental GUI text search