summaryrefslogtreecommitdiff
path: root/plugins/shrink-path/shrink-path.plugin.zsh
diff options
context:
space:
mode:
authorShiv Venkatasubrahmanyam <shvenkat@users.noreply.github.com>2016-08-10 17:44:00 -0700
committerMarc Cornellà <marc.cornella@live.com>2016-08-11 02:44:00 +0200
commitc09323098acb03a0678f87036fad10bd99b283b2 (patch)
treed2d4d4b8670513103725a1be7266bdfff4743fe0 /plugins/shrink-path/shrink-path.plugin.zsh
parenta9428b137f14969bd44a5787c0080297d81ea0b7 (diff)
downloadzsh-c09323098acb03a0678f87036fad10bd99b283b2.tar.gz
zsh-c09323098acb03a0678f87036fad10bd99b283b2.tar.bz2
zsh-c09323098acb03a0678f87036fad10bd99b283b2.zip
Add shrink-path plugin to shorten directory paths (e.g. ~/f/b/quux) (#5262)
* Add shrink-path plugin to shorten directory paths (e.g. ~/f/b/quux) * Add a README
Diffstat (limited to 'plugins/shrink-path/shrink-path.plugin.zsh')
-rw-r--r--plugins/shrink-path/shrink-path.plugin.zsh127
1 files changed, 127 insertions, 0 deletions
diff --git a/plugins/shrink-path/shrink-path.plugin.zsh b/plugins/shrink-path/shrink-path.plugin.zsh
new file mode 100644
index 000000000..f111962a5
--- /dev/null
+++ b/plugins/shrink-path/shrink-path.plugin.zsh
@@ -0,0 +1,127 @@
+# 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://sam.zoy.org/wtfpl>
+#
+# Ref: http://www.zsh.org/mla/workers/2009/msg00415.html
+# http://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})
+ (
+ unfunction chpwd 2> /dev/null
+ if [[ $tree[1] == \~* ]] {
+ cd ${~tree[1]}
+ result=$tree[1]
+ shift tree
+ } else {
+ cd /
+ }
+ 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 $dir
+ shift tree
+ }
+ echo ${result:-/}
+ )
+}
+
+## vim:ft=zsh