使用 setxkbmap 或 xmodmap 為某些鍵設定 Hyper 和 Super 修飾符

使用 setxkbmap 或 xmodmap 為某些鍵設定 Hyper 和 Super 修飾符

問題:我想修改/重新定義我的鍵盤佈局 (pc105 se),以便當我使用 mod3 (super) 和 mod4 (hyper) 按下某些鍵時,會返回與平常不同的字元。

例如

鍵碼 61 在正常按下時產生「減號」(-),在按住 Shift 的同時按下時產生「底線」(_)。當按下第一個修飾符組 (AltGr) 時,會產生「dead_belowdot」和「dead_abovedot」(不含shift)。

我想要的是當我按下超級(win)鍵的同時按下該鍵時的左括號或右括號(不帶/帶shift),以及超級鍵的斜杠/反斜杠(我已將其配置為大寫鎖定)。

我嘗試將 a 添加.Xmodmap到我的主目錄並 xmodmap ~/.Xmodmap使用以下語法運行它

keycode 61 = minus underscore a b c d e f g h i j k l m n o p

然而,這將導致 AltGr 導致 c/d,而 win/caps lock 仍然只導致 -/_

我還嘗試直接修改 /usr/share/X11/xkb/symbols/se 並嘗試以下更改:

key <BKSL>  { [apostrophe, asterisk, acute, multiply], [a,b,c,d], [e,f,g,h], [i,j,k,l]};

但發生的只是 ' * ´ × ' * ' * (分別適用於正常、altgr、win 和大寫鎖定)。我也嘗試過

key <BKSL>  { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};

但是,一旦指定欄位超過四個,它似乎就會完全破壞密鑰,並且密鑰將恢復為預設的 pc105(美國?)行為。

由於我在 stackoverflow、超級用戶或谷歌上找不到任何關於如何處理我的場景的信息,所以我在這裡詢問。

這是我的xmodmap -pm

xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock      
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        Hyper_L (0x42),  Hyper_L (0xcf)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

答案1

兩年後,我終於自豪地回答自己的問題。

我發現最簡單、最可靠和最可擴展的方法是完全依賴xmodmap.

1. 取得特殊按鍵的鍵碼

運行xev以決定您希望用作模式切換器的按鍵的按鍵代碼。然後按您感興趣的鍵並記下keycode

$ xev
KeyRelease event, serial 40, synthetic NO, window 0x2600001,
    root 0x2a6, subw 0x0, time 1221887800, (885,743), root:(3447,805),
    state 0x2010, keycode 66 (keysym 0xff7e, Mode_switch), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

鍵碼位於第三行,鍵碼 66。

對我來說,這些是我特別感興趣的按鍵,以及它們對應的按鍵代碼:

  • Caps Lock, 鍵碼 66
  • Pause|Break, 鍵碼 128
  • Left Windows key, 鍵碼 133
  • Num Lock, 鑰匙代碼 77

2. 設定切換鍵

這是我選擇的設置,但您可以選擇自己的設置。我已將其保存到文件中$HOME/.xmodmap

~/.xmodmap
keycode  66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...

這樣我就綁定了Caps Lockto Mode_switchPause BreaktoCompose和左鍵Winto Super_L。該Compose鍵特別有用,因為它允許將兩個鍵組合成連字。例如,Compose後面接著TM會產生商標符號

3. 取得目前的鍵盤映射綁定xmodmap

為了不破壞我的鍵盤佈局,我想讓我的按鍵盡可能接近原來的佈局。為了做到這一點,我列印了當前的鍵盤映射並查找我想要更改的鍵碼。

$ xmodmap -pke | ag 'keycode  51' 

當然,您也可以輕鬆使用grepack,這取決於您喜歡使用的工具。

$ xmodmap -pke | grep 'keycode  41' 
$ xmodmap -pke | ack 'keycode  31' 

其輸出格式與您在中指定的格式相同,~/.xmodmap如下所示:

keycode  31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless

4. 備份現有的xmodmap

以防萬一出現問題,讓您的電流xmodmap可以輕鬆恢復並不是一個壞主意。

$ xmodmap -pke > ~/.xmodmap.bak

5. 將字元加入按鍵的第 2、3、4 級

據我了解,該.xmodmap文件的格式是這樣的:

keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...

現在,我不明白所有這些級別,但Mode_SwitchCaps Lock就我而言)會給你級別 2 並Alt Gr給我級別3,這幾乎是我感興趣的所有內容,所以我保留了該行的其餘部分,因為它在我的~/.xmodmap.bak並將第 3、4、5 和 6 列(第 2 級和第 3 級,加上移位)更改為有效字元(請參閱此處以獲取有效字元列表)。

~/.xmodmap
...
keycode  51 = apostrophe asterisk dollar ampersand acute multiply acute multiply apostrophe asterisk acute multiply apostrophe asterisk acute multiply
keycode  59 = comma semicolon parenleft parenright dead_cedilla dead_ogonek dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek
keycode  60 = period colon bracketleft bracketright periodcentered dead_abovedot periodcentered dead_abovedot period colon periodcentered dead_abovedot period colon periodcentered dead_abovedot
keycode  61 = minus underscore braceleft braceright slash backslash braceleft braceright
keycode  65 = space space space space space underscore space space
...

6.測試你的.xmodmap

現在讓我們xmodmap執行.xmodmap並測試您的全新鍵盤佈局。

$ xmodmap /home/user/.xmodmap

7. 確保您的鍵盤佈局已在 x init 上加載

我將此添加到我的$HOME/.xinitrc

~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...

我希望這可以幫到你!

相關內容