Ceartaiche cruth Xswitcher airson Linux: ceum a dhà

bho fhoillseachadh roimhe (xswitcher aig ìre “dearbhadh bun-bheachd”) tòrr fios air ais cuideachail (a tha math), chùm mi orm a’ cur seachad m’ ùine shaor a’ leasachadh a’ phròiseict. A-nis tha mi airson beagan de do chuid a chaitheamh ... Cha bhi an dàrna ceum gu math àbhaisteach: moladh / deasbad air dealbhadh rèiteachaidh.

Ceartaiche cruth Xswitcher airson Linux: ceum a dhà

Ann an dòigh air choreigin tha e a’ tionndadh a-mach gu bheil luchd-prògramaidh àbhaisteach ga fhaighinn uamhasach dòrainneach na smachdan sin uile a stèidheachadh.

Gus nach bi thu gun stèidh, tha an taobh a-staigh na eisimpleir de na tha mi a 'dèiligeadh.
Gu h-iomlan air a dheagh dhealbhadh (agus air a dheagh bhuileachadh) Apache Kafka & ZooKeeper.
- Configuration? Ach tha e dòrainneach! Xml balbh (seach gu bheil e “a-mach às a’ bhogsa ”).
- O, a bheil thu cuideachd ag iarraidh ACL? Ach tha e cho dòrainneach! Tap-blooper... Rud mar sin.

Ach anns an obair agam tha e dìreach a chaochladh. Deas (Molaidh, cha mhòr a-riamh a’ chiad uair) leigidh am modail togte leat leantainn air adhart nas fhaide gu furasta agus gu nàdarra (Cha mhòr) cruinnich diagram.

O chionn ghoirid thàinig mi tarsainn air artaigil air Habré mu obair chruaidh luchd-saidheans dàta ...
Tha e a 'tionndadh a-mach gu bheil an àm seo air a làn choileanadh dhaibh. Agus nam chleachdadh, mar a chanas iad, “dreach aotrom”. Modalan ioma-mheud, prògramadairean eòlach le OOP deiseil, msaa. - nochdaidh seo uile nas fhaide air adhart nuair/ma bheir e dheth. Ach feumaidh an dealbhaiche tòiseachadh an àiteigin an seo agus an-dràsta.

Faigh chun a 'phuing. Ghabh mi TOML mar bhunait syntactic bhon saoranach seo.

Air sgàth e (TOML) air an aon làimh, a ghabhas deasachadh le daoine. Air an làimh eile, tha e air eadar-theangachadh 1:1 gu gin de na co-aontaran as cumanta: XML, JSON, YAML.
A bharrachd air an sin, tha am buileachadh a chleachd mi bho “github.com/BurntSushi/toml”, ged nach e am fear as fasanta (fhathast 1.4 syntax), co-chòrdail ris an aon rud (“togte a-steach”) JSON.

Is e sin, ma thogras tu, faodaidh tu dìreach a ràdh “rach tron ​​​​choille leis an TOML sin agadsa, tha mi ag iarraidh XXX” agus “patch” an còd le dìreach aon loidhne.

Mar sin, ma tha thu airson beagan uinneagan a sgrìobhadh gus xswitcher a rèiteachadh (Chan eil mi cinnteach) Chan eil dùil ri duilgheadas sam bith “leis an rèiteachadh damn seo agadsa.”

Airson a h-uile duine eile, tha an co-chòrdadh stèidhichte air “key = luach” (agus gu litireil roghainn no dhà nas iom-fhillte, leithid = [cuid, sin, sreath]) Tha mi smaoineachadh
intuitively goireasach.
Is e an rud a tha inntinneach gu bheil "loisg" timcheall air an aon àm (timcheall air 2013). A-mhàin, eu-coltach riumsa, chaidh ùghdar TOML a-steach air sgèile cheart.

Mar sin, a-nis tha e nas fhasa dhomh a bhuileachadh atharrachadh a rèir mi fhìn, agus chan ann a chaochladh.

San fharsaingeachd, bheir sinn TOML (glè choltach ris an t-seann Windows INI). Agus tha rèiteachadh againn anns am bi sinn ag innse mar a cheanglas sinn sreath de dubhan a rèir an t-seata de na còdan scan as ùire bhon mheur-chlàr. Gu h-ìosal, pìos air pìos, tha na tha air tachairt gu ruige seo. Agus mìneachadh carson a cho-dhùin mi san dòigh seo.

