如何在 Zsh 缩写后移动光标?

How can I move the cursor after a Zsh abbreviation?

我在我的 .zshrc 文件中使用这个优秀的脚本来完成 zsh 缩写: http://zshwiki.org/home/examples/zleiab

以上效果很好。

这是我的问题:

如何修改这些缩写或脚本,使光标在缩写的特定部分结束,而不是像这样结束:

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

应缩写为:

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

更新魔术缩写扩展为

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
}

缩写将设置为

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

完整剧本

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