summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compfix.zsh60
-rw-r--r--lib/diagnostics.zsh335
-rw-r--r--lib/functions.zsh132
-rw-r--r--lib/git.zsh5
-rw-r--r--lib/termsupport.zsh37
-rw-r--r--lib/theme-and-appearance.zsh7
-rw-r--r--oh-my-zsh.sh14
-rw-r--r--plugins/capistrano/_capistrano53
-rw-r--r--plugins/capistrano/capistrano.plugin.zsh11
-rw-r--r--plugins/coffee/coffee.plugin.zsh4
-rw-r--r--plugins/git-extras/git-extras.plugin.zsh194
-rw-r--r--plugins/gnu-utils/gnu-utils.plugin.zsh5
-rw-r--r--plugins/gradle/gradle.plugin.zsh2
-rw-r--r--plugins/gulp/gulp.plugin.zsh29
-rw-r--r--plugins/npm/npm.plugin.zsh3
-rw-r--r--plugins/osx/osx.plugin.zsh84
-rw-r--r--plugins/rails/rails.plugin.zsh4
-rw-r--r--plugins/scw/README.md7
-rw-r--r--plugins/scw/_scw333
-rw-r--r--plugins/sudo/sudo.plugin.zsh6
-rw-r--r--plugins/svn/svn.plugin.zsh10
-rw-r--r--plugins/terminalapp/terminalapp.plugin.zsh45
-rw-r--r--themes/dogenpunk.zsh-theme2
-rw-r--r--themes/gnzh.zsh-theme57
-rw-r--r--themes/michelebologna.zsh-theme15
-rw-r--r--themes/steeef.zsh-theme18
-rwxr-xr-xtools/install.sh18
27 files changed, 1253 insertions, 237 deletions
diff --git a/lib/compfix.zsh b/lib/compfix.zsh
new file mode 100644
index 000000000..208aaadb1
--- /dev/null
+++ b/lib/compfix.zsh
@@ -0,0 +1,60 @@
+# Handle completions insecurities (i.e., completion-dependent directories with
+# insecure ownership or permissions) by:
+#
+# * Human-readably notifying the user of these insecurities.
+# * Moving away all existing completion caches to a temporary directory. Since
+# any of these caches may have been generated from insecure directories, they
+# are all suspect now. Failing to do so typically causes subsequent compinit()
+# calls to fail with "command not found: compdef" errors. (That's bad.)
+function handle_completion_insecurities() {
+ # List of the absolute paths of all unique insecure directories, split on
+ # newline from compaudit()'s output resembling:
+ #
+ # There are insecure directories:
+ # /usr/share/zsh/site-functions
+ # /usr/share/zsh/5.0.6/functions
+ # /usr/share/zsh
+ # /usr/share/zsh/5.0.6
+ #
+ # Since the ignorable first line is printed to stderr and thus not captured,
+ # stderr is squelched to prevent this output from leaking to the user.
+ local -aU insecure_dirs
+ insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} )
+
+ # If no such directories exist, get us out of here.
+ if (( ! ${#insecure_dirs} )); then
+ print "[oh-my-zsh] No insecure completion-dependent directories detected."
+ return
+ fi
+
+ # List ownership and permissions of all insecure directories.
+ print "[oh-my-zsh] Insecure completion-dependent directories detected:"
+ ls -ld "${(@)insecure_dirs}"
+ print "[oh-my-zsh] For safety, completions will be disabled until you manually fix all"
+ print "[oh-my-zsh] insecure directory permissions and ownership and restart oh-my-zsh."
+ print "[oh-my-zsh] See the above list for directories with group or other writability.\n"
+
+ # Locally enable the "NULL_GLOB" option, thus removing unmatched filename
+ # globs from argument lists *AND* printing no warning when doing so. Failing
+ # to do so prints an unreadable warning if no completion caches exist below.
+ setopt local_options null_glob
+
+ # List of the absolute paths of all unique existing completion caches.
+ local -aU zcompdump_files
+ zcompdump_files=( "${ZSH_COMPDUMP}"(.) "${ZDOTDIR:-${HOME}}"/.zcompdump* )
+
+ # Move such caches to a temporary directory.
+ if (( ${#zcompdump_files} )); then
+ # Absolute path of the directory to which such files will be moved.
+ local ZSH_ZCOMPDUMP_BAD_DIR="${ZSH_CACHE_DIR}/zcompdump-bad"
+
+ # List such files first.
+ print "[oh-my-zsh] Insecure completion caches also detected:"
+ ls -l "${(@)zcompdump_files}"
+
+ # For safety, move rather than permanently remove such files.
+ print "[oh-my-zsh] Moving to \"${ZSH_ZCOMPDUMP_BAD_DIR}/\"...\n"
+ mkdir -p "${ZSH_ZCOMPDUMP_BAD_DIR}"
+ mv "${(@)zcompdump_files}" "${ZSH_ZCOMPDUMP_BAD_DIR}/"
+ fi
+}
diff --git a/lib/diagnostics.zsh b/lib/diagnostics.zsh
new file mode 100644
index 000000000..afc33829b
--- /dev/null
+++ b/lib/diagnostics.zsh
@@ -0,0 +1,335 @@
+# diagnostics.zsh
+#
+# Diagnostic and debugging support for oh-my-zsh
+
+# omz_diagnostic_dump()
+#
+# Author: Andrew Janke <andrew@apjanke.net>
+#
+# Usage:
+#
+# omz_diagnostic_dump [-v] [-V] [file]
+#
+# NOTE: This is a work in progress. Its interface and behavior are going to change,
+# and probably in non-back-compatible ways.
+#
+# Outputs a bunch of information about the state and configuration of
+# oh-my-zsh, zsh, and the user's system. This is intended to provide a
+# bunch of context for diagnosing your own or a third party's problems, and to
+# be suitable for posting to public bug reports.
+#
+# The output is human-readable and its format may change over time. It is not
+# suitable for parsing. All the output is in one single file so it can be posted
+# as a gist or bug comment on GitHub. GitHub doesn't support attaching tarballs
+# or other files to bugs; otherwise, this would probably have an option to produce
+# tarballs that contain copies of the config and customization files instead of
+# catting them all in to one file.
+#
+# This is intended to be widely portable, and run anywhere that oh-my-zsh does.
+# Feel free to report any portability issues as bugs.
+#
+# This is written in a defensive style so it still works (and can detect) cases when
+# basic functionality like echo and which have been redefined. In particular, almost
+# everything is invoked with "builtin" or "command", to work in the face of user
+# redefinitions.
+#
+# OPTIONS
+#
+# [file] Specifies the output file. If not given, a file in the current directory
+# is selected automatically.
+#
+# -v Increase the verbosity of the dump output. May be specified multiple times.
+# Verbosity levels:
+# 0 - Basic info, shell state, omz configuration, git state
+# 1 - (default) Adds key binding info and configuration file contents
+# 2 - Adds zcompdump file contents
+#
+# -V Reduce the verbosity of the dump output. May be specified multiple times.
+#
+# TODO:
+# * Multi-file capture
+# * Add automatic gist uploading
+# * Consider whether to move default output file location to TMPDIR. More robust
+# but less user friendly.
+#
+function omz_diagnostic_dump() {
+ emulate -L zsh
+
+ builtin echo "Generating diagnostic dump; please be patient..."
+
+ local thisfcn=omz_diagnostic_dump
+ local -A opts
+ local opt_verbose opt_noverbose opt_outfile
+ local timestamp=$(date +%Y%m%d-%H%M%S)
+ local outfile=omz_diagdump_$timestamp.txt
+ builtin zparseopts -A opts -D -- "v+=opt_verbose" "V+=opt_noverbose"
+ local verbose n_verbose=${#opt_verbose} n_noverbose=${#opt_noverbose}
+ (( verbose = 1 + n_verbose - n_noverbose ))
+
+ if [[ ${#*} > 0 ]]; then
+ opt_outfile=$1
+ fi
+ if [[ ${#*} > 1 ]]; then
+ builtin echo "$thisfcn: error: too many arguments" >&2
+ return 1
+ fi
+ if [[ -n "$opt_outfile" ]]; then
+ outfile="$opt_outfile"
+ fi
+
+ # Always write directly to a file so terminal escape sequences are
+ # captured cleanly
+ _omz_diag_dump_one_big_text &> "$outfile"
+ if [[ $? != 0 ]]; then
+ builtin echo "$thisfcn: error while creating diagnostic dump; see $outfile for details"
+ fi
+
+ builtin echo
+ builtin echo Diagnostic dump file created at: "$outfile"
+ builtin echo
+ builtin echo To share this with OMZ developers, post it as a gist on GitHub
+ builtin echo at "https://gist.github.com" and share the link to the gist.
+ builtin echo
+ builtin echo "WARNING: This dump file contains all your zsh and omz configuration files,"
+ builtin echo "so don't share it publicly if there's sensitive information in them."
+ builtin echo
+
+}
+
+function _omz_diag_dump_one_big_text() {
+ local program programs progfile md5
+
+ builtin echo oh-my-zsh diagnostic dump
+ builtin echo
+ builtin echo $outfile
+ builtin echo
+
+ # Basic system and zsh information
+ command date
+ command uname -a
+ builtin echo OSTYPE=$OSTYPE
+ builtin echo ZSH_VERSION=$ZSH_VERSION
+ builtin echo User: $USER
+ builtin echo umask: $(umask)
+ builtin echo
+ _omz_diag_dump_os_specific_version
+ builtin echo
+
+ # Installed programs
+ programs=(sh zsh ksh bash sed cat grep ls find git posh)
+ local progfile="" extra_str="" sha_str=""
+ for program in $programs; do
+ extra_str="" sha_str=""
+ progfile=$(builtin which $program)
+ if [[ $? == 0 ]]; then
+ if [[ -e $progfile ]]; then
+ if builtin whence shasum &>/dev/null; then
+ sha_str=($(command shasum $progfile))
+ sha_str=$sha_str[1]
+ extra_str+=" SHA $sha_str"
+ fi
+ if [[ -h "$progfile" ]]; then
+ extra_str+=" ( -> ${progfile:A} )"
+ fi
+ fi
+ builtin printf '%-9s %-20s %s\n' "$program is" "$progfile" "$extra_str"
+ else
+ builtin echo "$program: not found"
+ fi
+ done
+ builtin echo
+ builtin echo Command Versions:
+ builtin echo "zsh: $(zsh --version)"
+ builtin echo "this zsh session: $ZSH_VERSION"
+ builtin echo "bash: $(bash --version | command grep bash)"
+ builtin echo "git: $(git --version)"
+ builtin echo "grep: $(grep --version)"
+ builtin echo
+
+ # Core command definitions
+ _omz_diag_dump_check_core_commands || return 1
+ builtin echo
+
+ # ZSH Process state
+ builtin echo Process state:
+ builtin echo pwd: $PWD
+ if builtin whence pstree &>/dev/null; then
+ builtin echo Process tree for this shell:
+ pstree -p $$
+ else
+ ps -fT
+ fi
+ builtin set | command grep -a '^\(ZSH\|plugins\|TERM\|LC_\|LANG\|precmd\|chpwd\|preexec\|FPATH\|TTY\|DISPLAY\|PATH\)\|OMZ'
+ builtin echo
+ #TODO: Should this include `env` instead of or in addition to `export`?
+ builtin echo Exported:
+ builtin echo $(builtin export | command sed 's/=.*//')
+ builtin echo
+ builtin echo Locale:
+ command locale
+ builtin echo
+
+ # Zsh installation and configuration
+ builtin echo Zsh configuration:
+ builtin echo setopt: $(builtin setopt)
+ builtin echo
+ builtin echo zstyle:
+ builtin zstyle
+ builtin echo
+ builtin echo 'compaudit output:'
+ compaudit
+ builtin echo
+ builtin echo '$fpath directories:'
+ command ls -lad $fpath
+ builtin echo
+
+ # Oh-my-zsh installation
+ builtin echo oh-my-zsh installation:
+ command ls -ld ~/.z*
+ command ls -ld ~/.oh*
+ builtin echo
+ builtin echo oh-my-zsh git state:
+ (cd $ZSH && builtin echo "HEAD: $(git rev-parse HEAD)" && git remote -v && git status | command grep "[^[:space:]]")
+ if [[ $verbose -ge 1 ]]; then
+ (cd $ZSH && git reflog --date=default | command grep pull)
+ fi
+ builtin echo
+ if [[ -e $ZSH_CUSTOM ]]; then
+ local custom_dir=$ZSH_CUSTOM
+ if [[ -h $custom_dir ]]; then
+ custom_dir=$(cd $custom_dir && pwd -P)
+ fi
+ builtin echo "oh-my-zsh custom dir:"
+ builtin echo " $ZSH_CUSTOM ($custom_dir)"
+ (cd ${custom_dir:h} && command find ${custom_dir:t} -name .git -prune -o -print)
+ builtin echo
+ fi
+
+ # Key binding and terminal info
+ if [[ $verbose -ge 1 ]]; then
+ builtin echo "bindkey:"
+ builtin bindkey
+ builtin echo
+ builtin echo "infocmp:"
+ command infocmp -L
+ builtin echo
+ fi
+
+ # Configuration file info
+ local zdotdir=${ZDOTDIR:-$HOME}
+ builtin echo "Zsh configuration files:"
+ local cfgfile cfgfiles
+ # Some files for bash that zsh does not use are intentionally included
+ # to help with diagnosing behavior differences between bash and zsh
+ cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout
+ $zdotdir/.zshenv $zdotdir/.zprofile $zdotdir/.zshrc $zdotdir/.zlogin $zdotdir/.zlogout
+ ~/.zsh.pre-oh-my-zsh
+ /etc/bashrc /etc/profile ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_logout )
+ command ls -lad $cfgfiles 2>&1
+ builtin echo
+ if [[ $verbose -ge 1 ]]; then
+ for cfgfile in $cfgfiles; do
+ _omz_diag_dump_echo_file_w_header $cfgfile
+ done
+ fi
+ builtin echo
+ builtin echo "Zsh compdump files:"
+ local dumpfile dumpfiles
+ command ls -lad $zdotdir/.zcompdump*
+ dumpfiles=( $zdotdir/.zcompdump*(N) )
+ if [[ $verbose -ge 2 ]]; then
+ for dumpfile in $dumpfiles; do
+ _omz_diag_dump_echo_file_w_header $dumpfile
+ done
+ fi
+
+}
+
+function _omz_diag_dump_check_core_commands() {
+ builtin echo "Core command check:"
+ local redefined name builtins externals
+ redefined=()
+ # All the zsh non-module builtin commands
+ # These are taken from the zsh reference manual for 5.0.2
+ # Commands from modules should not be included.
+ # (For back-compatibility, if any of these are newish, they should be removed,
+ # or at least made conditional on the version of the current running zsh.)
+ # "history" is also excluded because OMZ is known to redefine that
+ builtins=( alias autoload bg bindkey break builtin bye cd chdir command
+ comparguments compcall compctl compdescribe compfiles compgroups compquote comptags
+ comptry compvalues continue declare dirs disable disown echo echotc echoti emulate
+ enable eval exec exit export false fc fg float functions getln getopts hash
+ integer jobs kill let limit local log logout noglob popd print printf
+ pushd pushln pwd r read readonly rehash return sched set setopt shift
+ source suspend test times trap true ttyctl type typeset ulimit umask unalias
+ unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile
+ zle zmodload zparseopts zregexparse zstyle )
+ builtins_fatal=( builtin command local )
+ externals=( zsh )
+ for name in $builtins; do
+ if [[ $(builtin whence -w $name) != "$name: builtin" ]]; then
+ builtin echo "builtin '$name' has been redefined"
+ builtin which $name
+ redefined+=$name
+ fi
+ done
+ for name in $externals; do
+ if [[ $(builtin whence -w $name) != "$name: command" ]]; then
+ builtin echo "command '$name' has been redefined"
+ builtin which $name
+ redefined+=$name
+ fi
+ done
+
+ if [[ -n "$redefined" ]]; then
+ builtin echo "SOME CORE COMMANDS HAVE BEEN REDEFINED: $redefined"
+ else
+ builtin echo "All core commands are defined normally"
+ fi
+
+}
+
+function _omz_diag_dump_echo_file_w_header() {
+ local file=$1
+ if [[ ( -f $file || -h $file ) ]]; then
+ builtin echo "========== $file =========="
+ if [[ -h $file ]]; then
+ builtin echo "========== ( => ${file:A} ) =========="
+ fi
+ command cat $file
+ builtin echo "========== end $file =========="
+ builtin echo
+ elif [[ -d $file ]]; then
+ builtin echo "File '$file' is a directory"
+ elif [[ ! -e $file ]]; then
+ builtin echo "File '$file' does not exist"
+ else
+ command ls -lad "$file"
+ fi
+}
+
+function _omz_diag_dump_os_specific_version() {
+ local osname osver version_file version_files
+ case "$OSTYPE" in
+ darwin*)
+ osname=$(command sw_vers -productName)
+ osver=$(command sw_vers -productVersion)
+ builtin echo "OS Version: $osname $osver build $(sw_vers -buildVersion)"
+ ;;
+ cygwin)
+ command systeminfo | command head -4 | command tail -2
+ ;;
+ esac
+
+ if builtin which lsb_release >/dev/null; then
+ builtin echo "OS Release: $(command lsb_release -s -d)"
+ fi
+
+ version_files=( /etc/*-release(N) /etc/*-version(N) /etc/*_version(N) )
+ for version_file in $version_files; do
+ builtin echo "$version_file:"
+ command cat "$version_file"
+ builtin echo
+ done
+}
+
diff --git a/lib/functions.zsh b/lib/functions.zsh
index 0d632a268..efb73a1bd 100644
--- a/lib/functions.zsh
+++ b/lib/functions.zsh
@@ -89,3 +89,135 @@ function env_default() {
env | grep -q "^$1=" && return 0
export "$1=$2" && return 3
}
+
+
+# Required for $langinfo
+zmodload zsh/langinfo
+
+# URL-encode a string
+#
+# Encodes a string using RFC 2396 URL-encoding (%-escaped).
+# See: https://www.ietf.org/rfc/rfc2396.txt
+#
+# By default, reserved characters and unreserved "mark" characters are
+# not escaped by this function. This allows the common usage of passing
+# an entire URL in, and encoding just special characters in it, with
+# the expectation that reserved and mark characters are used appropriately.
+# The -r and -m options turn on escaping of the reserved and mark characters,
+# respectively, which allows arbitrary strings to be fully escaped for
+# embedding inside URLs, where reserved characters might be misinterpreted.
+#
+# Prints the encoded string on stdout.
+# Returns nonzero if encoding failed.
+#
+# Usage:
+# omz_urlencode [-r] [-m] <string>
+#
+# -r causes reserved characters (;/?:@&=+$,) to be escaped
+#
+# -m causes "mark" characters (_.!~*''()-) to be escaped
+#
+# -P causes spaces to be encoded as '%20' instead of '+'
+function omz_urlencode() {
+ emulate -L zsh
+ zparseopts -D -E -a opts r m P
+
+ local in_str=$1
+ local url_str=""
+ local spaces_as_plus
+ if [[ -z $opts[(r)-P] ]]; then spaces_as_plus=1; fi
+ local str="$in_str"
+
+ # URLs must use UTF-8 encoding; convert str to UTF-8 if required
+ local encoding=$langinfo[CODESET]
+ local safe_encodings
+ safe_encodings=(UTF-8 utf8 US-ASCII)
+ if [[ -z ${safe_encodings[(r)$encoding]} ]]; then
+ str=$(echo -E "$str" | iconv -f $encoding -t UTF-8)
+ if [[ $? != 0 ]]; then
+ echo "Error converting string from $encoding to UTF-8" >&2
+ return 1
+ fi
+ fi
+
+ # Use LC_CTYPE=C to process text byte-by-byte
+ local i byte ord LC_ALL=C
+ export LC_ALL
+ local reserved=';/?:@&=+$,'
+ local mark='_.!~*''()-'
+ local dont_escape="[A-Za-z0-9"
+ if [[ -z $opts[(r)-r] ]]; then
+ dont_escape+=$reserved
+ fi
+ # $mark must be last because of the "-"
+ if [[ -z $opts[(r)-m] ]]; then
+ dont_escape+=$mark
+ fi
+ dont_escape+="]"
+
+ # Implemented to use a single printf call and avoid subshells in the loop,
+ # for performance (primarily on Windows).
+ local url_str=""
+ for (( i = 1; i <= ${#str}; ++i )); do
+ byte="$str[i]"
+ if [[ "$byte" =~ "$dont_escape" ]]; then
+ url_str+="$byte"
+ else
+ if [[ "$byte" == " " && -n $spaces_as_plus ]]; then
+ url_str+="+"
+ else
+ ord=$(( [##16] #byte ))
+ url_str+="%$ord"
+ fi
+ fi
+ done
+ echo -E "$url_str"
+}
+
+# URL-decode a string
+#
+# Decodes a RFC 2396 URL-encoded (%-escaped) string.
+# This decodes the '+' and '%' escapes in the input string, and leaves
+# other characters unchanged. Does not enforce that the input is a
+# valid URL-encoded string. This is a convenience to allow callers to
+# pass in a full URL or similar strings and decode them for human
+# presentation.
+#
+# Outputs the encoded string on stdout.
+# Returns nonzero if encoding failed.
+#
+# Usage:
+# omz_urldecode <urlstring> - prints decoded string followed by a newline
+function omz_urldecode {
+ emulate -L zsh
+ local encoded_url=$1
+
+ # Work bytewise, since URLs escape UTF-8 octets
+ local caller_encoding=$langinfo[CODESET]
+ local LC_ALL=C
+ export LC_ALL
+
+ # Change + back to ' '
+ local tmp=${encoded_url:gs/+/ /}
+ # Protect other escapes to pass through the printf unchanged
+ tmp=${tmp:gs/\\/\\\\/}
+ # Handle %-escapes by turning them into `\xXX` printf escapes
+ tmp=${tmp:gs/%/\\x/}
+ local decoded
+ eval "decoded=\$'$tmp'"
+
+ # Now we have a UTF-8 encoded string in the variable. We need to re-encode
+ # it if caller is in a non-UTF-8 locale.
+ local safe_encodings
+ safe_encodings=(UTF-8 utf8 US-ASCII)
+ if [[ -z ${safe_encodings[(r)$caller_encoding]} ]]; then
+ decoded=$(echo -E "$decoded" | iconv -f UTF-8 -t $caller_encoding)
+ if [[ $? != 0 ]]; then
+ echo "Error converting string from UTF-8 to $caller_encoding" >&2
+ return 1
+ fi
+ fi
+
+ echo -E "$decoded"
+}
+
diff --git a/lib/git.zsh b/lib/git.zsh
index caa7e6329..baf863717 100644
--- a/lib/git.zsh
+++ b/lib/git.zsh
@@ -36,7 +36,10 @@ git_remote_status() {
ahead=$(command git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l)
behind=$(command git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l)
- if [ $ahead -gt 0 ] && [ $behind -eq 0 ]
+ if [ $ahead -eq 0 ] && [ $behind -eq 0 ]
+ then
+ echo "$ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE"
+ elif [ $ahead -gt 0 ] && [ $behind -eq 0 ]
then
git_remote_status="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE"
git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}"
diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index babbaa957..5f61fe8ef 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -33,6 +33,7 @@ fi
# Runs before showing the prompt
function omz_termsupport_precmd {
+ emulate -L zsh
if [[ $DISABLE_AUTO_TITLE == true ]]; then
return
fi
@@ -42,11 +43,11 @@ function omz_termsupport_precmd {
# Runs before executing the command
function omz_termsupport_preexec {
+ emulate -L zsh
if [[ $DISABLE_AUTO_TITLE == true ]]; then
return
fi
- emulate -L zsh
setopt extended_glob
# cmd name only, or if this is sudo or ssh, the next cmd
@@ -60,14 +61,28 @@ precmd_functions+=(omz_termsupport_precmd)
preexec_functions+=(omz_termsupport_preexec)
-# Runs before showing the prompt, to update the current directory in Terminal.app
-function omz_termsupport_cwd {
- # Notify Terminal.app of current directory using undocumented OSC sequence
- # found in OS X 10.9 and 10.10's /etc/bashrc
- if [[ $TERM_PROGRAM == Apple_Terminal ]] && [[ -z $INSIDE_EMACS ]]; then
- local PWD_URL="file://$HOSTNAME${PWD// /%20}"
- printf '\e]7;%s\a' "$PWD_URL"
- fi
-}
+# Keep Apple Terminal.app's current working directory updated
+# Based on this answer: http://superuser.com/a/315029
+# With extra fixes to handle multibyte chars and non-UTF-8 locales
-precmd_functions+=(omz_termsupport_cwd)
+if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
+
+ # Emits the control sequence to notify Terminal.app of the cwd
+ function update_terminalapp_cwd() {
+ emulate -L zsh
+ # Identify the directory using a "file:" scheme URL, including
+ # the host name to disambiguate local vs. remote paths.
+
+ # Percent-encode the pathname.
+ local URL_PATH=$(omz_urlencode -P $PWD)
+ [[ $? != 0 ]] && return 1
+ local PWD_URL="file://$HOST$URL_PATH"
+ # Undocumented Terminal.app-specific control sequence
+ printf '\e]7;%s\a' $PWD_URL
+ }
+
+ # Use a precmd hook instead of a chpwd hook to avoid contaminating output
+ precmd_functions+=(update_terminalapp_cwd)
+ # Run once to get initial cwd set
+ update_terminalapp_cwd
+fi
diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh
index 926303ca4..ebb11fb31 100644
--- a/lib/theme-and-appearance.zsh
+++ b/lib/theme-and-appearance.zsh
@@ -11,8 +11,11 @@ then
# otherwise, leave ls as is, because NetBSD's ls doesn't support -G
gls --color -d . &>/dev/null 2>&1 && alias ls='gls --color=tty'
elif [[ "$(uname -s)" == "OpenBSD" ]]; then
- # On OpenBSD, test if "colorls" is installed (this one supports colors);
- # otherwise, leave ls as is, because OpenBSD's ls doesn't support -G
+ # On OpenBSD, "gls" (ls from GNU coreutils) and "colorls" (ls from base,
+ # with color and multibyte support) are available from ports. "colorls"
+ # will be installed on purpose and can't be pulled in by installing
+ # coreutils, so prefer it to "gls".
+ gls --color -d . &>/dev/null 2>&1 && alias ls='gls --color=tty'
colorls -G -d . &>/dev/null 2>&1 && alias ls='colorls -G'
else
ls --color -d . &>/dev/null 2>&1 && alias ls='ls --color=tty' || alias ls='ls -G'
diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh
index 4e5f77990..8e31ddd0f 100644
--- a/oh-my-zsh.sh
+++ b/oh-my-zsh.sh
@@ -8,6 +8,9 @@ fi
# add a function path
fpath=($ZSH/functions $ZSH/completions $fpath)
+# Load all stock functions (from $fpath files) called below.
+autoload -U compaudit compinit
+
# Set ZSH_CUSTOM to the path where your custom config files
# and plugins exists, or else we will use the default custom/
if [[ -z "$ZSH_CUSTOM" ]]; then
@@ -59,9 +62,14 @@ if [ -z "$ZSH_COMPDUMP" ]; then
ZSH_COMPDUMP="${ZDOTDIR:-${HOME}}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
fi
-# Load and run compinit
-autoload -U compinit
-compinit -i -d "${ZSH_COMPDUMP}"
+# If completion insecurities exist, warn the user without enabling completions.
+if ! compaudit &>/dev/null; then
+ # This function resides in the "lib/compfix.zsh" script sourced above.
+ handle_completion_insecurities
+# Else, enable and cache completions to the desired file.
+else
+ compinit -d "${ZSH_COMPDUMP}"
+fi
# Load all of the plugins that were defined in ~/.zshrc
for plugin ($plugins); do
diff --git a/plugins/capistrano/_capistrano b/plugins/capistrano/_capistrano
index 3cadf3d54..e6e71ffcc 100644
--- a/plugins/capistrano/_capistrano
+++ b/plugins/capistrano/_capistrano
@@ -1,10 +1,49 @@
-#compdef cap
+#compdef shipit
#autoload
-if [[ -f config/deploy.rb || -f Capfile ]]; then
- if [[ ! -f .cap_tasks~ || config/deploy.rb -nt .cap_tasks~ ]]; then
- echo "\nGenerating .cap_tasks~..." > /dev/stderr
- cap -v --tasks | grep '#' | cut -d " " -f 2 > .cap_tasks~
+# Added `shipit` because `cap` is a reserved word. `cap` completion doesn't work.
+# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
+
+local curcontext="$curcontext" state line ret=1
+local -a _configs
+
+_arguments -C \
+ '1: :->cmds' \
+ '2:: :->args' && ret=0
+
+_cap_tasks() {
+ if [[ -f config/deploy.rb || -f Capfile ]]; then
+ if [[ ! -f .cap_tasks~ ]]; then
+ shipit -v --tasks | sed 's/\(\[\)\(.*\)\(\]\)/\2:/' | awk '{command=$2; $1=$2=$3=""; gsub(/^[ \t\r\n]+/, "", $0); gsub(":", "\\:", command); print command"["$0"]"}' > .cap_tasks~
+ fi
+
+ OLD_IFS=$IFS
+ IFS=$'\n'
+ _values 'cap commands' $(< .cap_tasks~)
+ IFS=$OLD_IFS
+ # zmodload zsh/mapfile
+ # _values ${(f)mapfile[.cap_tasks~]}
fi
- compadd `cat .cap_tasks~`
-fi
+}
+
+_cap_stages() {
+ compadd $(find config/deploy -name \*.rb | cut -d/ -f3 | sed s:.rb::g)
+}
+
+case $state in
+ cmds)
+ # check if it uses multistage
+ if [[ -d config/deploy ]]; then
+ _cap_stages
+ else
+ _cap_tasks
+ fi
+ ret=0
+ ;;
+ args)
+ _cap_tasks
+ ret=0
+ ;;
+esac
+
+return ret
diff --git a/plugins/capistrano/capistrano.plugin.zsh b/plugins/capistrano/capistrano.plugin.zsh
new file mode 100644
index 000000000..c85eb474c
--- /dev/null
+++ b/plugins/capistrano/capistrano.plugin.zsh
@@ -0,0 +1,11 @@
+# Added `shipit` because `cap` is a reserved word. `cap` completion doesn't work.
+# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
+
+func shipit() {
+ if [ -f Gemfile ]
+ then
+ bundle exec cap $*
+ else
+ cap $*
+ fi
+}
diff --git a/plugins/coffee/coffee.plugin.zsh b/plugins/coffee/coffee.plugin.zsh
index 1a7bedd87..4e98e0228 100644
--- a/plugins/coffee/coffee.plugin.zsh
+++ b/plugins/coffee/coffee.plugin.zsh
@@ -2,11 +2,11 @@
# compile a string of coffeescript and print to output
cf () {
- coffee -peb $1
+ coffee -peb "$1"
}
# compile & copy to clipboard
cfc () {
- cf $1 | pbcopy
+ cf "$1" | pbcopy
}
# compile from pasteboard & print
diff --git a/plugins/git-extras/git-extras.plugin.zsh b/plugins/git-extras/git-extras.plugin.zsh
index 8419166ab..d91c1af81 100644
--- a/plugins/git-extras/git-extras.plugin.zsh
+++ b/plugins/git-extras/git-extras.plugin.zsh
@@ -3,19 +3,20 @@
# Description
# -----------
#
-# Completion script for git-extras (http://github.com/visionmedia/git-extras).
+# Completion script for git-extras (http://github.com/tj/git-extras).
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Alexis GRIMALDI (https://github.com/agrimaldi)
+# * spacewander (https://github.com/spacewander)
#
# ------------------------------------------------------------------------------
# Inspirations
# -----------
#
-# * git-extras (http://github.com/visionmedia/git-extras)
+# * git-extras (http://github.com/tj/git-extras)
# * git-flow-completion (http://github.com/bobthecow/git-flow-completion)
#
# ------------------------------------------------------------------------------
@@ -30,10 +31,21 @@ __git_command_successful () {
}
+__git_commits() {
+ declare -A commits
+ git log --oneline -15 | sed 's/\([[:alnum:]]\{7\}\) /\1:/' | while read commit
+ do
+ hash=$(echo $commit | cut -d':' -f1)
+ commits[$hash]="$commit"
+ done
+ local ret=1
+ _describe -t commits commit commits && ret=0
+}
+
__git_tag_names() {
local expl
declare -a tag_names
- tag_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/})
+ tag_names=(${${(f)"$(_call_program tags git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/})
__git_command_successful || return
_wanted tag-names expl tag-name compadd $* - $tag_names
}
@@ -47,31 +59,27 @@ __git_branch_names() {
_wanted branch-names expl branch-name compadd $* - $branch_names
}
-
-__git_feature_branch_names() {
+__git_specific_branch_names() {
local expl
declare -a branch_names
- branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/feature 2>/dev/null)"}#refs/heads/feature/})
+ branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/"$1" 2>/dev/null)"}#refs/heads/$1/})
__git_command_successful || return
_wanted branch-names expl branch-name compadd $* - $branch_names
}
+__git_feature_branch_names() {
+ __git_specific_branch_names 'feature'
+}
+
+
__git_refactor_branch_names() {
- local expl
- declare -a branch_names
- branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/refactor 2>/dev/null)"}#refs/heads/refactor/})
- __git_command_successful || return
- _wanted branch-names expl branch-name compadd $* - $branch_names
+ __git_specific_branch_names 'refactor'
}
__git_bug_branch_names() {
- local expl
- declare -a branch_names
- branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/bug 2>/dev/null)"}#refs/heads/bug/})
- __git_command_successful || return
- _wanted branch-names expl branch-name compadd $* - $branch_names
+ __git_specific_branch_names 'bug'
}
@@ -92,19 +100,43 @@ __git_author_names() {
_wanted author-names expl author-name compadd $* - $author_names
}
+# subcommands
-_git-changelog() {
- _arguments \
- '(-l --list)'{-l,--list}'[list commits]' \
+_git-bug() {
+ local curcontext=$curcontext state line ret=1
+ declare -A opt_args
+
+ _arguments -C \
+ ': :->command' \
+ '*:: :->option-or-argument' && ret=0
+
+ case $state in
+ (command)
+ declare -a commands
+ commands=(
+ 'finish:merge bug into the current branch'
+ )
+ _describe -t commands command commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*}-$line[1]:
+ case $line[1] in
+ (finish)
+ _arguments -C \
+ ':branch-name:__git_bug_branch_names'
+ ;;
+ esac
+ esac
}
-_git-effort() {
+_git-changelog() {
_arguments \
- '--above[ignore file with less than x commits]' \
+ '(-l --list)'{-l,--list}'[list commits]' \
}
+
_git-contrib() {
_arguments \
':author:__git_author_names'
@@ -135,6 +167,11 @@ _git-delete-tag() {
}
+_git-effort() {
+ _arguments \
+ '--above[ignore file with less than x commits]'
+}
+
_git-extras() {
local curcontext=$curcontext state line ret=1
declare -A opt_args
@@ -154,20 +191,7 @@ _git-extras() {
esac
_arguments \
- '(-v --version)'{-v,--version}'[show current version]' \
-}
-
-
-_git-graft() {
- _arguments \
- ':src-branch-name:__git_branch_names' \
- ':dest-branch-name:__git_branch_names'
-}
-
-
-_git-squash() {
- _arguments \
- ':branch-name:__git_branch_names'
+ '(-v --version)'{-v,--version}'[show current version]'
}
@@ -199,6 +223,25 @@ _git-feature() {
}
+_git-graft() {
+ _arguments \
+ ':src-branch-name:__git_branch_names' \
+ ':dest-branch-name:__git_branch_names'
+}
+
+
+_git-ignore() {
+ _arguments -C \
+ '(--local -l)'{--local,-l}'[show local gitignore]' \
+ '(--global -g)'{--global,-g}'[show global gitignore]'
+}
+
+_git-missing() {
+ _arguments \
+ ':first-branch-name:__git_branch_names' \
+ ':second-branch-name:__git_branch_names'
+}
+
_git-refactor() {
local curcontext=$curcontext state line ret=1
declare -A opt_args
@@ -227,59 +270,62 @@ _git-refactor() {
}
-_git-bug() {
- local curcontext=$curcontext state line ret=1
- declare -A opt_args
-
- _arguments -C \
- ': :->command' \
- '*:: :->option-or-argument' && ret=0
+_git-squash() {
+ _arguments \
+ ':branch-name:__git_branch_names'
+}
- case $state in
- (command)
- declare -a commands
- commands=(
- 'finish:merge bug into the current branch'
- )
- _describe -t commands command commands && ret=0
- ;;
- (option-or-argument)
- curcontext=${curcontext%:*}-$line[1]:
- case $line[1] in
- (finish)
- _arguments -C \
- ':branch-name:__git_bug_branch_names'
- ;;
- esac
- esac
+_git-summary() {
+ _arguments '--line[summarize with lines other than commits]'
+ __git_commits
}
+_git-undo(){
+ _arguments -C \
+ '(--soft -s)'{--soft,-s}'[only rolls back the commit but changes remain un-staged]' \
+ '(--hard -h)'{--hard,-h}'[wipes your commit(s)]'
+}
+
zstyle ':completion:*:*:git:*' user-commands \
+ alias:'define, search and show aliases' \
+ archive-file:'export the current HEAD of the git repository to a archive' \
+ back:'undo and stage latest commits' \
+ bug:'create a bug branch' \
changelog:'populate changelog file with commits since the previous tag' \
+ commits-since:'list commits since a given date' \
contrib:'display author contributions' \
count:'count commits' \
+ create-branch:'create local and remote branch' \
delete-branch:'delete local and remote branch' \
+ delete-merged-brancees:'delete merged branches'\
delete-submodule:'delete submodule' \
delete-tag:'delete local and remote tag' \
+ effort:'display effort statistics' \
extras:'git-extras' \
- graft:'merge commits from source branch to destination branch' \
- squash:'merge commits from source branch into the current one as a single commit' \
feature:'create a feature branch' \
- refactor:'create a refactor branch' \
- bug:'create a bug branch' \
- summary:'repository summary' \
- effort:'display effort statistics' \
- repl:'read-eval-print-loop' \
- commits-since:'list commits since a given date' \
- release:'release commit with the given tag' \
- alias:'define, search and show aliases' \
+ fork:'fork a repo on github' \
+ fresh-branch:'create empty local branch' \
+ gh-pages:'create the GitHub Pages branch' \
+ graft:'merge commits from source branch to destination branch' \
ignore:'add patterns to .gitignore' \
info:'show info about the repository' \
- create-branch:'create local and remote branch' \
- fresh-branch:'create empty local branch' \
- undo:'remove the latest commit' \
+ local-commits:'list unpushed commits on the local branch' \
+ lock:'lock a file excluded from version control' \
+ locked:'ls files that have been locked' \
+ missing:'show commits missing from another branch' \
+ pr:'checks out a pull request locally' \
+ rebase-patch:'rebases a patch' \
+ refactor:'create a refactor branch' \
+ release:'commit, tag and push changes to the repository' \
+ rename-tag:'rename a tag' \
+ repl:'read-eval-print-loop' \
+ reset-file:'reset one file' \
+ root:'show path of root' \
setup:'setup a git repository' \
+ show-tree:'show branch tree of commit history' \
+ squash:'merge commits from source branch into the current one as a single commit' \
+ summary:'repository summary' \
touch:'one step creation of new files' \
- obliterate:'Completely remove a file from the repository, including past commits and tags' \
- local-commits:'list unpushed commits on the local branch' \
+ undo:'remove the latest commit' \
+ unlock:'unlock a file excluded from version control'
diff --git a/plugins/gnu-utils/gnu-utils.plugin.zsh b/plugins/gnu-utils/gnu-utils.plugin.zsh
index e59265d66..de95f7e6c 100644
--- a/plugins/gnu-utils/gnu-utils.plugin.zsh
+++ b/plugins/gnu-utils/gnu-utils.plugin.zsh
@@ -29,7 +29,10 @@ if [[ -x "${commands[gwhoami]}" ]]; then
'gunexpand' 'guniq' 'gunlink' 'guptime' 'gusers' 'gvdir' 'gwc' 'gwho'
'gwhoami' 'gyes')
- # Not part of coreutils, installed separately.
+ # findutils
+ gcmds+=('gfind' 'gxargs' 'glocate')
+
+ # Not part of either coreutils or findutils, installed separately.
gcmds+=('gsed' 'gtar' 'gtime')
for gcmd in "${gcmds[@]}"; do
diff --git a/plugins/gradle/gradle.plugin.zsh b/plugins/gradle/gradle.plugin.zsh
index 6f634d1ba..97941756d 100644
--- a/plugins/gradle/gradle.plugin.zsh
+++ b/plugins/gradle/gradle.plugin.zsh
@@ -82,7 +82,7 @@ _gradlew_tasks () {
if [ in_gradle ]; then
_gradle_arguments
if _gradle_does_task_list_need_generating; then
- gradlew tasks --all | grep "^[ ]*[a-zA-Z0-9:]*\ -\ " | sed "s/ - .*$//" | sed "s/[\ ]*//" > .gradletasknamecache
+ ./gradlew tasks --all | grep "^[ ]*[a-zA-Z0-9:]*\ -\ " | sed "s/ - .*$//" | sed "s/[\ ]*//" > .gradletasknamecache
fi
compadd -X "==== Gradlew Tasks ====" `cat .gradletasknamecache`
fi
diff --git a/plugins/gulp/gulp.plugin.zsh b/plugins/gulp/gulp.plugin.zsh
new file mode 100644
index 000000000..6017c7b60
--- /dev/null
+++ b/plugins/gulp/gulp.plugin.zsh
@@ -0,0 +1,29 @@
+#!/usr/bin/env zsh
+
+#
+# gulp-autocompletion-zsh
+#
+# Autocompletion for your gulp.js tasks
+#
+# Copyright(c) 2014 André König <andre.koenig@posteo.de>
+# MIT Licensed
+#
+
+#
+# André König
+# Github: https://github.com/akoenig
+# Twitter: https://twitter.com/caiifr
+#
+
+#
+# Grabs all available tasks from the `gulpfile.js`
+# in the current directory.
+#
+function $$gulp_completion() {
+ compls=$(grep -Eo "gulp.task\(('(([a-zA-Z0-9]|-)*)',)" gulpfile.js 2>/dev/null | grep -Eo "'(([a-zA-Z0-9]|-)*)'" | sed s/"'"//g | sort)
+
+ completions=(${=compls})
+ compadd -- $completions
+}
+
+compdef $$gulp_completion gulp \ No newline at end of file
diff --git a/plugins/npm/npm.plugin.zsh b/plugins/npm/npm.plugin.zsh
index 68ec5fabd..595105d3c 100644
--- a/plugins/npm/npm.plugin.zsh
+++ b/plugins/npm/npm.plugin.zsh
@@ -12,3 +12,6 @@ alias npmS="npm i -S "
# Install and save to dev-dependencies in your package.json
# npmd is used by https://github.com/dominictarr/npmd
alias npmD="npm i -D "
+# Execute command from node_modules folder based on current directory
+# i.e npmE gulp
+alias npmE='PATH="$(npm bin)":"$PATH"'
diff --git a/plugins/osx/osx.plugin.zsh b/plugins/osx/osx.plugin.zsh
index 390960fdc..2cbb95977 100644
--- a/plugins/osx/osx.plugin.zsh
+++ b/plugins/osx/osx.plugin.zsh
@@ -5,29 +5,35 @@
# VERSION: 1.1.0
# ------------------------------------------------------------------------------
-function tab() {
- local command="cd \\\"$PWD\\\"; clear"
- (( $# > 0 )) && command="${command}; $*"
-
- the_app=$(
+function _omz_osx_get_frontmost_app() {
+ local the_app=$(
osascript 2>/dev/null <<EOF
tell application "System Events"
name of first item of (every process whose frontmost is true)
end tell
EOF
)
+ echo "$the_app"
+}
- [[ "$the_app" == 'Terminal' ]] && {
- osascript 2>/dev/null <<EOF
+function tab() {
+ # Must not have trailing semicolon, for iTerm compatibility
+ local command="cd \\\"$PWD\\\"; clear"
+ (( $# > 0 )) && command="${command}; $*"
+
+ local the_app=$(_omz_osx_get_frontmost_app)
+
+ if [[ "$the_app" == 'Terminal' ]]; then
+ # Discarding stdout to quash "tab N of window id XXX" output
+ osascript >/dev/null <<EOF
tell application "System Events"
tell process "Terminal" to keystroke "t" using command down
- tell application "Terminal" to do script "${command}" in front window
end tell
+ tell application "Terminal" to do script "${command}" in front window
EOF
- }
- [[ "$the_app" == 'iTerm' ]] && {
- osascript 2>/dev/null <<EOF
+ elif [[ "$the_app" == 'iTerm' ]]; then
+ osascript <<EOF
tell application "iTerm"
set current_terminal to current terminal
tell current_terminal
@@ -35,29 +41,27 @@ EOF
set current_session to current session
tell current_session
write text "${command}"
- keystroke return
end tell
end tell
end tell
EOF
- }
+
+ else
+ echo "tab: unsupported terminal app: $the_app"
+ false
+
+ fi
}
function vsplit_tab() {
- local command="cd \\\"$PWD\\\""
+ local command="cd \\\"$PWD\\\"; clear"
(( $# > 0 )) && command="${command}; $*"
- the_app=$(
- osascript 2>/dev/null <<EOF
- tell application "System Events"
- name of first item of (every process whose frontmost is true)
- end tell
-EOF
- )
+ local the_app=$(_omz_osx_get_frontmost_app)
- [[ "$the_app" == 'iTerm' ]] && {
- osascript 2>/dev/null <<EOF
- tell application "iTerm" to activate
+ if [[ "$the_app" == 'iTerm' ]]; then
+ osascript <<EOF
+ -- tell application "iTerm" to activate
tell application "System Events"
tell process "iTerm"
@@ -65,26 +69,24 @@ EOF
click
end tell
end tell
- keystroke "${command}; clear;"
- keystroke return
+ keystroke "${command} \n"
end tell
EOF
- }
+
+ else
+ echo "$0: unsupported terminal app: $the_app" >&2
+ false
+
+ fi
}
function split_tab() {
- local command="cd \\\"$PWD\\\""
+ local command="cd \\\"$PWD\\\"; clear"
(( $# > 0 )) && command="${command}; $*"
- the_app=$(
- osascript 2>/dev/null <<EOF
- tell application "System Events"
- name of first item of (every process whose frontmost is true)
- end tell
-EOF
- )
+ local the_app=$(_omz_osx_get_frontmost_app)
- [[ "$the_app" == 'iTerm' ]] && {
+ if [[ "$the_app" == 'iTerm' ]]; then
osascript 2>/dev/null <<EOF
tell application "iTerm" to activate
@@ -94,11 +96,15 @@ EOF
click
end tell
end tell
- keystroke "${command}; clear;"
- keystroke return
+ keystroke "${command} \n"
end tell
EOF
- }
+
+ else
+ echo "$0: unsupported terminal app: $the_app" >&2
+ false
+
+ fi
}
function pfd() {
diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh
index 6824836fc..39e388494 100644
--- a/plugins/rails/rails.plugin.zsh
+++ b/plugins/rails/rails.plugin.zsh
@@ -54,10 +54,12 @@ alias rdrs='rake db:reset'
alias rdtc='rake db:test:clone'
alias rdtp='rake db:test:prepare'
alias rdmtc='rake db:migrate db:test:clone'
-
alias rlc='rake log:clear'
alias rn='rake notes'
alias rr='rake routes'
+alias rrg='rake routes | grep'
+alias rt='rake test'
+
# legacy stuff
alias sstat='thin --stats "/thin/stats" start'
diff --git a/plugins/scw/README.md b/plugins/scw/README.md
new file mode 100644
index 000000000..d2312c2e5
--- /dev/null
+++ b/plugins/scw/README.md
@@ -0,0 +1,7 @@
+## Scaleway CLI autocomplete plugin
+
+[scw](https://github.com/scaleway/scaleway-cli): Manage Bare Metal servers from Command Line (as easily as with Docker)
+
+- Adds autocomplete options for all `scw` commands.
+
+Maintainer : Manfred Touron ([@moul](https://github.com/moul))
diff --git a/plugins/scw/_scw b/plugins/scw/_scw
new file mode 100644
index 000000000..f9fdf916e
--- /dev/null
+++ b/plugins/scw/_scw
@@ -0,0 +1,333 @@
+#compdef scw
+#
+# zsh completion for scw (http://scaleway.com)
+#
+# Inspired by https://github.com/felixr/docker-zsh-completion
+
+__scw_get_servers() {
+ local expl
+ declare -a servers
+ servers=(${(f)"$(_call_program commands scw _completion servers-names)"})
+ _describe -t servers "servers" servers
+}
+
+__scw_stoppedservers() {
+ __scw_get_servers
+}
+
+__scw_runningservers() {
+ __scw_get_servers
+}
+
+__scw_servers () {
+ __scw_get_servers
+}
+
+__scw_images () {
+ local expl
+ declare -a images
+ images=(${(f)"$(_call_program commands scw _completion images-names)"})
+ _describe -t images "images" images
+}
+
+__scw_images_and_snapshots () {
+ __scw_images
+ __scw_snapshots
+}
+
+__scw_snapshots () {
+ local expl
+ declare -a snapshots
+ snapshots=(${(f)"$(_call_program commands scw _completion --prefix snapshots-names)"})
+ _describe -t snapshots "snapshots" snapshots
+}
+
+__scw_bootscripts () {
+ local expl
+ declare -a bootscripts
+ bootscripts=(${(f)"$(_call_program commands scw _completion bootscripts-names)"})
+ _describe -t bootscripts "bootscripts" bootscripts
+}
+
+__scw_tags() {
+ __scw_images
+}
+
+__scw_repositories_with_tags() {
+ __scw_images
+}
+
+__scw_search() {
+ # declare -a scwsearch
+ local cache_policy
+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
+ if [[ -z "$cache_policy" ]]; then
+ zstyle ":completion:${curcontext}:" cache-policy __scw_caching_policy
+ fi
+
+ local searchterm cachename
+ searchterm="${words[$CURRENT]%/}"
+ cachename=_scw-search-$searchterm
+
+ local expl
+ local -a result
+ if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \
+ && ! _retrieve_cache ${cachename#_}; then
+ _message "Searching for ${searchterm}..."
+ result=(${${${(f)"$(_call_program commands scw search ${searchterm})"}%% *}[2,-1]})
+ _store_cache ${cachename#_} result
+ fi
+ _wanted scwsearch expl 'available images' compadd -a result
+}
+
+__scw_caching_policy()
+{
+ oldp=( "$1"(Nmh+1) ) # 1 hour
+ (( $#oldp ))
+}
+
+
+__scw_repositories () {
+ __scw_images
+}
+
+__scw_commands () {
+ # local -a _scw_subcommands
+ local cache_policy
+
+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
+ if [[ -z "$cache_policy" ]]; then
+ zstyle ":completion:${curcontext}:" cache-policy __scw_caching_policy
+ fi
+
+ if ( [[ ${+_scw_subcommands} -eq 0 ]] || _cache_invalid scw_subcommands) \
+ && ! _retrieve_cache scw_subcommands;
+ then
+ local -a lines
+ lines=(${(f)"$(_call_program commands scw 2>&1)"})
+ _scw_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:})
+ _scw_subcommands=($_scw_subcommands 'help:Show help for a command')
+ _store_cache scw_subcommands _scw_subcommands
+ fi
+ _describe -t scw-commands "scw command" _scw_subcommands
+}
+
+__scw_subcommand () {
+ local -a _command_args
+ case "$words[1]" in
+ (attach)
+ _arguments \
+ '--no-stdin[Do not attach stdin]' \
+ ':servers:__scw_runningservers'
+ ;;
+ (commit)
+ _arguments \
+ {-v,--volume=0}'[Volume slot]:volume: ' \
+ ':server:__scw_servers' \
+ ':repository:__scw_repositories_with_tags'
+ ;;
+ (cp)
+ _arguments \
+ ':server:->server' \
+ ':hostpath:_files'
+ case $state in
+ (server)
+ if compset -P '*:'; then
+ _files
+ else
+ __scw_servers -qS ":"
+ fi
+ ;;
+ esac
+ ;;
+ (exec)
+ local state ret
+ _arguments \
+ {-T,--timeout=0}'[Set timeout values to seconds]' \
+ {-w,--wait}'[Wait for SSH to be ready]' \
+ ':servers:__scw_runningservers' \
+ '*::command:->anycommand' && ret=0
+
+ case $state in
+ (anycommand)
+ shift 1 words
+ (( CURRENT-- ))
+ _normal
+ ;;
+ esac
+
+ return ret
+ ;;
+ (history)
+ _arguments \
+ '--no-trunc[Do not truncate output]' \
+ {-q,--quiet}'[Only show numeric IDs]' \
+ '*:images:__scw_images'
+ ;;
+ (images)
+ _arguments \
+ {-a,--all}'[Show all images]' \
+ '--no-trunc[Do not truncate output]' \
+ {-q,--quiet}'[Only show numeric IDs]' \
+ ':repository:__scw_repositories'
+ ;;
+ (info)
+ ;;
+ (inspect)
+ _arguments \
+ {-f,--format=-}'[Format the output using the given go template]:template: ' \
+ '*:servers:__scw_servers'
+ ;;
+ (kill)
+ _arguments \
+ '*:servers:__scw_runningservers'
+ ;;
+ (login)
+ _arguments \
+ {-o,--organization=-}'[Organization]:organization: ' \
+ {-t,--token=-}'[Token]:token: ' \
+ ':server: '
+ ;;
+ (logout)
+ _arguments \
+ ':server: '
+ ;;
+ (logs)
+ _arguments \
+ '*:servers:__scw_servers'
+ ;;
+ (port)
+ _arguments \
+ '1:servers:__scw_runningservers' \
+ '2:port:_ports'
+ ;;
+ (start)
+ _arguments \
+ {-T,--timeout=0}'[Set timeout values to seconds]' \
+ {-w,--wait}'[Wait for SSH to be ready]' \
+ '*:servers:__scw_stoppedservers'
+ ;;
+ (rm)
+ _arguments \
+ '*:servers:__scw_stoppedservers'
+ ;;
+ (rmi)
+ _arguments \
+ '*:images:__scw_images'
+ ;;
+ (restart)
+ _arguments \
+ '*:servers:__scw_runningservers'
+ ;;
+ (stop)
+ _arguments \
+ {-t,--terminate}'[Stop and trash a server with its volumes]' \
+ {-w,--wait}'[Synchronous stop. Wait for server to be stopped]' \
+ '*:servers:__scw_runningservers'
+ ;;
+ (top)
+ _arguments \
+ '1:servers:__scw_runningservers' \
+ '(-)*:: :->ps-arguments'
+ case $state in
+ (ps-arguments)
+ _ps
+ ;;
+ esac
+ ;;
+ (ps)
+ _arguments \
+ {-a,--all}'[Show all servers. Only running servers are shown by default]' \
+ {-l,--latest}'[Show only the latest created server]' \
+ '-n[Show n last created servers, include non-running one]:n:(1 5 10 25 50)' \
+ '--no-trunc[Do not truncate output]' \
+ {-q,--quiet}'[Only show numeric IDs]'
+ ;;
+ (tag)
+ _arguments \
+ {-f,--force}'[force]'\
+ ':image:__scw_images'\
+ ':repository:__scw_repositories_with_tags'
+ ;;
+ (create|run)
+ _arguments \
+ {-a,--attach}'[Attach to stdin, stdout or stderr]' \
+ '*'{-e,--environment=-}'[Set environment variables]:environment variable: ' \
+ '--name=-[Server name]:name: ' \
+ '--bootscript=-[Assign a bootscript]:bootscript:__scw_bootscripts ' \
+ '*-v[Bind mount a volume]:volume: '\
+ '(-):images:__scw_images_and_snapshots' \
+ '(-):command: _command_names -e' \
+ '*::arguments: _normal'
+
+ case $state in
+ (link)
+ if compset -P '*:'; then
+ _wanted alias expl 'Alias' compadd -E ""
+ else
+ __scw_runningservers -qS ":"
+ fi
+ ;;
+ esac
+ ;;
+ (rename)
+ _arguments \
+ ':old name:__scw_servers' \
+ ':new name: '
+ ;;
+ (search)
+ _arguments \
+ '--no-trunc[Do not truncate output]' \
+ ':term: '
+ ;;
+ (wait)
+ _arguments '*:servers:__scw_runningservers'
+ ;;
+ (help)
+ _arguments ':subcommand:__scw_commands'
+ ;;
+ (*)
+ _message 'Unknown sub command'
+ esac
+
+}
+
+_scw () {
+ # Support for subservices, which allows for `compdef _scw scw-shell=_scw_servers`.
+ # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
+ if [[ $service != scw ]]; then
+ _call_function - _$service
+ return
+ fi
+
+ local curcontext="$curcontext" state line
+ typeset -A opt_args
+
+ _arguments -C \
+ '-H[tcp://host:port to bind/connect to]:socket: ' \
+ '(-): :->command' \
+ '(-)*:: :->option-or-argument'
+
+ if (( CURRENT == 1 )); then
+
+ fi
+ case $state in
+ (command)
+ __scw_commands
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:scw-$words[1]:
+ __scw_subcommand
+ ;;
+ esac
+}
+
+_scw "$@"
+
+# Local Variables:
+# mode: Shell-Script
+# sh-indentation: 4
+# indent-tabs-mode: nil
+# sh-basic-offset: 4
+# End:
+# vim: ft=zsh sw=4 ts=4 et
diff --git a/plugins/sudo/sudo.plugin.zsh b/plugins/sudo/sudo.plugin.zsh
index e3ba39918..0ba8bed5b 100644
--- a/plugins/sudo/sudo.plugin.zsh
+++ b/plugins/sudo/sudo.plugin.zsh
@@ -14,7 +14,11 @@
sudo-command-line() {
[[ -z $BUFFER ]] && zle up-history
- [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
+ if [[ $BUFFER == sudo\ * ]]; then
+ LBUFFER="${LBUFFER#sudo }"
+ else
+ LBUFFER="sudo $LBUFFER"
+ fi
}
zle -N sudo-command-line
# Defined shortcut keys: [Esc] [Esc]
diff --git a/plugins/svn/svn.plugin.zsh b/plugins/svn/svn.plugin.zsh
index 9f7a4c6eb..816055afe 100644
--- a/plugins/svn/svn.plugin.zsh
+++ b/plugins/svn/svn.plugin.zsh
@@ -1,16 +1,17 @@
# vim:ft=zsh ts=2 sw=2 sts=2
#
function svn_prompt_info() {
+ local _DISPLAY
if in_svn; then
if [ "x$SVN_SHOW_BRANCH" = "xtrue" ]; then
unset SVN_SHOW_BRANCH
_DISPLAY=$(svn_get_branch_name)
else
_DISPLAY=$(svn_get_repo_name)
+ _DISPLAY=$(omz_urldecode "${_DISPLAY}")
fi
echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
$ZSH_THEME_REPO_NAME_COLOR$_DISPLAY$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR$(svn_dirty)$(svn_dirty_pwd)$ZSH_PROMPT_BASE_COLOR"
- unset _DISPLAY
fi
}
@@ -30,7 +31,7 @@ function svn_get_repo_name() {
}
function svn_get_branch_name() {
- _DISPLAY=$(
+ local _DISPLAY=$(
svn info 2> /dev/null | \
awk -F/ \
'/^URL:/ { \
@@ -49,7 +50,6 @@ function svn_get_branch_name() {
else
echo $_DISPLAY
fi
- unset _DISPLAY
}
function svn_get_rev_nr() {
@@ -60,7 +60,7 @@ function svn_get_rev_nr() {
function svn_dirty_choose() {
if in_svn; then
- root=`svn info 2> /dev/null | sed -n 's/^Working Copy Root Path: //p'`
+ local root=`svn info 2> /dev/null | sed -n 's/^Working Copy Root Path: //p'`
if $(svn status $root 2> /dev/null | command grep -Eq '^\s*[ACDIM!?L]'); then
# Grep exits with 0 when "One or more lines were selected", return "dirty".
echo $1
@@ -77,7 +77,7 @@ function svn_dirty() {
function svn_dirty_choose_pwd () {
if in_svn; then
- root=$PWD
+ local root=$PWD
if $(svn status $root 2> /dev/null | command grep -Eq '^\s*[ACDIM!?L]'); then
# Grep exits with 0 when "One or more lines were selected", return "dirty".
echo $1
diff --git a/plugins/terminalapp/terminalapp.plugin.zsh b/plugins/terminalapp/terminalapp.plugin.zsh
index 6e47ee188..7c0c278b9 100644
--- a/plugins/terminalapp/terminalapp.plugin.zsh
+++ b/plugins/terminalapp/terminalapp.plugin.zsh
@@ -1,39 +1,6 @@
-# Set Apple Terminal.app resume directory
-# based on this answer: http://superuser.com/a/315029
-# 2012-10-26: (javageek) Changed code using the updated answer
-
-# Tell the terminal about the working directory whenever it changes.
-if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
- update_terminal_cwd() {
- # Identify the directory using a "file:" scheme URL, including
- # the host name to disambiguate local vs. remote paths.
-
- # Percent-encode the pathname.
- local URL_PATH=''
- {
- # Use LANG=C to process text byte-by-byte.
- local i ch hexch LANG=C
- for ((i = 1; i <= ${#PWD}; ++i)); do
- ch="$PWD[i]"
- if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
- URL_PATH+="$ch"
- else
- hexch=$(printf "%02X" "'$ch")
- URL_PATH+="%$hexch"
- fi
- done
- }
-
- local PWD_URL="file://$HOST$URL_PATH"
- #echo "$PWD_URL" # testing
- printf '\e]7;%s\a' "$PWD_URL"
- }
-
- # Register the function so it is called whenever the working
- # directory changes.
- autoload add-zsh-hook
- add-zsh-hook precmd update_terminal_cwd
-
- # Tell the terminal about the initial directory.
- update_terminal_cwd
-fi
+# This file is intentionally empty.
+#
+# The terminalapp plugin is deprecated and may be removed in a future release.
+# Its functionality has been folded in to the core lib/termsupport.zsh, which
+# is loaded for all users. You can remove terminalapp from your $plugins list
+# once all your systems are updated to the current version of Oh My Zsh.
diff --git a/themes/dogenpunk.zsh-theme b/themes/dogenpunk.zsh-theme
index 0bd38acc2..d6719281d 100644
--- a/themes/dogenpunk.zsh-theme
+++ b/themes/dogenpunk.zsh-theme
@@ -3,7 +3,7 @@
MODE_INDICATOR="%{$fg_bold[red]%}❮%{$reset_color%}%{$fg[red]%}❮❮%{$reset_color%}"
local return_status="%{$fg[red]%}%(?..⏎)%{$reset_color%}"
-PROMPT='%{$fg[blue]%}%m%{$reset_color%}%{$fg_bold[white]%} ओम् %{$reset_color%}%{$fg[cyan]%}%~:%{$reset_color%}$(git_time_since_commit)$(git_prompt_info)
+PROMPT='%{$fg[blue]%}%m%{$reset_color%}%{$fg_bold[white]%} ॐ %{$reset_color%}%{$fg[cyan]%}%~:%{$reset_color%}$(git_time_since_commit)$(git_prompt_info)
%{$fg[red]%}%!%{$reset_color%} $(prompt_char) '
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[green]%}git%{$reset_color%}@%{$bg[white]%}%{$fg[black]%}"
diff --git a/themes/gnzh.zsh-theme b/themes/gnzh.zsh-theme
index ab154c1e5..04b0450a8 100644
--- a/themes/gnzh.zsh-theme
+++ b/themes/gnzh.zsh-theme
@@ -1,53 +1,50 @@
# ZSH Theme - Preview: http://dl.dropbox.com/u/4109351/pics/gnzh-zsh-theme.png
# Based on bira theme
-# load some modules
-autoload -U zsh/terminfo # Used in the colour alias below
setopt prompt_subst
-# make some aliases for the colours: (could use normal escape sequences too)
-for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do
- eval PR_$color='%{$fg[${(L)color}]%}'
-done
-eval PR_NO_COLOR="%{$terminfo[sgr0]%}"
-eval PR_BOLD="%{$terminfo[bold]%}"
+() {
+
+local PR_USER PR_USER_OP PR_PROMPT PR_HOST
# Check the UID
if [[ $UID -ne 0 ]]; then # normal user
- eval PR_USER='${PR_GREEN}%n${PR_NO_COLOR}'
- eval PR_USER_OP='${PR_GREEN}%#${PR_NO_COLOR}'
- local PR_PROMPT='$PR_NO_COLOR➤ $PR_NO_COLOR'
+ PR_USER='%F{green}%n%f'
+ PR_USER_OP='%F{green}%#%f'
+ PR_PROMPT='%f➤ %f'
else # root
- eval PR_USER='${PR_RED}%n${PR_NO_COLOR}'
- eval PR_USER_OP='${PR_RED}%#${PR_NO_COLOR}'
- local PR_PROMPT='$PR_RED➤ $PR_NO_COLOR'
+ PR_USER='%F{red}%n%f'
+ PR_USER_OP='%F{red}%#%f'
+ PR_PROMPT='%F{red}➤ %f'
fi
# Check if we are on SSH or not
if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then
- eval PR_HOST='${PR_YELLOW}%M${PR_NO_COLOR}' #SSH
+ PR_HOST='%F{red}%M%f' # SSH
else
- eval PR_HOST='${PR_GREEN}%M${PR_NO_COLOR}' # no SSH
+ PR_HOST='%F{green}%M%f' # no SSH
fi
-local return_code="%(?..%{$PR_RED%}%? ↵%{$PR_NO_COLOR%})"
-local user_host='${PR_USER}${PR_CYAN}@${PR_HOST}'
-local current_dir='%{$PR_BOLD$PR_BLUE%}%~%{$PR_NO_COLOR%}'
+local return_code="%(?..%F{red}%? ↵%f)"
+
+local user_host="${PR_USER}%F{cyan}@${PR_HOST}"
+local current_dir="%B%F{blue}%~%f%b"
local rvm_ruby=''
-if ${HOME}/.rvm/bin/rvm-prompt &> /dev/null; then # detect local user rvm installation
- rvm_ruby='%{$PR_RED%}‹$(${HOME}/.rvm/bin/rvm-prompt i v g s)›%{$PR_NO_COLOR%}'
-elif which rvm-prompt &> /dev/null; then # detect sysem-wide rvm installation
- rvm_ruby='%{$PR_RED%}‹$(rvm-prompt i v g s)›%{$PR_NO_COLOR%}'
-elif which rbenv &> /dev/null; then # detect Simple Ruby Version management
- rvm_ruby='%{$PR_RED%}‹$(rbenv version | sed -e "s/ (set.*$//")›%{$PR_NO_COLOR%}'
+if ${HOME}/.rvm/bin/rvm-prompt &> /dev/null; then # detect user-local rvm installation
+ rvm_ruby='%F{red}‹$(${HOME}/.rvm/bin/rvm-prompt i v g s)›%f'
+elif which rvm-prompt &> /dev/null; then # detect system-wide rvm installation
+ rvm_ruby='%F{red}‹$(rvm-prompt i v g s)›%f'
+elif which rbenv &> /dev/null; then # detect Simple Ruby Version Management
+ rvm_ruby='%F{red}‹$(rbenv version | sed -e "s/ (set.*$//")›%f'
fi
-local git_branch='$(git_prompt_info)%{$PR_NO_COLOR%}'
+local git_branch='$(git_prompt_info)'
-#PROMPT="${user_host} ${current_dir} ${rvm_ruby} ${git_branch}$PR_PROMPT "
PROMPT="╭─${user_host} ${current_dir} ${rvm_ruby} ${git_branch}
╰─$PR_PROMPT "
-RPS1="${return_code}"
+RPROMPT="${return_code}"
+
+ZSH_THEME_GIT_PROMPT_PREFIX="%F{yellow}‹"
+ZSH_THEME_GIT_PROMPT_SUFFIX="› %f"
-ZSH_THEME_GIT_PROMPT_PREFIX="%{$PR_YELLOW%}‹"
-ZSH_THEME_GIT_PROMPT_SUFFIX="› %{$PR_NO_COLOR%}"
+}
diff --git a/themes/michelebologna.zsh-theme b/themes/michelebologna.zsh-theme
index fec243873..110e3f203 100644
--- a/themes/michelebologna.zsh-theme
+++ b/themes/michelebologna.zsh-theme
@@ -59,16 +59,17 @@ ZSH_THEME_GIT_PROMPT_PREFIX=""
ZSH_THEME_GIT_PROMPT_SUFFIX=""
ZSH_THEME_GIT_PROMPT_DIRTY=""
ZSH_THEME_GIT_PROMPT_CLEAN=""
-ZSH_THEME_GIT_PROMPT_UNTRACKED="%%"
-ZSH_THEME_GIT_PROMPT_MODIFIED="*"
-ZSH_THEME_GIT_PROMPT_ADDED="+"
-ZSH_THEME_GIT_PROMPT_STASHED="$"
-ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE="="
+ZSH_THEME_GIT_PROMPT_UNTRACKED="$blue%%"
+ZSH_THEME_GIT_PROMPT_MODIFIED="$red*"
+ZSH_THEME_GIT_PROMPT_ADDED="$green+"
+ZSH_THEME_GIT_PROMPT_STASHED="$blue$"
+ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE="$green="
ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE=">"
ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE="<"
-ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE="<>"
+ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE="$red<>"
PROMPT='$username_output$hostname_output:$current_dir_output%1(j. [$jobs_bg].)'
-PROMPT+='$(__git_ps1)'
+GIT_PROMPT='$(out=$(git_prompt_info)$(git_prompt_status)$(git_remote_status);if [[ -n $out ]]; then printf %s " $white($green$out$white)$reset";fi)'
+PROMPT+="$GIT_PROMPT"
PROMPT+=" $last_command_output%#$reset "
RPROMPT=''
diff --git a/themes/steeef.zsh-theme b/themes/steeef.zsh-theme
index 13728ca9a..13dc3ad2f 100644
--- a/themes/steeef.zsh-theme
+++ b/themes/steeef.zsh-theme
@@ -10,7 +10,7 @@
export VIRTUAL_ENV_DISABLE_PROMPT=1
function virtualenv_info {
- [ $VIRTUAL_ENV ] && echo '('$fg[blue]`basename $VIRTUAL_ENV`%{$reset_color%}') '
+ [ $VIRTUAL_ENV ] && echo '('%F{blue}`basename $VIRTUAL_ENV`%f') '
}
PR_GIT_UPDATE=1
@@ -20,18 +20,18 @@ autoload -U add-zsh-hook
autoload -Uz vcs_info
#use extended color pallete if available
-if [[ $TERM = *256color* || $TERM = *rxvt* ]]; then
+if [[ $terminfo[colors] -ge 256 ]]; then
turquoise="%F{81}"
orange="%F{166}"
purple="%F{135}"
hotpink="%F{161}"
limegreen="%F{118}"
else
- turquoise="$fg[cyan]"
- orange="$fg[yellow]"
- purple="$fg[magenta]"
- hotpink="$fg[red]"
- limegreen="$fg[green]"
+ turquoise="%F{cyan}"
+ orange="%F{yellow}"
+ purple="%F{magenta}"
+ hotpink="%F{red}"
+ limegreen="%F{green}"
fi
# enable VCS systems you use
@@ -48,7 +48,7 @@ zstyle ':vcs_info:*:prompt:*' check-for-changes true
# %a - action (e.g. rebase-i)
# %R - repository path
# %S - path in the repository
-PR_RST="%{${reset_color}%}"
+PR_RST="%f"
FMT_BRANCH="(%{$turquoise%}%b%u%c${PR_RST})"
FMT_ACTION="(%{$limegreen%}%a${PR_RST})"
FMT_UNSTAGED="%{$orange%}●"
@@ -96,5 +96,5 @@ function steeef_precmd {
add-zsh-hook precmd steeef_precmd
PROMPT=$'
-%{$purple%}%n%{$reset_color%} at %{$orange%}%m%{$reset_color%} in %{$limegreen%}%~%{$reset_color%} $vcs_info_msg_0_$(virtualenv_info)%{$reset_color%}
+%{$purple%}%n${PR_RST} at %{$orange%}%m${PR_RST} in %{$limegreen%}%~${PR_RST} $vcs_info_msg_0_$(virtualenv_info)
$ '
diff --git a/tools/install.sh b/tools/install.sh
index 1586cdee5..aebd28371 100755
--- a/tools/install.sh
+++ b/tools/install.sh
@@ -16,6 +16,13 @@ if [ -d "$ZSH" ]; then
exit
fi
+# Prevent the cloned repository from having insecure permissions. Failing to do
+# so causes compinit() calls to fail with "command not found: compdef" errors
+# for users with insecure umasks (e.g., "002", allowing group writability). Note
+# that this will be ignored under Cygwin by default, as Windows ACLs take
+# precedence over umasks except for filesystems mounted with option "noacl".
+umask g-w,o-w
+
echo "\033[0;34mCloning Oh My Zsh...\033[0m"
hash git >/dev/null 2>&1 && env git clone --depth=1 https://github.com/robbyrussell/oh-my-zsh.git $ZSH || {
echo "git not installed"
@@ -41,12 +48,17 @@ export PATH=\"$PATH\"
" ~/.zshrc > ~/.zshrc-omztemp
mv -f ~/.zshrc-omztemp ~/.zshrc
-TEST_CURRENT_SHELL=$(expr "$SHELL" : '.*/\(.*\)')
-if [ "$TEST_CURRENT_SHELL" != "zsh" ]; then
+# If this user's login shell is not already "zsh", attempt to switch.
+if [ "$(expr "$SHELL" : '.*/\(.*\)')" != "zsh" ]; then
+ # If this platform provides a "chsh" command (not Cygwin), do it, man!
+ if hash chsh >/dev/null 2>&1; then
echo "\033[0;34mTime to change your default shell to zsh!\033[0m"
chsh -s $(grep /zsh$ /etc/shells | tail -1)
+ # Else, suggest the user do so manually.
+ else
+ echo "\033[0;34mPlease manually change your default shell to zsh!\033[0m"
+ fi
fi
-unset TEST_CURRENT_SHELL
echo "\033[0;32m"' __ __ '"\033[0m"
echo "\033[0;32m"' ____ / /_ ____ ___ __ __ ____ _____/ /_ '"\033[0m"