我的用例是,我希望每当我将某些内容复制到剪贴板时,它也保存在 PRIMARY 中。人们通常认为要复制某些内容,您需要选择它,因此大多数时候不需要这样做。
然而,有时我只是单击经典的“复制到剪贴板”按钮,然后将一些不在主要内容中的内容复制到剪贴板。我经常使用Shift+Insert来粘贴,并且必须跟踪我正在使用的选择让我感到困惑。
我知道有类似clipit
或parcellite
之类的工具可以做类似的事情,但我不想要没有 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