about summary refs log tree commit diff
path: root/Functions/Chpwd/_cdr
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Chpwd/_cdr')
-rw-r--r--Functions/Chpwd/_cdr57
1 files changed, 57 insertions, 0 deletions
diff --git a/Functions/Chpwd/_cdr b/Functions/Chpwd/_cdr
new file mode 100644
index 000000000..2f52ff54b
--- /dev/null
+++ b/Functions/Chpwd/_cdr
@@ -0,0 +1,57 @@
+#compdef cdr
+
+local expl insert_string
+integer default insert
+
+zstyle -t ':chpwd:' recent-dirs-default && default=1
+if (( default )); then
+  zstyle -s ':completion:${curcontext}' recent-dirs-insert insert_string
+  case $insert_string in
+    (both)
+    insert=4
+    ;;
+
+    (fallback)
+    insert=3
+    ;;
+
+    (always)
+    insert=2
+    ;;
+
+    ([tT]*|1|[yY]*)
+    insert=1
+    ;;
+
+    (*)
+    insert=0
+  esac
+fi
+
+# See if we should fall back to cd completion.
+if [[ default -ne 0 && insert -lt 2 && \
+  ( CURRENT -ne 2 || (-n $words[2] && $words[2] != <->) ) ]]; then
+  $_comps[cd] "$@"
+  return
+fi
+
+local -a values keys
+
+if (( insert )); then
+  # insert the actual directory, not the number
+  values=(${${(f)"$(cdr -l)"}##<-> ##})
+  # Suppress the usual space suffix, since there's no further argument
+  # and it's useful to be able to edit the directory e.g. add /more/stuff.
+  if _wanted -V recent-dirs expl 'recent directory' compadd -S '' -Q -a values
+  then
+    (( insert == 4 )) || return 0
+  fi
+
+  (( insert >= 3 )) || return
+  $_comps[cd] "$@"
+else
+  values=(${${(f)"$(cdr -l)"}/ ##/:})
+  keys=(${values%%:*})
+
+  _describe -t dir-index 'recent directory index' values keys -V unsorted
+fi