mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-04 07:21:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			444 lines
		
	
	
	
		
			9.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			444 lines
		
	
	
	
		
			9.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/usr/local/bin/zsh
 | 
						|
#
 | 
						|
# NAME:
 | 
						|
#	reporter
 | 
						|
#
 | 
						|
# SYNOPSIS:
 | 
						|
#	reporter [all | aliases | bindings | completion | functions |
 | 
						|
#			limits | options | variables]
 | 
						|
#
 | 
						|
# DESCRIPTION:
 | 
						|
#	"reporter" prints your current environment variables, shell
 | 
						|
#	variables, limits, completion settings, and option settings to
 | 
						|
#	stdout in the form of a script.
 | 
						|
#
 | 
						|
#	If you run into a zsh bug, someone can source the output script to
 | 
						|
#	recreate most of the environment under which you were working.
 | 
						|
#
 | 
						|
#	IMPORTANT:	"source" this script, don't try to run it directly.
 | 
						|
#			Otherwise it won't report the settings for your
 | 
						|
#			current shell session.
 | 
						|
#
 | 
						|
# OPTIONS:
 | 
						|
#	All command-line options can be abbreviated.
 | 
						|
#
 | 
						|
#	"aliases"	prints only aliases.
 | 
						|
#	"bindings"	prints only "bindkey" commands.
 | 
						|
#	"completion"	prints only "compctl" commands.
 | 
						|
#	"functions"	prints "autoload" commands or actual functions.
 | 
						|
#	"limits"	prints "limit" commands for things like cputime, etc.
 | 
						|
#	"modules"	prints "zmodload" commands.
 | 
						|
#	"options"	prints "setopt" commands.
 | 
						|
#	"variables"	prints both shell and environment variables.
 | 
						|
#
 | 
						|
#	"all"		tries to find every useful setting under your shell.
 | 
						|
#			This is the default, and it's the same as typing all
 | 
						|
#			of the above options on the command line.
 | 
						|
#
 | 
						|
# CAVEATS:
 | 
						|
#	Assumes that you have the following programs in your search path:
 | 
						|
#		awk, cut, echo, grep, sed, sort
 | 
						|
#	Assumes that your C preprocessor lives in /lib/cpp or /usr/ccs/lib/cpp.
 | 
						|
#	Uses (and unsets) variables beginning with "reporter_".
 | 
						|
#
 | 
						|
# RESTRICTIONS:
 | 
						|
#	DON'T:	pretend you wrote it, sell it, or blame me if it breaks.
 | 
						|
#	DO:	as ye will an' ye harm none.
 | 
						|
#					--Wiccan saying, I think
 | 
						|
#
 | 
						|
# BUGS:
 | 
						|
#	I'm sure there are more than a few.  To be safe, run "zsh -f" before
 | 
						|
#	sourcing the output from this script.  If you have "screen", you may
 | 
						|
#	want to use that, too; I hammered my terminal settings beyond repair
 | 
						|
#	when using an early version, and "screen" saved me from having to
 | 
						|
#	login on another terminal.
 | 
						|
#
 | 
						|
# HISTORY:
 | 
						|
#	The name was ripped off from the Emacs "reporter.el" function.
 | 
						|
#	The idea came from a mail message to the ZSH mailing list:
 | 
						|
#
 | 
						|
# Begin Configuration Section
 | 
						|
#
 | 
						|
 | 
						|
reporter_OSVersion="`uname -s`_`uname -r`"
 | 
						|
 | 
						|
#
 | 
						|
# Solaris 2.x
 | 
						|
#
 | 
						|
case ${reporter_OSVersion} in
 | 
						|
	SunOS_5.*)
 | 
						|
		CPP=${CPP:-/usr/ccs/lib/cpp}
 | 
						|
		AWK=${AWK:-nawk}	# GNU AWK doesn't come standard :-(
 | 
						|
		;;
 | 
						|
esac
 | 
						|
 | 
						|
#
 | 
						|
# Default Values 
 | 
						|
#
 | 
						|
 | 
						|
CPP=${CPP:-/lib/cpp}
 | 
						|
AWK=${AWK:-awk}
 | 
						|
 | 
						|
#
 | 
						|
# End Configuration Section
 | 
						|
#
 | 
						|
 | 
						|
reporter_do_all=yes
 | 
						|
 | 
						|
for each in $*
 | 
						|
