Xswitcher nhazi nhazi maka Linux: nzọụkwụ abụọ

Ebe ọ bụ na mbipụta gara aga (xswitcher na "ihe akaebe nke echiche" ogbo) natara ọtụtụ nzaghachi na-ewuli elu (nke dị mma), M nọgidere na-eji oge efu m na-emepụta ọrụ ahụ. Ugbu a achọrọ m imefu ntakịrị nke gị ... Nzọụkwụ nke abụọ agaghị adị na mbụ: atụmatụ/mkparịta ụka nke nhazi nhazi.

Xswitcher nhazi nhazi maka Linux: nzọụkwụ abụọ

N'ụzọ ụfọdụ ọ na-apụta na ndị mmemme nkịtị na-ahụ na ọ na-agwụ ike nke ukwuu ịtọ njikwa ndị a niile.

Ka ọ ghara ịbụ ndị na-enweghị isi, n'ime bụ ihe atụ nke ihe m na-eme.
N'ozuzu tụụrụ ime nke ọma (ma tinyekwa ya nke ọma) Apache Kafka & ZooKeeper.
- Nhazi? Ma ọ na-agwụ ike! Ogbi xml (n'ihi na ọ si na igbe ahụ pụta).
- Oh, ị chọkwara ACL? Ma ọ na-agwụ ike! Kpatụ-blooper... Ihe dị otú ahụ.

Ma n'ọrụ m, ọ bụ ihe dị iche. Right (Ewoo, ọ fọrọ nke nta ka ọ bụrụ oge mbụ) ihe nlereanya a rụrụ na-enye gị ohere ịga n'ihu n'ụzọ dị mfe na n'ụzọ nkịtị (Ọ fọrọ nke nta ka ọ bụrụ) kpọkọta eserese.

Na nso nso a, ahụrụ m otu akụkọ gbasara Habré gbasara ọrụ siri ike nke ndị sayensị data...
Ọ na-apụta na oge a zuru oke maka ha. Na omume m, dịka ha na-ekwu, "ụdị ọkụ". Ụdị ọtụtụ olu, ndị mmemme nwere oge nwere OOP na njikere, wdg. - ihe niile ga-apụta ma emechaa mgbe / ma ọ bụrụ na ọ ga-apụ. Ma onye mmebe kwesịrị ịmalite ebe a na ugbu a.

Gaa n'isi okwu. Ana m ewere TOML dị ka ntọala syntactic site na nwa amaala a.

N'ihi na ọ (TOML) n'otu aka, mmadụ-editable. N'aka nke ọzọ, a sụgharịrị ya 1:1 n'ime nke ọ bụla n'ime okwu ndị a na-ahụkarị: XML, JSON, YAML.
Ọzọkwa, mmejuputa iwu m ji si na "github.com/BurntSushi/toml", ọ bụ ezie na ọ bụghị nke kachasị ejiji (ka 1.4 syntax), bụ syntactically dakọtara na otu ("built-in") JSON.

Ya bụ, ọ bụrụ na-ịchọrọ, ị nwere ike ịsị "jiri TOML nke gị gabiga n'ọhịa, achọrọ m XXX" na "patch" koodu ahụ na otu ahịrị.

Ya mere, ọ bụrụ na ịchọrọ ide ụfọdụ windo iji hazie xswitcher (O doghi m anya) Enweghị nsogbu a na-atụ anya "na nhazi nke gị a jọgburu onwe ya."

Maka ndị ọzọ niile, syntax ahụ dabere na “igodo = uru” (na n'ụzọ nkịtị nhọrọ ole na ole gbagwojuru anya, dị ka = [ụfọdụ, nke ahụ, array]) echere m
kensinammuo adaba.
Ihe na-adọrọ mmasị bụ nke ahụ "ọkụ" n'otu oge ahụ (gburugburu 2013). Naanị, n'adịghị ka m, onye dere TOML batara n'ogo kwesịrị ekwesị.

Ya mere, ugbu a ọ na-adịrị m mfe ịhazigharị mmejuputa ya ka ọ dabara onwe m, ọ bụghịkwa ọzọ.

N'ozuzu, anyị na-ewere TOML (yiri nnọọ Windows INI ochie). Ma anyị nwere nhazi nke anyị na-akọwa otu esi ejikọta usoro nko na-adabere na nhazi nke koodu nyocha kachasị ọhụrụ site na keyboard. N'okpuru, ibe n'ibe, bụ ihe mere ugbu a. Na nkọwa nke ihe mere m ji kpebie otú a.

0. Nkọwapụta ndị bụ isi

  • Nyochaa aha koodu. Ekwesịrị ịme ihe n'ezie maka nke a, ebe ọ bụ na koodu dijitalụ abụghị nke mmadụ ga-agụ (nke ahụ bụ naanị m) loloswitcher).
    A kpapụrụ m "ecodes.go" site na "golang-evdev" (m dị umengwụ ileba anya na isi mmalite, ọ bụ ezie na onye edemede ahụ gosipụtara ya na omenala). Adoziri m ntakịrị (ugbu a) ihe na-atụ egwu nke ukwuu. Dị ka "LEFTBRACE" → "L_BRACE".
  • Na mgbakwunye, ọ webatara echiche nke "igodo steeti". Ebe ọ bụ na ụtọ asụsụ a na-ejikarị eme ihe anaghị ekwe ka ọ dị ogologo oge. (Ma ọ na-enye gị ohere ịlele na obere ego n'elu. Ọ bụrụ na ị na-eji naanị "kpọmkwem" ndekọ.)
  • A ga-enwe "deduplicator" arụnyere n'ime ihe a na-agbanye. Ya mere, a ga-ede steeti "repeat" = 2 один ugboro.

1. Ngalaba ndebiri

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

Kedu ihe okwu asụsụ mmadụ nwere akara ụdaume nwere? (ma ọ bụ okwu graphemes aka "hieroglyphs")? Ụdị "ibé akwụkwọ" dị egwu. Ya mere, m ozugbo ewebata echiche nke "n'ụdị".

2. Ihe ị ga-eme mgbe ịpịrị ihe ( koodu nyocha ọzọ eruola)

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

Enwere koodu 768 na mkpokọta. (Ma "ọ bụrụ na" etinyere m ijide "ihe ịtụnanya" n'ime koodu xswitcher).
N'ime m kọwara na-ejuputa n'usoro na njikọ ọrụ "ihe a ga-eme". Na golang nke a bụ (na mberede) Ọ tụgharịrị bụrụ nke dabara na nke doro anya.

  • M na-eme atụmatụ ibelata “dobe” na opekempe na ebe a. N'ịkwado nhazi nhazi ndị ọzọ (M ga-egosi ya n'okpuru).

3. Tebụl nwere klaasị windo

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

Ahịrị table ahụ dị n'akara ukwu anọ nwere aha ya. Ọ gaghị adị mfe ozugbo na bat. Dabere na windo na-arụ ọrụ ugbu a, ị nwere ike họrọ nhọrọ ndị a:

  • Ntọala nke "igodo ọkụ" "Ọrụ =…". Ọ bụrụ na ọ bụghị / efu, emela ihe ọ bụla.
  • Gbanwee "MouseClickDrops" - ihe ị ga-eme mgbe achọpụtara ọpịpị òké. Ebe ọ bụ na ebe a na-agbanye xswitcher enweghị nkọwa gbasara "ebe ha pịa," anyị na-emegharị ihe nchekwa ahụ na ndabara. Ma na ọnụ (dịka ọmụmaatụ) ịkwesighi ime nke a (na-emekarị).

4. Otu (ma ọ bụ ọtụtụ) usoro nke clicks na-akpalite otu nko ma ọ bụ ọzọ

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

A na-ekewa nko ụzọ abụọ. Wuru n'ime ya, nwere aha nkọwa onwe ya (NewWord, NewSentence, Compose) na mmemme.

Aha mmemme na-amalite na "Action." N'ihi na TOML v1.4, aha nwere ntụpọ ga-abụrịrị na nhota okwu.

Ekwesịrị ịkọwa akụkụ nke ọ bụla n'okpuru na otu aha.

Ka ị ghara ịfụ uche ndị mmadụ na "ọtọ" oge niile (site na ahụmahụ, ha ideikekwe otu n'ime iri ndị ọkachamara), M ozugbo mejuputa syntax ọzọ.

  • "gbanyụọ:" (ma ọ bụ "ON:") tupu regexp (okwu mgbe niile) chọrọ ka ewepụta bọtịnụ ndị a (ma ọ bụ pịa).
    Ọzọ, m ga-eme ka okwu "ezighị ezi" mgbe niile. Na iche iche nlele nke iberibe n'etiti ọkpọkọ "|". Iji belata ọnụ ọgụgụ ndekọ dị ka "[LR]_SHIFT" (ebe nke a doro anya na ọ dịghị mkpa).
  • "SEQ:" Ọ bụrụ na ọnọdụ gara aga ezute (ma ọ bụ na-anọghị), mgbe ahụ, anyị na-enyocha okwu "nkịtị" mgbe niile. Maka nkọwa zuru ezu, ana m ezigara ^W ọba akwụkwọ “regexp” ozugbo. N'ihi na enwebeghị m nsogbu ịchọpụta ogo ndakọrịta na pcre ọkacha mmasị m ("perl compatible").
  • Edere okwu ahụ n'ụdị "BUTTON_1: CODE1, BUTTON_2: CODE2" wdg, n'usoro nke enwetara koodu nyocha.
  • A na-echekwa nlele mgbe niile na njedebe nke usoro, yabụ na ọ dịghị mkpa ịgbakwunye "$" na ọdụ.
  • A na-eme nlele niile n'otu ahịrị otu otu ma jikọtara ya na "M". Mana ebe ọ bụ na akọwara uru ya dị ka nhazi, ị nwere ike dee nlele ọzọ ka rikomas gachara. Ọ bụrụ na achọrọ nke a maka ihe ụfọdụ.
  • uru "Seq Ogologo = 8" na-amachi nha nke nchekwa ebe a na-eme nyocha niile. N'ihi na Enwere m (ruo ugbu a) ahụtụbeghị m akụ na-adịghị agwụ agwụ na ndụ m.

5. Ịtọ ntọala nko ndị akọwara na ngalaba gara aga

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

Isi ihe ebe a bụ "Action = [Array]". Yiri ngalaba nke gara aga, enwere oke arụrụ arụ arụrụ n'ime ya. Na ohere nke ọdụ ụgbọ mmiri ejedebeghị na ụkpụrụ (dee "Action.XXX" ma adịla umengwụ idere ngalaba ọzọ maka ya).
Karịsịa, a na-ekewa idegharị mkpụrụokwu n'ime nhazi emeziri ụzọ abụọ: "gbanwee okirikiri nhọrọ ukwuu dịka akọwapụtara ebe ahụ" и "Tigharịa" ("RetypeWord").

Edere paramita ndị fọdụrụ na “akwụkwọ ọkọwa okwu” ("map" na golang) maka omume enyere, ndepụta ha dabere na ihe edere na "Action".

Enwere ike ịkọwa ọtụtụ omume dị iche iche n'otu ikpo (ngalaba). Ma ọ bụ ị nwere ike ịdọpụ ya iche. Dị ka m gosiri n'elu.

M ozugbo etinyere ihe omume “Exec” iji mebie edemede mpụta. Site na nhọrọ ịkwanye ihe nchekwa edere na stdin.

  • "Chere = 1" - chere ka usoro ịgba ọsọ ga-agwụ.
  • Eleghị anya, "ruo n'obo" ị ga-achọ itinye ndị ọzọ na gburugburu ebe obibi. ozi dị ka aha klaasị mpio nke esitere na ya wepụta ya.
    "Ị chọrọ jikọọ onye njikwa gị? Nke a bụ ebe ị ga-aga."

Phew (ekupụrụ ume). Ọ dị ka echefubeghị m ihe ọ bụla.

Ee! Ee, echefughị ​​m...
Ebee ka nhazi mmalite dị? Na koodu siri ike? Dị ka nke ahụ:

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

Ebee ka m chefuru/mehie ụzọ? (Ọ nweghị ụzọ na-enweghị nke a), M n'ezie na-atụ anya na-aṅa ntị na-agụ agaghị adị umengwụ ịkwanye imi ha.

Jisie!

isi: www.habr.com

Tinye a comment