Ceartaitheoir leagan amach Xswitcher le haghaidh Linux: céim a dó

Mar foilseachán roimhe seo (xswitcher ag an gcéim “cruthúnas ar choincheap”) a fuarthas go leor aiseolas cuiditheach (atá go deas), Lean mé de mo chuid ama saor a chaitheamh ag forbairt an tionscadail. Anois ba mhaith liom beagán de do chuid a chaitheamh ... Ní gnách go leor an dara céim: dearadh cumraíochta a mholadh/plé.

Ceartaitheoir leagan amach Xswitcher le haghaidh Linux: céim a dó

Ar bhealach tharla sé go mbíonn sé thar a bheith leadránach do ghnáth-ríomhchláraitheoirí na rialuithe seo go léir a chur ar bun.

Chun gan a bheith gan bhunús, tá sampla taobh istigh de na rudaí a bhfuil mé ag déileáil leis.
Ar an iomlán ceapadh go sármhaith (agus curtha i bhfeidhm go maith) Apache Kafka & ZooKeeper.
- Cumraíocht? Ach tá sé leadránach! Xml balbh (toisc go bhfuil sé “as an mbosca”).
- Ó, ar mhaith leat freisin ACL? Ach tá sé chomh leadránach! Tap-blooper... Rud mar sin.

Ach i mo chuid oibre tá sé díreach a mhalairt. Ceart (olar, beagnach riamh an chéad uair) Ceadaíonn an tsamhail tógtha duit leanúint ar aghaidh níos éasca agus go nádúrtha (beagnach) le chéile léaráid.

Tháinig mé trasna ar alt le déanaí ar Habré faoi obair chrua na n-eolaithe sonraí...
Tharlaíonn sé go raibh an nóiméad seo réadaithe go hiomlán dóibh. Agus i mo chleachtas, mar a deir siad, "leagan éadrom". Samhlacha il-imleabhar, ríomhchláraitheoirí seasoned le OOP réidh, etc. — beidh sé seo ar fad le feiceáil níos déanaí nuair/má tharlaíonn sé. Ach ní mór don dearthóir tosú áit éigin anseo agus anois.

Faigh go dtí an pointe. Ghlac mé TOML mar bhonn syntactic ón saoránach seo.

Toisc go bhfuil sé (TOML) ar thaobh amháin, daonna-in eagar. Ar an láimh eile, aistrítear é 1:1 go haon cheann de na comhréireanna is coitianta: XML, JSON, YAML.
Thairis sin, tá an cur i bhfeidhm a d’úsáid mé ó “github.com/BurntSushi/toml”, cé nach é an comhréir is faiseanta (fós 1.4), ag luí go comhréir leis an JSON céanna (“tógtha i”).

Is é sin, más mian leat, is féidir leat a rá go simplí “téigh tríd na coillte agus an TOML sin agatsa, ba mhaith liom XXX” agus “paiste” an cód le líne amháin.

Mar sin, más mian leat roinnt fuinneoga a scríobh chun xswitcher a chumrú (Níl mé cinnte) Níltear ag súil le fadhbanna ar bith “leis an chumraíocht diabhal seo atá agat.”

I gcás gach duine eile, tá an chomhréir bunaithe ar “eochair = luach” (agus go litriúil cúpla rogha níos casta, mar = [roinnt, sin, eagar]) Is dóigh liom
intuitively áisiúil.
An rud atá suimiúil é sin "dóite" timpeall an ama chéanna (thart ar 2013). Murab ionann agus mise amháin, chuaigh údar TOML isteach ar scála ceart.

Mar sin, tá sé níos fusa anois dom a chur i bhfeidhm a choigeartú de réir mar a oireann dom féin, agus ní vice versa.

