mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-04 07:21:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			516 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			516 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/usr/local/bin/zsh
 | 
						|
#
 | 
						|
# NAME:
 | 
						|
#	reporter
 | 
						|
#
 | 
						|
# SYNOPSIS:
 | 
						|
#	reporter [all | aliases | bindings | completion | functions |
 | 
						|
#			limits | options | variables | zstyles]
 | 
						|
#
 | 
						|
# 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.
 | 
						|
#	"zstyles"	prints "zstyle" commands
 | 
						|
#
 | 
						|
#	"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_".
 | 
						|
#	Won't work for versions of zsh that are older than 3.1.3 or so.
 | 
						|
#
 | 
						|
# 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 reporter_each
 | 
						|
do
 | 
						|
	case "$reporter_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 ;;
 | 
						|
		zs*|s*)	reporter_do_zstyle=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.  Similarly "shwordsplit" and "kshoptionprint".
 | 
						|
#	We'll re-enable them later.
 | 
						|
#
 | 
						|
 | 
						|
reporter_junkiequotes="no"
 | 
						|
reporter_shwordsplit="no"
 | 
						|
reporter_kshoptprint="no"
 | 
						|
reporter_nounset="no"
 | 
						|
 | 
						|
if [[ -o cshjunkiequotes ]]
 | 
						|
then
 | 
						|
	reporter_junkiequotes="yes"
 | 
						|
	unsetopt cshjunkiequotes
 | 
						|
fi
 | 
						|
if [[ -o shwordsplit ]]
 | 
						|
then
 | 
						|
	reporter_shwordsplit="yes"
 | 
						|
	unsetopt shwordsplit
 | 
						|
fi
 | 
						|
if [[ -o kshoptionprint ]]
 | 
						|
then
 | 
						|
	reporter_kshoptprint="yes"
 | 
						|
	unsetopt kshoptionprint
 | 
						|
fi
 | 
						|
if [[ -o nounset ]]
 | 
						|
then
 | 
						|
	reporter_nounset="yes"
 | 
						|
	unsetopt nounset
 | 
						|
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 reporter_each in `echo $PATH | sed -e 's/:/ /g'`
 | 
						|
do
 | 
						|
	if [[ -x $reporter_each/uname ]]
 | 
						|
	then
 | 
						|
		reporter_uname="$reporter_each/uname"
 | 
						|
		break
 | 
						|
	fi
 | 
						|
done
 | 
						|
 | 
						|
case "$reporter_uname"
 | 
						|
in
 | 
						|
	"")	reporter_uname="echo not found on this system" ;;
 | 
						|
	*)	;;
 | 
						|
esac
 | 
						|
 | 
						|
for reporter_each in $reporter_cppdef
 | 
						|
do
 | 
						|
	case "$reporter_each"
 | 
						|
	in
 | 
						|
		pyr)	reporter_uname="/bin/att uname" ;;
 | 
						|
		*)	;;
 | 
						|
	esac
 | 
						|
done
 | 
						|
 | 
						|
echo '# START zsh saveset'
 | 
						|
echo '# uname: ' `eval $reporter_uname -a`
 | 
						|
echo
 | 
						|
 | 
						|
unset reporter_cppdef
 | 
						|
unset reporter_uname
 | 
						|
unset reporter_each
 | 
						|
 | 
						|
#
 | 
						|
#	ALIASES
 | 
						|
#
 | 
						|
#	Use "alias -L" to get a listing of the aliases in the form we want.
 | 
						|
#
 | 
						|
 | 
						|
