shrink-path: added glob and quote options (#7694)

* Added -g option to shrink-path plugin.

The new optins adds an asterix to the uniquely shortened name, such
that, if copy'n'pasted, zsh globbing will expand to the full path name
of the shortened path:

shrink-path -g:
"/net/software/modules/modulefiles" -> "/n*/s*/modules/m*"

shrink-path -l -g:
"/net/software/modules/modulefiles" -> "/n*/s*/modules/modulefiles"

* Updated also the README file with the new -g option.

* shrink-path: improved handling of special cases

This commits improves the handling of special cases in path strings:

- handling of white space in path names
- handling of single-letter path names

* Update plugins/shrink-path/README.md

Co-Authored-By: Jacob Tomaw <jacob.tomaw@gmail.com>

* Fix typo "Asterix" and replace with "asterisk"

* Add optional quoting support to shrink_path

Co-authored-by: Jacob Tomaw <jacob.tomaw@gmail.com>
This commit is contained in:
Marc Cornellà 2020-03-05 13:08:05 +01:00 committed by GitHub
parent ecf2240b06
commit 2f345a3d0c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 6 deletions

View file

@ -7,21 +7,26 @@ For this directory tree:
``` ```
/home/ /home/
me/ me/
foo/ f o o/ # The prefix f is ambiguous between "f o o" and "f i g".
bar/ bar/
quux/ quux/
biz/ # The prefix b is ambiguous between bar and biz. biz/ # The prefix b is ambiguous between bar and biz.
f i g/
baz/
``` ```
here are the results of calling `shrink_path <option> /home/me/foo/bar/quux`: here are the results of calling `shrink_path <option> /home/me/foo/bar/quux`:
``` ```
Option Result Option Result
<none> /h/m/f/ba/q <none> /h/m/f o/ba/q
-l|--last /h/m/f/ba/quux -l|--last /h/m/f o/ba/q
-s|--short /h/m/f/b/q -s|--short /h/m/f/b/q
-t|--tilde ~/f/ba/q -t|--tilde ~/f o/ba/q
-f|--fish ~/f/b/quux -f|--fish ~/f/b/quux
-3 /hom/me/foo/bar/quu -g|--glob /h*/m*/f o*/ba*/q*
-e '$' -3 /ho$/me/foo/bar/qu$ -3 /hom/me/f o/bar/quu
-e '$' -3 /hom$/me/f o$/bar/quu$
-q /h/m/f\ o/ba/q
-g -q /h*/m*/f\ o*/ba*/q*
``` ```
@ -39,6 +44,7 @@ The following options are available:
``` ```
-f, --fish fish simulation, equivalent to -l -s -t. -f, --fish fish simulation, equivalent to -l -s -t.
-g, --glob Add asterisk to allow globbing of shrunk path (equivalent to -e "*")
-l, --last Print the last directory's full name. -l, --last Print the last directory's full name.
-s, --short Truncate directory names to the number of characters given by -. Without -s, --short Truncate directory names to the number of characters given by -. Without
-s, names are truncated without making them ambiguous. -s, names are truncated without making them ambiguous.
@ -47,6 +53,7 @@ The following options are available:
-# Truncate each directly to at least this many characters inclusive of the -# Truncate each directly to at least this many characters inclusive of the
ellipsis character(s) (defaulting to 1). ellipsis character(s) (defaulting to 1).
-e SYMBOL Postfix symbol(s) to indicate that a directory name had been truncated. -e SYMBOL Postfix symbol(s) to indicate that a directory name had been truncated.
-q, --quote Quote special characters in the shrunk path
``` ```
The long options can also be set via zstyle, like The long options can also be set via zstyle, like

View file

@ -9,6 +9,7 @@
# The following options are available: # The following options are available:
# #
# -f, --fish fish simulation, equivalent to -l -s -t. # -f, --fish fish simulation, equivalent to -l -s -t.
# -g, --glob Add asterisk to allow globbing of shrunk path (equivalent to -e "*")
# -l, --last Print the last directory's full name. # -l, --last Print the last directory's full name.
# -s, --short Truncate directory names to the number of characters given by -#. Without # -s, --short Truncate directory names to the number of characters given by -#. Without
# -s, names are truncated without making them ambiguous. # -s, names are truncated without making them ambiguous.
@ -17,6 +18,7 @@
# -# Truncate each directly to at least this many characters inclusive of the # -# Truncate each directly to at least this many characters inclusive of the
# ellipsis character(s) (defaulting to 1). # ellipsis character(s) (defaulting to 1).
# -e SYMBOL Postfix symbol(s) to indicate that a directory name had been truncated. # -e SYMBOL Postfix symbol(s) to indicate that a directory name had been truncated.
# -q, --quote Quote special characters in the shrunk path
# #
# The long options can also be set via zstyle, like # The long options can also be set via zstyle, like
# zstyle :prompt:shrink_path fish yes # zstyle :prompt:shrink_path fish yes
@ -42,6 +44,7 @@ shrink_path () {
typeset -i named=0 typeset -i named=0
typeset -i length=1 typeset -i length=1
typeset ellipsis="" typeset ellipsis=""
typeset -i quote=0
if zstyle -t ':prompt:shrink_path' fish; then if zstyle -t ':prompt:shrink_path' fish; then
lastfull=1 lastfull=1
@ -55,6 +58,8 @@ shrink_path () {
zstyle -t ':prompt:shrink_path' last && lastfull=1 zstyle -t ':prompt:shrink_path' last && lastfull=1
zstyle -t ':prompt:shrink_path' short && short=1 zstyle -t ':prompt:shrink_path' short && short=1
zstyle -t ':prompt:shrink_path' tilde && tilde=1 zstyle -t ':prompt:shrink_path' tilde && tilde=1
zstyle -t ':prompt:shrink_path' glob && ellipsis='*'
zstyle -t ':prompt:shrink_path' quote && quote=1
while [[ $1 == -* ]]; do while [[ $1 == -* ]]; do
case $1 in case $1 in
@ -70,6 +75,7 @@ shrink_path () {
-h|--help) -h|--help)
print 'Usage: shrink_path [-f -l -s -t] [directory]' print 'Usage: shrink_path [-f -l -s -t] [directory]'
print ' -f, --fish fish-simulation, like -l -s -t' print ' -f, --fish fish-simulation, like -l -s -t'
print ' -g, --glob Add asterisk to allow globbing of shrunk path (equivalent to -e "*")'
print ' -l, --last Print the last directory''s full name' print ' -l, --last Print the last directory''s full name'
print ' -s, --short Truncate directory names to the number of characters given by -#. Without' print ' -s, --short Truncate directory names to the number of characters given by -#. Without'
print ' -s, names are truncated without making them ambiguous.' print ' -s, names are truncated without making them ambiguous.'
@ -78,6 +84,7 @@ shrink_path () {
print ' -# Truncate each directly to at least this many characters inclusive of the' print ' -# Truncate each directly to at least this many characters inclusive of the'
print ' ellipsis character(s) (defaulting to 1).' print ' ellipsis character(s) (defaulting to 1).'
print ' -e SYMBOL Postfix symbol(s) to indicate that a directory name had been truncated.' print ' -e SYMBOL Postfix symbol(s) to indicate that a directory name had been truncated.'
print ' -q, --quote Quote special characters in the shrunk path'
print 'The long options can also be set via zstyle, like' print 'The long options can also be set via zstyle, like'
print ' zstyle :prompt:shrink_path fish yes' print ' zstyle :prompt:shrink_path fish yes'
return 0 return 0
@ -96,6 +103,12 @@ shrink_path () {
shift shift
ellipsis="$1" ellipsis="$1"
;; ;;
-g|--glob)
ellipsis='*'
;;
-q|--quote)
quote=1
;;
esac esac
shift shift
done done
@ -140,9 +153,11 @@ shrink_path () {
typeset -i dif=$(( ${#dir} - ${#part} - ellen )) typeset -i dif=$(( ${#dir} - ${#part} - ellen ))
if [[ $dif -gt 0 ]] if [[ $dif -gt 0 ]]
then then
(( quote )) && part=${(q)part}
part+="$ellipsis" part+="$ellipsis"
else else
part="$dir" part="$dir"
(( quote )) && part=${(q)part}
fi fi
result+="/$part" result+="/$part"
cd -q $dir cd -q $dir