Xswitcher masanjidwe owongolera a Linux: gawo lachiwiri

chifukwa chofalitsidwa cham'mbuyo (xswitcher pagawo la "umboni wa lingaliro") adalandira mayankho olimbikitsa (chomwe chili chabwino), ndinapitirizabe kuthera nthawi yanga yaulere ndikukonzekera ntchitoyi. Tsopano ndikufuna kuwononga pang'ono zanu ... Gawo lachiwiri silikhala lachizolowezi: malingaliro / zokambirana zamapangidwe osinthika.

Xswitcher masanjidwe owongolera a Linux: gawo lachiwiri

Mwanjira ina zimachitika kuti opanga mapulogalamu abwinobwino amapeza kuti ndizosasangalatsa kukhazikitsa zowongolera zonsezi.

Kuti asakhale opanda maziko, mkati ndi chitsanzo cha zomwe ndikuchita nazo.
Zonse zidapangidwa bwino (komanso zakhazikitsidwa bwino) Apache Kafka & ZooKeeper.
- Kukonzekera? Koma ndizotopetsa! Xml wosayankhula (chifukwa "yatuluka m'bokosi").
- O, mukufunanso ACL? Koma ndizotopetsa! Chopupa-chinthu chonga icho.

Koma mu ntchito yanga ndizosiyana. Kulondola (kalanga, pafupifupi konse koyamba) chitsanzo chomangidwa chimakulolani kuti mupitirizebe mosavuta komanso mwachibadwa (Pafupifupi) sonkhanitsani chithunzi.

Posachedwa ndapeza nkhani yokhudza HabrΓ© yokhudza kulimbikira kwa asayansi a data ...
Zikuoneka kuti mphindi ino yakwaniritsidwa kwathunthu kwa iwo. Ndipo muzochita zanga, monga akunena, "light version". Mitundu yambiri yama voliyumu, opanga mapulogalamu omwe ali ndi OOP okonzeka, ndi zina zambiri. - zonsezi zidzawoneka pambuyo pake / ngati zinyamuka. Koma wojambulayo ayenera kuyamba penapake pano ndi pano.

Pezani mfundo. Ndinatenga TOML ngati maziko a syntactic kuchokera kwa nzika iyi.

Chifukwa iye (TOML) mbali imodzi, yokhoza kusinthidwa ndi anthu. Kumbali inayi, amasuliridwa 1:1 m'mawu aliwonse odziwika bwino: XML, JSON, YAML.
Kuphatikiza apo, kukhazikitsidwa komwe ndidagwiritsa ntchito kuchokera ku "github.com/BurntSushi/toml", ngakhale sikukhala kowoneka bwino kwambiri (kadali kofanana ndi 1.4), kumagwirizana ndi zomwezo ("zomangidwa") JSON.

Ndiye kuti, ngati mungafune, mutha kungonena kuti "pitani m'nkhalango ndi TOML yanu, ndikufuna XXX" ndi "chigamba" kachidindo ndi mzere umodzi wokha.

Chifukwa chake, ngati mukufuna kulemba windows kuti mukonze xswitcher (Sindikudziwa) Palibe mavuto omwe akuyembekezeka "ndi dongosolo lanu loyipali."

Kwa ena onse, mawuwo amachokera pa "key = value" (ndipo njira zingapo zovuta, monga = [zina, izo, mndandanda]) ndikuganiza
mwachilengedwe yabwino.
Chosangalatsa ndichakuti "kuwotcha" nthawi yomweyo (mozungulira 2013). Kokha, mosiyana ndi ine, wolemba TOML adalowa mumlingo woyenera.

Chifukwa chake, tsopano ndizosavuta kwa ine kusintha kukhazikitsidwa kwake kuti zigwirizane ndi ine ndekha, osati mosemphanitsa.

Kawirikawiri, timatenga TOML (yofanana kwambiri ndi Windows INI yakale). Ndipo tili ndi kasinthidwe komwe timafotokozera momwe mungagwirizanitsire zingwe zotsatizana kutengera ma code aposachedwa kuchokera pa kiyibodi. M'munsimu, chidutswa ndi chidutswa, ndi zomwe zachitika mpaka pano. Ndipo kufotokoza chifukwa chake ndinaganiza motere.

