diff options
Diffstat (limited to 'Util/reporter')
-rw-r--r-- | Util/reporter | 444 |
1 files changed, 444 insertions, 0 deletions
diff --git a/Util/reporter b/Util/reporter new file mode 100644 index 000000000..8f8f530ae --- /dev/null +++ b/Util/reporter @@ -0,0 +1,444 @@ +#!/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 + |