# This pseudo-package is loaded from jimsh to add additional
# paths to $auto_path and to source ~/.jimrc

proc _jimsh_init {} {
	rename _jimsh_init {}
	global jim::exe jim::argv0 tcl_interactive auto_path tcl_platform

	# Stash the result of [info nameofexecutable] now, before a possible [cd]
	if {[exists jim::argv0]} {
		if {[string match "*/*" $jim::argv0]} {
			set jim::exe [file join [pwd] $jim::argv0]
		} else {
			foreach path [split [env PATH ""] $tcl_platform(pathSeparator)] {
				set exec [file join [pwd] [string map {\\ /} $path] $jim::argv0]
				if {[file executable $exec]} {
					set jim::exe $exec
					break
				}
			}
		}
	}

	# Add to the standard auto_path
	lappend p {*}[split [env JIMLIB {}] $tcl_platform(pathSeparator)]
	if {[exists jim::exe]} {
		lappend p [file dirname $jim::exe]
	}
	lappend p {*}$auto_path
	set auto_path $p

	if {$tcl_interactive && [env HOME {}] ne ""} {
		foreach src {.jimrc jimrc.tcl} {
			if {[file exists [env HOME]/$src]} {
				uplevel #0 source [env HOME]/$src
				break
			}
		}
	}
	return ""
}

if {$tcl_platform(platform) eq "windows"} {
	set jim::argv0 [string map {\\ /} $jim::argv0]
}

# Set a global variable here so that custom commands can be added post hoc
set tcl::autocomplete_commands {array clock debug dict file history info namespace package signal socket string tcl::prefix zlib}

# Simple interactive command line completion callback
# Explicitly knows about some commands that support "-commands"
proc tcl::autocomplete {prefix} {
	if {[set space [string first " " $prefix]] != -1} {
		set cmd [string range $prefix 0 $space-1]
		if {$cmd in $::tcl::autocomplete_commands || [info channel $cmd] ne ""} {
			set arg [string range $prefix $space+1 end]
			# Add any results from -commands
			return [lmap p [$cmd -commands] {
				if {![string match "${arg}*" $p]} continue
				function "$cmd $p"
			}]
		}
	}
	# Find matching files.
	if {[string match "source *" $prefix]} {
		set path [string range $prefix 7 end]
		return [lmap p [glob -nocomplain "${path}*"] {
			function "source $p"
		}]
	}
	# Find matching commands, omitting results containing spaces
	return [lmap p [lsort [info commands $prefix*]] {
		if {[string match "* *" $p]} {
			continue
		}
		function $p
	}]
}

# Only procs and C commands that support "cmd -help subcommand" have autohint suport
set tcl::stdhint_commands {array clock debug dict file history info namespace package signal string zlib}

set tcl::stdhint_cols {
	none {0}
	black {30}
	red {31}
	green {32}
	yellow {33}
	blue {34}
	purple {35}
	cyan {36}
	normal {37}
	grey {30 1}
	gray {30 1}
	lred {31 1}
	lgreen {32 1}
	lyellow {33 1}
	lblue {34 1}
	lpurple {35 1}
	lcyan {36 1}
	white {37 1}
}

# Make it easy to change the colour
set tcl::stdhint_col $tcl::stdhint_cols(lcyan)

# The default hint implementation
proc tcl::stdhint {string} {
	set result ""
	if {[llength $string] >= 2} {
		lassign $string cmd arg
		if {$cmd in $::tcl::stdhint_commands || [info channel $cmd] ne ""} {
			catch {
				set help [$cmd -help $arg]
				if {[string match "Usage: $cmd *" $help]} {
					set n [llength $string]
					set subcmd [lindex $help $n]
					incr n
					set hint [join [lrange $help $n end]]
					set prefix ""
					if {![string match "* " $string]} {
						if {$n == 3 && $subcmd ne $arg} {
							# complete the subcommand in the hint
							set prefix "[string range $subcmd [string length $arg] end] "
						} else {
							set prefix " "
						}
					}
					set result [list $prefix$hint {*}$::tcl::stdhint_col]
				}
			}
		}
	}
	return $result
}

_jimsh_init