if [[ "$reporter_do_all" = "yes" || "$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 [[ "$reporter_do_all" = "yes" || "$reporter_do_bindings" = "yes" ]]
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo "# Key bindings."
 | 
						|
	echo
 | 
						|
	bindkey -lL | grep -v ' \.safe$'
 | 
						|
	(
 | 
						|
		alias bindkey=bindkey
 | 
						|
		bindkey () {
 | 
						|
			[[ "$1" == "-N" ]] || return
 | 
						|
			[[ "$2" == "--" ]] && shift
 | 
						|
			[[ "$2" == ".safe" ]] && return
 | 
						|
			echo
 | 
						|
			builtin bindkey -L -M -- "$2"
 | 
						|
		}
 | 
						|
		eval "`builtin bindkey -lL`"
 | 
						|
	)
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	COMPLETION COMMANDS
 | 
						|
#	Warning:  this won't work for zsh-2.5.03.
 | 
						|
#
 | 
						|
 | 
						|
if [[ "$reporter_do_all" = "yes" || "$reporter_do_compctl" = "yes" ]]
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo "# Completions."
 | 
						|
	echo
 | 
						|
 | 
						|
	compctl -L
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	FUNCTIONS
 | 
						|
#
 | 
						|
 | 
						|
if [[ "$reporter_do_all" = "yes" || "$reporter_do_fun" = "yes" ]]
 | 
						|
then
 | 
						|
	echo 
 | 
						|
	echo "# Undefined functions."
 | 
						|
	echo
 | 
						|
 | 
						|
	autoload + | ${AWK} '{print "autoload " $1}'
 | 
						|
 | 
						|
	echo 
 | 
						|
	echo "# Defined functions."
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		unfunction `autoload +` 2>/dev/null
 | 
						|
		functions
 | 
						|
	)
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	LIMITS
 | 
						|
#
 | 
						|
#	"cputime" has to be handled specially, because you can specify
 | 
						|
#	the time as just hours, or "minutes:seconds".
 | 
						|
#
 | 
						|
 | 
						|
if [[ "$reporter_do_all" = "yes" || "$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 [[ "$reporter_do_all" = "yes" || "$reporter_do_mod" = "yes" ]]
 | 
						|
then
 | 
						|
	echo
 | 
						|
	if ( zmodload ) >& /dev/null; then
 | 
						|
		echo "# Modules."
 | 
						|
		echo
 | 
						|
		zmodload -d -L
 | 
						|
		echo
 | 
						|
		zmodload -ab -L
 | 
						|
		echo
 | 
						|
		zmodload -ac -L
 | 
						|
		echo
 | 
						|
		zmodload -ap -L
 | 
						|
		echo
 | 
						|
		zmodload -L
 | 
						|
	else
 | 
						|
		echo "# Modules: zmodload not available."
 | 
						|
	fi
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	NON-ARRAY VARIABLES
 | 
						|
#
 | 
						|
#	We run this in a subshell to preserve the parameter module state
 | 
						|
#	in the current shell.  Also, reset the prompt to show you're now
 | 
						|
#	in a test shell.
 | 
						|
#
 | 
						|
 | 
						|
if [[ "$reporter_do_all" = "yes" || "$reporter_do_vars" = "yes" ]]
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo "# Non-array variables."
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		zmodload -u `zmodload | grep parameter` 2>/dev/null
 | 
						|
 | 
						|
		echo "ARGC=0"
 | 
						|
		eval `typeset + |
 | 
						|
			grep -v 'array ' |
 | 
						|
			grep -v 'association ' |
 | 
						|
			grep -v 'undefined ' |
 | 
						|
			grep -v ' ARGC$' |
 | 
						|
			grep -v '^reporter_' |
 | 
						|
			grep -wv '[!#$*0?@_-]$' |
 | 
						|
			sed -e 's/.* \(.*\)/print -r -- \1=${(qq)\1};/' \
 | 
						|
			    -e 's/^\([^ ]*\)$/print -r -- \1=${(qq)\1};/'`
 | 
						|
		echo "prompt='test%'"
 | 
						|
	)
 | 
						|
 | 
						|
#
 | 
						|
#	ARRAY VARIABLES
 | 
						|
#
 | 
						|
#	Run this in a subshell to preserve the parameter module state in
 | 
						|
#	the current shell.
 | 
						|
#
 | 
						|
 | 
						|
	echo
 | 
						|
	echo "# Array variables."
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		zmodload -u `zmodload | grep parameter` 2>/dev/null
 | 
						|
 | 
						|
		echo "argv=()"
 | 
						|
		eval `{ typeset + | grep 'array ' ;
 | 
						|
				typeset + | grep 'association ' } |
 | 
						|
			grep -v 'undefined ' |
 | 
						|
			grep -v ' argv$' |
 | 
						|
			grep -v ' reporter_' |
 | 
						|
			grep -v ' [!#$*0?@_-]$' |
 | 
						|
			sed 's/.* \(.*\)/print -r -- \1=\\\(${(qq)\1}\\\);/'`
 | 
						|
	)
 | 
						|
 | 
						|
#
 | 
						|
#	EXPORTED VARIABLES
 | 
						|
#
 | 
						|
#	Run this in a subshell to preserve the parameter module state in
 | 
						|
#	the current shell.
 | 
						|
#
 | 
						|
 | 
						|
	echo
 | 
						|
	echo "# Exported variables."
 | 
						|
	echo
 | 
						|
 | 
						|
	(
 | 
						|
		zmodload -u `zmodload | grep parameter` 2>/dev/null
 | 
						|
 | 
						|
		export | grep -v "^'*"'[!#$*0?@_-]'"'*=" |
 | 
						|
			${AWK} -F'=' '{print "export " $1}'
 | 
						|
	)
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	SETOPT
 | 
						|
#
 | 
						|
#	We exclude interactive because "setopt interactive" has no effect.
 | 
						|
#	A few special options are dealt with separately; see the comments
 | 
						|
#	near the start of the script.
 | 
						|
#
 | 
						|
 | 
						|
if [[ "$reporter_do_all" = "yes" || "$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
 | 
						|
		case "$reporter_shwordsplit"
 | 
						|
		in
 | 
						|
			yes)	echo "setopt shwordsplit" ;;
 | 
						|
			*)	;;
 | 
						|
		esac
 | 
						|
		case "$reporter_kshoptprint"
 | 
						|
		in
 | 
						|
			yes)	echo "setopt kshoptionprint" ;;
 | 
						|
			*)	;;
 | 
						|
		esac
 | 
						|
		case "$reporter_nounset"
 | 
						|
		in
 | 
						|
			yes)	echo "setopt nounset" ;;
 | 
						|
			*)	;;
 | 
						|
		esac
 | 
						|
	) | sort
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
#	STYLES
 | 
						|
