浏览代码

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>
Marc Cornellà 4 年之前
父节点
当前提交
2f345a3d0c
共有 2 个文件被更改,包括 28 次插入6 次删除
  1. 13 6
      plugins/shrink-path/README.md
  2. 15 0
      plugins/shrink-path/shrink-path.plugin.zsh

+ 13 - 6
plugins/shrink-path/README.md

@@ -7,21 +7,26 @@ For this directory tree:
 ```
     /home/
       me/
-        foo/
+        f o o/     # The prefix f is ambiguous between "f o o" and "f i g".
           bar/
             quux/
           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`:
 ```
     Option        Result
-    <none>        /h/m/f/ba/q
-    -l|--last     /h/m/f/ba/quux
+    <none>        /h/m/f o/ba/q
+    -l|--last     /h/m/f o/ba/q
     -s|--short    /h/m/f/b/q
-    -t|--tilde    ~/f/ba/q
+    -t|--tilde    ~/f o/ba/q
     -f|--fish     ~/f/b/quux
-    -3            /hom/me/foo/bar/quu
-    -e '$' -3     /ho$/me/foo/bar/qu$
+    -g|--glob     /h*/m*/f o*/ba*/q*
+    -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.
+    -g, --glob       Add asterisk to allow globbing of shrunk path (equivalent to -e "*")
     -l, --last       Print the last directory's full name.
     -s, --short      Truncate directory names to the number of characters given by -. Without
                      -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
                      ellipsis character(s) (defaulting to 1).
     -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

+ 15 - 0
plugins/shrink-path/shrink-path.plugin.zsh

@@ -9,6 +9,7 @@
 # The following options are available:
 #
 #   -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.
 #   -s, --short      Truncate directory names to the number of characters given by -#. Without
 #                    -s, names are truncated without making them ambiguous.
@@ -17,6 +18,7 @@
 #   -#               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.
+#   -q, --quote      Quote special characters in the shrunk path
 #
 # The long options can also be set via zstyle, like
 #   zstyle :prompt:shrink_path fish yes
@@ -42,6 +44,7 @@ shrink_path () {
         typeset -i named=0
         typeset -i length=1
         typeset ellipsis=""
+        typeset -i quote=0
 
         if zstyle -t ':prompt:shrink_path' fish; then
                 lastfull=1
@@ -55,6 +58,8 @@ shrink_path () {
         zstyle -t ':prompt:shrink_path' last && lastfull=1
         zstyle -t ':prompt:shrink_path' short && short=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
                 case $1 in
@@ -70,6 +75,7 @@ shrink_path () {
                         -h|--help)
                                 print 'Usage: shrink_path [-f -l -s -t] [directory]'
                                 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 ' -s, --short     Truncate directory names to the number of characters given by -#. Without'
                                 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 '                 ellipsis character(s) (defaulting to 1).'
                                 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 '  zstyle :prompt:shrink_path fish yes'
                                 return 0
@@ -96,6 +103,12 @@ shrink_path () {
                                 shift
                                 ellipsis="$1"
                         ;;
+                        -g|--glob)
+                                ellipsis='*'
+                        ;;
+                        -q|--quote)
+                                quote=1
+                        ;;
                 esac
                 shift
         done
@@ -140,9 +153,11 @@ shrink_path () {
                         typeset -i dif=$(( ${#dir} - ${#part} - ellen ))
                         if [[ $dif -gt 0 ]]
                         then
+                            (( quote )) && part=${(q)part}
                             part+="$ellipsis"
                         else
                             part="$dir"
+                            (( quote )) && part=${(q)part}
                         fi
                         result+="/$part"
                         cd -q $dir