問題:我想修改/重新定義我的鍵盤佈局 (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
, 鍵碼 66Pause|Break
, 鍵碼 128Left Windows key
, 鍵碼 133Num Lock
, 鑰匙代碼 77
2. 設定切換鍵
這是我選擇的設置,但您可以選擇自己的設置。我已將其保存到文件中$HOME/.xmodmap
。
~/.xmodmap
keycode 66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...
這樣我就綁定了Caps Lock
to Mode_switch
、Pause Break
toCompose
和左鍵Win
to Super_L
。該Compose
鍵特別有用,因為它允許將兩個鍵組合成連字。例如,Compose
後面接著T
和M
會產生商標符號™
。
3. 取得目前的鍵盤映射綁定xmodmap
為了不破壞我的鍵盤佈局,我想讓我的按鍵盡可能接近原來的佈局。為了做到這一點,我列印了當前的鍵盤映射並查找我想要更改的鍵碼。
$ xmodmap -pke | ag 'keycode 51'
當然,您也可以輕鬆使用grep
或ack
,這取決於您喜歡使用的工具。
$ 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_Switch
(Caps 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
...
我希望這可以幫到你!