do
 | 
						|
	case "$each"
 | 
						|
	in
 | 
						|
		ali*)	reporter_do_aliases=yes; reporter_do_all=no ;;
 | 
						|
		b*)	reporter_do_bindings=yes; reporter_do_all=no ;;
 | 
						|
		c*)	reporter_do_compctl=yes; reporter_do_all=no ;;
 | 
						|
		f*)	reporter_do_fun=yes; reporter_do_all=no ;;
 | 
						|
		l*)	reporter_do_lim=yes; reporter_do_all=no ;;
 | 
						|
		m*)	reporter_do_mod=yes; reporter_do_all=no ;;
 | 
						|
		o*)	reporter_do_setopt=yes; reporter_do_all=no ;;
 | 
						|
		v*)	reporter_do_vars=yes; reporter_do_all=no ;;
 | 
						|
		*)	;;
 | 
						|
	esac
 | 
						|
done
 | 
						|
 | 
						|
#
 | 
						|
#	The "cshjunkiequotes" option can break some of the commands
 | 
						|
#	used in the remainder of this script, so we check for that first
 | 
						|
#	and disable it.  We'll re-enable it later.
 | 
						|
#
 | 
						|
 | 
						|
reporter_junkiequotes="no"
 | 
						|
 | 
						|
if setopt | grep "cshjunkiequotes" > /dev/null
 | 
						|
then
 | 
						|
	reporter_junkiequotes="yes"
 | 
						|
	unsetopt cshjunkiequotes
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	UNAME
 | 
						|
#
 | 
						|
#	This shows your system name.  It's extremely system-dependent, so
 | 
						|
#	we need a way to find out what system you're on.  The easiest
 | 
						|
#	way to do this is by using "uname", but not everyone has that,
 | 
						|
#	so first we go through the search path.
 | 
						|
#
 | 
						|
#	If we don't find it, then the only thing I can think of is to
 | 
						|
#	check what's defined in your C compiler, and code in some exceptions
 | 
						|
#	for the location of "uname" or an equivalent.  For example, Pyramid
 | 
						|
#	has "uname" only in the ATT universe.  This code assumes that
 | 
						|
#	the "-a" switch is valid for "uname".
 | 
						|
#
 | 
						|
#	This section of code sees what is defined by "cpp".  It was
 | 
						|
#	originally written by brandy@tramp.Colorado.EDU (Carl Brandauer).
 | 
						|
#	Additional error checking and sed hacking added by Ken Phelps.
 | 
						|
#
 | 
						|
 | 
						|
reporter_cppdef=`strings -3 ${CPP} |
 | 
						|
	sed -n '
 | 
						|
	/^[a-zA-Z_][a-zA-Z0-9_]*$/{
 | 
						|
	s/.*/#ifdef &/p
 | 
						|
	s/.* \(.*\)/"\1";/p
 | 
						|
	s/.*/#endif/p
 | 
						|
	}
 | 
						|
	' | ${CPP} |sed '
 | 
						|
	/^[	 ]*$/d
 | 
						|
	/^#/d
 | 
						|
	s/.*"\(.*\)".*/\1/'`
 | 
						|
 | 
						|
reporter_uname=""
 | 
						|
 | 
						|
for each in `echo $PATH | sed -e 's/:/ /g'`
 | 
						|
do
 | 
						|
	if [ -x $each/uname ]
 | 
						|
	then
 | 
						|
		reporter_uname="$each/uname"
 | 
						|
		break
 | 
						|
	fi
 | 
						|
done
 | 
						|
 | 
						|
case "$reporter_uname"
 | 
						|
in
 | 
						|
	"")	reporter_uname="echo not found on this system" ;;
 | 
						|
	*)	;;
 | 
						|
esac
 | 
						|
 | 
						|
for each in $reporter_cppdef
 | 
						|
do
 | 
						|
	case "$each"
 | 
						|
	in
 | 
						|
		pyr)	reporter_uname="/bin/att uname" ;;
 | 
						|
		*)	;;
 | 
						|
	esac
 | 
						|
done
 | 
						|
 | 
						|
str=`eval $reporter_uname -a`
 | 
						|
 | 
						|
echo '# START zsh saveset'
 | 
						|
echo '# uname: ' $str
 | 
						|
echo
 | 
						|
 | 
						|
unset reporter_cppdef
 | 
						|
