Xswitcher layout corrector ho an'ny Linux: dingana roa

satria fanontana teo aloha (xswitcher eo amin'ny sehatra "porofon'ny foto-kevitra") dia nahazo fanehoan-kevitra manorina be dia be (izay tsara), nanohy nandany ny fotoanako malalaka aho namolavola ilay tetikasa. Ankehitriny dia te handany kely amin'ny... Ny dingana faharoa dia tsy ho mahazatra loatra: tolo-kevitra/fanadihadiana momba ny famolavolana tefy.

Xswitcher layout corrector ho an'ny Linux: dingana roa

Na izany na tsy izany dia hita fa mankaleo ny fametrahana ireo fanaraha-maso rehetra ireo ny mpandrindra mahazatra.

Mba tsy ho tsinontsinona dia ao anatin'ny ohatra ny zavatra ataoko.
Amin'ny ankapobeny dia noforonina tsara (ary nampiharina tsara) Apache Kafka & ZooKeeper.
- Configuration? Fa mankaleo! Domb xml (satria "tsy anaty boaty").
- Oh, mila ACL koa ve ianao? Fa tena mankaleo! Tap-blooper... Zavatra toy izany.

Fa amin'ny asako dia mifanohitra tanteraka izany. TSARA (indrisy, saika tsy tamin'ny voalohany) ny modely namboarina dia ahafahanao manohy mora kokoa sy voajanahary (Saika) manangona kisary.

Vao haingana aho no nahita lahatsoratra momba ny Habré momba ny asa mafy ataon'ny mpahay siansa momba ny data...
Hita fa tanteraka ho azy ireo izany fotoana izany. Ary amin'ny fanaoko, araka ny filazan'izy ireo, "dikan-teny maivana". Modely maro be, mpandrindra efa za-draharaha miaraka amin'ny OOP efa vonona, sns. - izany rehetra izany dia hiseho aoriana rehefa/raha miala. Fa ny mpamorona dia mila manomboka any amin'ny toerana eto sy izao.

Tongava amin'ny teboka. Noraisiko ho fototra syntactic ny TOML avy amin'ity olom-pirenena ity.

Satria izy (TOML) amin'ny lafiny iray, azo ovaina. Amin'ny lafiny iray, adika 1: 1 amin'ny iray amin'ireo syntax mahazatra kokoa: XML, JSON, YAML.
Ankoatr'izay, ny fampiharana nampiasaiko avy amin'ny "github.com/BurntSushi/toml", na dia tsy ny lamaody indrindra (mbola 1.4 syntax), dia mifanaraka amin'ny JSON mitovy ("naorina").

Izany hoe, raha tianao dia azonao atao ny miteny tsotra hoe "mandeha any anaty ala miaraka amin'io TOML anao io, mila XXX aho" ary "paty" amin'ny andalana iray monja ny code.

Noho izany, raha te hanoratra varavarankely sasany ianao hanitsy ny xswitcher (Tsy azoko antoka) Tsy misy olana andrasana "amin'ity config anao ity."

Ho an'ny hafa rehetra, ny syntax dia mifototra amin'ny "key = sanda" (ary safidy roa sarotra kokoa, toy ny = [ny sasany, izany, array]) angamba
intuitively mety.
Ny mahaliana dia izay "may" manodidina ny fotoana mitovy (manodidina ny 2013). Tsy toa ahy ihany, ny mpanoratra ny TOML dia niditra tamin'ny ambaratonga mety.

Noho izany, ankehitriny dia mora kokoa ho ahy ny manitsy ny fampiharana azy hifanaraka amin'ny tenako, fa tsy ny mifamadika amin'izany.

Amin'ny ankapobeny, maka TOML (mitovitovy amin'ny Windows INI taloha) izahay. Ary manana fanamafisam-peo izahay izay mamaritra ny fomba fametahana andian-tsofina miankina amin'ny andiana kaody scan farany avy amin'ny fitendry. Ireto ambany ireto ny zava-nitranga hatramin'izao. Ary fanazavana ny antony nanapahako hevitra toy izany.

