Posted to tcl by auriocus at Sat Dec 06 14:10:53 GMT 2014view pretty

--- tkcon.tcl	2014-12-06 13:39:41.000000000 +0100
+++ tkcon_patched.tcl	2014-12-06 15:07:30.000000000 +0100
@@ -2156,6 +2156,21 @@
     return [expr {[llength [$w tag ranges find]]/2}]
 }
 
+## ::tkcon::Goto - highlights a line in the text widget
+## If $str is empty, it just deletes any highlighting
+# ARGS: w	- text widget
+#	pos	- line to highlight
+##
+proc ::tkcon::Goto {w pos} {
+    $w tag remove gotopos 1.0 end
+    set truth {^(1|yes|true|on)$}
+    if {$pos eq ""} { return }
+
+    $w tag add gotopos ${pos}.0 ${pos}.end
+    $w tag configure gotopos -background $::tkcon::COLOR(blink)
+    catch {$w see gotopos.first}
+}
+
 ## ::tkcon::Attach - called to attach tkcon to an interpreter
 # ARGS:	name	- application name to which tkcon sends commands
 #		  This is either a slave interperter name or tk appname.
@@ -3105,6 +3120,26 @@
 		    {[list $OPT(edit) -attach $app -type proc -- $cmd]}"
 	}
     }
+    
+    # do voodoo for class methods, less vodoo than for procs
+    set info [$w get 1.0 end-1c]
+    # Check for specific line error in a proc
+    set exp(method) {\(class\s+"([^"]*)"\s+method\s+"([^"]*)"\s+line\s+(\d+)\)}
+    set positions [regexp -inline -all -indices $exp(method) $info]
+    set pieces [regexp -inline -all  $exp(method) $info]
+
+    foreach {all _ _ _} $positions {_ class method line} $pieces {
+	lassign $all start end
+	set tag [UniqueTag $w]
+	if {$end <= $start} { incr end }
+
+	$w tag add $tag 1.0+${start}c 1.0+${end}c
+	$w tag configure $tag -foreground $COLOR(stdout)
+	$w tag bind $tag <Enter> [list $w tag configure $tag -under 1]
+	$w tag bind $tag <Leave> [list $w tag configure $tag -under 0]
+	$w tag bind $tag <ButtonRelease-1> "if {!\$tk::Priv(mouseMoved)} \
+	    {[list $OPT(edit) -attach $app -type oomethod -goto $line -- [list $class $method]]}"
+    }
 }
 
 proc ::tkcon::ExpectInit {{termcap 1} {terminfo 1}} {
@@ -3847,10 +3882,11 @@
     variable ::tkcon::COLOR
     variable ::tkcon::OPT
 
-    array set opts {-find {} -type {} -attach {} -wrap {none}}
+    array set opts {-find {} -type {} -attach {} -wrap {none} -goto {}}
     while {[string match -* [lindex $args 0]]} {
 	switch -glob -- [lindex $args 0] {
 	    -f*	{ set opts(-find) [lindex $args 1] }
+	    -g*	{ set opts(-goto) [lindex $args 1] }
 	    -a*	{ set opts(-attach) [lindex $args 1] }
 	    -t*	{ set opts(-type) [lindex $args 1] }
 	    -w*	{ set opts(-wrap) [lindex $args 1] }
@@ -3970,6 +4006,14 @@
 		    [::tkcon::EvalOther $app $type dump proc [list $word]]
 	    after idle [::tkcon::Highlight $w.text tcl]
 	}
+	oomethod {
+	    # a method from TclOO
+	    $w.text insert 1.0 \
+		    [::tkcon::EvalOther $app $type dump oomethod [list $word]]
+	    after idle [::tkcon::Highlight $w.text tcl]
+
+	}
+
 	var*	{
 	    $w.text insert 1.0 \
 		    [::tkcon::EvalOther $app $type dump var [list $word]]
@@ -4001,6 +4045,10 @@
     if {[string compare $opts(-find) {}]} {
 	::tkcon::Find $w.text $opts(-find) -case 1
     }
+    if {[string compare $opts(-goto) {}]} {
+	# mark the line indicated by goto and place the cursor there
+	::tkcon::Goto $w.text $opts(-goto)	
+    }
 }
 interp alias {} ::more {} ::edit
 interp alias {} ::less {} ::edit
@@ -4212,6 +4260,15 @@
 		}
 	    }
 	}
+	oomethod {
+	    set classmethod [lindex $args 0 0]
+	    lassign $classmethod class method
+	    set code [catch {info class definition {*}$classmethod} res]
+	    if {!$code} {
+		set res "oo::define [list $class] [list $method] $res"
+	    }
+	}
+
 	w* {
 	    # widget
 	    ## The user should have Tk loaded