unset reporter_uname
 | 
						|
 | 
						|
#
 | 
						|
#	ALIASES
 | 
						|
#
 | 
						|
#	Use "alias -L" to get a listing of the aliases in the form we want.
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_aliases" = "yes"
 | 
						|
then
 | 
						|
	echo '# Aliases.'
 | 
						|
	echo
 | 
						|
 | 
						|
	alias -L
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	KEY BINDINGS
 | 
						|
#
 | 
						|
#	The -L option does most of the work.  The subshell is used to
 | 
						|
#	avoid modifying things that will be recorded later.
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_bindings" = "yes"
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo "# Key bindings."
 | 
						|
	echo
 | 
						|
	bindkey -lL
 | 
						|
	(
 | 
						|
		alias bindkey=bindkey
 | 
						|
		bindkey () {
 | 
						|
			[[ "$1" == "-N" ]] || return
 | 
						|
			[[ "$2" == "--" ]] && shift
 | 
						|
			echo
 | 
						|
			builtin bindkey -L -M -- "$2"
 | 
						|
		}
 | 
						|
		eval "`builtin bindkey -lL`"
 | 
						|
	)
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	COMPLETION COMMANDS
 | 
						|
#	Warning:  this won't work for zsh-2.5.03.
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_compctl" = "yes"
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo "# Completions."
 | 
						|
	echo
 | 
						|
 | 
						|
	compctl -L
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	FUNCTIONS
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_fun" = "yes"
 | 
						|
then
 | 
						|
	echo 
 | 
						|
	echo "# Undefined functions."
 | 
						|
	echo
 | 
						|
 | 
						|
	functions | grep "undefined" | ${AWK} '{print "autoload " $2}'
 | 
						|
 | 
						|
	echo 
 | 
						|
	echo "# Defined functions."
 | 
						|
	echo
 | 
						|
 | 
						|
	functions | grep -v "undefined"
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	LIMITS
 | 
						|
#
 | 
						|
#	"cputime" has to be handled specially, because you can specify
 | 
						|
#	the time as just hours, or "minutes:seconds".
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_lim" = "yes"
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo '# Limits.'
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		set X `limit | grep "cputime" | grep -v "unlimited" |
 | 
						|
			sed -e 's/:/ /g'`
 | 
						|
 | 
						|
		if test "$#" -gt 1
 | 
						|
		then
 | 
						|
			hr=$3
 | 
						|
			min=$4
 | 
						|
			sec=$5
 | 
						|
 | 
						|
			if test "$hr" -gt 0
 | 
						|
			then
 | 
						|
				echo "limit cputime ${hr}h"
 | 
						|
			else
 | 
						|
				echo "limit cputime $min:$sec"
 | 
						|
			fi
 | 
						|
		fi
 | 
						|
	)
 | 
						|
 | 
						|
	limit | grep -v "cputime" | grep -v "unlimited" |
 | 
						|
		sed -e 's/Mb/m/' -e 's/Kb/k/' |
 | 
						|
		${AWK} 'NF > 1 {print "limit " $0}'
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	MODULE LOADING COMMANDS
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_mod" = "yes"
 | 
						|
then
 | 
						|
	echo
 | 
						|
	if ( zmodload ) >& /dev/null; then
 | 
						|
		echo "# Modules."
 | 
						|
		echo
 | 
						|
		zmodload -d -L
 | 
						|
		echo
 | 
						|
		zmodload -a -L
 | 
						|
		echo
 | 
						|
		zmodload -L
 | 
						|
	else
 | 
						|
		echo "# Modules: zmodload not available."
 | 
						|
	fi
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	NON-ARRAY VARIABLES
 | 
						|
#
 | 
						|
#	We run this in a subshell to preserve the TERMCAP and TERM settings
 | 
						|
#	in the current shell.  Also, reset the prompt to show you're now
 | 
						|
#	in a test shell.  I can't find an easy way to do IFS, so I ignore it.
 | 
						|
#
 | 
						|
#	Most of the sed nonsense is to make sure that variables are quoted
 | 
						|
#	when being set.  We also have to make sure that single-quotes and
 | 
						|
#	back-quotes are escaped.  This is why variable settings are
 | 
						|
#	surrounded by double quotes; some variables like SPROMPT have single
 | 
						|
#	quotes and back-quotes, and it's just too hard to escape those
 | 
						|
