====== Cloning vim's abbreviation feature ====== I saw this idea in [[http://strcat.de/dotfiles/#zsh|strcat's config]] for the first time.\\ This way you can get a similar featureset as with [[examples:aliasglobal|global aliases]], but without its dangers and with additional flexiblity. The idea is, to enter unique strings that get replaced with something useful as soon as ''the space-key'' gets hit: zsh% ls -l /dev Im # gets replaced by zsh% ls -l /dev | more This is really useful, because you are able to get really long commands by only typing a few characters, plus you may change the inserted command, if needed in the current situation. To get this feature, add the following code to your ''.zshrc'': typeset -Ag abbreviations abbreviations=( "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]#} LBUFFER+=${abbreviations[$MATCH]:-$MATCH} zle self-insert } 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 This also adds the possibility to _not_ replace abbreviations by hitting ''CTRL-x''. That way, you may enter 'Iag' without replacing it by 'agrep' if you need to. (But this could also be accomplished using ^V [i.e. "quoted-insert"], without adding the "no-magic-abbrev-expand" stuff, could it not? -- At least it works for me, but I have re-bound ^V to "vi-quoted-insert". /zrajm) Of course, this idea is not limited to expanding pipelines. You could, for example, add a replacement for 'emacs' that expands to 'emacs -nw'. Note, that you need to set the ''extendedglob'' [[options:expn|option]] before calling these lines. If don't do this already, this is the needed line: setopt extendedglob