`xdotools type` 破坏回车符

`xdotools type` 破坏回车符

我想设置一个粘贴功能,允许将复制的文本(如脚本和配置文件)粘贴到任何类型的应用程序,包括虚拟来宾和运行图形客户端(例如 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 中尝试过任何东西,所以你的情况可能会有所不同。

相关内容