Как я могу написать «идемпотент» .Xmodmap

14

В настоящее время у меня есть .Xmodmapфайл, который меняет мой Commandна Ctrl, затем меняет мой Ctrlна Super(я использую Linux на Mac).

Он работает довольно хорошо, когда запускается только один раз, но при последовательных запусках (например, когда я перезагружаю свою рабочую среду (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
coteyr
источник
Я не понимаю вопроса. Я понятия не имею, что значит «модальный» здесь. Это .Xmodmapвлияет только на ключи, которые вы меняете, что вы хотите сделать по-другому?
Жиль "ТАК - перестань быть злым"
Когда я использую .Xmodmap, он устанавливает ключи, если я запускаю его снова, он переключает их обратно. Я хочу создать .Xmodmap, который не имеет значения, что приводит к замене клавиш управления и команд. Иногда при перезапуске DE .Xmodmap запускается снова, что вызывает раздражение.
Котейр
2
@coteyr Я думаю, что слово, которое вы ищете, - « идемпотент »
Джозеф Р.

Ответы:

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

(редактировать: очистка)

jthill
источник
Я даю это попробовать. Все идет нормально.
Котейр
@coteyr - это работает для вас?
SLM
Не совсем я все еще экспериментирую.
Котейр
Обновление: похоже, это работает, по большей части мне все еще нужно немного подправить, но по крайней мере настройки не сбрасываются при последующих запусках.
Котейр
@coteyr - если это не сработает, я думаю, у меня есть другой метод, который может сработать, но он более сложный, поэтому я не хочу писать об этом, если это сработает. При ответе, пожалуйста, добавьте знак @ перед моим именем пользователя, чтобы я знал, что вы ответили, в противном случае я должен вернуться и проверить и, скорее всего, забуду.
slm
0

Зайдите в систему> Настройки> Автозагрузка приложений и добавьте xmodmap ~/.Xmodmap. добавить команду xmodmap

PMint
источник
Это приводит к тому, что xmodmap запускается при каждом перезапуске DE, это уже работает и вызывает установку параметров, а затем их сброс. Например, Запустите компьютер, войдите в систему, DE запустится, xmodmap запустится, DE вылетит, DE запустится, xmodmap запустится. Теперь моя клавиатура снова испортилась.
Котейр
Что насчет Ксев? crunchbanglinux.org/wiki/xev-determine_custom_keybindings
PMint
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снова начинает действовать как клавиша.

billyjmc
источник
Это именно то, чего я не хочу
coteyr
Я хочу прямо противоположное, я хочу каждый вызов, независимо от того, что приводит к тому, что команда действует как контроль, а управление действует как команда.
Котейр
Хорошо, хорошо, вот почему я запутался, потому что ваша оригинальная публикация, кажется, делает именно то, что вы хотите ...
billyjmc
Но это не так.
Котейр
Ну, поведение я наблюдаю, что ваш код является идемпотентным, в то время как мой код с сохранением состояния. Вы говорите мне, что и ваш код и мой ведут себя одинаково для вас? Если это так, то я думаю, что у вас, должно быть, какая-то ошибка. У меня есть предложение: попробуйте явно запустить xmodmap ~/.Xmodmapиз xterm, и посмотрите, действительно ли ваш код заменяет ключи при повторном применении. Может быть, ваши ключи возвращаются к исходному поведению, когда Cinnamon перезапускается, не по той причине, о которой вы думаете?
Billyjmc