![我怎样才能写一个“幂等”.Xmodmap](https://linux22.com/image/3713/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E5%86%99%E4%B8%80%E4%B8%AA%E2%80%9C%E5%B9%82%E7%AD%89%E2%80%9D.Xmodmap.png)
目前我有一个.Xmodmap
文件将 my 更改Command为Ctrl,然后将 my 更改Ctrl为Super(我在 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
答案1
在应用模组之前,请将地图重置为原始状态。完全重置需要很长时间,所以我能想到的最好办法是进行差异化。
此代码使用.Xmodmap{.orig,.reset,.mods}
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
(编辑:清理)
答案2
转到系统 > 首选项 > 启动应用程序并添加xmodmap ~/.Xmodmap
.
答案3
我仍然对你想要什么感到有点困惑,但我认为是这样的:
如果你把这个放在你的~/.Xmodmap
,
clear control
clear mod4
keysym Super_L = Control_L
keysym Control_L = Super_L
add control = Control_L
add control = Control_R
add mod4 = Super_L
add mod4 = Super_R
然后每次xmodmap ~/.Xmodmap
执行的时候,然后左键Ctrl和左键⌘互换。因此,在第一次调用时,该Ctrl键的作用就像您按下了 一样⌘,但在第二次调用时,它Ctrl再次恢复充当键的作用。