我正在使用 zsh。
我将右键单击 zsh 窗口中的复制内容,然后右键单击粘贴它。我总是会丢失一些字符,并且最后一个字符的大小写会翻转。
例如
echo this is a long message
粘贴为
(empty line)
this is a long messaG
和
vim hello.txt
变成
m hello.tX
可能是什么原因造成的以及如何修复它?
答案1
造成这种情况的原因有两个:
- 有什么东西(可能是 Z shell)告诉你的终端打开括号内的粘贴。
- Z shell 使用
vicmd
或viins
键盘映射。
发生的事情是这样的:
- Z shell 启动,并发出控制序列以在终端仿真器中打开括号内的粘贴。或者,也许文本编辑器在某个时刻执行了此操作,并且某些原因导致它无法发出控制序列以再次将其关闭。
- 你粘贴一些东西。
- 终端仿真器发送括号粘贴控制序列的开始、粘贴的文本和括号粘贴控制序列的结束。
- 起始括号粘贴控制序列的第一个字符是 ESC,它取消 ZLE 的
vi
插入模式并返回到 ZLE 的vi
命令模式。 - 后续字符是
vi
命令,不会执行太多操作,直到到达字母o
或i
,进入插入模式。 - 其余文本在插入模式下插入。
- 末尾括号粘贴控制序列的第一个字符是 ESC,它取消 ZLE 的
vi
插入模式并返回到 ZLE 的vi
命令模式。 - 控制序列的后续字符没有多大作用。
- 末尾括号粘贴控制序列的最后一个字符是
~
,它是vi
交换大小写的命令。这会导致粘贴文本的最后一个字母在大写和小写之间交换。
您可以通过以下两种方法之一解决此问题:
- 阻止 Z shell 打开括号内的粘贴;因为它显然尚未配置为在
vicmd
/viins
键映射中处理它。 vicmd
使括号内的粘贴在/键盘映射中起作用viins
。您如何执行此操作取决于您首先如何使 Z shell 识别括号内的粘贴。该safe-paste
插件采用 emacs 键盘映射,并且必须进行调整才能与 vi 键盘映射良好配合。但这并不是现在在 Z shell 中获得括号粘贴的唯一方法。
进一步阅读
- 在 vi 模式下在 zsh 中粘贴文本
- Vim 能免受复制粘贴攻击吗?
- 康拉德·欧文(2013 年 4 月)。 括号粘贴模式。 cirv.in。
- Bash 4.4 括号粘贴模式在运行命令时保持打开状态 - 损坏粘贴
- https://security.stackexchange.com/questions/39118/