On Jan 05, 2024 at 17:53, Sam B. wrote: > I'll have a read through `url-quote-magic` too, which seems to do > something similar. I quite liked the behaviour of `url-quote-magic` to simply type any of the "special" chars and have them automatically quoted. So I've modified `url-quote-magic` to escape chars only when the first word matches `task` or any alias to it. There's probably a few improvements possible, but here's a first pass of my solution. zstyle -m ':task-quote-magic:\*' task-seps '*' || zstyle -e ':task-quote-magic:*' task-seps 'reply=("#{}&<>''${histchars[1]}")' zstyle -m ':task-quote-magic' task-cmds '*' || zstyle -e ':task-quote-magic' task-cmds \ 'zmodload -i zsh/parameter; reply=( task ${(k)galiases[(R)(* |)task *]:-} ${(k)aliases[(R)(* |)task *]:-} )' function task-quote-magic { setopt localoptions noksharrays extendedglob local qkey="${(q)KEYS}" local -a reply match mbegin mend # is key different than quoted key if [[ "$KEYS" != "$qkey" ]] then local lbuf="$LBUFFER$qkey" if [[ "${(Q)LBUFFER}$KEYS" == "${(Q)lbuf}" ]] then local -a words words=("${(@Q)${(z)lbuf}}") local taskseps taskcmds zstyle -s ":task-quote-magic" task-cmds taskcmds '|' if [[ "$words[1]" == (#b)${~taskcmds} ]] then zstyle -s ":task-quote-magic:$match[1]" task-seps taskseps '' fi [[ "$taskseps" == *"$KEYS"* ]] && LBUFFER="$LBUFFER\\" fi fi zle .self-insert } zle -N self-insert task-quote-magic