最近几个月,我发现如果我在 Chrome 中复制 URL,然后在 中按住 Shift-Insert urxvt
,粘贴的 URL 就会被转义。
例如原网址为:
http://example.com/?a=c
粘贴的内容是:
http://example.com/\?a\=c
但如果我将其粘贴到其他地方,例如在网络浏览器中或在 中vim
,则无法逃脱。
我用的是Arch Linux urxvt
,,,zsh
oh-my-zsh.
答案1
这是称为“url-quote-magic”的 Z Shell 模块在行动中。它试图确保您最终得到您想要的结果,即使您完全忽略了 shell 元字符和引用。它检测(在 ZLE 中)未加引号的单词何时看起来像 URL(前面带有架构),并更改字符自插入发生在单词其余部分的方式。
如果粘贴操作只是输入
http://example.com/?a=c进入命令行编辑器,您最终会得到一个命令当运行时会尝试执行文件名扩展并且执行失败因为没有文件名匹配。 Vivek Verma 的一个著名例子是:
~$ mpvhttps://www.youtube.com/watch?v=HcgJRQWxKnw zsh:未找到匹配项:https://www.youtube.com/watch?v=HcgJRQWxKnw 〜$
请记住:Z Shell 有很多文件名扩展字符 — 不仅包括?
、[
、]
和*
;还可以=
(命令名称搜索)<
和>
(数字范围)、~
、^
和#
。这甚至不包括 Korn shell 兼容性机制。请参阅zshexpn手册页中有相当长的细节。
url-quote-magic 确定这不是一个引用的单词,识别了http:
模式前缀,并将?
and更改=
为\?
and ,\=
以便它们不会调用文件名扩展。
所以除非你其实想要,由于某种原因,您粘贴或输入的 URL(请注意,没有添加任何封闭的单引号)将受到所有文件名扩展的影响,并且要么无法工作,要么(在罕见的极端意外情况下)产生意外的结果匹配,您可能应该感到高兴,因为您清楚地认为 URL 中的 shell 元字符的自动引用已经为您完成了。 ☺
答案2
虽然@JdeBP 对正在发生的事情提供了很好的解释,但我似乎不知道可以对这种行为采取什么措施。
只需用双引号将 URL 链接括起来即可防止 zsh 在粘贴时转义:
"http://example.com/?a=c"
粘贴内容:
"http://example.com/?a=c"
答案3
值得关注的地方是 oh-my-zsh 及其对安全粘贴插件的使用(或不使用):
- 安全粘贴插件不会使粘贴安全并破坏其他功能。第1742章评论
启用此插件还会破坏粘贴的特殊字符(包括 URL 的特殊字符)的转义。
- 粘贴后键盘输入被禁用 #4434
- Debian Bug 报告日志 - #802581 zsh:粘贴 URL 时 url-quote-magic 不再起作用
从这些和类似的报告来看,似乎url-quote-magic
被以下更改所打破不是使用括号粘贴功能。您可能应该在适当的位置打开错误报告。
答案4
显然这不是解决此问题的最干净方法,但这里或多或少有一种解决方法,可以在不使用 zsh 自动转义的情况下复制字符串:
sudo apt-get install xclip
alias zhistory_paste='echo : `expr $(date +%s) + 1`:0\;`printf "$(xclip -o clipboard)\n"` >> ~/.zsh_history && fc -R'
现在,当您想要粘贴某些内容时,只需使用zhistory_paste
,然后按向上箭头键即可拉出字符串。