0. abstractions fototra

  • Fanondroana kaody scan. Tsy maintsy misy zavatra tokony hatao momba izany, satria ny kaody nomerika tsotra dia tsy azon'ny olona vakiana (izaho ihany izany loloswitcher).
    Nesoriko ny “ecodes.go” avy amin'ny “golang-evdev” (kamo loatra aho raha hijery ny loharano niandohany, na dia nasehon'ny mpanoratra tamin'ny fomba ara-kolontsaina aza izany). Nahitsy kely aho (amin'izao fotoana izao) zavatra tena natahotra. Toy ny “LEFTBRACE” → “L_BRACE”.
  • Ankoatra izany, nampiditra ny foto-kevitry ny "fanalahidin'ny fanjakana" izy. Satria ny fitsipi-pitenenana mahazatra ampiasaina dia tsy mamela andalan-tsoratra lava. (Saingy mamela anao hanamarina amin'ny overhead faran'izay kely.
  • Hisy “dedulicator” ao anatiny ny zavatra voatsindry. Noho izany dia hosoratana ny fanjakana "avereno"=2 один fotoana.

1. Fizarana templates

[Templates] # "@name@" to simplify expressions
 # Words can consist of these chars (regex)
 "WORD" = "([0-9A-Z`;']|[LR]_BRACE|COMMA|DOT|SLASH|KP[0-9])"

Inona no tafiditra amin'ny teny fitenin'olombelona miaraka amin'ny fanamafisam-peo? (na resaka graphemes aka "hieroglyphs")? Karazana "rafitra" mahatsiravina. Noho izany, ampidiriko avy hatrany ny foto-kevitry ny "template".

2. Inona no tokony hatao rehefa misy zavatra kitihina (efa tonga ny code scan hafa)

[ActionKeys]
 # Collect key and do the test for command sequence
 # !!! Repeat codes (code=2) must be collected once per key!
 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 all collected keys, including this.  This is default action.
 Drop = ["ESC", "-", "TAB", "ENTER", "KPENTER", "LINEFEED..POWER"]
 # Store extra map for these keys, when any is in "down" state.
 # State is checked via "OFF:"|"ON:" conditions in action.
 # (Also, state of these keys must persist between buffer drops.)
 # ??? How to deal with CAPS and "LOCK"-keys ???
 StateKeys = ["L_CTRL", "L_SHIFT", "L_ALT", "L_META", "CAPS", "N_LOCK", "S_LOCK",
              "R_CTRL", "R_SHIFT", "R_ALT", "R_META"]

 # Test only, but don't collect.
 # E.g., I use F12 instead of BREAK on dumb laptops whith shitty keyboards (new ThinkPads)
 Test = ["F1..F10", "ZENKAKUHANKAKU", "102ND", "F11", "F12",
          "RO..KPJPCOMMA", "SYSRQ", "SCALE", "HANGEUL..YEN",
          "STOP..SCROLLDOWN", "NEW..MAX"]

Misy kaody 768 amin'ny fitambarany. (Fa “raha sanatria” dia nampiditra “surprise” tamin'ny code xswitcher aho).
Tao anatiny dia nofaritako ny famenoana ny array miaraka amin'ny rohy mankany amin'ny fiasa "inona no tokony hatao". Ao amin'ny golang izany (tampotampoka) Hita fa nety sy niharihary izany.

  • Mikasa ny hampihena ny "Drop" ho faran'izay kely indrindra amin'ity toerana ity aho. Ho fanohanana ny fanodinana mora kokoa (hasehoko eto ambany).

3. Latabatra misy kilasy misy varavarankely

# Some behaviour can depend on application currently doing the input.
[[WindowClasses]]
 # VNC, VirtualBox, qemu etc. emulates there input independently, so never intercept.
 # With the exception of some stupid VNC clients, which does high-level (layout-based) keyboard input.
 Regex = "^VirtualBox"
 Actions = "" # Do nothing while focus stays in VirtualBox

[[WindowClasses]]
 Regex = "^konsole"
 # In general, mouse clicks leads to unpredictable (at the low-level where xswitcher resides) cursor jumps.
 # So, it's good choise to drop all buffers after click.
 # But some windows, e.g. terminals, can stay out of this problem.
 MouseClickDrops = 0
 Actions = "Actions"

[[WindowClasses]] # Default behaviour: no Regex (or wildcard like ".")
 MouseClickDrops = 1
 Actions = "Actions"

