Kirekebisha mpangilio cha Xswitcher cha Linux: hatua ya pili

Kama uchapishaji uliopita (xswitcher katika hatua ya "uthibitisho wa dhana") ilipokea maoni mengi ya kujenga (ambayo ni nzuri), niliendelea kutumia wakati wangu wa bure kuendeleza mradi huo. Sasa nataka kutumia pesa zako kidogo ... Hatua ya pili haitakuwa ya kawaida kabisa: pendekezo/majadiliano ya muundo wa usanidi.

Kirekebisha mpangilio cha Xswitcher cha Linux: hatua ya pili

Kwa njia fulani inabadilika kuwa watengenezaji wa programu za kawaida wanaona kuwa ni ya kuchosha sana kusanidi vidhibiti hivi vyote.

Ili kutokuwa na msingi, ndani ni mfano wa kile ninachoshughulika nacho.
Kwa ujumla iliyoundwa vyema (na kutekelezwa vyema) Apache Kafka & ZooKeeper.
- Usanidi? Lakini ni boring! Xml bubu (kwa sababu ni "nje ya boksi").
- Oh, unataka pia ACL? Lakini ni hivyo boring! Gonga-blooper... Kitu kama hicho.

Lakini katika kazi yangu ni kinyume kabisa. Haki (ole, karibu kamwe mara ya kwanza) mfano uliojengwa unakuwezesha kuendelea kwa urahisi zaidi na kwa kawaida (Karibu) kusanya mchoro.

Hivi majuzi nilikutana na nakala juu ya Habre kuhusu bidii ya wanasayansi wa data ...
Inageuka kuwa wakati huu unafikiwa kikamilifu kwao. Na katika mazoezi yangu, kama wanasema, "toleo nyepesi". Aina za kiasi nyingi, watengenezaji programu walioboreshwa na OOP wakiwa tayari, nk. - hii yote itaonekana baadaye wakati/ikiwa inaanza. Lakini mbuni anahitaji kuanza mahali hapa na sasa.

Fika kwenye uhakika. Nilichukua TOML kama msingi wa kisintaksia kutoka kwa raia huyu.

Kwa sababu yeye (TOML) kwa upande mmoja, inaweza kuhaririwa na binadamu. Kwa upande mwingine, imetafsiriwa 1:1 katika sintaksia zozote za kawaida zaidi: XML, JSON, YAML.
Zaidi ya hayo, utekelezaji niliotumia kutoka kwa "github.com/BurntSushi/toml", ingawa sio mtindo zaidi (bado sintaksia 1.4), inaendana kisintaksia na JSON sawa ("iliyojengwa ndani").

Hiyo ni, ikiwa unataka, unaweza kusema kwa urahisi "pitia msituni na TOML yako, nataka XXX" na "bandika" msimbo kwa mstari mmoja tu.

Kwa hivyo, ikiwa unataka kuandika windows ili kusanidi xswitcher (Sina uhakika) Hakuna matatizo yanayotarajiwa "na usanidi wako huu mzuri."

Kwa wengine wote, syntax inategemea "ufunguo = thamani" (na kwa kweli chaguzi kadhaa ngumu zaidi, kama = [baadhi, hiyo, safu]) Nadhani
Intuitively rahisi.
Kinachovutia ni kwamba "kuchomwa" karibu wakati huo huo (karibu 2013). Tu, tofauti na mimi, mwandishi wa TOML aliingia kwa kiwango sahihi.

Kwa hiyo, sasa ni rahisi kwangu kurekebisha utekelezaji wake ili kujifaa, na si kinyume chake.

Kwa ujumla, tunachukua TOML (sawa sana na Windows INI ya zamani). Na tunayo usanidi ambao tunaelezea jinsi ya kushikilia safu ya ndoano kulingana na seti ya nambari za hivi karibuni za skanisho kutoka kwa kibodi. Chini, kipande kwa kipande, ni nini kimetokea hadi sasa. Na maelezo ya kwanini niliamua hivi.

0. Vifupisho vya msingi

  • Changanua sifa za msimbo. Jambo fulani hakika linahitaji kufanywa kuhusu hili, kwani misimbo ya kidijitali haiwezi kusomeka kabisa na binadamu (hiyo ni mimi tu. loloswitcher).
    Nilitikisa "ecodes.go" kutoka kwa "golang-evdev" (nilikuwa mvivu sana kutazama chanzo asili, ingawa mwandishi alionyesha kitamaduni). Nilisahihisha kidogo (kwa sasa) jambo ambalo lilikuwa la kutisha. Kama "LEFTBRACE" β†’ "L_BRACE".
  • Zaidi ya hayo, alianzisha dhana ya "funguo za hali". Kwa kuwa sarufi ya kawaida iliyotumika hairuhusu vifungu virefu. (Lakini inakuruhusu kuangalia kwa kutumia kichwa kidogo zaidi. Ikiwa unatumia rekodi ya "moja kwa moja" pekee.)
  • Kutakuwa na "deduplicator" iliyojengwa ya kile kinachoshinikizwa. Kwa hivyo, hali ya "kurudia" = 2 itaandikwa moja mara moja.

1. Sehemu ya violezo

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

Neno la lugha ya binadamu lenye nukuu za kifonetiki linajumuisha nini? (ama suala la graphemes aka "hieroglyphs")? Aina fulani ya "karatasi" ya kutisha. Kwa hiyo, mara moja ninaanzisha dhana ya "template".

2. Nini cha kufanya wakati kitu kimebofya (msimbo mwingine wa skanisho umefika)

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

