Search code examples
bashzshzshrcoh-my-zshzsh-completion

How can I move the cursor after a Zsh abbreviation?


I'm using this excellent script in my .zshrc file to accomplish zsh abbreviations: http://zshwiki.org/home/examples/zleiab

The above works great.

Here's my question:

How can I modify these abbreviations or the script to have the cursor end up in specific parts of the abbreviation instead of the end like so:

 "ac"    "ack -C 5 {cursorHere} --ignore-dir=.build"¬

Should abbreviate to:

ack -C 5  [cursor]  --ignore-dir=.build

Solution

  • Update the magic-abbrev-expand to

    magic-abbrev-expand() {
        local MATCH
        LBUFFER=${LBUFFER%%(#m)[_a-zA-Z0-9]#}
        command=${abbreviations[$MATCH]}
        LBUFFER+=${command:-$MATCH}
    
        if [[ "${command}" =~ "__CURSOR__" ]]
        then
            RBUFFER=${LBUFFER[(ws:__CURSOR__:)2]}
            LBUFFER=${LBUFFER[(ws:__CURSOR__:)1]}
        else
            zle self-insert
        fi
    }
    

    The abbreviation would be set as

    "ac"    "ack -C 5__CURSOR__--ignore-dir=.build"
    "Ii"    "Hello__CURSOR__! How are you"
    

    Full script

    setopt extendedglob
    typeset -Ag abbreviations
    abbreviations=(
      "ac"    "ack -C 5__CURSOR__--ignore-dir=.build"
      "Ii"    "Hello__CURSOR__! How are you"
      "Im"    "| more"
      "Ia"    "| awk"
      "Ig"    "| grep"
      "Ieg"   "| egrep"
      "Iag"   "| agrep"
      "Igr"   "| groff -s -p -t -e -Tlatin1 -mandoc"
      "Ip"    "| $PAGER"
      "Ih"    "| head"
      "Ik"    "| keep"
      "It"    "| tail"
      "Is"    "| sort"
      "Iv"    "| ${VISUAL:-${EDITOR}}"
      "Iw"    "| wc"
      "Ix"    "| xargs"
    )
    
    magic-abbrev-expand() {
        local MATCH
        LBUFFER=${LBUFFER%%(#m)[_a-zA-Z0-9]#}
        command=${abbreviations[$MATCH]}
        LBUFFER+=${command:-$MATCH}
    
        if [[ "${command}" =~ "__CURSOR__" ]]
        then
            RBUFFER=${LBUFFER[(ws:__CURSOR__:)2]}
            LBUFFER=${LBUFFER[(ws:__CURSOR__:)1]}
        else
            zle self-insert
        fi
    }
    
    no-magic-abbrev-expand() {
      LBUFFER+=' '
    }
    
    zle -N magic-abbrev-expand
    zle -N no-magic-abbrev-expand
    bindkey " " magic-abbrev-expand
    bindkey "^x " no-magic-abbrev-expand
    bindkey -M isearch " " self-insert