Elementary OS使用Xkb修改按鍵對映,同時適用於其他使用Xkb庫的Linux發行版

鴻則發表於2017-11-23

目的

  1. 實現CapsL_Ctrl交換

  2. 實現自定義功能鍵:

    • R_Alt + H -> Left

    • R_Alt + J -> Down

    • R_Alt + K -> Up

    • R_Alt + L -> Right

    • R_Alt + 4 -> End

    • R_Alt + 6 -> Home

    • R_Alt + F -> Prior

    • R_Alt + N -> Next

以上按鍵對映主要是為了適應Vim,因為R_Alt我最不常用,固將其用作功能鍵。 關於Xkb是什麼這裡不做贅述,簡單來說XkbX-Window的一個負責鍵盤對映的庫。

步驟

  1. 檢視當前使用的鍵盤佈局,終端執行setxkbmap -print

    xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)"    };
        xkb_types     { include "complete"    };
        xkb_compat    { include "complete"    };
        xkb_symbols   { include "pc+us+inet(evdev)+group(alt_shift_toggle)"    };
        xkb_geometry  { include "pc(pc105)"    };
    };

    xkb_symbols屬性後面的pcus即下面我們需要修改檔案。

  2. 備份配置檔案
    以下操作有風險,請在有linux作業系統使用經驗的情況下操作
    切換到目錄/usr/share/X11/xkb,執行sudo tar -cvf symbols.tar symbols打包原有的配置檔案,然後進入目錄symbols

  3. CapsL_Ctrl交換
    概念:

    每一個鍵配置(大括號)裡面的方括號表示一個組,每個方括號裡面用逗號隔開的內容表示不同的等級。
    使用`Shift`建可以切換等級,使用`Mode_switch`可以切換組。
    

    編輯pc檔案,修改xkb_symbols "pc105"段,->表示前面的內容修改為後面的內容

    key <CAPS> { [ Caps_Lock   ] }; -> key <CAPS> {  [ Control_L   ] };
    key <LCTL> { [ Control_L   ] }; -> key <LCTL> {  [ Caps_Lock   ] };

    儲存登出從新登入生效。

  4. 設定R_Alt為自定義功能鍵
    pc檔案中的內容include "altwin(meta_alt)"可以看出R_Alt鍵的修改並不在pc檔案中。
    我們編輯altwin檔案。修改xkb_symbols "meta_alt"段,將R_Alt對映為Mode_switch

     key <RALT> { type[Group1] = "TWO_LEVEL", symbols[Group1] = [ Alt_R, Meta_R ] }; -> key <RALT> { type[Group1] = "TWO_LEVEL", symbols[Group1] = [ Mode_switch ] };
    
  5. 自定義R_Alt的功能
    修改us檔案。編輯xkb_symbols "basic"段,修改以下內容

    key <AE04> {  [   4, dollar      ] }; -> key <AE04> {  [ 4, dollar      ], [ End   ]  };
    key <AE06> {  [   6, asciicircum ] }; -> key <AE06> {  [ 6, asciicircum ], [ Home  ]  };
    key <AC04> {  [   f,  F          ] }; -> key <AC04> {  [   f,  F        ], [ Prior ]  };
    以下類推修改為:
    key <AC06> {  [   h,  H   ], [ Left ] };
    key <AC07> {  [   j,  J   ], [ Down ] };
    key <AC08> {  [   k,  K   ], [ Up ] };
    key <AC09> {  [   l,  L   ], [ Right ]  };
    key <AB06> {  [   n,  N   ], [ Next ] };

    登出從新登入有效

參考

相關文章