X11

linux中的高級鍵映射

  • January 9, 2019

我正在使用 manjaro i3,並且正在研究修改我所做的一些鍵映射。目前我正在使用 xcape、xmodmap 和 setxkbmap 命令重新映射以下鍵:

  1. 握住時可控制的蓋子,按下時可退出
  2. 交換分號和冒號

我已經用這個設置腳本完成了這個:

setxkbmap -option 'caps:ctrl_modifier'
xcape -e 'Caps_Lock=Escape'
xmodmap -e "keycode 47 = colon semicolon"

我想就我希望進行的其他更改尋求一些幫助或建議,因為我已經破壞了我的鍵映射並且在玩下面列出的列印螢幕重新映射時必須重新安裝我的作業系統才能回到第一格。我希望做出的改變如下:

  1. 列印螢幕 –> 禁用或用作另一個超級鍵
  2. 左 alt –> mode_switch 鍵
  3. 轉義鍵 –> 波浪線和反引號
  4. 原始波浪號和反引號->退格
  5. 退格->刪除
  6. 禁用 home、end、insert、delete 鍵並映射它們以執行某些腳本
  7. mode_switch + h, j, k, l –> 附加箭頭鍵
  8. mode_switch + 退格-> 首頁
  9. mode_switch + 刪除 –> 結束

我應該使用什麼工具來完成這些重新映射?此外,如果有人有一些他們過去使用過的類似範例,那也將非常有幫助!提前感謝您的幫助。

我在 GNOME 中執行 Pop!_OS(Ubuntu 18.10 的衍生版本)的 ThinkPad P1 上確認了以下所有內容。

查找關鍵程式碼

在終端中執行xev並開始輸入。有很多數據,但是您要查找的通常是單詞之後的第二個第 3 行keycode

KeyRelease event, serial 37, synthetic NO, window 0x3c00001,
   root 0x1a5, subw 0x0, time 291165043, (404,446), root:(454,634),
   state 0x0, **keycode 107** (keysym 0xff67, Menu), same_screen YES,
   XLookupString gives 0 bytes:
   XFilterEvent returns: False

有些鍵xev不會列印鍵碼,例如 Print Screen。對於這些,您可以通過 grep 瀏覽下一節中創建的文件。

所需工具

xmodmap

轉儲你目前的綁定

您可以通過執行將目前映射列印到標準輸出xmodmap -pkexmodmap通過首先將佈局備份到文件,您將節省一些潛在的麻煩:

xmodmap -pke ~/.Xmodmap.orig

該文件還可以作為一個簡單的參考,如果它們沒有出現在xev.

cat ~/.Xmodmap | grep Print
keycode 107 = Print Sys_Req Print Sys_Req

快速更改綁定的命令

您已經知道這一點,但只是重申一下:

xmodmap -e "keycode [number] = [keys...]"

這將為您的會話臨時重新綁定密鑰。再次執行xmodmap -pke 將反映這些變化。

句法

xmodmap使用空格分隔的列來表示 a 的不同修飾符/模式keycode。從左到右他們是:

  • 鑰匙本身
  • Shift + 鍵
  • Mode_switch + 按鍵
  • Mode_switch + shift + 按鍵

例如:

xmodmap -e "44 = j J Down Next"

這會單獨設置“J”鍵“j”,當按下 Shift 鍵時設置“J”,按下 Mode_switch 鍵時設置向下箭頭,按下 Mode_switch 和 Shift 鍵時設置 Page Down。

Mode_switch

Mode_switch是一個單獨的通用修飾符,類似於 Shift。我認為許多鍵盤不再帶有專用Mode_switch(AltGr) 鍵,但您可以使用xmodmap.

# Set left Alt as Mode_switch
xmodmap -e "keycode 108 = Mode_switch"

使用 GNOME 設置執行腳本或xbindkeys

我不知道使用xmodmap. 但是,有一些簡單的方法。

從 i3 配置

i3 文件bindsym有關於在文件中使用/bindcode指令的範例~/.config/i3/config

bindcode 214 exec /home/you/some_script.sh

我還沒有設置 i3,還沒有測試過,但它直接來自使用者手冊。我猜程式碼與您在xmodmap& 朋友中找到的程式碼相匹配。

侏儒

查看設置 > 設備 > 鍵盤 > 鍵盤快捷鍵。點擊加號並添加腳本/鍵組合。請注意,您必須將完整路徑(從根目錄)放入腳本並確保它是可執行的。

鍵盤快捷鍵的 GNOME 設置窗格的螢幕截圖

在我的測試中,GNOME 不允許您使用某些鍵,例如 Home 和 End。

xbindkeys

xbindkeys可以攔截任何按鍵並執行腳本。

也可以查看一些配置文件範例,執行xbindkeys --defaults > $HOME/.xbindkeysrc並查看文件。

請注意,它不會打開終端,只需在程序中執行文件。

你的例子

這是為您想要的內容執行的實際命令。請務必確認您自己的密鑰程式碼,這些正是我碰巧擁有的。

第 1 步:重新映射xmodmap

# print screen --> use as another super key, print screen with Mode_switch
# Note: On GNOME, it appears Super_R doesn't work the same as Super_L
xmodmap -e "keycode 107 = Super_L NoSymbol Print Sys_Req"

# left alt --> mode_switch key
xmodmap -e "keycode 64 = Mode_switch NoSymbol"

# escape key --> tilde and backtick
# Note: this can have unexpected consequences if you use `xcape` to map 
# Control/Caps to send Escape when tapped. It will instead send `/~ when you 
# press Caps Lock attempting to get Escape.
# A solution might be to switch the keys around and use a non-op key as a 
# placeholder, like in the xcape README
# https://github.com/alols/xcape/blob/master/README.md#examples
xmodmap -e "keycode 9 = grave asciitilde grave asciitilde"

# original tild and back tick --> backspace
xmodmap -e "keycode 49 = BackSpace"

# backspace --> delete, and
# mode_switch + backspace --> home
xmodmap -e "keycode 22 = Delete NoSymbol Home"

# mode_switch + delete --> end
# Note: This won't work when combined with `xbindkeys`, since `xbindkeys`
# hijacks the entire Delete key from X.
xmodmap -e "keycode 119 = Delete NoSymbol End"

# mode_switch + h, j, k, l --> additional arrow keys
# Bonus: capital J/K are Page Down/Up, H/L are Home/End with Mode_switch + Shift
xmodmap -e "keycode 43 = h H Left Home"
xmodmap -e "keycode 44 = j J Down Next"
xmodmap -e "keycode 45 = k K Up Prior"
xmodmap -e "keycode 46 = l L Right End"

第 2 步:保存更改

# Write current config to a file
xmodmap -pke > ~/.Xmodmap

# Load the config into xmodmap
xmodmap ~/.Xmodmap

假設您有一個標准設置,將上面的最後一個命令添加到您的~/.profile或將在您登錄時載入它。~/.bash_profile對我來說這有點慢,您可能只想xmodmap -e手動添加所有命令。

第 3 步:為自定義腳本設置綁定xbindkeys

確保xbindkeys已安裝,並將其添加到您的~/.xbindkeysrc文件中:

# disable home, end, insert, delete keys and map them to run some script, and
"some-script-in-PATH"
 Home
"some-script-in-PATH"
 End
"some-script-in-PATH"
 Insert
"some-script-in-PATH"
 Delete

然後重新載入xbindkeys -p

第 4 步:沒有第 4 步

延伸閱讀

關於重新映射的Emacs Wiki 頁面 Xmodmap 上的

Emacs Wiki 頁面 關於 Xmodmap 的

Arch Wiki

更多關於 StackExchange 上
的 Mode_switch 一個更全面、更費力的解決方案是編寫您自己的鍵盤佈局

引用自:https://unix.stackexchange.com/questions/429835