0. Abstractions Bunaiteach

  • Sgan sònrachadh còd. Gu cinnteach feumar rudeigin a dhèanamh mu dheidhinn seo, leis gu bheil dìreach còdan didseatach dha-rìribh nach urrainn a leughadh le daoine (sin dìreach mise loloswitcher).
    Chrath mi “ecodes.go” bho “golang-evdev” (bha mi ro leisg a bhith a’ coimhead air an tobar tùsail, ged a thuirt an t-ùghdar gu bheil e gu math cultarach). Ceartaich mi beagan (airson a-nis) rudeigin a bha gu math eagallach. Coltach ri “LEFTBRACE” → “L_BRACE”.
  • A bharrachd air an sin, thug e a-steach am bun-bheachd air “iuchraichean stàite”. Leis nach eil an gràmar cunbhalach a thathar a 'cleachdadh a' ceadachadh earrannan fada. (Ach leigidh e leat sgrùdadh a dhèanamh le glè bheag de chosgais. Mura cleachd thu ach clàradh “dìreach”.)
  • Bidh “deduplicator” stèidhichte ann de na thèid a bhrùthadh. Mar sin, thèid an stàit "ath-aithris" = 2 a sgrìobhadh один amannan.

1. Earrann teamplaidean

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

Dè a th’ ann am facal cànain daonna le comharradh fònaidheach? (an dàrna cuid cùis de graphemes aka “hieroglyphs”)? Seòrsa de “dhuilleag” uamhasach. Mar sin, tha mi a 'toirt a-steach a' bhun-bheachd "teamplaid" sa bhad.

2. Dè nì thu nuair a thèid rudeigin a bhriogadh (còd sganaidh eile air ruighinn)

