Da die vorherige Veröffentlichung (xswitcher in der Phase des „Proof of Concept“) viele konstruktive Bewertungen erhalten hat (was sehr schön ist) , habe ich meine Freizeit weiterhin mit der Entwicklung des Projekts verbracht. Jetzt möchte ich ein wenig von Ihnen ausgeben ... Der zweite Schritt wird nicht ganz vertraut sein: Vorschlag / Diskussion des Konfigurationsdesigns.
Irgendwie stellt sich heraus, dass normale Programmierer, die all diese Wendungen konfigurieren, wild langweilig sind.Um nicht unbegründet zu sein, ist innen ein Beispiel dafür, womit ich es zu tun habe.( ) Apache Kafka & ZooKeeper.
— ? ! - xml ( « »).
— , ACL ? ! -… - .
Und in meiner Arbeit - genau das Gegenteil. Richtig (leider gibt es das erste Mal, dass es so gut wie nie gibt) können Sie mit dem gebauten Modell die Schaltung einfach und problemlos ( na ja, fast) zusammenbauen.Kürzlich stieß ein Artikel über Habré auf einen Artikel über harte Arbeit von Datenwissenschaftlern ..., . , , « ». , .. — , / . - .
Komm zum Punkt. Als syntaktische Grundlage habe ich TOML von diesem Bürger genommen .Weil es (TOML) einerseits von Menschen bearbeitet werden kann. Und andererseits übersetzt es 1: 1 in eine der gängigsten Syntaxen: XML, JSON, YAML.Darüber hinaus ist die Implementierung, die ich von "github.com/BurntSushi/toml" verwendet habe, zwar nicht die modernste (immer noch Syntax 1.4), aber syntaktisch kompatibel mit demselben ("eingebauten") JSON.Das heißt, wenn Sie möchten, können Sie einfach sagen: "Gehen Sie mit dieser TOML durch den Wald, ich möchte XXX" und den Code mit nur einer Zeile "patchen".Wenn Sie also einige Fenster schreiben möchten (definitiv nicht ich) , um xswitcher zu konfigurieren, gibt es keine Probleme "mit dieser verdammten Konfiguration".Für alle anderen ist die Syntax basierend auf "key = value" (und buchstäblich sind einige Optionen komplizierter, type = [some, then, array]), nehme ich anintuitiv bequem.,
«» ( 2013 ). , , TOML .
, .
Im Allgemeinen nehmen wir TOML (sehr ähnlich der alten Windows INI). Und wir haben eine Konfiguration, in der wir beschreiben, wie eine Reihe von Haken abhängig von den neuesten Scan-Codes von der Tastatur angebracht werden. Unten in Stücken - was im Moment passiert ist. Und die Erklärung dessen, was ich so entschieden habe.0. Grundlegende Abstraktionen
- -. - , - ( loloswitcher).
«ecodes.go» «golang-evdev» ( , ). () . «LEFTBRACE» → «L_BRACE». - « ». . ( . «» .)
- «» . , «»=2 .
1.
[Templates]
"WORD" = "([0-9A-Z`;']|[LR]_BRACE|COMMA|DOT|SLASH|KP[0-9])"
Woraus besteht ein menschliches Sprachwort mit phonetischer Notation (oder ist es ein Graphem, auch bekannt als "Hieroglyphen") ? Eine Art schreckliches "Blatt". Deshalb lege ich sofort das Konzept der "Vorlage".2. Was tun, wenn etwas gedrückt wird (der nächste Scan-Code ist eingetroffen)?
[ActionKeys]
Add = ["1..0", "=", "BS", "Q..]", "L_CTRL..CAPS", "N_LOCK", "S_LOCK",
"KP7..KPDOT", "R_CTRL", "KPSLASH", "R_ALT", "KPEQUAL..PAUSE",
"KPCOMMA", "L_META..COMPOSE", "KPLEFTPAREN", "KPRIGHTPAREN"]
Drop = ["ESC", "-", "TAB", "ENTER", "KPENTER", "LINEFEED..POWER"]
StateKeys = ["L_CTRL", "L_SHIFT", "L_ALT", "L_META", "CAPS", "N_LOCK", "S_LOCK",
"R_CTRL", "R_SHIFT", "R_ALT", "R_META"]
Test = ["F1..F10", "ZENKAKUHANKAKU", "102ND", "F11", "F12",
"RO..KPJPCOMMA", "SYSRQ", "SCALE", "HANGEUL..YEN",
"STOP..SCROLLDOWN", "NEW..MAX"]
Insgesamt werden 768 Codes bereitgestellt. (Aber "nur für den Fall" in den xswitcher-Code eingefügt ein Fang von "Überraschungen").Im Inneren habe ich das Array mit Links zu den "Was zu tun" -Funktionen gefüllt. Auf Golang stellte sich (plötzlich) heraus, dass es bequem und offensichtlich war.- "Drop" an dieser Stelle habe ich vor, auf ein Minimum zu reduzieren. Für eine flexiblere Verarbeitung (ich werde unten zeigen).
3. Fensterklassenbezeichnung
[[WindowClasses]]
Regex = "^VirtualBox"
Actions = ""
[[WindowClasses]]
Regex = "^konsole"
MouseClickDrops = 0
Actions = "Actions"
[[WindowClasses]]
MouseClickDrops = 1
Actions = "Actions"
Tabellenzeilen stehen in doppelten eckigen Klammern mit ihrem Namen. Einfacher zu gehen hat nicht funktioniert. Abhängig vom aktuell aktiven Fenster können Sie folgende Optionen auswählen:- « » «Actions = …». / — .
- «MouseClickDrops» — . xswitcher « », - . () ( ).
4. ( )
[Actions]
SeqLength = 8
NewWord = [ "OFF:(CTRL|ALT|META) SEQ:(((BACK)?SPACE|[LR]_SHIFT):[01],)*(@WORD@:1)",
"SEQ:(@WORD@:2,@WORD@:0)",
"SEQ:((KP)?MINUS|(KP)?ENTER|ESC|TAB)" ]
NewSentence = [ "SEQ:(ENTER:0)" ]
Compose = [ "OFF:(CTRL|L_ALT|META|SHIFT) SEQ:(R_ALT:1,(R_ALT:2,)?(,@WORD@:1,@WORD@:0){2},R_ALT:0)" ]
"Action.RetypeWord" = [ "OFF:(CTRL|ALT|META|SHIFT) SEQ:(PAUSE:0)" ]
"Action.CyclicSwitch" = [ "OFF:(R_CTRL|ALT|META|SHIFT) SEQ:(L_CTRL:1,L_CTRL:0)" ]
"Action.Respawn" = [ "OFF:(CTRL|ALT|META|SHIFT) SEQ:(S_LOCK:2,S_LOCK:0)" ]
"Action.Layout0" = [ "OFF:(CTRL|ALT|META|R_SHIFT) SEQ:(L_SHIFT:1,L_SHIFT:0)" ]
"Action.Layout1" = [ "OFF:(CTRL|ALT|META|L_SHIFT) SEQ:(R_SHIFT:1,R_SHIFT:0)" ]
"Action.Hook1" = [ "OFF:(CTRL|R_ALT|META|SHIFT) SEQ:(L_ALT:1,L_ALT:0)" ]
Haken werden in zwei Typen unterteilt. Eingebaut, mit "sprechenden" Namen (NewWord, NewSentence, Compose) und programmierbar.Programmierbare Namen beginnen mit "Aktion". weil In TOML v1.4 müssen gepunktete Namen in Anführungszeichen gesetzt werden.Ein Abschnitt mit demselben Namen sollte unten für jeden Abschnitt beschrieben werden .Um das Gehirn von Menschen nicht mit „nackten“ Stammgästen in die Luft zu jagen (erfahrungsgemäß kann jeder zehnte Fachmann sie schreiben ), führe ich sofort eine zusätzliche Syntax ein.- «OFF:» ( «ON:») regexp ( ) ( ).
«» . "|". "[LR]_SHIFT" ( ). - «SEQ:» ( ), «» .
^W «regexp». pcre («perl compatible»). - «_1: 1, _2: 2» .., -.
- «» , "$" .
- «». , . - .
- «SeqLength = 8» , . .. ( ) .
5. ,
[Action.RetypeWord]
Action = [ "Action.CyclicSwitch", "RetypeWord" ]
[Action.CyclicSwitch]
Action = [ "Switch" ]
Layouts = [0, 1]
[Action.Layout0]
Action = [ "Layout" ]
Layout = 0
[Action.Layout1]
Action = [ "Layout" ]
Layout = 1
[Action.Respawn]
Action = [ "Respawn" ]
[Action.Hook1]
Action = [ "Exec" ]
Exec = "/path/to/exec -a -b --key_x"
Wait = 1
SendBuffer = "Word"
Die Hauptsache hier ist "Action = [Array]" . Ähnlich wie im vorherigen Abschnitt gibt es eine begrenzte Anzahl integrierter Aktionen. Und im Prinzip unbegrenzt die Möglichkeit des Andockens (schreiben Sie "Action.XXX" und seien Sie nicht zu faul, um einen anderen Abschnitt dafür zu malen) .Insbesondere ist das Wort, das im korrigierten Layout erneut eingegeben wird, in zwei Teile unterteilt: "Ändern Sie das Layout so, wie es dort eingestellt ist" und "Neu eingeben" ("RetypeWord") .Die restlichen Parameter werden für diese Aktion in das "Wörterbuch" ("Karte" in Golang) geschrieben. Ihre Liste hängt davon ab, was in "Aktion" geschrieben ist.In einem Heap (Abschnitt) können mehrere verschiedene Aktionen beschrieben werden . Und du kannst es auseinander ziehen. Wie ich oben gezeigt habe.Legen Sie sofort die Aktion "Exec" - führen Sie ein externes Skript aus. Mit der Option, den geschriebenen Puffer in stdin zu verschieben.- "Wait = 1" - Warten Sie, bis der laufende Prozess abgeschlossen ist.
- Wahrscheinlich wird "to the heap" die Umgebung extra belasten wollen. Informationen wie der Name der Fensterklasse, von der sie abgefangen wird.
"Möchten Sie Ihren Handler anschließen?" Für dich hier. "
Puh (ausgeatmet). Es scheint nichts vergessen zu haben.Hoppla! Ja, ich habe nicht vergessen ...? -́? :
[ScanDevices]
Test = "/dev/input/event0"
Respawn = 30
Search = "/dev/input/event*"
Bypass = "(?i)Video|Camera"
Und wo ich einen Fehler vergessen / gemacht habe (ohne dies - auf keinen Fall) , hoffe ich wirklich, dass aufmerksame Leser nicht zu faul sind, um ihre Nase zu stechen.Viel Glück