我想设置一个粘贴功能,允许将复制的文本(如脚本和配置文件)粘贴到任何类型的应用程序,包括虚拟来宾和运行图形客户端(例如 VNC)的远程会话(其中不可能进行标准复制粘贴)。
为了实现这一点,我将桌面管理器中的快捷方式与以下命令相关联:
sh -c 'sleep 1; xdotool type -- "$(xsel -bo)"'
这有效......但仅适用于某些应用程序(遗憾的是 VNC 不是其中的一部分,残酷的世界!)。
- 如果我使用它将文本粘贴到本地主机上的
vi
运行中xterm
,那么这将完美地工作:文件的内容将被保留并按预期写入。这似乎也可以完美地工作在gnome-terminal
. - 例如,如果仍然在本地主机上
vi
运行,则所有回车符都会被破坏。xfce4-terminal
- 同样,如果我尝试通过 VNC 将文本粘贴到任何应用程序(包括
xterm
),则文本会正确键入,但这里再次全部在一行上。
奇怪的是,如果我将以下命令附加到另一个键盘快捷键:
sh -c 'sleep 1; xdotool key Return'
这里xdotool
设法在任何应用程序中输入回车符,因此技术上是可行的。
我试图以此为基础作为一个丑陋的解决方法来强制回车:
sh -c 'sleep 1; xsel -bo | { while read -r LINE; do xdotool type -- "$LINE"; xdotool key Return; done; }'
现在回车“有效”,这个解决方法现在会破坏选项卡,并且在所有情况下我都不喜欢它,因为我并不总是想要最终的回车(例如,在填写网络表单字段而不立即提交时)。
我想我有同样的问题这家伙,但遗憾的是该线程没有解释。
哪里有问题?我怎样才能做到这一点?或者,如果由于某种原因这是不可能的,是否还有其他方法轻的我最初的需求的替代方案?
答案1
由于历史原因,表示换行的字符有两个:换行符(常用表示为 LF、\n
、\012
、 Ctrl+J、...)和回车符(CR、\r
、\015
、 Ctrl+M)。 Unix 使用 LF 作为行终止符,但当您按 时键盘会发送 CR Return。某些应用程序可以识别Linefeed按键(某些罕见的键盘上存在这种按键,这些键盘不是为 PC 市场设计的),但这种情况很少见。
实验上,当字符串中有换行符时,xdotool 会发送一个Linefeed密钥。对于某些应用程序无法识别这一点,我并不感到惊讶。您可以Return通过用回车符替换换行符来使其发送。
sleep 1; xdotool type -- "$(xsel -bo | tr \\n \\r | sed s/\\r*\$//)"
您的解决方法也可以发挥作用。设置IFS
为空值,否则read
会去除每行的前导和尾随空格(这就是制表符消失的原因)。并且不要Return在最后一行之后发送。 (这并不严格等同于命令替换方法:使用命令替换,所有尾随空行都将被删除;使用以下方法,仅忽略最后一个换行符(如果有)。)
sleep 1
xsel -bo | {
IFS= read -r LINE;
xdotool type -- "$LINE";
while IFS= read -r LINE; do
xdotool key Return;
xdotool type -- "$LINE";
done;
}
注意:我还没有在 VNC 中尝试过任何东西,所以你的情况可能会有所不同。