一段時間以來,我一直對將鍵盤上的 Windows 鍵 (Super_L) 綁定到複製和貼上感興趣,沒有其他原因,只是為了我的桌上型電腦和 MacBook 之間的方便和一致性。
在閱讀了 xmodmap 並執行以下命令後,我認為我已經很接近了:
$ # re-map Super_L to Mode_switch, the 3rd col in keymap table `xmodmap -pke`
$ xmodmap -e "keycode 133 = Mode_switch"
$ # map Mode_switch+c to copy
$ xmodmap -e "keycode 54 = c C XF86_Copy C"
$ # map Mode_switch+v to paste
$ xmodmap -e "keycode 55 = v V XF86_Paste V"
不幸的是,XF86Copy 和 XF86Paste 似乎根本不起作用。它們被列出/usr/include/X11/XF86keysym.h
並xev
顯示按鍵序列被 X 解釋為 XF86Paste 和 XF86Copy,這些符號實際上有效嗎?他們必須有應用程式層級的支援嗎?
答案1
將 Super 綁定到 Ctrl
Windows/Logo/Super
綁定你的左鍵作為另一個Ctrl
鍵怎麼樣?
您可以使用以下 xmodmap 指令來實現此目的:
remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L
假設你儲存了以上幾行,super_as_ctrl.xmodmap
你可以透過執行來測試效果
xmodmap super_as_ctrl.xmodmap
若要使變更永久(重新登入/重新啟動後仍然存在),請將該檔案重新命名為.Xmodmap
您的主資料夾中的檔案。
(以上是在Ubuntu 11.10 live系統上測試的,其他Linux發行版應該也是一樣的)
調整終端程式的複製/貼上捷徑
綁定後Super
,Ctrl
您現在Super-C
幾乎可以在任何地方進行複製。唯一常見的例外是您的終端程式。但是您可以在那裡重新定義快捷方式。
我發現gnome-terminal
現在甚至有這個選項(直到我習慣了才有Ctrl-Shift-C
)。如果您使用該選項,請轉到Edit / Keyboard Shortcuts...
選單並指定Ctrl-C
複製和Ctrl-V
貼上。應該類似konsole
等。
別擔心,您不會失去使用捷徑終止程式的能力。重新綁定終端的複製捷徑後,您就可以Ctrl-Shift-C
像以前一樣使用了Ctrl-C
。終端在這裡不區分是否按下 Shift。並且副本不再捕獲快捷方式。或者將終止重新綁定到另一個快捷方式,正如 MountainX 在他的回答中所建議的那樣。
XF86Copy等不起作用
關於複製和貼上的關鍵符號:顯然它們沒有任何作用。我透過將複製操作分配給 Shift-ScrollLock 快速測試了它(它未使用,我想使用非修飾鍵進行測試):
xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'
按下它沒有效果,XF86AudioMute 也沒有效果。然而,它在分配字母“a”時確實有效。所以我猜這些 XF86 特殊按鍵符號有特定問題。
答案2
如果您只想將 Super+x、Super+c、Super+v 形式的幾個序列綁定到其他序列,例如 Ctrl+x、Ctrl+c、Ctrl+v,以便(如 OP 所需)這些特定的超級鍵序列通常會對應到剪下和貼上,而不會影響系統上超級鍵的任何其他用途,可以僅使用XKB 擴充。下面的過程概述了這些步驟,並給出了兩種不同的啟動鍵盤設定的詳細資訊的兩個不同範例;希望這將提供足夠的資訊來適應您的系統。它假設您熟悉在系統上建立和編輯文件,包括位於系統位置(例如/usr/share/X11/xkb
.
決定您希望 XKB 配置樹駐留的位置。首先找到系統一。它通常位於 /usr/share/X11/xkb 中,如果它不存在,我不太確定如何找到它;您只需在系統中搜尋名為“xkb”的目錄即可。無論如何,一旦找到它,您可以就地修改系統,也可以使用您選擇的任何目錄。使用系統目錄的優點是您可以更輕鬆地呼叫更改,但缺點是將來的系統更新可能會覆蓋您的更改(已警告您)。無論如何,下文提到的所有檔案名稱都是相對於該目錄的,需要時我將其稱為 $XKBLOCAL$,並且所有命令都假定這是您的當前目錄。
確定目前 x、c、v 鍵的 XKB「類型」。最簡單的方法是透過命令
xkbcomp -a $DISPLAY - | grep -C 6 c,
(請注意,逗號是有意包含在模式中的)。在我的第一個範例設定中,這會產生:key <AB02> { type= "ALPHABETIC", symbols[Group1]= [ x, X ] }; key <AB03> { type= "ALPHABETIC", symbols[Group1]= [ c, C ] }; key <AB04> { type= "ALPHABETIC", symbols[Group1]= [ v, V ] }; key <AB05> {
而在我的其他範例設定中,這會產生
key <AB02> { type= "FOUR_LEVEL", symbols[Group1]= [ x, X, approxeq, dead_ogonek ] }; key <AB03> { type= "FOUR_LEVEL", symbols[Group1]= [ c, C, ccedilla, Ccedilla ] }; key <AB04> { type= "FOUR_LEVEL", symbols[Group1]= [ v, V, squareroot, U25CA ] }; key <AB05> {
結果是,在第一個範例中,相關鍵的類型為“ALPHABETIC”,而在第二個範例中,相關鍵的類型為“FOUR_LEVEL”。根據您的鍵盤設置,您可能會發現它們完全是其他類型。在下文中,該類型將被稱為 $TYPE$,您必須將其替換為實際字串 ALPHABETIC 或以下命令中的任何內容。
找到 $TYPE$ 的定義並將其複製到 $XKBLOCAL$/types 目錄中的新檔案中。這是執行此操作的命令:
xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste
。我選擇的文件“cutpaste”的名稱是任意的,可以使用您喜歡的任何名稱,但請注意,您必須在後續步驟中一致地引用該文件。在第一個設定中,該文件會取得內容type "ALPHABETIC" { modifiers= Shift+Lock; map[Shift]= Level2; map[Lock]= Level2; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; };
在另一個例子中它會取得內容
type "FOUR_LEVEL" { modifiers= Shift+LevelThree; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; };
編輯檔案類型/剪下貼上以執行兩件事:添加前導碼和後導碼,使其成為正確的XKB 子句,並更改類型名稱和類型定義以添加由對應於Super 的修飾符生成的另一個級別。您應該檢查您系統上的修改器是什麼,很可能是 Mod4,如下所示。從 types/cutpaste 的兩個範例最終版本中應該可以明顯看出必要的修改,即:
default partial xkb_types "addsuper" { type "ALPHABETIC_SUPER" { modifiers= Shift+Lock+Mod4; map[Shift]= Level2; map[Lock]= Level2; map[Mod4]= Level3; map[Shift+Mod4]= Level3; map[Lock+Mod4]= Level3; level_name[Level1]= "Base"; level_name[Level2]= "Caps"; level_name[Level3]= "With Super"; }; };
和
default partial xkb_types "addsuper" { type "FOUR_LEVEL_SUPER" { modifiers= Shift+LevelThree+Mod4; map[Shift]= Level2; map[LevelThree]= Level3; map[Shift+LevelThree]= Level4; map[Mod4]= Level5; map[Shift+Mod4] = Level5; map[LevelThree+Mod4] = Level5; map[Shift+LevelThree+Mod4] = Level5; level_name[Level1]= "Base"; level_name[Level2]= "Shift"; level_name[Level3]= "Alt Base"; level_name[Level4]= "Shift Alt"; level_name[Level5]= "With Super"'; }; };
將第二步驟中grep 輸出的鍵符號定義複製到第二個新檔案symbols/cutpaste中,並添加類似的前導碼和後導碼,並修改定義以使用新類型並向定義添加操作以處理所需的鍵由超級版本製作。在我們的兩個範例中,結果是:
default partial xkb_symbols "superversions" { replace key <AB02> { type[Group1]= "ALPHABETIC_SUPER", symbols[Group1]= [ x, X, NoSymbol ], actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<LatX>,mods=Control,clearmods=Super)] }; replace key <AB03> { type[Group1]= "ALPHABETIC_SUPER", symbols[Group1]= [ c, C, NoSymbol ], actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<LatC>,mods=Control,clearmods=Super)] }; replace key <AB04> { type[Group1]= "ALPHABETIC_SUPER", symbols[Group1]= [ v, V, NoSymbol ], actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=<LatV>,mods=Control,clearmods=Super)] }; };
和
default partial xkb_symbols "superversions" { replace key <AB02> { type[Group1]= "FOUR_LEVEL_SUPER", symbols[Group1]= [x,X,approxeq,dead_ogonek,NoSymbol], actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatX>,mods=Control,clearmods=Super)] }; replace key <AB03> { type[Group1]= "FOUR_LEVEL_SUPER", symbols[Group1]= [c,C,ccedilla,Ccedilla,NoSymbol], actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatC>,mods=Control,clearmods=Super)] }; replace key <AB04> { type[Group1]= "FOUR_LEVEL_SUPER", symbols[Group1]= [v,V,squareroot,U25CA,NoSymbol], actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatV>,mods=Control,clearmods=Super)] }; };
請注意,在第二個範例中,我還擠出了一些(不重要的)空白,以將行長度保持在一點控制之下。
找到XKB目前使用的規則集的名稱。很簡單,結果就顯示出來了
setxkbmap -query
。就我而言,它是“evdev”。將規則/evdev 的系統版本(或任何規則集的名稱)複製到 $XKBLOCAL$/rules/evdev 並新增指向我們建立的選項的規則。您在這裡有兩個選擇:您可以複製所有 evdev 或僅複製提及您實際使用的鍵盤型號、佈局、變體和選項的部分。當然,如果您要就地修改系統文件,則不需要進行任何複製,只需編輯即可。
在這種情況下,無論初始鍵盤設定如何,新增的內容都是相同的,因此只有一個範例。您找到規則檔案中以 開頭的部分,並為該部分新增
! option = symbols
一行cutpaste:super = +cutpaste
,您也可以找到規則檔案中以 開頭的部分,並在! option = types
該部分新增一行cutpaste:super = +cutpaste
。複製 evdev.lst 的系統版本並為新選項新增一行。請注意,該檔案的名稱僅對應於規則檔案的名稱並附加 .lst。與上一步一樣,您可以複製整個文件,也可以僅複製您正在使用的模型、佈局、變體和選項引用的部分。您只需找到該文件中以以下內容開頭的部分,然後向該部分
! option
添加如下行: 。cutpaste:super Add super equivalents of cut and paste operations
好的,現在所有的設定檔都已就位。如果您修改了系統文件,您現在可以使用 呼叫新選項
setxkbmap -option cutpaste:super
。另一方面,如果沒有,則必須讓 setxkbmap 知道 $XKBLOCAL$ 目錄在哪裡。更糟的是,伺服器也不知道該目錄在哪裡,而且 setxkbmap 不知道(或者可能不能,因為最終伺服器可能在另一台機器上運行)告訴它。因此,您必須將 setxkbmap 的輸出透過管道傳輸到 xkbcomp,並告訴該命令您的 $XKBLOCAL 目錄在哪裡。因此,完整的命令行是setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY
.
希望這對某人有幫助/感興趣,因為好的權威 XKB 文件/參考很少。一個非常有用的參考是http://madduck.net/docs/extending-xkb/。
答案3
這就是我所做的。這不是最終的解決方案,但我試圖實現最終的解決方案,但經過了許多努力卻無法實現。所以我選擇了一些簡單且能滿足我 90% 以上需求的東西。我可以在幾分鐘內在我訪問的任何電腦(或任何新安裝的 Linux)上實現它。這非常簡單。
在 X 終端應用程式中,設定快捷方式首選項。我已經在 Gnome 和 KDE 中完成了此操作。例如,在 Konsole 中,前往功能表 > 設定 > 配置捷徑。 Gnome X 終端機中也有類似的選單。只需選擇快捷方式(例如“複製”)並輸入所需的按鍵序列。
如果終端複製和貼上捷徑與終端命令衝突,也有一個簡單的修復方法。例如,如果有人想使用 CTRL-C 進行複製(因此 X 終端符合 CUA 標準)怎麼辦?
在這種情況下,您可以輕鬆更改 stty 鍵綁定(在 .bashrc 中)。繼續使用 CTRL-C 進行複製範例,假設您希望中斷鍵現在為 CTRL-b(表示「中斷」)。這實現了:
echo "stty intr \^b" >> ~/.bashrc
然後來源.bashrc。
整個解決方案非常簡單,只需使用 X 終端設定更改快捷方式,然後(可選)使用一行 echo 命令解決與 stty 的衝突。非常簡單,幾乎涵蓋了我需要的一切。
答案4
可能 Windows 鍵是修飾鍵。運行此命令並重試:
xmodmap -e 'remove Mod4 = Super_L'