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 READMEmaster
parent
a9428b137f
commit
c09323098a
2 changed files with 195 additions and 0 deletions
@ -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://sam.zoy.org/wtfpl> |
||||||
|
|
||||||
|
Ref: http://www.zsh.org/mla/workers/2009/msg00415.html |
||||||
|
http://www.zsh.org/mla/workers/2009/msg00419.html |
||||||
|
|
||||||
|
|
||||||
|
## Misc |
||||||
|
|
||||||
|
Keywords: prompt directory truncate shrink collapse fish |
||||||
@ -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 |
||||||
Loading…
Reference in new issue