Jamis Charles
Jamis Charles

Reputation: 6039

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

Upvotes: 3

Views: 853

Answers (1)

amit_g
amit_g

Reputation: 31250

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

Upvotes: 2

Related Questions