📄 auto.tcl
字号:
# auto.tcl --## utility procs formerly in init.tcl dealing with auto execution# of commands and can be auto loaded themselves.## RCS: @(#) $Id: auto.tcl,v 1.7 2000/02/08 10:06:12 hobbs Exp $## Copyright (c) 1991-1993 The Regents of the University of California.# Copyright (c) 1994-1998 Sun Microsystems, Inc.## See the file "license.terms" for information on usage and redistribution# of this file, and for a DISCLAIMER OF ALL WARRANTIES.## auto_reset --## Destroy all cached information for auto-loading and auto-execution,# so that the information gets recomputed the next time it's needed.# Also delete any procedures that are listed in the auto-load index# except those defined in this file.## Arguments: # None.proc auto_reset {} { global auto_execs auto_index auto_oldpath foreach p [info procs] { if {[info exists auto_index($p)] && ![string match auto_* $p] && ([lsearch -exact {unknown pkg_mkIndex tclPkgSetup tcl_findLibrary pkg_compareExtension tclMacPkgSearch tclPkgUnknown} $p] < 0)} { rename $p {} } } catch {unset auto_execs} catch {unset auto_index} catch {unset auto_oldpath}}# tcl_findLibrary --## This is a utility for extensions that searches for a library directory# using a canonical searching algorithm. A side effect is to source# the initialization script and set a global library variable.## Arguments:# basename Prefix of the directory name, (e.g., "tk")# version Version number of the package, (e.g., "8.0")# patch Patchlevel of the package, (e.g., "8.0.3")# initScript Initialization script to source (e.g., tk.tcl)# enVarName environment variable to honor (e.g., TK_LIBRARY)# varName Global variable to set when done (e.g., tk_library)proc tcl_findLibrary {basename version patch initScript enVarName varName} { upvar #0 $varName the_library global env errorInfo set dirs {} set errors {} # The C application may have hardwired a path, which we honor if {[info exist the_library] && [string compare $the_library {}]} { lappend dirs $the_library } else { # Do the canonical search # 1. From an environment variable, if it exists if {[info exists env($enVarName)]} { lappend dirs $env($enVarName) } # 2. Relative to the Tcl library lappend dirs [file join [file dirname [info library]] \ $basename$version] # 3. Various locations relative to the executable # ../lib/foo1.0 (From bin directory in install hierarchy) # ../../lib/foo1.0 (From bin/arch directory in install hierarchy) # ../library (From unix directory in build hierarchy) # ../../library (From unix/arch directory in build hierarchy) # ../../foo1.0b1/library (From unix directory in parallel build hierarchy) # ../../../foo1.0b1/library (From unix/arch directory in parallel build hierarchy) set parentDir [file dirname [file dirname [info nameofexecutable]]] set grandParentDir [file dirname $parentDir] lappend dirs [file join $parentDir lib $basename$version] lappend dirs [file join $grandParentDir lib $basename$version] lappend dirs [file join $parentDir library] lappend dirs [file join $grandParentDir library] if {![regexp {.*[ab][0-9]*} $patch ver]} { set ver $version } lappend dirs [file join $grandParentDir $basename$ver library] lappend dirs [file join [file dirname $grandParentDir] $basename$ver library] } foreach i $dirs { set the_library $i set file [file join $i $initScript] # source everything when in a safe interpreter because # we have a source command, but no file exists command if {[interp issafe] || [file exists $file]} { if {![catch {uplevel #0 [list source $file]} msg]} { return } else { append errors "$file: $msg\n$errorInfo\n" } } } set msg "Can't find a usable $initScript in the following directories: \n" append msg " $dirs\n\n" append msg "$errors\n\n" append msg "This probably means that $basename wasn't installed properly.\n" error $msg}# ----------------------------------------------------------------------# auto_mkindex# ----------------------------------------------------------------------# The following procedures are used to generate the tclIndex file# from Tcl source files. They use a special safe interpreter to# parse Tcl source files, writing out index entries as "proc"# commands are encountered. This implementation won't work in a# safe interpreter, since a safe interpreter can't create the# special parser and mess with its commands. if {[interp issafe]} { return ;# Stop sourcing the file here}# auto_mkindex --# Regenerate a tclIndex file from Tcl source files. Takes as argument# the name of the directory in which the tclIndex file is to be placed,# followed by any number of glob patterns to use in that directory to# locate all of the relevant files.## Arguments: # dir - Name of the directory in which to create an index.# args - Any number of additional arguments giving the# names of files within dir. If no additional# are given auto_mkindex will look for *.tcl.proc auto_mkindex {dir args} { global errorCode errorInfo if {[interp issafe]} { error "can't generate index within safe interpreter" } set oldDir [pwd] cd $dir set dir [pwd] append index "# Tcl autoload index file, version 2.0\n" append index "# This file is generated by the \"auto_mkindex\" command\n" append index "# and sourced to set up indexing information for one or\n" append index "# more commands. Typically each line is a command that\n" append index "# sets an element in the auto_index array, where the\n" append index "# element name is the name of a command and the value is\n" append index "# a script that loads the command.\n\n" if {$args == ""} { set args *.tcl } auto_mkindex_parser::init foreach file [eval glob $args] { if {[catch {auto_mkindex_parser::mkindex $file} msg] == 0} { append index $msg } else { set code $errorCode set info $errorInfo cd $oldDir error $msg $info $code } } auto_mkindex_parser::cleanup set fid [open "tclIndex" w] puts -nonewline $fid $index close $fid cd $oldDir}# Original version of auto_mkindex that just searches the source# code for "proc" at the beginning of the line.proc auto_mkindex_old {dir args} { global errorCode errorInfo set oldDir [pwd] cd $dir set dir [pwd] append index "# Tcl autoload index file, version 2.0\n" append index "# This file is generated by the \"auto_mkindex\" command\n" append index "# and sourced to set up indexing information for one or\n" append index "# more commands. Typically each line is a command that\n" append index "# sets an element in the auto_index array, where the\n" append index "# element name is the name of a command and the value is\n" append index "# a script that loads the command.\n\n" if {[string equal $args ""]} { set args *.tcl } foreach file [eval glob $args] { set f "" set error [catch { set f [open $file] while {[gets $f line] >= 0} { if {[regexp {^proc[ ]+([^ ]*)} $line match procName]} { set procName [lindex [auto_qualify $procName "::"] 0] append index "set [list auto_index($procName)]" append index " \[list source \[file join \$dir [list $file]\]\]\n" } } close $f } msg] if {$error} { set code $errorCode set info $errorInfo catch {close $f} cd $oldDir error $msg $info $code } } set f "" set error [catch { set f [open tclIndex w] puts -nonewline $f $index close $f cd $oldDir } msg] if {$error} { set code $errorCode set info $errorInfo catch {close $f} cd $oldDir error $msg $info $code }}# Create a safe interpreter that can be used to parse Tcl source files# generate a tclIndex file for autoloading. This interp contains# commands for things that need index entries. Each time a command# is executed, it writes an entry out to the index file.namespace eval auto_mkindex_parser { variable parser "" ;# parser used to build index variable index "" ;# maintains index as it is built variable scriptFile "" ;# name of file being processed variable contextStack "" ;# stack of namespace scopes variable imports "" ;# keeps track of all imported cmds variable initCommands "" ;# list of commands that create aliases proc init {} { variable parser variable initCommands if {![interp issafe]} { set parser [interp create -safe] $parser hide info $parser hide rename $parser hide proc $parser hide namespace $parser hide eval $parser hide puts $parser invokehidden namespace delete :: $parser invokehidden proc unknown {args} {} # We'll need access to the "namespace" command within the # interp. Put it back, but move it out of the way. $parser expose namespace $parser invokehidden rename namespace _%@namespace $parser expose eval $parser invokehidden rename eval _%@eval # Install all the registered psuedo-command implementations foreach cmd $initCommands { eval $cmd }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -