Як я можу написати "idempotent" .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

Я не розумію питання. Я поняття не маю, що тут означає «модальний». Це .Xmodmapвпливає лише на клавіші, які ви змінюєте, що ви хочете зробити інакше?
Жил "ТАК - перестань бути злим"

Коли я використовую .Xmodmap, він встановлює клавіші, якщо я запускаю його знову, він перемикає їх назад. Я хочу створити .Xmodmap, що незалежно від того, які результати буде замінено клавішами управління та команд. Іноді при перезапуску DE .Xmodmap знову запускається, що призводить до роздратування.
coteyr

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

(редагувати: очищення)


Я намагаюся це спробувати. Все йде нормально.
coteyr

@coteyr - це працює для вас?
slm

Насправді я все ще експериментую.
coteyr

Оновлення: це, здається, працює, здебільшого мені ще доводиться трохи підлаштовувати речі, але принаймні налаштування не скидаються під час послідовних прогонів.
coteyr

@coteyr - якщо це не зникає, я думаю, що у мене є інший метод, який може працювати, але він більше задіяний, тому я дуже не хочу його писати, якщо це робить роботу. У відповідь, будь ласка, включіть знак @ ім'я мого імені користувача, щоб я знав, що ви відповіли, інакше я повинен повернутися і перевірити і, швидше за все, забуду.
slm

0

Перейдіть до системи> Налаштування> Запуск програм та додайте xmodmap ~/.Xmodmap. додати команду xmodmap


Це призводить до запуску xmodmap кожного разу, коли DE перезапускається, це вже працює і призводить до встановлення налаштувань, а потім повернення назад. Наприклад, запустіть комп'ютер, увійдіть, запускається DE, запускається xmodmap, аварія DE, запускається DE, запускається xmodmap. Тепер моя клавіатура знову заплуталася.
coteyr


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

Добре, ну, ось чому я плутаюсь, тому що, здається, ваша оригінальна публікація робить саме те, що ви хочете ...
billyjmc

Але це не так.
coteyr

Ну, поведінку я спостерігаю, що ваш код є ідемпотентна, в той час як мій код з збереженням стану. Ви мені кажете, що і ваш код, і мій поводяться для вас однаково? Якщо це так, то я думаю, що ви, мабуть, відчували якусь помилку. У мене є пропозиція: спробуйте явно запустити xmodmap ~/.Xmodmapвід xterm, і подивіться, чи дійсно ваш код міняє ключі повторним застосуванням. Можливо, ваші ключі повертаються до оригінальної поведінки, коли Cinnamon перезавантажується не з тієї причини, яку ви вважаєте, що це?
billyjmc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.