#	properly when setting them.
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_vars" = "yes"
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo "# Non-array variables."
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		echo "TERMCAP='$TERMCAP'"
 | 
						|
		echo "TERM='$TERM'"
 | 
						|
		unset TERMCAP
 | 
						|
 | 
						|
		set | grep '=' | grep -v 'prompt=' |
 | 
						|
			grep -v 'reporter_do' |
 | 
						|
			grep -v '^[!#$*0?@_-]=' |
 | 
						|
			grep -v '=(' | sed -e "s/'/\\\'/g" |
 | 
						|
                        sed -e 's/`/\\`/g' |
 | 
						|
			sed -e 's/=/="/' -e 's/$/"/' |
 | 
						|
			grep -v '^IFS=' |
 | 
						|
			grep -v '^TERMCAP=' |
 | 
						|
			grep -v '^TERM='
 | 
						|
 | 
						|
		echo "prompt='test%'"
 | 
						|
	)
 | 
						|
 | 
						|
#
 | 
						|
#	ARRAY VARIABLES
 | 
						|
#
 | 
						|
#	The "grep -v" nonsense is to keep from setting shell variables
 | 
						|
#	that caused me some trouble from a script.
 | 
						|
#
 | 
						|
 | 
						|
	echo
 | 
						|
	echo "# Array variables."
 | 
						|
	echo
 | 
						|
 | 
						|
	echo "argv=()"
 | 
						|
	set | grep '=' | grep -v 'argv=' |
 | 
						|
		grep -v 'reporter_do' | grep -v '^[!#$*0?@_-]=' |
 | 
						|
		grep '=('
 | 
						|
 | 
						|
#
 | 
						|
#	EXPORTED VARIABLES
 | 
						|
#
 | 
						|
#	Run this in a subshell to preserve the TERM and TERMCAP setting in
 | 
						|
#	the current shell.
 | 
						|
#
 | 
						|
 | 
						|
	echo
 | 
						|
	echo "# Exported variables."
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		echo "export TERMCAP"
 | 
						|
		echo "export TERM"
 | 
						|
		unset TERMCAP
 | 
						|
 | 
						|
		export | grep -v '^[!#$*0?@_-]=' |
 | 
						|
			${AWK} -F='=' '{print "export " $1}' |
 | 
						|
			grep -v '^TERM=' | grep -v '^TERMCAP='
 | 
						|
	)
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	SETOPT
 | 
						|
#
 | 
						|
#	We exclude interactive because "setopt interactive" has no effect.
 | 
						|
#	The cshjunkiequotes option is dealt with separately; see the
 | 
						|
#	comments near the start of the script.
 | 
						|
#
 | 
						|
 | 
						|
if test "$reporter_do_all" = "yes" -o "$reporter_do_setopt" = "yes"
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo '# Setopt.'
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		setopt | grep -v 'interactive' | ${AWK} '{print "setopt " $0}'
 | 
						|
 | 
						|
		case "$reporter_junkiequotes"
 | 
						|
		in
 | 
						|
			yes)	echo "setopt cshjunkiequotes" ;;
 | 
						|
			*)	;;
 | 
						|
		esac
 | 
						|
	) | sort
 | 
						|
fi
 | 
						|
 | 
						|
echo
 | 
						|
echo '# END zsh saveset'
 | 
						|
 | 
						|
#
 | 
						|
#	Don't put an exit here, or you'll get a nasty surprise when you
 | 
						|
#	source this thing.  Get rid of variables created when processing
 | 
						|
#	command line.
 | 
						|
#
 | 
						|
 | 
						|
unset reporter_do_all
 | 
						|
unset reporter_do_aliases
 | 
						|
unset reporter_do_bindings
 | 
						|
unset reporter_do_compctl
 | 
						|
unset reporter_do_fun
 | 
						|
unset reporter_do_lim
 | 
						|
unset reporter_do_setopt
 | 
						|
unset reporter_do_vars
 | 
						|
 | 
						|
#
 | 
						|
#	Turn cshjunkiequotes back on if necessary.
 | 
						|
#
 | 
						|
 | 
						|
case "$reporter_junkiequotes"
 | 
						|
in
 | 
						|
	yes)	setopt cshjunkiequotes ;;
 | 
						|
	*)	;;
 | 
						|
esac
 | 
						|
 | 
						|
unset reporter_junkiequotes
 | 
						|
 |