#
 | 
						|
 | 
						|
if [[ "$reporter_do_all" = "yes" || "$reporter_do_zstyle" = "yes" ]]
 | 
						|
then
 | 
						|
	echo
 | 
						|
	echo '# Styles.'
 | 
						|
	echo
 | 
						|
 | 
						|
	zstyle -L
 | 
						|
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 various options back on if necessary, in case run via ".".
 | 
						|
#
 | 
						|
 | 
						|
case "$reporter_junkiequotes"
 | 
						|
in
 | 
						|
	yes)	setopt cshjunkiequotes ;;
 | 
						|
	*)	;;
 | 
						|
esac
 | 
						|
case "$reporter_shwordsplit"
 | 
						|
in
 | 
						|
	yes)	setopt shwordsplit ;;
 | 
						|
	*)	;;
 | 
						|
esac
 | 
						|
case "$reporter_kshoptprint"
 | 
						|
in
 | 
						|
	yes)	setopt kshoptionprint ;;
 | 
						|
	*)	;;
 | 
						|
esac
 | 
						|
case "$reporter_nounset"
 | 
						|
in
 | 
						|
	yes)	setopt nounset ;;
 | 
						|
	*)	;;
 | 
						|
esac
 | 
						|
 | 
						|
unset reporter_junkiequotes
 | 
						|
unset reporter_shwordsplit
 | 
						|
unset reporter_kshoptprint
 | 
						|
unset reporter_nounset
 | 
						|
 | 
						|
unset reporter_OSVersion
 |