summaryrefslogtreecommitdiff
path: root/plugins/shrink-path
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/shrink-path')
-rw-r--r--plugins/shrink-path/README.md68
-rw-r--r--plugins/shrink-path/shrink-path.plugin.zsh126
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