Wie kann ich eine "idempotente" .Xmodmap schreiben?

14

Zur Zeit habe ich eine .XmodmapDatei , die meine Änderungen Commandzu Ctrl, dann ändert sich meine Ctrlzu Super(ich bin mit Linux auf einem Mac).

Es funktioniert ganz gut, wenn es nur einmal ausgeführt wird, aber wenn es nacheinander ausgeführt wird (wenn ich zum Beispiel meine Desktop-Umgebung (Cinnamon) neu starte, wird die .XmodmapDatei neu geladen ), werden die Einstellungen im Grunde genommen zurückgesetzt, indem die Änderungen zurückgesetzt werden. Effektives Umschalten zwischen meinem gewünschten Setup und dem ursprünglichen Setup.

Wie kann ich eine .XmodmapDatei schreiben , die die Einstellungen nur einmal festlegt, sie aber bei aufeinanderfolgenden Durchläufen nicht wieder ändert? Hier ist meine vorhandene .XmodmapDatei:

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
quelle
Ich verstehe die Frage nicht. Ich habe keine Ahnung, was "modal" hier bedeutet. Dies .Xmodmapbetrifft nur die Tasten, die Sie ändern. Was möchten Sie anders machen?
Gilles 'SO- hör auf böse zu sein'
Wenn ich die .Xmodmap verwende, werden die Schlüssel festgelegt. Wenn ich sie erneut ausführe, werden sie zurückgeschaltet. Ich möchte eine .Xmodmap erstellen, die unabhängig von den getauschten Steuer- und Befehlstasten ist. Manchmal wird beim Neustart die DE .Xmodmap erneut ausgeführt, was zu Ärger führt.
Coteyr
2
@ Coteyr Ich denke, das Wort, das Sie suchen, ist " idempotent "
Joseph R.

Antworten:

7

Setzen Sie die Karte in den ursprünglichen Zustand zurück, bevor Sie Ihre Modifikationen anwenden. Ein vollständiger Reset dauert ewig, daher ist das Beste, was ich mir einfallen lassen kann, ein Unterschied.

In diesem Code wird verwendet, .Xmodmap{.orig,.reset,.mods}wo .orignicht vorhanden, dass er auf den aktuellen Status gesetzt ist, und berechnet .reset, um diesen Status von jedem Ort aus wiederherzustellen. vor der Bewerbung .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

(edit: aufräumen)

jdoch
quelle
Ich versuche es. So weit, ist es gut.
Coteyr
@coteyr - funktioniert das für dich?
slm
Nicht wirklich experimentiere ich noch.
Coteyr
Upadate: Dies scheint zu funktionieren, zum größten Teil muss ich noch ein bisschen an den Dingen arbeiten, aber zumindest werden die Einstellungen nicht bei aufeinanderfolgenden Läufen zurückgesetzt.
Coteyr
@coteyr - wenn das nicht klappt, denke ich, dass ich eine andere Methode habe, die vielleicht funktioniert, aber die ist komplizierter, deshalb möchte ich es nicht wirklich aufschreiben, wenn dies den Job erledigt. Wenn Sie antworten, geben Sie bitte das @ -Zeichen vor meinem Benutzernamen an, damit ich weiß, dass Sie geantwortet haben. Andernfalls muss ich zurückkommen und nachsehen und werde es höchstwahrscheinlich vergessen.
SLM
0

Gehen Sie zu system> Preferences> Startup Applications und fügen Sie hinzu xmodmap ~/.Xmodmap. Befehl xmodmap hinzufügen

PMint
quelle
Dies führt dazu, dass xmodmap bei jedem Neustart des DE ausgeführt wird. Dies funktioniert bereits und bewirkt, dass die Einstellungen festgelegt und anschließend zurückgesetzt werden. Beispiel: Computer starten, anmelden, DE wird gestartet, xmodmap wird ausgeführt, DE stürzt ab, DE wird gestartet, xmodmap wird ausgeführt. Jetzt ist meine Tastatur wieder durcheinander.
Coteyr
0

Ich bin immer noch ein bisschen verwirrt, was Sie wollen, aber ich denke, das ist es:

Wenn Sie dies in Ihrem setzen ~/.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

dann wird jedes mal xmodmap ~/.Xmodmapausgeführt, dann tauschen die linke Ctrlund linke Taste. Beim ersten Aufruf verhält sich die CtrlTaste also so, als hätten Sie sie gedrückt . Beim zweiten Aufruf wird sie jedoch wieder als CtrlTaste verwendet.

billyjmc
quelle
Dies ist genau das, was ich nicht will
Coteyr
Ich möchte das genaue Gegenteil, ich möchte jeden Aufruf, egal was dazu führen soll, dass sich ein Befehl wie eine Kontrolle verhält und eine Kontrolle wie ein Befehl.
Coteyr
Okay, das ist der Grund, warum ich verwirrt bin, weil Ihr ursprünglicher Beitrag genau das zu tun scheint, was Sie wollen ...
billyjmc
Aber das tut es nicht.
Coteyr
Nun, das Verhalten , das ich beobachten, dass Ihr Code ist idempotent, während mein Code Stateful ist. Sagen Sie mir, dass sich Ihr und mein Code für Sie identisch verhalten? Wenn das der Fall ist, dann denke ich, müssen Sie einen Fehler in irgendeiner Form haben. Ich habe einen Vorschlag: Versuchen Sie, explizit xmodmap ~/.Xmodmapvon einem xterm aus zu starten, und prüfen Sie, ob Ihr Code die Schlüssel bei wiederholter Anwendung wirklich vertauscht. Vielleicht kehren Ihre Schlüssel zu ihrem ursprünglichen Verhalten zurück, wenn Cinnamon neu gestartet wird, nicht aus dem Grund, den Sie glauben, dass dies der Fall ist?
Billyjmc