Linux

同步 CLIPBOARD -> PRIMARY 選擇的輕量級方法是什麼?

  • July 28, 2021

我的案例是我希望每當我將某些內容複製到剪貼板時,它也保存在 PRIMARY 中。大多數情況下,假設要複製某些內容,您需要選擇它,因此大多數情況下不需要這樣做。

但是,有時我只是點擊經典的“複製到剪貼板”按鈕,然後將某些內容髮送到 CLIPBOARD,但它不在 PRIMARY 中。我經常使用Shift+Insert進行粘貼,並且必須跟踪我正在使用的選擇讓我感到困惑。

我知道有類似clipitparcellite可以做類似事情的工具,但我不想要沒有 GUI 的東西,比如systemd我可以啟動並忘記的簡單服務。

我嘗試使用配置的systemd服務autocutsel

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

然而,這也會同步 PRIMARY -> CLIPBOARD,這會破壞一些非常常見的工作流程,例如選擇文本然後將其替換為剪貼板的內容。

我在 的聯機幫助頁中查找了此選項autocutsel,但我發現它有點令人困惑,有很多提及cutbuffer(我認為不再使用)和我不使用的 Windows。所以我什至不知道這是否可能與autocutsel.

這是一個使用 GTK 的 PyGObject 綁定的快速 Python 程序。我不是這方面的專家,所​​以這只是一個對我有用的例子,在舊的 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

引用自:https://unix.stackexchange.com/questions/660024