diff options
Diffstat (limited to 'plugins/shrink-path')
-rw-r--r-- | plugins/shrink-path/README.md | 68 | ||||
-rw-r--r-- | plugins/shrink-path/shrink-path.plugin.zsh | 126 |
2 files changed, 194 insertions, 0 deletions
diff --git a/plugins/shrink-path/README.md b/plugins/shrink-path/README.md new file mode 100644 index 000000000..b990aea91 --- /dev/null +++ b/plugins/shrink-path/README.md @@ -0,0 +1,68 @@ +# A plugin to shrink directory paths for brevity and pretty-printing + + +## Examples + +For this directory tree: +``` + /home/ + me/ + foo/ + bar/ + quux/ + biz/ # The prefix b is ambiguous between bar and biz. +``` +here are the results of calling `shrink_path <option> /home/me/foo/bar/quux`: +``` + Option Result + <none> /h/m/f/ba/q + -l|--last /h/m/f/ba/quux + -s|--short /h/m/f/b/q + -t|--tilde ~/f/ba/q + -f|--fish ~/f/b/quux +``` + + +## Usage + +For a fish-style working directory in your command prompt, add the following to +your theme or zshrc: + +``` + setopt prompt_subst + PS1='%n@%m $(shrink_path -f)>' +``` + +The following options are available: + +``` + -f, --fish fish simulation, equivalent to -l -s -t. + -l, --last Print the last directory's full name. + -s, --short Truncate directory names to the first character. Without + -s, names are truncated without making them ambiguous. + -t, --tilde Substitute ~ for the home directory. + -T, --nameddirs Substitute named directories as well. +``` + +The long options can also be set via zstyle, like +``` + zstyle :prompt:shrink_path fish yes +``` + +Note: Directory names containing two or more consecutive spaces are not yet +supported. + + +## License + +Copyright (C) 2008 by Daniel Friesel <derf@xxxxxxxxxxxxxxxxxx> + +License: WTFPL <http://www.wtfpl.net> + +Ref: https://www.zsh.org/mla/workers/2009/msg00415.html + https://www.zsh.org/mla/workers/2009/msg00419.html + + +## Misc + +Keywords: prompt directory truncate shrink collapse fish diff --git a/plugins/shrink-path/shrink-path.plugin.zsh b/plugins/shrink-path/shrink-path.plugin.zsh new file mode 100644 index 000000000..86102e651 --- /dev/null +++ b/plugins/shrink-path/shrink-path.plugin.zsh @@ -0,0 +1,126 @@ +# Shrink directory paths, e.g. /home/me/foo/bar/quux -> ~/f/b/quux. +# +# For a fish-style working directory in your command prompt, add the following +# to your theme or zshrc: +# +# setopt prompt_subst +# PS1='%n@%m $(shrink_path -f)>' +# +# The following options are available: +# +# -f, --fish fish simulation, equivalent to -l -s -t. +# -l, --last Print the last directory's full name. +# -s, --short Truncate directory names to the first character. Without +# -s, names are truncated without making them ambiguous. +# -t, --tilde Substitute ~ for the home directory. +# -T, --nameddirs Substitute named directories as well. +# +# The long options can also be set via zstyle, like +# zstyle :prompt:shrink_path fish yes +# +# Note: Directory names containing two or more consecutive spaces are not yet +# supported. +# +# Keywords: prompt directory truncate shrink collapse fish +# +# Copyright (C) 2008 by Daniel Friesel <derf@xxxxxxxxxxxxxxxxxx> +# License: WTFPL <http://www.wtfpl.net> +# +# Ref: https://www.zsh.org/mla/workers/2009/msg00415.html +# https://www.zsh.org/mla/workers/2009/msg00419.html + +shrink_path () { + setopt localoptions + setopt rc_quotes null_glob + + typeset -i lastfull=0 + typeset -i short=0 + typeset -i tilde=0 + typeset -i named=0 + + if zstyle -t ':prompt:shrink_path' fish; then + lastfull=1 + short=1 + tilde=1 + fi + if zstyle -t ':prompt:shrink_path' nameddirs; then + tilde=1 + named=1 + fi + zstyle -t ':prompt:shrink_path' last && lastfull=1 + zstyle -t ':prompt:shrink_path' short && short=1 + zstyle -t ':prompt:shrink_path' tilde && tilde=1 + + while [[ $1 == -* ]]; do + case $1 in + -f|--fish) + lastfull=1 + short=1 + tilde=1 + ;; + -h|--help) + print 'Usage: shrink_path [-f -l -s -t] [directory]' + print ' -f, --fish fish-simulation, like -l -s -t' + print ' -l, --last Print the last directory''s full name' + print ' -s, --short Truncate directory names to the first character' + print ' -t, --tilde Substitute ~ for the home directory' + print ' -T, --nameddirs Substitute named directories as well' + print 'The long options can also be set via zstyle, like' + print ' zstyle :prompt:shrink_path fish yes' + return 0 + ;; + -l|--last) lastfull=1 ;; + -s|--short) short=1 ;; + -t|--tilde) tilde=1 ;; + -T|--nameddirs) + tilde=1 + named=1 + ;; + esac + shift + done + + typeset -a tree expn + typeset result part dir=${1-$PWD} + typeset -i i + + [[ -d $dir ]] || return 0 + + if (( named )) { + for part in ${(k)nameddirs}; { + [[ $dir == ${nameddirs[$part]}(/*|) ]] && dir=${dir/#${nameddirs[$part]}/\~$part} + } + } + (( tilde )) && dir=${dir/#$HOME/\~} + tree=(${(s:/:)dir}) + ( + if [[ $tree[1] == \~* ]] { + cd -q ${~tree[1]} + result=$tree[1] + shift tree + } else { + cd -q / + } + for dir in $tree; { + if (( lastfull && $#tree == 1 )) { + result+="/$tree" + break + } + expn=(a b) + part='' + i=0 + until [[ (( ${#expn} == 1 )) || $dir = $expn || $i -gt 99 ]] do + (( i++ )) + part+=$dir[$i] + expn=($(echo ${part}*(-/))) + (( short )) && break + done + result+="/$part" + cd -q $dir + shift tree + } + echo ${result:-/} + ) +} + +## vim:ft=zsh |