什么是同步 CLIPBOARD -> PRIMARY 选择的轻量级方法?

什么是同步 CLIPBOARD -> PRIMARY 选择的轻量级方法?

我的用例是,我希望每当我将某些内容复制到剪贴板时,它也保存在 PRIMARY 中。人们通常认为要复制某些内容,您需要选择它,因此大多数时候不需要这样做。

然而,有时我只是单击经典的“复制到剪贴板”按钮,然后将一些不在主要内容中的内容复制到剪贴板。我经常使用Shift+Insert来粘贴,并且必须跟踪我正在使用的选择让我感到困惑。

我知道有类似clipitparcellite之类的工具可以做类似的事情,但我不想要没有 GUI 的东西,比如systemd我可以启动并忘记的简单服务。

我尝试使用类似配置的systemd服务autocutsel

ExecStartPre=autocutsel -f
ExecStart=autocutsel -f --selection PRIMARY

然而,这也会同步 PRIMARY -> CLIPBOARD,这会破坏一些非常常见的工作流程,例如选择文本,然后将其替换为剪贴板的内容。

我在 的联机帮助页中查找过此选项autocutsel,但我发现它有点令人困惑,其中大量提及cutbuffer(我认为它不再使用)和我不使用的 Windows。所以我什至不知道这是否可能autocutsel

答案1

下面是一个快速的 Python 程序,使用 GTK 的 PyGObject 绑定来执行此操作。我不是这方面的专家,所以这只是一个适合我的示例,在旧的 Fedora 版本上使用 rpm pygobject2。您必须自己找到等效的软件包。

#!/usr/bin/python3
# copy clipboard to primary every time it changes
# https://unix.stackexchange.com/a/660344/119298
import signal, gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

# callback with args (Gtk.Clipboard, Gdk.EventOwnerChange)
def onchange(cb, event): 
    text = clipboard.wait_for_text() # convert contents to text in utf8
    primary.set_text(text, -1) # -1 to auto set length

signal.signal(signal.SIGINT, signal.SIG_DFL) # allow ^C to kill
primary = Gtk.Clipboard.get(Gdk.SELECTION_PRIMARY)
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clipboard.connect('owner-change', onchange) # ask for events
Gtk.main() # loop forever

相关内容