Zsh 5.1 and bracketed paste
TL;DR. Jump to code.
In short, Zsh 5.1 introduced bracketed paste mode1 and turned it on by default (as it seems to me2). It is nice in certain ways — I appreciate the change, yet I was bitten nevertheless. In at least two ways:
url-quote-magicdoesn't work anymore when pasting URLs, so for example if I paste
without typing in a single or double quote first, the
=won't be backslash-quoted by default, which causes an error when passed unnoticed (out of habit).
The Emacs shell3 is littered with
^[[?2004laround every prompt.
The solution? Zsh now also ships with
bracketed-paste-magic that resolves exactly breakage #1 (and a bit more); to quote comments from the linked source file:
Starting with zsh-5.1, ZLE began to recognize the "bracketed paste" capability of terminal emulators, that is, the sequences
$'\e[200~'to start a paste and
$'\e[201~'to indicate the end of the pasted text. Pastes are handled by the bracketed-paste widget and insert literally into the editor buffer rather than being interpreted as keystrokes.
This disables some common usages where the self-insert widget has been replaced in order to accomplish some extra processing. An example is the contributed url-quote-magic widget. The bracketed-paste-magic widget replaces bracketed-paste with a wrapper that re-enables these self-insert actions, and other actions as selected by the zstyles described below.
And to resolve breakage #2, just disable bracketed paste altogether for dumb terms.
Putting it together:
# turn off ZLE bracketed paste in dumb term # otherwise turn on ZLE bracketed-paste-magic if [[ $TERM == dumb ]]; then unset zle_bracketed_paste else autoload -Uz bracketed-paste-magic zle -N bracketed-paste bracketed-paste-magic fi
09/22/2015 update. I only read
NEWS and not
README, so I missed out on a very clear announcement of the bracketed paste incompatibitilies (between 5.0.8 and 5.1):
The default behaviour when text is pasted into an X Windows terminal has changed significantly (unless you are using a very old terminal emulator that doesn't support this mode). Now, the new "bracketed paste mode" treats all the pasted text as literal characters. This means, in particular, that a newline is simply inserted as a visible newline; you need to hit Return on the keyboard to execute the pasted text in one go. See the description of
zshparamsmanual for more. "
unset zle_bracketed_paste" restores the previous behaviour.
Bracketed paste mode is a safeguard against inadvertent interpretation of pasted text, e.g., newline being treated at
accept-linein Zsh. You may read more about it in this blog post, which is somewhat outdated yet still informational.↩︎
Indeed it is. See update with more accurate info from official source.↩︎
I seldom use this dumb (literally) thing, but when I do I expect it to work ungarbled, naturally.↩︎