0. Basic abstractions

  • Jambulani ma code. Chinachake chiyenera kuchitika pa izi, chifukwa manambala a digito sangawerengedwe ndi anthu (ndi ine ndekha. loloswitcher).
    Ndinagwedeza "ecodes.go" kuchokera ku "golang-evdev" (ndinali waulesi kuti ndiyang'ane gwero loyambirira, ngakhale wolemba adaziwonetsa mwachikhalidwe). Ndinakonza pang'ono (pakadali pano) china chake chomwe chinali chowopsa. Monga "LEFTBRACE" β†’ "L_BRACE".
  • Kuphatikiza apo, adayambitsa lingaliro la "makiyi a boma". Popeza galamala yogwiritsidwa ntchito nthawi zonse salola kuti pakhale ndime zazitali. (Koma zimakuthandizani kuti mufufuze mosadukizadukiza pang'ono. Ngati mumagwiritsa ntchito kujambula "mwachindunji" kokha.)
  • Padzakhala "deduplicator" yokhazikika ya zomwe zapanikizidwa. Chifukwa chake, "kubwereza" = 2 kulembedwa ΠΎΠ΄ΠΈΠ½ nthawi.

1. Zitsanzo gawo

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

Kodi liwu lachiyankhulo chamunthu lokhala ndi mawu ofotokozera limaphatikizapo chiyani? (mwina nkhani ya graphemes aka "hieroglyphs")? Mtundu wina wa "mapepala" oyipa. Chifukwa chake, nthawi yomweyo ndimayambitsa lingaliro la "template".

2. Zoyenera kuchita mukadindidwa china chake (kodi ya scan yafika)

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

Pali ma code 768 onse. (Koma "ngati" ndidayikapo "zodabwitsa" mu code xswitcher).
M'katimo ndidalongosola kudzaza mndandandawo ndi maulalo ogwirira ntchito "zoyenera kuchita". Mu golang izi (mwadzidzi) Zinakhala zosavuta komanso zowonekeratu.

  • Ndikukonzekera kuchepetsa "Drop" kuti ikhale yochepa pamalo ano. M'malo osinthika osinthika (ndiwonetsa pansipa).

3. Table ndi makalasi zenera

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

Mizere ya tebuloyo ili m'mabulaketi aΕ΅iri masikweya awiri okhala ndi dzina lake. Sizikanakhala zophweka kuchokera pamleme. Kutengera ndi zenera lomwe likugwira ntchito pano, mutha kusankha izi:

  • Seti yanu ya "makiyi otentha" "Zochita = ...". Ngati sichoncho, musachite chilichonse.
  • Sinthani "MouseClickDrops" - choti muchite mukadina mbewa. Popeza pomwe xswitcher imatsegulidwa palibe zambiri za "komwe amadina," timakhazikitsanso buffer mwachisawawa. Koma muma terminal (mwachitsanzo) simuyenera kuchita izi (nthawi zambiri).

4. Kudina kumodzi (kapena zingapo) kumayambitsa mbedza imodzi kapena ina

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

Njoka zimagawidwa m'mitundu iwiri. Omangidwa mkati, okhala ndi mayina odzifotokozera okha (NewWord, NewSentence, Compose) ndi okonzeka.

Mayina otha kukonzedwa amayamba ndi "Zochita." Chifukwa TOML v1.4, mayina okhala ndi madontho akuyenera kukhala m'mawu.

Gawo lirilonse liyenera kufotokozedwa pansipa ndi dzina lomwelo.

Kuti musawombere malingaliro a anthu ndi "maliseche" okhazikika (kuchokera ku zochitika, zawo kulembamwina mmodzi mwa khumi akatswiri), nthawi yomweyo ndimagwiritsa ntchito mawu owonjezera.

  • "ZOZIMA:" (kapena "ON:") pamaso regexp (mawu okhazikika) amafuna kuti mabatani otsatirawa atulutsidwe (kapena kukanikizidwa).
    Kenako ndipanga mawu "opanda chilungamo" pafupipafupi. Ndi macheke osiyana a zidutswa pakati pa mapaipi "|". Kuti muchepetse kuchuluka kwa zolemba ngati "[LR]_SHIFT" (pomwe izi sizofunikira).
  • "SEQ:" Ngati chikhalidwe cham'mbuyomu chikakwaniritsidwa (kapena kulibe), ndiye kuti timayang'ana motsutsana ndi mawu akuti "zabwinobwino". Kuti mudziwe zambiri, ndimatumiza nthawi yomweyo ku ^W laibulale ya "regexp". Chifukwa sindinavutikebe kuti ndipeze kuchuluka kwa kugwirizana ndi pcre yomwe ndimakonda ("perl compatible").
  • Mawuwa amalembedwa m'mawonekedwe "BUTTON_1: CODE1, BUTTON_2: CODE2" etc., mu dongosolo limene jambulani zizindikiro analandira.
  • Cheke nthawi zonse "yotsekemera" mpaka kumapeto kwa mndandanda, kotero palibe chifukwa chowonjezera "$" kumchira.
  • Macheke onse pamzere umodzi amachitidwa chimodzi ndi china ndipo amaphatikizidwa ndi "I". Koma popeza mtengowo ukufotokozedwa ngati gulu, mutha kulemba cheke china pambuyo pa koma. Ngati izi zikufunika pazifukwa zina.
  • mtengo "SeqLength = 8" imachepetsa kukula kwa bafa komwe kuwunika konse kumachitidwa. Chifukwa Sindinakhalepo (mpaka pano) sindinakumanepo ndi zinthu zopanda malire m'moyo wanga.

5. Kukhazikitsa mbedza zomwe zafotokozedwa mu gawo lapitalo

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

Chinthu chachikulu apa ndi "Zochita = [Zotsatira]". Mofanana ndi gawo lapitalo, pali zochepa zomwe zimapangidwira. Ndipo kuthekera kwa docking sikuli ndi malire (lembani "Action.XXX" ndipo musakhale aulesi kuti mulembe gawo lina).
Makamaka, kulembanso kwa mawu pamakonzedwe okonzedwa kumagawidwa m'magawo awiri: "Sinthani masanjidwe monga momwe zafotokozedwera pamenepo" ΠΈ "Lembaninso" ("RetypeWord").

Zotsalira zotsalira zalembedwa ku "dikishonale" ("mapu" mu golang) pakuchitapo kanthu, mndandanda wawo umadalira zomwe zalembedwa mu "Zochita".

Zochita zingapo zosiyanasiyana zitha kufotokozedwa mulu umodzi (zigawo). Kapena mukhoza kuchilekanitsa. Monga ndawonetsera pamwambapa.

Nthawi yomweyo ndinakhazikitsa "Exec" kuchitapo kanthu kuti ndichite zolemba zakunja. Ndi mwayi wokankhira chosungira chojambulidwa mu stdin.

  • "Dikirani = 1" - dikirani kuti ntchitoyo ithe.
  • Mwinamwake, "ku mulu" mudzafuna kuyika anthu owonjezera mu chilengedwe. zambiri monga dzina la kalasi ya zenera pomwe zidalandidwa.
    "Mukufuna kulumikiza chogwirira chanu? Apa ndiye muyenera kupita. ”

Phew (kutulutsa mpweya). Zikuwoneka ngati sindinayiwale kalikonse.

Oops! Inde, sindinayiwala ...
Kodi masinthidwe otsegulira ali kuti? Mu hard code? Monga choncho:

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

Ndinalakwila/ ndinalakwitsa kuti? (palibe popanda izi), Ndikuyembekezadi kuti owerenga mwachidwi sadzakhala aulesi kwambiri kuti agwedeze mphuno zawo.

Zabwino zonse!

Source: www.habr.com

Kuwonjezera ndemanga