如何编写“幂等” .Xmodmap


14

目前,我有一个.Xmodmap文件,将其更改CommandCtrl,然后将其更改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

我不明白这个问题。我不知道“模态”在这里是什么意思。这.Xmodmap只会影响您要更改的键,您想要做些什么?
吉尔斯(Gilles)'所以

当我使用.Xmodmap时,它会设置密钥,如果再次运行它,它将把它们切换回去。我想创建一个.Xmodmap,无论导致交换控制键和命令键的结果如何。有时,重新启动时会再次运行DE .Xmodmap,从而造成麻烦。
coteyr

2
@coteyr我认为您要寻找的词是“ 幂等
Joseph R.

Answers:


7

在套用模组之前,请先将地图重设为原始状态。完全重置将永远花费,所以我能提供的最好的就是差异。

此代码的用途.Xmodmap{.orig,.reset,.mods},其中,如果.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

(编辑:清理)


我正在尝试。到目前为止,一切都很好。
coteyr

@coteyr-这对您有用吗?
slm

并不是真的,我还在尝试。
coteyr

Upadate:这似乎是可行的,但在大多数情况下,我仍然需要进行一些调整,但至少在连续运行时不会重置设置。
coteyr

@coteyr-如果无法成功,我想我还有另一种可能有效的方法,但是它涉及更多,所以我真的不想写这篇文章。回复时,请在用户名前面加上@符号,这样我就知道您已回复,否则我必须回来检查,很可能会忘记。
slm


0

对于您想要什么我还是有些困惑,但是我认为是这样:

如果你把这个放进你的~/.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键又恢复为键的作用。


这正是我所不想要的
摄氏

我想要完全相反的事情,我想要每次调用,无论导致命令像控件一样执行和像命令一样执行控件的结果如何。
coteyr

好的,这就是为什么我很困惑,因为您的原始帖子似乎完全
可以满足

但事实并非如此。
coteyr

好吧,我观察到的行为是您的代码幂等的,而我的代码是有状态的。您是在告诉我,您的代码和我的行为对您来说都一样吗?如果是这样,那么我认为您一定遇到了某种错误。我有一个建议:尝试xmodmap ~/.Xmodmap从xterm 显式运行,看看您的代码是否确实与重复的应用程序交换了密钥。也许肉桂重新启动时您的键恢复为原始行为不是因为您认为的原因吗?
Billyjmc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.