為什麼 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-terminal+Shift應該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) 訊號所需的鍵綁定。

相關內容