[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"]

Tha 768 còdan uile gu lèir ann. (Ach “dìreach gun fhios nach cuir mi a-steach glacadh“ iongnadh ”a-steach don chòd xswitcher).
Taobh a-staigh thug mi cunntas air lìonadh an raon le ceanglaichean gu gnìomhan “dè a nì thu”. Ann an golang tha seo (gu h-obann) Thionndaidh e a-mach gu bhith goireasach agus follaiseach.

  • Tha mi an dùil “Drop” a lughdachadh chun ìre as ìsle san àite seo. A thaobh giollachd nas sùbailte (seallaidh mi gu h-ìosal e).

3. Clàr le clasaichean uinneig

# 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"

Tha sreathan a’ bhùird eadar camagan dùbailte ceàrnagach leis an ainm. Cha b’ urrainn dha a bhith na b’ fhasa dìreach bhon ialtag. A rèir na h-uinneige a tha gnìomhach an-dràsta, faodaidh tu na roghainnean a leanas a thaghadh:

  • An t-seata agad fhèin de “iuchraichean teth” “Gnìomhan =…”. Mura h-eil/falamh, na dèan dad.
  • Atharraich “MouseClickDrops” - dè a nì thu nuair a lorgar cliog lucha. Leis aig an ìre far a bheil xswitcher air a thionndadh air chan eil mion-fhiosrachadh ann mu “far a bheil iad a’ cliogadh, ”ath-shuidhich sinn am bufair gu bunaiteach. Ach ann an cinn-uidhe (mar eisimpleir) chan fheum thu seo a dhèanamh (mar as trice).

4. Bidh aon (no grunn) sreath de chlican a' brosnachadh dubhan no dhà eile

# 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)" ]

Tha dubhan air an roinn ann an dà sheòrsa. Air a thogail a-steach, le ainmean fèin-mhìneachaidh (NewWord, NewSentence, Compose) agus prògramaichte.

Bidh ainmean prògramaichte a’ tòiseachadh le “Gnìomh.” Air sgàth TOML v1.4, feumaidh ainmean le dotagan a bhith ann an luachan.

Bu chòir gach earrann a bhith air a mhìneachadh gu h-ìosal leis an aon ainm.

Gus nach sèideadh thu inntinnean dhaoine le riaghladairean “rùisgte” (bho eòlas, an cuid a sgrìobhadhis dòcha aon a-mach à deich proifeiseantaich), Bidh mi a’ cur an gnìomh co-chòrdadh a bharrachd sa bhad.

  • "OFF:" (no "AIR:") mus bi regexp (aithris cunbhalach) ag iarraidh gun tèid na putanan a leanas a leigeil ma sgaoil (no am brùthadh).
    An ath rud tha mi a’ dol a dhèanamh abairt cunbhalach “mì-chothromach”. Le sgrùdadh fa leth de phìosan eadar pìoban "|". Gus an àireamh de chlàran mar "[LR] _SHIFT" a lughdachadh (far a bheil e soilleir nach eil seo riatanach).
  • "SEQ:" Ma thèid an suidheachadh a bh’ ann roimhe a choileanadh (no neo-làthaireach), bidh sinn a’ sgrùdadh an aghaidh abairt àbhaisteach “àbhaisteach”. Airson mion-fhiosrachadh, cuiridh mi sa bhad gu ^W an leabharlann “regexp”. Leis nach eil mi fhathast air dragh a chuir orm faighinn a-mach dè an ìre de cho-chòrdalachd leis a’ pcre as fheàrr leam (“perl compatible”).
  • Tha an abairt sgrìobhte ann an cruth "BUTTON_1: CODE1, BUTTON_2: CODE2" msaa, anns an òrdugh anns am faighear na còdan scan.
  • Tha an t-seic an-còmhnaidh “snugged” gu deireadh an t-sreath, mar sin chan eil feum air “$” a chur ris an earball.
  • Bidh a h-uile sgrùdadh ann an aon loidhne air a dhèanamh aon às deidh a chèile agus air an cur còmhla le “I”. Ach leis gu bheil an luach air a mhìneachadh mar raon, faodaidh tu seic eile a sgrìobhadh às deidh a’ choma. Ma tha feum air seo airson adhbhar air choireigin.
  • luach "SeqLength = 8" a’ cuingealachadh meud a’ bhufair ris an tèid a h-uile sgrùdadh a dhèanamh. Air sgàth Cha do choinnich mi (gu ruige seo) ri goireasan gun chrìoch nam bheatha.

5. A 'suidheachadh nan dubhan a chaidh a mhìneachadh san earrann roimhe

# 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.

Tha am prìomh rud an seo "Gnìomh = [Eagar]". Coltach ris an earrann roimhe, tha seata cuibhrichte de ghnìomhan togte. Agus chan eil comas docaigeadh cuingealaichte ann am prionnsapal (sgrìobh “Action.XXX” agus na bi ro leisg earrann eile a sgrìobhadh air a shon).
Gu sònraichte, tha ath-sgrìobhadh facal ann an cruth ceartaichte air a roinn ann an dà phàirt: “atharraich an cruth mar a chaidh a shònrachadh an sin” и “retype” (“RetypeWord”).

Tha na crìochan a tha air fhàgail air an sgrìobhadh chun an "fhaclair" ("mapa" ann an golang) airson gnìomh sònraichte, tha an liosta aca an urra ris na tha sgrìobhte ann an “Gnìomh”.

Faodar grunn ghnìomhan eadar-dhealaichte a mhìneachadh ann an aon chàrn (earrannan). No faodaidh tu a tharraing às a chèile. Mar a sheall mi gu h-àrd.

Shuidhich mi an gnìomh “Exec” sa bhad gus an sgriobt taobh a-muigh a chuir an gnìomh. Leis an roghainn am bufair clàraichte a phutadh gu stdin.

  • “Fuirich = 1” - feitheamh ris a’ phròiseas ruith a chrìochnachadh.
  • Is dòcha, “don tiùrr” bidh thu airson daoine a bharrachd a chuir san àrainneachd. fiosrachadh leithid ainm clas na h-uinneige bhon deach a ghlacadh.
    “A bheil thu airson an inneal-làimhseachaidh agad a cheangal? Seo far am feum thu a dhol.”

Phew (exhaled). Tha e coltach nach do dhìochuimhnich mi dad.

Oich! Yeah, cha do dhìochuimhnich mi ...
Càite a bheil an rèiteachadh tòiseachaidh? Ann an còd cruaidh? Mar sin:

[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.

Càite an do dhìochuimhnich mi / rinn mi mearachd? (gun dòigh às aonais seo), tha mi dha-rìribh an dòchas nach bi leughadairean furachail ro leisg an sròin a phutadh.

Beannachd leat

Source: www.habr.com

Cuir beachd ann