diff options
Diffstat (limited to 'plugins/zsh-navigation-tools/n-cd')
-rw-r--r-- | plugins/zsh-navigation-tools/n-cd | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/plugins/zsh-navigation-tools/n-cd b/plugins/zsh-navigation-tools/n-cd new file mode 100644 index 000000000..48c6dbf4e --- /dev/null +++ b/plugins/zsh-navigation-tools/n-cd @@ -0,0 +1,71 @@ +# Copy this file into /usr/share/zsh/site-functions/ +# and add 'autoload n-cd` to .zshrc +# +# This function allows to choose a directory from pushd stack +# +# Uses n-list + +emulate -L zsh + +setopt extendedglob pushdignoredups + +zmodload zsh/curses +local IFS=" +" + +# Unset before configuration is read +unset NLIST_COLORING_PATTERN + +[ -f ~/.config/znt/n-list.conf ] && builtin source ~/.config/znt/n-list.conf +[ -f ~/.config/znt/n-cd.conf ] && builtin source ~/.config/znt/n-cd.conf + +local list +local selected + +NLIST_REMEMBER_STATE=0 + +list=( `dirs -p` ) +list=( "${(@M)list:#(#i)*$1*}" ) + +local NLIST_GREP_STRING="$1" + +[ "$#list" -eq 0 ] && echo "No matching directories" + +if [ "$#hotlist" -ge 1 ]; then + typeset -a NLIST_NONSELECTABLE_ELEMENTS NLIST_HOP_INDEXES + local tmp_list_size="$#list" + NLIST_NONSELECTABLE_ELEMENTS=( $(( tmp_list_size+1 )) $(( tmp_list_size+2 )) ) + list=( "$list[@]" "" $'\x1b[00;31m'"Hotlist"$'\x1b[00;00m': "$hotlist[@]" ) + (( tmp_list_size+=3 )) + local middle_hop=$(( (tmp_list_size+$#list) / 2 )) + [[ "$middle_hop" -eq $tmp_list_size || "$middle_hop" -eq $#list ]] && middle_hop="" + [ "$tmp_list_size" -eq $#list ] && tmp_list_size="" + NLIST_HOP_INDEXES=( 1 $tmp_list_size $middle_hop $#list ) +else + [ "$#list" -eq 0 ] && return 1 +fi + +n-list "${list[@]}" + +if [ "$REPLY" -gt 0 ]; then + selected="$reply[REPLY]" + selected="${selected/#\~/$HOME}" + + (( NCD_DONT_PUSHD )) && setopt NO_AUTO_PUSHD + cd "$selected" + local code=$? + (( NCD_DONT_PUSHD )) && setopt AUTO_PUSHD + + if [ "$code" -eq "0" ]; then + # ZLE? + if [ "${(t)CURSOR}" = "integer-local-special" ]; then + zle -M "You have selected $selected" + else + echo "You have selected $selected" + fi + fi +else + [ "${(t)CURSOR}" = "integer-local-special" ] && zle redisplay +fi + +# vim: set filetype=zsh: |