为什么 Shift+Insert 在某些应用程序中从 CLIPBOARD 粘贴,而在其他应用程序中从 PRIMARY 粘贴?

为什么 Shift+Insert 在某些应用程序中从 CLIPBOARD 粘贴,而在其他应用程序中从 PRIMARY 粘贴?

如何使用键盘快捷键从主要选择(例如鼠标选择的文本)进行粘贴?Shift+Insert从 PRIMARY 或 CLIPBOARD 粘贴不一致,具体取决于应用程序。

背景:

Ctrl+C将所选文本复制到剪贴板,同时将鼠标选择复制到主文本。从 CLIPBOARD 粘贴Ctrl+V,从 PRIMARY 粘贴mouse-middle-click

在终端模拟器 (gnome-terminal) 中,从 CLIPBOARD 粘贴Ctrl+Shift+V. (从 PRIMARY 粘贴到mouse-middle-click静止状态。)

我想使用键盘快捷键从 PRIMARY 粘贴。在 gnome-terminal 中,这是Shift+Insert,但在 gedit 和 Firefox 中,Shift+Insert是从 CLIPBOARD 粘贴。我想要一个始终从 CLIPBOARD 粘贴的快捷方式和一个始终从 PRIMARY 粘贴的不同快捷方式。

我正在使用 xmonad 和 Firefox 34.0 运行 Ubuntu 14.04

答案1

您提到的所有应用程序都是gtk+应用程序,因此很容易回答为什么...因为在全部 gtk+应用 (除了一个), Shift+Insert从剪贴板粘贴 - 即它相当于Ctrl+ V。该快捷方式被硬编码在gtkentry.c(第 2022 行)和gtktextview.c(第 1819 行):

gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, GDK_SHIFT_MASK,
                "paste-clipboard", 0);

它也记录在GTK+ 3 参考手册在下面GtkEntry:

The “paste-clipboard” signal
void
user_function (GtkEntry *entry,
               gpointer  user_data)
The ::paste-clipboard signal is a keybinding signal which gets emitted
to paste the contents of the clipboard into the text view.
The default bindings for this signal are Ctrl-v and Shift-Insert.

据我所知,这样做是为了与其他 DE 保持一致(KDEQt参阅QTextEdit Class) 和 Windows 操作系统1 .
唯一的例外gnome-terminal。经过长时间的争论,开发人员决定(为了与其他终端保持一致),在 中gnome-terminalShift+Insert应该从 PRIMARY 粘贴,Ctrl++Shift应该V从 CLIPBOARD 粘贴(尽管您可以选择自定义一些快捷方式)。


至于如何您是否使用键盘快捷键粘贴选择...没有简单的方法。

最简单的方法是为运行的脚本分配快捷方式xdotool click 2(模拟单击鼠标中键)。虽然这有效(并且它应该适用于所有或大多数 DE 和工具包),但只有当鼠标光标实际上位于文本输入框上方时它才有效,否则它将失败。

另一种相对简单的方法是通过 Gnome Accessibility(如果您的系统可用)。它还需要有数字键盘。转到Universal Access>>Pointing & Clicking并启用Mouse Keys。确保NumLock已关闭。然后,您可以使用数字键盘移动光标并单击。要模拟鼠标中键单击,请按下(然后释放)*(星号),然后按下5(这是一个简短的指导)。这个解决方案似乎总是在某个gtk+环境中有效。缺点是它需要Gnome Accessibility一个数字键盘。此外,您无法自定义快捷方式。

提出了一个有趣的解决方案gnome-bugzilla(错误 643391)。 (2018 年更新:问题现已转移这里.)它需要修补一些源文件并在~/.config/gtk-3.0/gtk.css(或~/.gtkrc-2.02gtk+个应用程序)中设置配置选项。我个人没有尝试过,但反馈是积极的。

理想情况下,您可以修补源文件并定义一个"paste-selection"信号,然后将Shift+绑定Insert"paste-selection"而不是"paste-clipboard".安迪的代码(附在上面链接的错误报告中)可以作为如何做到这一点的指南。即使如此,它也只会影响gtk+应用程序(我不是一个KDE/Qt人,所以我不知道如何改变Qt应用程序的行为)。


1:(更不用说IBM的CUA了)

答案2

抱歉:由于声誉问题,我无法写评论,所以我写为答案。这不是直接的解决方案,但它帮助我......

您可以使用信息组合:

  1. 编辑 gtk 主题并根据需要允许键绑定

  2. 在主题的 css 中创建 gtk 3.0 键绑定的示例

  3. 覆盖 gtk 键绑定和取消绑定的示例

  4. 修改 gnome 终端键绑定的示例

  5. 自动启动 autocutsel,并使用默认选项将 CLIPBOARD 同步到 CUTBUFFER(这是可选的)。此链接仅提供有关问题的信息。

  6. 使用clipman gui访问多个缓冲区(主和剪贴板),没有自动同步选择(双向自动同步会出错)。

因此,我只需选择 gtk 主题,并将主题 CSS 修改为复制剪贴板 (Ctrl+Insert) 和粘贴剪贴板 (Shift+Insert) 信号所需的键绑定。

相关内容