Reputation: 6039
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
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