Go ginearálta, glacaimid TOML (an-chosúil leis an sean Windows INI). Agus tá cumraíocht againn ina ndéanaimid cur síos ar conas sraith crúcaí a cheangal ag brath ar shraith na gcód scanadh is déanaí ón méarchlár. Anseo thíos, píosa ar phíosa, tá an méid a tharla go dtí seo. Agus míniú ar cén fáth a chinn mé ar an mbealach seo.

0. Astarraingtí bunúsacha

  • Scanadh sonrúcháin chóid. Is cinnte go gcaithfear rud éigin a dhéanamh faoi seo, ós rud é nach bhfuil cóid dhigiteacha inléite ag daoine (is mise amháin loloswitcher).
    Chroith mé “ecodes.go” ó “golang-evdev” (bhí mé ró-leisciúil féachaint ar an mbunfhoinse, cé gur thug an t-údar le fios go cultúrtha é). Ceartaigh mé rud beag (go fóill) a bhí eagla go leor. Cosúil le “LEFTBRACE” → “L_BRACE”.
  • Ina theannta sin, thug sé isteach an coincheap "eochracha stáit". Toisc nach gceadaíonn an ghramadach rialta sleachta fada. (Ach ceadaíonn sé duit seiceáil le forchostais íosta. Mura n-úsáideann tú ach taifeadadh “díreach”.)
  • Beidh “deduplicator” ionsuite ann dá bhfuil brúite. Mar sin, scríobhfar an stát "athrá"=2 amháin am.

1. Teimpléid alt

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

Cad atá i bhfocal teanga daonna le nodaireacht foghraíochta? (ceachtar ábhar de graphemes nó "hieroglyphs")? “Bileog” uafásach de shaghas éigin. Dá bhrí sin, tugaim isteach láithreach an coincheap "teimpléad".

2. Cad atá le déanamh nuair a chliceáiltear rud éigin (cód scanadh eile tagtha)

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

Tá 768 cód san iomlán. (Ach “ar eagla na heagla” chuir mé “iontas” isteach sa chód xswitcher).
Taobh istigh rinne mé cur síos ar líonadh an eagar le naisc chuig feidhmeanna “cad atá le déanamh”. I golang é seo (go tobann) Iompaigh sé amach a bheith áisiúil agus soiléir.

  • Tá sé ar intinn agam “Drop” a laghdú go dtí an t-íosmhéid san áit seo. I bhfabhar próiseáil níos solúbtha (taispeánfaidh mé thíos é).

3. Tábla le ranganna fuinneoige

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

Tá sraitheanna an tábla idir lúibíní cearnacha dúbailte agus a ainm. Ní fhéadfadh sé a bheith níos éasca díreach as an ialtóg. Ag brath ar an bhfuinneog atá gníomhach faoi láthair, is féidir leat na roghanna seo a leanas a roghnú:

  • Do shraith féin de “eochracha te” “Gníomhartha = …”. Mura bhfuil/folamh, ná déan faic.
  • Athraigh “MouseClickDrops” - cad atá le déanamh nuair a aimsítear cliceáil luiche. Ós rud é ag an bpointe a bhfuil xswitcher ar siúl níl aon sonraí ann maidir le “cá chliceáil,” athshocraímid an maolán de réir réamhshocraithe. Ach i gcríochfoirt (mar shampla) ní gá duit é seo a dhéanamh (go hiondúil).

4. Spreagann seicheamh (nó roinnt) de chlic duán amháin nó duán 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)" ]

Tá crúcaí roinnte ina dhá chineál. Insuite, le hainmneacha “ag labhairt” (NewWord, NewSentence, Compose) agus in-ríomhchláraithe.

Tosaíonn ainmneacha in-ríomhchláraithe le “Gníomh.” Mar TOML v1.4, ní mór ainmneacha le poncanna a bheith i Sleachta.

Ba chóir cur síos a dhéanamh ar gach cuid thíos leis an ainm céanna.