Kuna misimbo 768 kwa jumla. (Lakini "ikiwa tu" niliingiza kukamata "mshangao" kwenye nambari ya xswitcher).
Ndani nilielezea kujaza safu na viungo vya kazi "nini cha kufanya". Katika golang hii ni (ghafla) Ilibadilika kuwa rahisi na dhahiri.

  • Ninapanga kupunguza "Done" kwa kiwango cha chini mahali hapa. Kwa ajili ya usindikaji rahisi zaidi (nitaionyesha hapa chini).

3. Jedwali na madarasa ya dirisha

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

Safu za jedwali ziko kwenye mabano ya mraba mara mbili na jina lake. Haingeweza kuwa rahisi mara moja kutoka kwenye bat. Kulingana na dirisha linalotumika sasa, unaweza kuchagua chaguzi zifuatazo:

  • Seti yako mwenyewe ya "funguo za moto" "Vitendo = ...". Ikiwa sio / tupu, usifanye chochote.
  • Badili "MouseClickDrops" - nini cha kufanya wakati kubofya kwa kipanya kunagunduliwa. Kwa kuwa wakati ambapo xswitcher imewashwa hakuna maelezo kuhusu "ambapo wanabofya," tunaweka upya bafa kwa chaguo-msingi. Lakini katika vituo (kwa mfano) sio lazima ufanye hivi (kawaida).

4. Mlolongo mmoja (au kadhaa) wa kubofya husababisha ndoano moja au nyingine

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

Hooks imegawanywa katika aina mbili. Imejengewa ndani, yenye majina yanayojieleza (NewWord, NewSentence, Tunga) na inayoweza kupangwa.

Majina yanayoweza kupangwa huanza na "Kitendo." Kwa sababu TOML v1.4, majina yenye vitone lazima yawe katika manukuu.

Kila sehemu inapaswa kuelezewa hapa chini kwa jina moja.

Ili sio kupiga akili za watu na kawaida "uchi" (kutoka kwa uzoefu, wao kuandikalabda mmoja kati ya kumi wataalamu), mimi hutekeleza mara moja syntax ya ziada.

  • "ZIMA:" (au "WASHA:") kabla ya regexp (msemo wa kawaida) zinahitaji kwamba vifungo vifuatavyo kutolewa (au kubofya).
    Ifuatayo nitatoa usemi wa kawaida "usio sawa". Kwa kuangalia tofauti ya vipande kati ya mabomba "|". Ili kupunguza idadi ya rekodi kama "[LR]_SHIFT" (ambapo hii sio lazima).
  • "SEQ:" Ikiwa hali ya awali imekutana (au haipo), basi tunaangalia dhidi ya kujieleza kwa kawaida "kawaida". Kwa maelezo, mara moja ninatuma kwa ^W maktaba ya "regexp". Kwa sababu bado sijajisumbua kujua kiwango cha utangamano na pcre yangu ninayopenda ("perl sambamba").
  • Usemi umeandikwa kwa fomu "BUTTON_1: CODE1, BUTTON_2: CODE2" nk, kwa mpangilio ambao misimbo ya skanisho hupokelewa.
  • Cheki daima "hupigwa" hadi mwisho wa mlolongo, kwa hiyo hakuna haja ya kuongeza "$" kwenye mkia.
  • Ukaguzi wote katika mstari mmoja unafanywa moja baada ya nyingine na zimeunganishwa na "I". Lakini kwa kuwa thamani inaelezewa kama safu, unaweza kuandika hundi mbadala baada ya koma. Ikiwa hii inahitajika kwa sababu fulani.
  • Thamani "SeqLength = 8" hupunguza saizi ya bafa ambayo ukaguzi wote unafanywa. Kwa sababu Sijawahi (mpaka sasa) kamwe kukutana na rasilimali zisizo na mwisho katika maisha yangu.

5. Kuweka ndoano zilizoelezwa katika sehemu iliyopita

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

Jambo kuu hapa ni "Kitendo = [Safu]". Sawa na sehemu ya awali, kuna seti ndogo ya vitendo vya kujengwa. Na uwezekano wa docking sio mdogo kwa kanuni (andika "Action.XXX" na usiwe mvivu sana kuandika sehemu nyingine kwa ajili yake).
Hasa, kuandika tena neno katika mpangilio uliosahihishwa umegawanywa katika sehemu mbili: "badilisha mpangilio kama ilivyoainishwa hapo" ΠΈ "andika upya" ("RetypeWord").

Vigezo vilivyobaki vimeandikwa kwa "kamusi" ("ramani" katika golang) kwa hatua fulani, orodha yao inategemea kile kilichoandikwa katika "Hatua".

Vitendo kadhaa tofauti vinaweza kuelezewa katika lundo moja (sehemu). Au unaweza kuitenganisha. Kama nilivyoonyesha hapo juu.

Mara moja niliweka hatua ya "Exec" kutekeleza hati ya nje. Na chaguo la kusukuma bafa iliyorekodiwa kwenye stdin.

  • "Subiri = 1" - subiri mchakato wa kukimbia ukamilike.
  • Pengine, "kwa lundo" utataka kuweka watu wa ziada katika mazingira. habari kama vile jina la darasa la dirisha ambalo lilizuiliwa.
    β€œUnataka kuunganisha kishikaji chako? Hapa ndipo unapohitaji kwenda.”

Phew (alitoa pumzi). Inaonekana kama sijasahau chochote.

Lo! Ndio, sikusahau ...
Usanidi wa uzinduzi uko wapi? Katika kanuni ngumu? Kama hivyo:

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

Ni wapi nilisahau/ nilikosea? (hakuna njia bila hii), Ninatumai sana kwamba wasomaji wasikivu hawatakuwa wavivu sana kupiga pua zao.

Bahati nzuri!

Chanzo: mapenzi.com

Kuongeza maoni