namespace eval CmdInput {
# We want to allow shell commands to execute automatically
# as in normal interactive use. The "unknown" proc checks
# that "info script" returns "", before it enables that
# behaviour, so we subclass "info". In Tcl 8.4 we could simply
# call 'info script ""' I believe, but 8.3 and earlier don't do
# that.
variable this_script [info script]
proc info {args} {
set result [uplevel [concat __org_info $args]]
set cmd [lindex $args 0]
variable this_script
if {"script" == $cmd && "$result" == $this_script} {
return ""
} else {
return $result
}
}
rename ::info ::__org_info ;# using a namespace proc here cores
proc ::info {args} "uplevel \[concat [namespace which info] \$args\]"
proc loop {} {
# preparations
fconfigure stdin -buffering line
fconfigure stdout -buffering line
fconfigure stderr -buffering line
set ::tcl_interactive 1
if {[file exists ~/tclshrc.tcl]} {
namespace eval :: {uplevel \#0 source ~/tclshrc.tcl}
}
# input loop
while {1} {
catch {uplevel \#0 $::tcl_prompt1}
flush stdout
set cmd {}
while {1} {
append cmd [gets stdin] "\n"
if {[info complete $cmd]} {
break
}
catch {uplevel \#0 $::tcl_prompt2}
flush stdout
}
history add $cmd
catch {uplevel \#0 $cmd} result
puts $result
}
return ""
}
}
catch {CmdInput::loop} result
puts $result
exit 0To use this code: Save it to a file called cmd-input.tcl. In Emacs customize the variable tcl-application to read "tclsh83.exe" and the variable tcl-command-switches to include "c:/your-path-here/cmd-input.tcl" (this is with Emacs 21.1, Emacs 20 used other names for the variables, I believe).I hope this is clear, if not or if you have ideas for improvement, you can always contact me at mailto:b.riefenstahl@turtle-trading.net
. Just to clarify: This code is free to use by everybody, but I don't give any guarantees for anything. See also: Who owns the content on this Wiki.Note: Jim Graham has a similar thing called interp.tcl on his homepage [1].
2003-12-01 VI I just set tcl_interactive 1. Works fine for me after that. A proc in the tclshrc will make it even easier.
Even easier, add the following to your .emacs file:
(add-hook 'inferior-tcl-mode-hook
(lambda ()
(tcl-send-string (inferior-tcl-proc) "set ::tcl_interactive 1\n")))This will automatically set tcl_interactive whenever you launch the inferior-tcl-modeA similar solution has been added to tcl.el in Emacs CVS. So it should work out-of-the-box when Emacs 22 is released. (It still doesn't work if you're using wish, though).
Nathan: I am using EMACS 22.0.50.1 and activestate tcl 8.4.13 and the integration works fine out-of-the-box except when my tcl code calls any file dialog box (tk_getOpenFile) at which point it hangs. I can call other dialogs (tk_messageBox) without any problem. Any ideas on what could be the cause?
escargo 2006-11-17: I'm using Emacs 21.3 (the latest version I found). When I'm editing Tcl programs, the Tcl menu shows a choice, Tcl Help, that's grayed out. I don't know what I might need to add nor where in order to enable Tcl mode help. Any suggestions? (Knowing where later versions of Windows Emacs could be found might be helpful too.)

