Browse Source

shrink-path: add minimum length and ellipsis symbol options (#7382)

* Added minimum length and ellipsis symbol options for the shrink-path plugin.

* Replaced tab indentation with space indentation for the shrink-path plugin.

* Added handling of multicharacter ellipsis, and updated documentation and README for the shrink-path plugin.
Pavel N. Krivitsky 4 years ago
parent
commit
e65bce8495
2 changed files with 40 additions and 5 deletions
  1. 7 1
      plugins/shrink-path/README.md
  2. 33 4
      plugins/shrink-path/shrink-path.plugin.zsh

+ 7 - 1
plugins/shrink-path/README.md

@@ -20,6 +20,8 @@ here are the results of calling `shrink_path <option> /home/me/foo/bar/quux`:
     -s|--short    /h/m/f/b/q
     -t|--tilde    ~/f/ba/q
     -f|--fish     ~/f/b/quux
+    -3            /hom/me/foo/bar/quu
+    -e '$' -3     /ho$/me/foo/bar/qu$
 ```
 
 
@@ -38,10 +40,13 @@ 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, --short      Truncate directory names to the number of characters given by -. Without
                      -s, names are truncated without making them ambiguous.
     -t, --tilde      Substitute ~ for the home directory.
     -T, --nameddirs  Substitute named directories as well.
+    -#               Truncate each directly to at least this many characters inclusive of the
+                     ellipsis character(s) (defaulting to 1).
+    -e SYMBOL        Postfix symbol(s) to indicate that a directory name had been truncated.
 ```
 
 The long options can also be set via zstyle, like
@@ -56,6 +61,7 @@ supported.
 ## License
 
 Copyright (C) 2008 by Daniel Friesel <derf@xxxxxxxxxxxxxxxxxx>
+Copyright (C) 2018-2020 by Pavel N. Krivitsky
 
 License: WTFPL <http://www.wtfpl.net>
 

+ 33 - 4
plugins/shrink-path/shrink-path.plugin.zsh

@@ -10,10 +10,13 @@
 #
 #   -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, --short      Truncate directory names to the number of characters given by -#. Without
 #                    -s, names are truncated without making them ambiguous.
 #   -t, --tilde      Substitute ~ for the home directory.
 #   -T, --nameddirs  Substitute named directories as well.
+#   -#               Truncate each directly to at least this many characters inclusive of the
+#                    ellipsis character(s) (defaulting to 1).
+#   -e SYMBOL        Postfix symbol(s) to indicate that a directory name had been truncated.
 #
 # The long options can also be set via zstyle, like
 #   zstyle :prompt:shrink_path fish yes
@@ -37,6 +40,8 @@ shrink_path () {
         typeset -i short=0
         typeset -i tilde=0
         typeset -i named=0
+        typeset -i length=1
+        typeset ellipsis=""
 
         if zstyle -t ':prompt:shrink_path' fish; then
                 lastfull=1
@@ -53,6 +58,10 @@ shrink_path () {
 
         while [[ $1 == -* ]]; do
                 case $1 in
+                        --)
+                                shift
+                                break
+                        ;;
                         -f|--fish)
                                 lastfull=1
                                 short=1
@@ -62,9 +71,13 @@ shrink_path () {
                                 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 ' -s, --short     Truncate directory names to the number of characters given by -#. Without'
+                                print '                 -s, names are truncated without making them ambiguous.'
                                 print ' -t, --tilde     Substitute ~ for the home directory'
                                 print ' -T, --nameddirs Substitute named directories as well'
+                                print ' -#              Truncate each directly to at least this many characters inclusive of the'
+                                print '                 ellipsis character(s) (defaulting to 1).'
+                                print ' -e SYMBOL       Postfix symbol(s) to indicate that a directory name had been truncated.'
                                 print 'The long options can also be set via zstyle, like'
                                 print '  zstyle :prompt:shrink_path fish yes'
                                 return 0
@@ -76,10 +89,18 @@ shrink_path () {
                                 tilde=1
                                 named=1
                         ;;
+                        -[0-9]|-[0-9][0-9])
+                                length=${1/-/}
+                        ;;
+                        -e)
+                                shift
+                                ellipsis="$1"
+                        ;;
                 esac
                 shift
         done
 
+        typeset -i elllen=${#ellipsis}
         typeset -a tree expn
         typeset result part dir=${1-$PWD}
         typeset -i i
@@ -109,12 +130,20 @@ shrink_path () {
                         expn=(a b)
                         part=''
                         i=0
-                        until [[ (( ${#expn} == 1 )) || $dir = $expn || $i -gt 99 ]]  do
+                        until [[ $i -gt 99 || ( $i -ge $((length - ellen)) || $dir == $part ) && ( (( ${#expn} == 1 )) || $dir = $expn ) ]]; do
                                 (( i++ ))
                                 part+=$dir[$i]
                                 expn=($(echo ${part}*(-/)))
-                                (( short )) && break
+                                (( short )) && [[ $i -ge $((length - ellen)) ]] && break
                         done
+
+                        typeset -i dif=$(( ${#dir} - ${#part} - ellen ))
+                        if [[ $dif -gt 0 ]]
+                        then
+                            part+="$ellipsis"
+                        else
+                            part="$dir"
+                        fi
                         result+="/$part"
                         cd -q $dir
                         shift tree