Ionas nach slaghdófar aigne daoine le rialtaigh “nocht” (ó thaithí, a gcuid scríobhb'fhéidir duine as gach deichniúr gairmithe), cuirim comhréir bhreise i bhfeidhm láithreach.

  • "OFF:" (nó "AR:") roimh regexp (sloinn rialta) a cheangal go scaoilfí (nó brú) na cnaipí seo a leanas.
    Ansin táim chun slonn rialta “éagórach” a dhéanamh. Le seiceáil ar leithligh na bpíosaí idir píopaí "|". Chun líon na dtaifead mar "[LR]_SHIFT" a laghdú (nuair is léir nach bhfuil sé seo riachtanach).
  • "SEQ:" Má tá an coinníoll roimhe comhlíonta (nó as láthair), ansin seiceáil muid i gcoinne "gnáth" slonn rialta. Chun sonraí a fháil, cuirim chuig ^W an leabharlann “regexp” láithreach. Toisc nach bhfuil aon bhac orm fós a fháil amach an leibhéal comhoiriúnachta leis an pcre is fearr liom (“comhoiriúnach perl”).
  • Tá an slonn scríofa san fhoirm "BUTTON_1: CÓD1, BUTTON_2: CODE2" etc., san ord ina bhfaightear na cóid scanadh.
  • Déantar an seic a “snugged” i gcónaí go dtí deireadh an tseichimh, mar sin ní gá “$” a chur leis an eireaball.
  • Déantar gach seiceáil i líne amháin ceann i ndiaidh a chéile agus cuirtear "I" le chéile iad. Ach ós rud é go gcuirtear síos ar an luach mar eagar, is féidir leat seiceáil eile a scríobh tar éis an choma. Más gá é seo ar chúis éigin.
  • Luach "SeqLength = 8" teorainn le méid an mhaoláin a ndéantar gach seiceáil ina choinne. Mar Níor tháinig mé (go dtí seo) ar acmhainní gan teorainn i mo shaol.

5. Socrú na crúcaí a thuairiscítear san alt roimhe seo

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

Is é an rud is mó anseo "Gníomh = [Eagar]". Cosúil leis an alt roimhe seo, tá sraith teoranta de ghníomhartha ionsuite. Agus níl an fhéidearthacht Á teoranta i bprionsabal (scríobh “Action.XXX” agus ná bí ró-leisciúil alt eile a scríobh dó).
Go háirithe, tá athchlóscríobh focal sa leagan amach ceartaithe roinnte ina dhá chuid: “athraigh an leagan amach mar atá sonraithe ann” и “athchlóscríobh” (“RetypeWord”).

Scríobhtar na paraiméadair atá fágtha go dtí an “foclóir” ("mapa" i golang) maidir le gníomh ar leith, braitheann a liosta ar a bhfuil scríofa i “Gníomh”.

Is féidir cur síos a dhéanamh ar roinnt gníomhartha éagsúla in aon charn amháin (rannóga). Nó is féidir leat é a tharraingt óna chéile. Mar a léirigh mé thuas.

Shocraigh mé an gníomh “Exec” láithreach chun an script sheachtrach a rith. Leis an rogha an maolán taifeadta a bhrú isteach i stdin.

  • “Fan = 1” - fan go gcríochnófar an próiseas reatha.
  • Is dócha, “go dtí an carn” beidh tú ag iarraidh daoine breise a chur sa chomhshaol. faisnéis mar ainm an aicme fuinneoige ónar idircheapadh é.
    “Ar mhaith leat do láimhseálaí a nascadh? Seo an áit a gcaithfidh tú dul."

Phew (easanálaithe). Is cosúil nach bhfuil dearmad déanta agam ar rud ar bith.

Úps! Sea, ní dhearna mé dearmad ...
Cá bhfuil cumraíocht an tseolta? I gcód crua? 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á ndearna mé dearmad/dearmad? (aon bhealach gan é seo), tá súil agam nach mbeidh léitheoirí aireach ró-leisciúil a srón a mhúscailt.

Ádh mór oraibh!

Foinse: will.com

Add a comment