diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2019-01-08 20:15:33 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2019-01-08 20:15:33 (GMT) |
commit | 38d941c01b73c1d0611976e4cb9d361592ff30bd (patch) | |
tree | 18dc8ae526baafc21c4200c29979434b64898fca /tkcon/extra/stripped.tcl | |
parent | 4750a6186365f1457eea083102108b8c2a4d5936 (diff) | |
download | blt-38d941c01b73c1d0611976e4cb9d361592ff30bd.zip blt-38d941c01b73c1d0611976e4cb9d361592ff30bd.tar.gz blt-38d941c01b73c1d0611976e4cb9d361592ff30bd.tar.bz2 |
update TEA 3.13
Diffstat (limited to 'tkcon/extra/stripped.tcl')
-rwxr-xr-x | tkcon/extra/stripped.tcl | 1083 |
1 files changed, 0 insertions, 1083 deletions
diff --git a/tkcon/extra/stripped.tcl b/tkcon/extra/stripped.tcl deleted file mode 100755 index 64ef1f5..0000000 --- a/tkcon/extra/stripped.tcl +++ /dev/null @@ -1,1083 +0,0 @@ -#!/bin/sh -# \ -exec wish4.1 "$0" ${1+"$@"} - -# -## stripped.tcl -## Stripped down version of Tk Console Widget, part of the VerTcl system -## Stripped to work with Netscape Tk Plugin. -## -## Copyright (c) 1995,1996 by Jeffrey Hobbs -## jhobbs@cs.uoregon.edu, http://www.cs.uoregon.edu/~jhobbs/ -## source standard_disclaimer.tcl - -if {[info tclversion] < 7.5} { - error "TkCon requires at least the stable version of tcl7.5/tk4.1" -} - -## tkConInit - inits tkCon -# ARGS: root - widget pathname of the tkCon console root -# title - title for the console root and main (.) windows -# Calls: tkConInitUI -# Outputs: errors found in tkCon resource file -## -proc tkConInit {{title Main}} { - global tkCon tcl_platform env auto_path tcl_interactive - - set tcl_interactive 1 - - array set tkCon { - color,blink yellow - color,proc darkgreen - color,prompt brown - color,stdin black - color,stdout blue - color,stderr red - - blinktime 500 - font fixed - lightbrace 1 - lightcmd 1 - prompt1 {[history nextid] % } - prompt2 {[history nextid] cont > } - showmultiple 1 - slavescript {} - - cmd {} cmdbuf {} cmdsave {} event 1 svnt 1 cols 80 rows 24 - - version {0.5x Stripped} - base .console - } - - if [string comp $tcl_platform(platform) unix] { - array set tkCon { - font {Courier 12 {}} - } - } - - tkConInitUI $title - - interp alias {} clean {} tkConStateRevert tkCon - tkConStateCheckpoint tkCon -} - -## tkConInitUI - inits UI portion (console) of tkCon -## Creates all elements of the console window and sets up the text tags -# ARGS: title - title for the console root and main (.) windows -# Calls: tkConInitMenus, tkConPrompt -## -proc tkConInitUI {title} { - global tkCon - - set root $tkCon(base) - if [string match $root .] { set w {} } else { set w [frame $root] } - - set tkCon(console) [text $w.text -font $tkCon(font) -wrap char \ - -yscrollcommand "$w.sy set" -setgrid 1 -foreground $tkCon(color,stdin)] - bindtags $w.text "$w.text PreCon Console PostCon $root all" - set tkCon(scrolly) [scrollbar $w.sy \ - -command "$w.text yview" -takefocus 0 -bd 1] - - pack $w.sy -side left -fill y - set tkCon(scrollypos) left - pack $w.text -fill both -expand 1 - - $w.text insert insert "$title console display active\n" stdout - tkConPrompt $w.text - - foreach col {prompt stdout stderr stdin proc} { - $w.text tag configure $col -foreground $tkCon(color,$col) - } - $w.text tag configure blink -background $tkCon(color,blink) - - pack $root -fill both -expand 1 - focus $w.text -} - -## tkConEval - evaluates commands input into console window -## This is the first stage of the evaluating commands in the console. -## They need to be broken up into consituent commands (by tkConCmdSep) in -## case a multiple commands were pasted in, then each is eval'ed (by -## tkConEvalCmd) in turn. Any uncompleted command will not be eval'ed. -# ARGS: w - console text widget -# Calls: tkConCmdGet, tkConCmdSep, tkConEvalCmd -## -proc tkConEval {w} { - global tkCon - tkConCmdSep [tkConCmdGet $w] cmds tkCon(cmd) - $w mark set insert end-1c - $w insert end \n - if [llength $cmds] { - foreach cmd $cmds {tkConEvalCmd $w $cmd} - $w insert insert $tkCon(cmd) {} - } elseif {[info complete $tkCon(cmd)] && ![regexp {[^\\]\\$} $tkCon(cmd)]} { - tkConEvalCmd $w $tkCon(cmd) - } - $w see insert -} - -## tkConEvalCmd - evaluates a single command, adding it to history -# ARGS: w - console text widget -# cmd - the command to evaluate -# Calls: tkConPrompt -# Outputs: result of command to stdout (or stderr if error occured) -# Returns: next event number -## -proc tkConEvalCmd {w cmd} { - global tkCon - $w mark set output end - if [catch {uplevel \#0 history add [list $cmd] exec} result] { - $w insert output $result\n stderr - } elseif [string comp {} $result] { - $w insert output $result\n stdout - } - tkConPrompt $w - set tkCon(svnt) [set tkCon(event) [history nextid]] -} - -## tkConCmdGet - gets the current command from the console widget -# ARGS: w - console text widget -# Returns: text which compromises current command line -## -proc tkConCmdGet w { - if [string match {} [set ix [$w tag nextrange prompt limit end]]] { - $w tag add stdin limit end-1c - return [$w get limit end-1c] - } -} - -## tkConCmdSep - separates multiple commands into a list and remainder -# ARGS: cmd - (possible) multiple command to separate -# list - varname for the list of commands that were separated. -# rmd - varname of any remainder (like an incomplete final command). -# If there is only one command, it's placed in this var. -# Returns: constituent command info in varnames specified by list & rmd. -## -proc tkConCmdSep {cmd ls rmd} { - upvar $ls cmds $rmd tmp - set tmp {} - set cmds {} - foreach cmd [split [set cmd] \n] { - if [string comp {} $tmp] { - append tmp \n$cmd - } else { - append tmp $cmd - } - if {[info complete $tmp] && ![regexp {[^\\]\\$} $tmp]} { - lappend cmds $tmp - set tmp {} - } - } - if {[string comp {} [lindex $cmds end]] && [string match {} $tmp]} { - set tmp [lindex $cmds end] - set cmds [lreplace $cmds end end] - } -} - -## tkConPrompt - displays the prompt in the console widget -# ARGS: w - console text widget -# Outputs: prompt (specified in tkCon(prompt1)) to console -## -proc tkConPrompt w { - global tkCon env - set i [$w index end-1c] - $w insert end [subst $tkCon(prompt1)] prompt - $w mark set output $i - $w mark set limit insert - $w mark gravity limit left -} - -## tkConStateCheckpoint - checkpoints the current state of the system -## This allows you to return to this state with tkConStateRevert -# ARGS: ary an array into which several elements are stored: -# commands - the currently defined commands -# variables - the current global vars -# This is the array you would pass to tkConRevertState -## -proc tkConStateCheckpoint {ary} { - global tkCon - upvar $ary a - set a(commands) [uplevel \#0 info commands *] - set a(variables) [uplevel \#0 info vars *] - return -} - -## tkConStateCompare - compare two states and output difference -# ARGS: ary1 an array with checkpointed state -# ary2 a second array with checkpointed state -# Outputs: -## -proc tkConStateCompare {ary1 ary2} { - upvar $ary1 a1 $ary2 a2 - puts "Commands unique to $ary1:\n[lremove $a1(commands) $a2(commands)]" - puts "Commands unique to $ary2:\n[lremove $a2(commands) $a1(commands)]" - puts "Variables unique to $ary1:\n[lremove $a1(variables) $a2(variables)]" - puts "Variables unique to $ary2:\n[lremove $a2(variables) $a1(variables)]" -} - -## tkConStateRevert - reverts interpreter to a previous state -# ARGS: ary an array with checkpointed state -## -proc tkConStateRevert {ary} { - upvar $ary a - tkConStateCheckpoint tmp - foreach i [lremove $tmp(commands) $a(commands)] { catch "rename $i {}" } - foreach i [lremove $tmp(variables) $a(variables)] { uplevel \#0 unset $i } -} - -## -## Some procedures to make up for lack of built-in shell commands -## - -## puts -## This allows me to capture all stdout/stderr to the console window -# ARGS: same as usual -# Outputs: the string with a color-coded text tag -## -catch {rename puts tcl_puts} -proc puts args { - set len [llength $args] - if {$len==1} { - eval tkcon console insert output $args stdout {\n} stdout - tkcon console see output - } elseif {$len==2 && - [regexp {(stdout|stderr|-nonewline)} [lindex $args 0] junk tmp]} { - if [string comp $tmp -nonewline] { - eval tkcon console insert output [lreplace $args 0 0] $tmp {\n} $tmp - } else { - eval tkcon console insert output [lreplace $args 0 0] stdout - } - tkcon console see output - } elseif {$len==3 && - [regexp {(stdout|stderr)} [lreplace $args 2 2] junk tmp]} { - if [string comp [lreplace $args 1 2] -nonewline] { - eval tkcon console insert output [lrange $args 1 1] $tmp - } else { - eval tkcon console insert output [lreplace $args 0 1] $tmp - } - tkcon console see output - } else { - eval tcl_puts $args - } -} - -## alias - akin to the csh alias command -## If called with no args, then it prints out all current aliases -## If called with one arg, returns the alias of that arg (or {} if none) -# ARGS: newcmd - (optional) command to bind alias to -# args - command and args being aliased -## -proc alias {{newcmd {}} args} { - if [string match $newcmd {}] { - set res {} - foreach a [interp aliases] { - lappend res [list $a: [interp alias {} $a]] - } - return [join $res \n] - } elseif {[string match {} $args]} { - interp alias {} $newcmd - } else { - eval interp alias {{}} $newcmd {{}} $args - } -} - -## unalias - unaliases an alias'ed command -# ARGS: cmd - command to unbind as an alias -## -proc unalias {cmd} { - interp alias {} $cmd {} -} - -## tkcon - command that allows control over the console -# ARGS: totally variable, see internal comments -## -proc tkcon {args} { - global tkCon - switch -- [lindex $args 0] { - clean { - ## 'cleans' the interpreter - reverting to original tkCon state - tkConStateRevert tkCon - } - console { - ## Passes the args to the text widget of the console. - eval $tkCon(console) [lreplace $args 0 0] - } - font { - ## "tkcon font ?fontname?". Sets the font of the console - if [string comp {} [lindex $args 1]] { - return [$tkCon(console) config -font [lindex $args 1]] - } else { - return [$tkCon(console) config -font] - } - } - version { - return $tkCon(version) - } - default { - ## tries to determine if the command exists, otherwise throws error - set cmd [lindex $args 0] - set cmd tkCon[string toup [string index $cmd 0]][string range $cmd 1 end] - if [string match $cmd [info command $cmd]] { - eval $cmd [lreplace $args 0 0] - } else { - error "bad option \"[lindex $args 0]\": must be attach,\ - clean, console, font" - } - } - } -} - -## clear - clears the buffer of the console (not the history though) -## This is executed in the parent interpreter -## -proc clear {{pcnt 100}} { - if {![regexp {^[0-9]*$} $pcnt] || $pcnt < 1 || $pcnt > 100} { - error "invalid percentage to clear: must be 1-100 (100 default)" - } elseif {$pcnt == 100} { - tkcon console delete 1.0 end - } else { - set tmp [expr $pcnt/100.0*[tkcon console index end]] - tkcon console delete 1.0 "$tmp linestart" - } -} - -## dump - outputs variables/procedure/widget info in source'able form. -## Accepts glob style pattern matching for the names -# ARGS: type - type of thing to dump: must be variable, procedure, widget -# OPTS: -nocomplain don't complain if no vars match something -# Returns: the values of the variables in a 'source'able form -## -proc dump {type args} { - set whine 1 - set code ok - if [string match \-n* [lindex $args 0]] { - set whine 0 - set args [lreplace $args 0 0] - } - if {$whine && [string match {} $args]} { - error "wrong \# args: [lindex [info level 0] 0] ?-nocomplain? pattern ?pattern ...?" - } - set res {} - switch -glob -- $type { - v* { - # variable - # outputs variables value(s), whether array or simple. - foreach arg $args { - if {[string match {} [set vars [uplevel info vars [list $arg]]]]} { - if {[uplevel info exists $arg]} { - set vars $arg - } elseif $whine { - append res "\#\# No known variable $arg\n" - set code error - continue - } else continue - } - foreach var [lsort $vars] { - upvar $var v - if {[array exists v]} { - append res "array set $var \{\n" - foreach i [lsort [array names v]] { - upvar 0 v\($i\) w - if {[array exists w]} { - append res " [list $i {NESTED VAR ERROR}]\n" - if $whine { set code error } - } else { - append res " [list $i $v($i)]\n" - } - } - append res "\}\n" - } else { - append res [list set $var $v]\n - } - } - } - } - p* { - # procedure - foreach arg $args { - if {[string comp {} [set ps [info proc $arg]]]} { - foreach p [lsort $ps] { - set as {} - foreach a [info args $p] { - if {[info default $p $a tmp]} { - lappend as [list $a $tmp] - } else { - lappend as $a - } - } - append res [list proc $p $as [info body $p]]\n - } - } elseif $whine { - append res "\#\# No known proc $arg\n" - } - } - } - w* { - # widget - } - default { - return -code error "bad [lindex [info level 0] 0] option\ - \"[lindex $args 0]\":\ must be procedure, variable, widget" - } - } - return -code $code [string trimr $res \n] -} - -## which - tells you where a command is found -# ARGS: cmd - command name -# Returns: where command is found (internal / external / unknown) -## -proc which cmd { - if [string comp {} [info commands $cmd]] { - if {[lsearch -exact [interp aliases] $cmd] > -1} { - return "$cmd:\taliased to [alias $cmd]" - } elseif [string comp {} [info procs $cmd]] { - return "$cmd:\tinternal proc" - } else { - return "$cmd:\tinternal command" - } - } else { - return "$cmd:\tunknown command" - } -} - -## lremove - remove items from a list -# OPTS: -all remove all instances of each item -# ARGS: l a list to remove items from -# is a list of items to remove -## -proc lremove {args} { - set all 0 - if [string match \-a* [lindex $args 0]] { - set all 1 - set args [lreplace $args 0 0] - } - set l [lindex $args 0] - eval append is [lreplace $args 0 0] - foreach i $is { - if {[set ix [lsearch -exact $l $i]] == -1} continue - set l [lreplace $l $ix $ix] - if $all { - while {[set ix [lsearch -exact $l $i]] != -1} { - set l [lreplace $l $i $i] - } - } - } - return $l -} - - -## Unknown changed to get output into tkCon window -## See $tcl_library/init.tcl for an explanation -## -proc unknown args { - global auto_noexec auto_noload env unknown_pending tcl_interactive tkCon - global errorCode errorInfo - - # Save the values of errorCode and errorInfo variables, since they - # may get modified if caught errors occur below. The variables will - # be restored just before re-executing the missing command. - - set savedErrorCode $errorCode - set savedErrorInfo $errorInfo - set name [lindex $args 0] - if ![info exists auto_noload] { - # - # Make sure we're not trying to load the same proc twice. - # - if [info exists unknown_pending($name)] { - unset unknown_pending($name) - if {[array size unknown_pending] == 0} { - unset unknown_pending - } - return -code error "self-referential recursion in \"unknown\" for command \"$name\""; - } - set unknown_pending($name) pending; - set ret [catch {auto_load $name} msg] - unset unknown_pending($name); - if {$ret != 0} { - return -code $ret -errorcode $errorCode \ - "error while autoloading \"$name\": $msg" - } - if ![array size unknown_pending] { - unset unknown_pending - } - if $msg { - set errorCode $savedErrorCode - set errorInfo $savedErrorInfo - set code [catch {uplevel $args} msg] - if {$code == 1} { - # - # Strip the last five lines off the error stack (they're - # from the "uplevel" command). - # - - set new [split $errorInfo \n] - set new [join [lrange $new 0 [expr [llength $new] - 6]] \n] - return -code error -errorcode $errorCode \ - -errorinfo $new $msg - } else { - return -code $code $msg - } - } - } - if {[info level] == 1 && [string match {} [info script]] \ - && [info exists tcl_interactive] && $tcl_interactive} { - if ![info exists auto_noexec] { - if [auto_execok $name] { - set errorCode $savedErrorCode - set errorInfo $savedErrorInfo - return [uplevel exec $args] - #return [uplevel exec >&@stdout <@stdin $args] - } - } - set errorCode $savedErrorCode - set errorInfo $savedErrorInfo - if {[string match $name !!]} { - catch {set tkCon(cmd) [history event]} - return [uplevel {history redo}] - } elseif [regexp {^!(.+)$} $name dummy event] { - catch {set tkCon(cmd) [history event $event]} - return [uplevel [list history redo $event]] - } elseif [regexp {^\^([^^]*)\^([^^]*)\^?$} $name dummy old new] { - catch {set tkCon(cmd) [history substitute $old $new]} - return [uplevel [list history substitute $old $new]] - } - set cmds [info commands $name*] - if {[llength $cmds] == 1} { - return [uplevel [lreplace $args 0 0 $cmds]] - } elseif {[llength $cmds]} { - if {$name == ""} { - return -code error "empty command name \"\"" - } else { - return -code error \ - "ambiguous command name \"$name\": [lsort $cmds]" - } - } - } - return -code error "invalid command name \"$name\"" -} - - -# tkConClipboardKeysyms -- -# This procedure is invoked to identify the keys that correspond to -# the "copy", "cut", and "paste" functions for the clipboard. -# -# Arguments: -# copy - Name of the key (keysym name plus modifiers, if any, -# such as "Meta-y") used for the copy operation. -# cut - Name of the key used for the cut operation. -# paste - Name of the key used for the paste operation. - -proc tkConCut w { - if [string match $w [selection own -displayof $w]] { - clipboard clear -displayof $w - catch { - clipboard append -displayof $w [selection get -displayof $w] - if [$w compare sel.first >= limit] {$w delete sel.first sel.last} - } - } -} -proc tkConCopy w { - if [string match $w [selection own -displayof $w]] { - clipboard clear -displayof $w - catch {clipboard append -displayof $w [selection get -displayof $w]} - } -} - -proc tkConPaste w { - if ![catch {selection get -displayof $w -selection CLIPBOARD} tmp] { - if [$w compare insert < limit] {$w mark set insert end} - $w insert insert $tmp - $w see insert - if [string match *\n* $tmp] {tkConEval $w} - } -} - -proc tkConClipboardKeysyms {copy cut paste} { - bind Console <$copy> {tkConCopy %W} - bind Console <$cut> {tkConCut %W} - bind Console <$paste> {tkConPaste %W} -} - -## Get all Text bindings into Console -## -foreach ev [lremove [bind Text] {<Control-Key-y> <Control-Key-w> \ - <Meta-Key-w> <Control-Key-o>}] { - bind Console $ev [bind Text $ev] -} -unset ev - -## Redefine for Console what we need -## -tkConClipboardKeysyms F16 F20 F18 -tkConClipboardKeysyms Control-c Control-x Control-v - -bind Console <Insert> {catch {tkConInsert %W [selection get -displayof %W]}} - -bind Console <Up> { - if [%W compare {insert linestart} != {limit linestart}] { - tkTextSetCursor %W [tkTextUpDownLine %W -1] - } else { - if {$tkCon(event) == [history nextid]} { - set tkCon(cmdbuf) [tkConCmdGet %W] - } - if [catch {history event [incr tkCon(event) -1]} tkCon(tmp)] { - incr tkCon(event) - } else { - %W delete limit end - %W insert limit $tkCon(tmp) - %W see end - } - } -} -bind Console <Down> { - if [%W compare {insert linestart} != {end-1c linestart}] { - tkTextSetCursor %W [tkTextUpDownLine %W 1] - } else { - if {$tkCon(event) < [history nextid]} { - %W delete limit end - if {[incr tkCon(event)] == [history nextid]} { - %W insert limit $tkCon(cmdbuf) - } else { - %W insert limit [history event $tkCon(event)] - } - %W see end - } - } -} -bind Console <Control-P> { - if [%W compare insert > limit] {tkConExpand %W proc} -} -bind Console <Control-V> { - if [%W compare insert > limit] {tkConExpand %W var} -} -bind Console <Control-i> { - if [%W compare insert >= limit] { - tkConInsert %W \t - } -} -bind Console <Return> { - tkConEval %W -} -bind Console <KP_Enter> [bind Console <Return>] -bind Console <Delete> { - if {[string comp {} [%W tag nextrange sel 1.0 end]] \ - && [%W compare sel.first >= limit]} { - %W delete sel.first sel.last - } elseif [%W compare insert >= limit] { - %W delete insert - %W see insert - } -} -bind Console <BackSpace> { - if {[string comp {} [%W tag nextrange sel 1.0 end]] \ - && [%W compare sel.first >= limit]} { - %W delete sel.first sel.last - } elseif {[%W compare insert != 1.0] && [%W compare insert-1c >= limit]} { - %W delete insert-1c - %W see insert - } -} -bind Console <Control-h> [bind Console <BackSpace>] - -bind Console <KeyPress> { - tkConInsert %W %A -} - -bind Console <Control-a> { - if [%W compare {limit linestart} == {insert linestart}] { - tkTextSetCursor %W limit - } else { - tkTextSetCursor %W {insert linestart} - } -} -bind Console <Control-d> { - if [%W compare insert < limit] break - %W delete insert -} -bind Console <Control-k> { - if [%W compare insert < limit] break - if [%W compare insert == {insert lineend}] { - %W delete insert - } else { - %W delete insert {insert lineend} - } -} -bind Console <Control-l> { - ## Clear console buffer, without losing current command line input - set tkCon(tmp) [tkConCmdGet %W] - clear - tkConPrompt - tkConInsert %W $tkCon(tmp) -} -bind Console <Control-n> { - ## Goto next command in history - if {$tkCon(event) < [history nextid]} { - %W delete limit end - if {[incr tkCon(event)] == [history nextid]} { - %W insert limit $tkCon(cmdbuf) - } else { - %W insert limit [history event $tkCon(event)] - } - %W see end - } -} -bind Console <Control-p> { - ## Goto previous command in history - if {$tkCon(event) == [history nextid]} { - set tkCon(cmdbuf) [tkConCmdGet %W] - } - if [catch {history event [incr tkCon(event) -1]} tkCon(tmp)] { - incr tkCon(event) - } else { - %W delete limit end - %W insert limit $tkCon(tmp) - %W see end - } -} -bind Console <Control-r> { - ## Search history reverse - if {$tkCon(svnt) == [history nextid]} { - set tkCon(cmdbuf) [tkConCmdGet %W] - } - set tkCon(tmp1) [string len $tkCon(cmdbuf)] - incr tkCon(tmp1) -1 - while 1 { - if {[catch {history event [incr tkCon(svnt) -1]} tkCon(tmp)]} { - incr tkCon(svnt) - break - } elseif {![string comp $tkCon(cmdbuf) \ - [string range $tkCon(tmp) 0 $tkCon(tmp1)]]} { - %W delete limit end - %W insert limit $tkCon(tmp) - break - } - } - %W see end -} -bind Console <Control-s> { - ## Search history forward - set tkCon(tmp1) [string len $tkCon(cmdbuf)] - incr tkCon(tmp1) -1 - while {$tkCon(svnt) < [history nextid]} { - if {[incr tkCon(svnt)] == [history nextid]} { - %W delete limit end - %W insert limit $tkCon(cmdbuf) - break - } elseif {![catch {history event $tkCon(svnt)} tkCon(tmp)] - && ![string comp $tkCon(cmdbuf) \ - [string range $tkCon(tmp) 0 $tkCon(tmp1)]]} { - %W delete limit end - %W insert limit $tkCon(tmp) - break - } - } - %W see end -} -bind Console <Control-t> { - ## Transpose current and previous chars - if [%W compare insert > limit] { - tkTextTranspose %W - } -} -bind Console <Control-u> { - ## Clear command line (Unix shell staple) - %W delete limit end -} -bind Console <Control-z> { - ## Save command buffer - set tkCon(tmp) $tkCon(cmdsave) - set tkCon(cmdsave) [tkConCmdGet %W] - if {[string match {} $tkCon(cmdsave)]} { - set tkCon(cmdsave) $tkCon(tmp) - } else { - %W delete limit end-1c - } - tkConInsert %W $tkCon(tmp) - %W see end -} -catch {bind Console <Key-Page_Up> { tkTextScrollPages %W -1 }} -catch {bind Console <Key-Prior> { tkTextScrollPages %W -1 }} -catch {bind Console <Key-Page_Down> { tkTextScrollPages %W 1 }} -catch {bind Console <Key-Next> { tkTextScrollPages %W 1 }} -bind Console <Meta-d> { - if [%W compare insert >= limit] { - %W delete insert {insert wordend} - } -} -bind Console <Meta-BackSpace> { - if [%W compare {insert -1c wordstart} >= limit] { - %W delete {insert -1c wordstart} insert - } -} -bind Console <Meta-Delete> { - if [%W compare insert >= limit] { - %W delete insert {insert wordend} - } -} -bind Console <ButtonRelease-2> { - if {(!$tkPriv(mouseMoved) || $tk_strictMotif) \ - && ![catch {selection get -displayof %W} tkCon(tmp)]} { - if [%W compare @%x,%y < limit] { - %W insert end $tkCon(tmp) - } else { - %W insert @%x,%y $tkCon(tmp) - } - if [string match *\n* $tkCon(tmp)] {tkConEval %W} - } -} - -## -## End weird bindings -## - -## -## PostCon bindings, for doing special things based on certain keys -## -bind PostCon <Key-parenright> { - if {$tkCon(lightbrace) && $tkCon(blinktime)>99 && - [string comp \\ [%W get insert-2c]]} { - tkConMatchPair %W \( \) - } -} -bind PostCon <Key-bracketright> { - if {$tkCon(lightbrace) && $tkCon(blinktime)>99 && - [string comp \\ [%W get insert-2c]]} { - tkConMatchPair %W \[ \] - } -} -bind PostCon <Key-braceright> { - if {$tkCon(lightbrace) && $tkCon(blinktime)>99 && - [string comp \\ [%W get insert-2c]]} { - tkConMatchPair %W \{ \} - } -} -bind PostCon <Key-quotedbl> { - if {$tkCon(lightbrace) && $tkCon(blinktime)>99 && - [string comp \\ [%W get insert-2c]]} { - tkConMatchQuote %W - } -} - -bind PostCon <KeyPress> { - if {$tkCon(lightcmd) && [string comp {} %A]} { tkConTagProc %W } -} - -## tkConTagProc - tags a procedure in the console if it's recognized -## This procedure is not perfect. However, making it perfect wastes -## too much CPU time... Also it should check the existence of a command -## in whatever is the connected slave, not the master interpreter. -## -proc tkConTagProc w { - set i [$w index "insert-1c wordstart"] - set j [$w index "insert-1c wordend"] - if {[string comp {} [info command [list [$w get $i $j]]]]} { - $w tag add proc $i $j - } else { - $w tag remove proc $i $j - } -} - - -## tkConMatchPair - blinks a matching pair of characters -## c2 is assumed to be at the text index 'insert'. -## This proc is really loopy and took me an hour to figure out given -## all possible combinations with escaping except for escaped \'s. -## It doesn't take into account possible commenting... Oh well. If -## anyone has something better, I'd like to see/use it. This is really -## only efficient for small contexts. -# ARGS: w - console text widget -# c1 - first char of pair -# c2 - second char of pair -# Calls: tkConBlink -## -proc tkConMatchPair {w c1 c2} { - if [string comp {} [set ix [$w search -back $c1 insert limit]]] { - while {[string match {\\} [$w get $ix-1c]] && - [string comp {} [set ix [$w search -back $c1 $ix-1c limit]]]} {} - set i1 insert-1c - while {[string comp {} $ix]} { - set i0 $ix - set j 0 - while {[string comp {} [set i0 [$w search $c2 $i0 $i1]]]} { - append i0 +1c - if {[string match {\\} [$w get $i0-2c]]} continue - incr j - } - if {!$j} break - set i1 $ix - while {$j && - [string comp {} [set ix [$w search -back $c1 $ix limit]]]} { - if {[string match {\\} [$w get $ix-1c]]} continue - incr j -1 - } - } - if [string match {} $ix] { set ix [$w index limit] } - } else { set ix [$w index limit] } - tkConBlink $w $ix [$w index insert] -} - -## tkConMatchQuote - blinks between matching quotes. -## Blinks just the quote if it's unmatched, otherwise blinks quoted string -## The quote to match is assumed to be at the text index 'insert'. -# ARGS: w - console text widget -# Calls: tkConBlink -## -proc tkConMatchQuote w { - set i insert-1c - set j 0 - while {[string comp {} [set i [$w search -back \" $i limit]]]} { - if {[string match {\\} [$w get $i-1c]]} continue - if {!$j} {set i0 $i} - incr j - } - if [expr $j%2] { - tkConBlink $w $i0 [$w index insert] - } else { - tkConBlink $w [$w index insert-1c] [$w index insert] - } -} - -## tkConBlink - blinks between 2 indices for a specified duration. -# ARGS: w - console text widget -# i1 - start index to blink region -# i2 - end index of blink region -# dur - duration in usecs to blink for -# Outputs: blinks selected characters in $w -## -proc tkConBlink {w i1 i2} { - global tkCon - $w tag add blink $i1 $i2 - after $tkCon(blinktime) $w tag remove blink $i1 $i2 - return -} - - -## tkConInsert -## Insert a string into a text at the point of the insertion cursor. -## If there is a selection in the text, and it covers the point of the -## insertion cursor, then delete the selection before inserting. -# ARGS: w - text window in which to insert the string -# s - string to insert (usually just a single char) -# Outputs: $s to text widget -## -proc tkConInsert {w s} { - if {[string match {} $s] || [string match disabled [$w cget -state]]} { - return - } - if [$w comp insert < limit] { - $w mark set insert end - } - catch { - if {[$w comp sel.first <= insert] && [$w comp sel.last >= insert]} { - $w delete sel.first sel.last - } - } - $w insert insert $s - $w see insert -} - -## tkConExpand - -# ARGS: w - text widget in which to expand str -# type - type of expansion (path / proc / variable) -# Calls: tkConExpand(Pathname|Procname|Variable) -# Outputs: The string to match is expanded to the longest possible match. -# If tkCon(showmultiple) is non-zero and the user longest match -# equaled the string to expand, then all possible matches are -# output to stdout. Triggers bell if no matches are found. -# Returns: number of matches found -## -proc tkConExpand {w type} { - set exp "\[^\\]\[ \t\n\r\[\{\"\$]" - set tmp [$w search -back -regexp $exp insert-1c limit-1c] - if [string compare {} $tmp] {append tmp +2c} else {set tmp limit} - if [$w compare $tmp >= insert] return - set str [$w get $tmp insert] - switch -glob $type { - pr* {set res [tkConExpandProcname $str]} - v* {set res [tkConExpandVariable $str]} - default {set res {}} - } - set len [llength $res] - if $len { - $w delete $tmp insert - $w insert $tmp [lindex $res 0] - if {$len > 1} { - global tkCon - if {$tkCon(showmultiple) && [string match [lindex $res 0] $str]} { - puts stdout [lreplace $res 0 0] - } - } - } - return [incr len -1] -} - -## tkConExpandProcname - expand a tcl proc name based on $str -# ARGS: str - partial proc name to expand -# Calls: tkConExpandBestMatch -# Returns: list containing longest unique match followed by all the -# possible further matches -## -proc tkConExpandProcname str { - set match [info commands $str*] - if {[llength $match] > 1} { - regsub -all { } [tkConExpandBestMatch $match $str] {\\ } str - set match [linsert $match 0 $str] - } else { - regsub -all { } $match {\\ } match - } - return $match -} - -## tkConExpandVariable - expand a tcl variable name based on $str -# ARGS: str - partial tcl var name to expand -# Calls: tkConExpandBestMatch -# Returns: list containing longest unique match followed by all the -# possible further matches -## -proc tkConExpandVariable str { - if [regexp {([^\(]*)\((.*)} $str junk ary str] { - set match [uplevel \#0 array names $ary $str*] - if {[llength $match] > 1} { - set vars $ary\([tkConExpandBestMatch $match $str] - foreach var $match {lappend vars $ary\($var\)} - return $vars - } else {set match $ary\($match\)} - } else { - set match [uplevel \#0 info vars $str*] - if {[llength $match] > 1} { - regsub -all { } [tkConExpandBestMatch $match $str] {\\ } str - set match [linsert $match 0 $str] - } else { - regsub -all { } $match {\\ } match - } - } - return $match -} - -## tkConExpandBestMatch - finds the best unique match in a list of names -## The extra $e in this argument allows us to limit the innermost loop a -## little further. This improves speed as $l becomes large or $e becomes long. -# ARGS: l - list to find best unique match in -# e - currently best known unique match -# Returns: longest unique match in the list -## -proc tkConExpandBestMatch {l {e {}}} { - set ec [lindex $l 0] - if {[llength $l]>1} { - set e [string length $e]; incr e -1 - set ei [string length $ec]; incr ei -1 - foreach l $l { - while {$ei>=$e && [string first $ec $l]} { - set ec [string range $ec 0 [incr ei -1]] - } - } - } - return $ec -} - - -## Initialize only if we haven't yet -## -if [catch {winfo exists $tkCon(base)}] tkConInit |