我怎样才能写一个“幂等的”.Xmodmap

cot*_*eyr 14 xorg keyboard xmodmap

目前我有一个.Xmodmap文件将 my 更改CommandCtrl,然后将 my 更改CtrlSuper(我在 Mac 上运行 Linux)。

它工作得很好,当只运行一次但连续运行时(例如,当我重新启动我的桌面环境(Cinnamon)时,它会重新加载.Xmodmap文件)它基本上通过恢复更改来重置设置。有效地在我想要的设置和原始设置之间切换。

如何编写一个.Xmodmap只设置一次设置但在连续运行时不会将它们更改回的文件?这是我现有的.Xmodmap文件:

clear control
clear mod4

keycode 105 =
keycode 206 =

keycode 133 = Control_L NoSymbol Control_L
keycode 134 = Control_R NoSymbol Control_R
keycode 37 = Super_L NoSymbol Super_L

add control = Control_L
add control = Control_R
Run Code Online (Sandbox Code Playgroud)

jth*_*ill 7

在应用您的模组之前将地图重置为其原始状态。完全重置需要永远,所以我能想到的最好的方法就是不同。

此代码使用.Xmodmap{.orig,.reset,.mods}where if.orig不存在将其设置为当前状态,并计算.reset从它到达的任何位置恢复该状态。申请前.mods

#!/bin/sh
# file xmodmap-reset

#     rm ~/.Xmodmap.orig
# beforehand to take current setup as baseline for Xmodmap.mods changes

stem=~/.Xmodmap
orig=${stem}.orig
reset=${stem}.reset
mods=${stem}.mods

# implement -pme like -pke
#
xmodmap-pme () {
  xmodmap -pm \
  | sed '
        1d
        / [^ ]/!d
        s/^[^ ][^ ]*/clear &\nadd & =/
        s/([^ ]*//g
    '
}

# save baseline if none atm
test -a $orig || {
    xmodmap  -pke
    xmodmap-pme
} > $orig

# payload, diff for commands to reset to baseline from current
{
    xmodmap  -pke
    xmodmap-pme
} \
| {
    diff -u0 $orig - \
    | sed -n '
        1,/^@@/d
        s/^[^+]clear/clear/p
        s/^-//p
      '
} > $reset
xmodmap $reset

# finally ready to apply the mods
test -a $mods && xmodmap $mods
Run Code Online (Sandbox Code Playgroud)

(编辑:清理)