6

In recent months, I find that if I copy the url in chrome and then Shift Insert in the urxvt, the pasted url is escaped.

For example, the original url is:

http://example.com/?a=c

the pasted content is:

http://example.com/\?a\=c

But if I paste it into other places, such as in the web browser or in the vim, there is no escape.

What I use is arch linux, urxvt, zsh, oh-my-zsh.

  • That sounds like url-quote-magic has been passed to autoload, though with the buggy mess that is oh-my-zsh, I couldn't say where it might have been set. – thrig Jul 2 '16 at 15:06
  • You want that it will be never escaped at all when you post it in the shell? – phk Jul 2 '16 at 15:08
5

This is a Z Shell module known as "url-quote-magic" in action. It is trying to ensure that you end up with what you intended even though you completely ignored shell metacharacters and quoting. It detects when (in ZLE) an unquoted word looks like a URL, with a schema on the front, and changes the way that character self-insertion happens to the rest of the word.

If the paste operation had simply entered

http://example.com/?a=c
into the command-line editor, you would have ended up with a command that when run would have tried to perform filename expansion and fail to execute because no filenames matched. A well-known example by Vivek Verma is:

~$  mpv https://www.youtube.com/watch?v=HcgJRQWxKnw
zsh: no matches found: https://www.youtube.com/watch?v=HcgJRQWxKnw
~$  

Remember: The Z Shell has a lot of filename expansion characters — not only including ?, [, ], and *; but also = (command name search), < and > (number ranges), ~, ^, and #. And that's not even including the Korn shell compatibility mechanisms. See the zshexpn manual page for the quite lengthy details.

url-quote-magic determined that this wasn't a quoted word, recognized the http: schema prefix, and changed the ? and = into \? and \= so that they wouldn't invoke filename expansion.

So unless you actually want, for some reason, URLs that you've pasted or typed in (without your adding any enclosing single quotes, note) to be subject to all of the filename expansions and either fail to work or (in the rare extreme surprise case) produce unexpected matches, you should probably be glad that this automatic quoting of shell metacharacters in what you clearly think of as URLs is being done for you. ☺

  • Do you mean that it just displays http://...\?a\=c and helps zsh avoids expanding. If I do something like aria2c http://...\?a\=c in zsh, the actual command to run is still aria2c http://...?a=c? – 宇宙人 Jul 2 '16 at 16:13
0

The place to look is with oh-my-zsh and its use (or not) of the safe-paste plugin:

From these and similar reports, it seems that url-quote-magic was broken by changes to not use the bracketed-paste feature. You probably should open a bug report in the appropriate place.

0

The text is shown escaped, but the command does not get affected by those escapes. If you test that URL with any command like curl, wget, or even google-chrome, you will find that it will work without any issue.

  • No, not actually. Under following situation, the command gets affected. In some cases, the urls contain spaces (some urls even contain both CJK characters and spaces), so I must wrap the url with quotes and unescape all \?s back to ?s. – 宇宙人 Nov 7 '16 at 2:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.