autojump icon indicating copy to clipboard operation
autojump copied to clipboard

Cleaner zsh completion

Open jamesk opened this issue 8 years ago • 2 comments

Hi, love autojump, I've just started using it with zsh (and oh-my-zsh) and I had what seemed like a bug in the completion, duplicate folder entries. The completion also automatically added __ to my command as all results from autojump -complete start with the search term and __.

Anyway, posting this in case it affects anyone else / you want to incorporate it into autojump. This is my modified _j file:

#compdef j
cur=${words[2, -1]}

integer i=1
declare -A displayMap

autojump --complete "${=cur[*]}" | while read c; do
    hidden=$(echo "$c" | sed 's/\(.*__[0-9][0-9]*__\).*/\1/')
    display=$(echo "$c" | sed 's/.*__[0-9][0-9]*__\(.*\)/\1/')

    (( $+displayMap[$display] )) && continue
    displayMap[$display]=true

    compadd -V $i -U -i "$hidden" "$display";
    i=$((i+1))
done

(( $i > 2 )) && compadd -V $i -U "${=cur[*]}"

Modifications:

  • It doesn't display the XXX__N__ prefix
  • Maintains order via -V arg to compadd
  • If there is more than one result: adds a final auto completion entry equal to the user's current argument, this stops the completion from modifying the command until the user actually selects one of the options.

jamesk avatar Jul 16 '17 07:07 jamesk

I would love to have something like this :)

However, while trying this script out, I noticed that the chosen completion looks far from clean: <What I entered>__<int>__<actual completion>. Since I use the autocompletion for zsh and the history extensively, this is not ideal. Do you have an idea how to fix it so the final completion is just <actual completion>?

fdw avatar May 12 '19 10:05 fdw

@fdw just change the /usr/share/zsh/site-fucntions/_j

to that

#compdef j cur=${words[2, -1]}

integer i=1 declare -A displayMap

autojump --complete "${=cur[]}" | while read c; do hidden=$(echo "$c" | sed 's/(.[0-9][0-9]*)./\1/') display=$(echo "$c" | sed 's/.[0-9][0-9]*(.*)/\1/')

(( $+displayMap[$display] )) && continue
displayMap[$display]=true

compadd -V $i -U "$display";
i=$((i+1))

done

(( $i > 2 )) && compadd -V $i -U "${=cur[*]}"

and you should be good to go

mesmerx avatar Jul 15 '20 00:07 mesmerx