summary refs log tree commit diff stats
path: root/tag-zsh/config/zsh/fasd.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'tag-zsh/config/zsh/fasd.zsh')
-rw-r--r--tag-zsh/config/zsh/fasd.zsh85
1 files changed, 85 insertions, 0 deletions
diff --git a/tag-zsh/config/zsh/fasd.zsh b/tag-zsh/config/zsh/fasd.zsh
new file mode 100644
index 0000000..64dbf7b
--- /dev/null
+++ b/tag-zsh/config/zsh/fasd.zsh
@@ -0,0 +1,85 @@
+alias a='fasd -a'
+alias s='fasd -si'
+alias sd='fasd -sid'
+alias sf='fasd -sif'
+alias d='fasd -d'
+alias f='fasd -f'
+# function to execute built-in cd
+fasd_cd() {
+  if [ $# -le 1 ]; then
+    fasd "$@"
+  else
+    local _fasd_ret="$(fasd -e 'printf %s' "$@")"
+    [ -z "$_fasd_ret" ] && return
+    [ -d "$_fasd_ret" ] && cd "$_fasd_ret" || printf %s\n "$_fasd_ret"
+  fi
+}
+alias z='fasd_cd -d'
+alias zz='fasd_cd -d -i'
+
+# add zsh hook
+_fasd_preexec() {
+  { eval "fasd --proc $(fasd --sanitize $1)"; } >> "/dev/null" 2>&1
+}
+autoload -Uz add-zsh-hook
+add-zsh-hook preexec _fasd_preexec
+
+# zsh command mode completion
+_fasd_zsh_cmd_complete() {
+  local compl
+  read -c compl
+  (( $+compstate )) && compstate[insert]=menu # no expand if compsys loaded
+  reply=(${(f)"$(fasd --complete "$compl")"})
+}
+
+# enbale command mode completion
+compctl -U -K _fasd_zsh_cmd_complete -V fasd -x 'C[-1,-*e],s[-]n[1,e]' -c - \
+  'c[-1,-A][-1,-D]' -f -- fasd fasd_cd
+
+(( $+functions[compdef] )) && {
+  # zsh word mode completion
+  _fasd_zsh_word_complete() {
+    [ "$2" ] && local _fasd_cur="$2"
+    [ -z "$_fasd_cur" ] && local _fasd_cur="${words[CURRENT]}"
+    local fnd="${_fasd_cur//,/ }"
+    local typ=${1:-e}
+    fasd --query $typ "$fnd" 2>> "/dev/null" | \
+      sort -nr | sed 's/^[^ ]*[ ]*//' | while read -r line; do
+        compadd -U -V fasd "$line"
+      done
+    compstate[insert]=menu # no expand
+  }
+  _fasd_zsh_word_complete_f() { _fasd_zsh_word_complete f ; }
+  _fasd_zsh_word_complete_d() { _fasd_zsh_word_complete d ; }
+  _fasd_zsh_word_complete_trigger() {
+    local _fasd_cur="${words[CURRENT]}"
+    eval $(fasd --word-complete-trigger _fasd_zsh_word_complete $_fasd_cur)
+  }
+  # define zle widgets
+  zle -C fasd-complete complete-word _generic
+  zstyle ':completion:fasd-complete:*' completer _fasd_zsh_word_complete
+  zstyle ':completion:fasd-complete:*' menu-select
+
+  zle -C fasd-complete-f complete-word _generic
+  zstyle ':completion:fasd-complete-f:*' completer _fasd_zsh_word_complete_f
+  zstyle ':completion:fasd-complete-f:*' menu-select
+
+  zle -C fasd-complete-d complete-word _generic
+  zstyle ':completion:fasd-complete-d:*' completer _fasd_zsh_word_complete_d
+  zstyle ':completion:fasd-complete-d:*' menu-select
+}
+
+(( $+functions[compdef] )) && {
+  # enable word mode completion
+  orig_comp="$(zstyle -L ':completion:\*' completer 2>> "/dev/null")"
+  if [ "$orig_comp" ]; then
+    case $orig_comp in
+      *_fasd_zsh_word_complete_trigger*);;
+      *) eval "$orig_comp _fasd_zsh_word_complete_trigger";;
+    esac
+  else
+    zstyle ':completion:*' completer _complete _fasd_zsh_word_complete_trigger
+  fi
+  unset orig_comp
+}
+