Ny andalana amin'ny latabatra dia ao anaty fononteny efamira roa misy ny anarany. Tsy ho mora kokoa izany avy hatrany. Miankina amin'ny varavarankely mavitrika amin'izao fotoana izao, azonao atao ny misafidy ireto safidy manaraka ireto:

  • Ny andiana "fanalahidy mafana" "Actions = ...". Raha tsy / foana dia tsy manao na inona na inona.
  • Ampifamadiho ny "MouseClickDrops" - inona no tokony hatao rehefa hita ny tsindry totozy. Satria eo amin'ny toerana izay avadika ny xswitcher dia tsy misy antsipiriany momba ny "aiza izy ireo tsindrio", dia averinay amin'ny alàlan'ny default ny buffer. Saingy amin'ny terminal (ohatra) dia tsy mila manao izany ianao (matetika).

4. Ny filaharan'ny kitika iray (na maromaro) dia miteraka fihokoana iray na iray hafa

# action = [ regex1, regex2, ... ]
# "CLEAN" state: all keys are released
[Actions]
# Inverse regex is hard to understand, so extract negation to external condition.
# Expresions will be checked in direct order, one-by-one. Condition succceds when ALL results are True.
 # Maximum key sequence length, extra keys will be dropped. More length - more CPU.
 SeqLength = 8
 # Drop word buffer and start collecting new one
 NewWord = [ "OFF:(CTRL|ALT|META)  SEQ:(((BACK)?SPACE|[LR]_SHIFT):[01],)*(@WORD@:1)", # "@WORD@:0" then collects the char
             "SEQ:(@WORD@:2,@WORD@:0)", # Drop repeated char at all: unlikely it needs correction
             "SEQ:((KP)?MINUS|(KP)?ENTER|ESC|TAB)" ] # Be more flexible: chars line "-" can start new word, but must not completelly invalidate buffer!
 # Drop all buffers
 NewSentence = [ "SEQ:(ENTER:0)" ]

 # Single char must be deleted by single BS, so there is need in compose sequence detector.
 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)" ] # Single short LEFT CONTROL
 "Action.Respawn" = [ "OFF:(CTRL|ALT|META|SHIFT)  SEQ:(S_LOCK:2,S_LOCK:0)" ] # Long-pressed SCROLL LOCK

 "Action.Layout0" = [ "OFF:(CTRL|ALT|META|R_SHIFT)  SEQ:(L_SHIFT:1,L_SHIFT:0)" ] # Single short LEFT SHIFT
 "Action.Layout1" = [ "OFF:(CTRL|ALT|META|L_SHIFT)  SEQ:(R_SHIFT:1,R_SHIFT:0)" ] # Single short RIGHT SHIFT

 "Action.Hook1" = [ "OFF:(CTRL|R_ALT|META|SHIFT)  SEQ:(L_ALT:1,L_ALT:0)" ]

Mizara roa ny hooks. Namboarina, miaraka amin'ny anarana manazava tena (NewWord, NewSentence, Compose) ary azo programa.

Ny anarana azo programa dia manomboka amin'ny "Action". SATRIA TOML v1.4, anarana misy teboka dia tsy maintsy misy teny nalaina.

Ny fizarana tsirairay dia tokony hofaritana etsy ambany mitovy anarana.

Mba tsy hanapotika ny sain'ny olona amin'ny "mitanjaka" mahazatra (avy amin'ny traikefa, ny to writeangamba iray amin'ny folo matihanina), avy hatrany dia mampihatra syntax fanampiny aho.

  • "OFF:" (na "ON:") alohan'ny regexp (fitenenana mahazatra) dia mitaky ny hamoahana (na tsindriana) ireto bokotra manaraka ireto.
    Manaraka izany dia hanao fitenenana mahazatra "tsy rariny" aho. Miaraka amin'ny fanamarinana misaraka amin'ny sodina "|". Mba hampihenana ny isan'ny rakitra toy ny "[LR]_SHIFT" (izay mazava ho azy fa tsy ilaina izany).
  • "SEQ:" Raha mahafeno (na tsy eo) ny fepetra teo aloha, dia manamarina ny fomba fiteny mahazatra "ara-dalàna". Raha mila antsipiriany dia alefako avy hatrany any amin'ny ^W ny tranomboky "regexp". Satria mbola tsy nieritreritra ny hamantatra ny haavon'ny compatibility amin'ny pcre tiako indrindra ("perl compatible").
  • Ny fomba fiteny dia voasoratra amin'ny endrika "BUTTON_1: CODE1, BUTTON_2: CODE2" sns, araka ny filaharan'ny fandraisana ny kaody scan.
  • Ny seky dia "mifatotra" hatrany amin'ny faran'ny filaharana, ka tsy ilaina ny manampy “$” amin'ny rambony.
  • Ny fisavana rehetra amin'ny andalana iray dia atao manaraka ary atambatra amin’ny “I”. Fa satria ny sandany dia faritana ho array, azonao atao ny manoratra fanamarinana hafa aorian'ny faingo. Raha ilaina izany noho ny antony.
  • zava-dehibe "SeqLength = 8" mametra ny haben'ny buffer izay anaovana fisavana rehetra. SATRIA Tsy mbola nahita loharano tsy misy farany aho (hatramin'izao) teo amin'ny fiainako.

5. Fametrahana ny farango voalaza ao amin'ny fizarana teo aloha

# Action is the array, so actions could be chained (m.b., infinitely... Have I to check this?).
# For each action type, extra named parameters could be collected. Invalid parameters will be ignored(?).
[Action.RetypeWord] # Switch layout, drop last word and type it again
 Action = [ "Action.CyclicSwitch", "RetypeWord" ] # Call Switch() between layouts tuned below, then RetypeWord()

[Action.CyclicSwitch] # Cyclic layout switching
 Action = [ "Switch" ] # Internal layout switcher func
 Layouts = [0, 1]

[Action.Layout0] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 0

[Action.Layout1] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 1

[Action.Respawn] # Completely respawn xswitcher. Reload config as well
 Action = [ "Respawn" ]

[Action.Hook1] # Run external commands
  Action = [ "Exec" ]
  Exec = "/path/to/exec -a -b --key_x"
  Wait = 1
  SendBuffer = "Word" # External hook can process collected buffer by it's own means.

Ny zava-dehibe eto dia "Action = [Array]". Mitovy amin'ny fizarana teo aloha, misy andiana hetsika naorina ao anatiny. Ary ny mety hisian'ny docking dia tsy voafetra amin'ny fitsipika (soraty "Action.XXX" ary aza kamo loatra hanoratra fizarana hafa ho azy).
Indrindra indrindra, mizara roa ny famerenana ny teny iray amin'ny fisehon'ny fanitsiana: "Hanova ny layout araka izay voalaza ao" и “Retype” (“RetypeWord”).

Ny masontsivana sisa dia voasoratra ao amin'ny "rakibolana" ("saritany" amin'ny golang) ho an'ny hetsika iray dia miankina amin'izay voasoratra ao amin'ny "Action" ny lisitra.

Hetsika maro samihafa no azo faritana ao anaty antontan-taratasy iray (fizarana). Na azonao atao ny manasaraka azy. Araka ny nasehoko teo ambony.

Napetrako avy hatrany ny hetsika "Exec" hanatanterahana ny script ivelany. Miaraka amin'ny safidy hanosika ny buffer voarakitra ao amin'ny stdin.

  • "Andraso = 1" - miandry ny fizotran'ny hazakazaka ho vita.
  • Angamba, "amin'ny antontam-bato" dia tianao ny hametraka olona fanampiny ao amin'ny tontolo iainana. fampahalalana toy ny anaran'ny kilasin'ny varavarankely izay nanakanana azy.
    “Te hampifandray ny mpitantana anao ve ianao? Eto no tokony halehanao.”

Phew (voafoka). Toa tsy nanadino na inona na inona aho.

Oops! Eny, tsy nanadino aho...
Aiza ny firafitry ny fandefasana? Amin'ny kaody sarotra? Toy izany:

[ScanDevices]
 # Must exist on start. Self-respawn in case it is younger then 30s
 Test = "/dev/input/event0"
 Respawn = 30
 # Search mask
 Search = "/dev/input/event*"
 # In my thinkPads there are such a pseudo-keyboards whith tons of unnecessary events
 Bypass = "(?i)Video|Camera" # "(?i)" obviously differs from "classic" pcre's.

Taiza aho no nanadino/nanao fahadisoana? (tsy misy fomba tsy misy an'ity), Tena manantena aho fa tsy ho kamo loatra hanindrona ny orony ireo mpamaky mazoto.

Mirary soa!

Source: www.habr.com

Add a comment