Xswitcher hoʻoponopono hoʻoponopono no Linux: ʻanuʻu ʻelua

mai hoʻopuka mua (xswitcher ma ke kahua "hōʻoia o ka manaʻo") loaʻa i ka nui o nā manaʻo maikaʻi (ʻo ia ka maikaʻi), Ua hoʻomau au i koʻu manawa kūʻokoʻa i ka hoʻomohala ʻana i ka papahana. I kēia manawa, makemake wau e hoʻolilo i kāu... ʻAʻole maʻa mau ka ʻanuʻu ʻelua: manaʻo / kūkākūkā o ka hoʻolālā hoʻonohonoho.

Xswitcher hoʻoponopono hoʻoponopono no Linux: ʻanuʻu ʻelua

ʻIke ʻia he mea ʻoluʻolu loa nā polokalamu polokalamu maʻamau i ka hoʻonohonoho ʻana i kēia mau mana āpau.

I mea ʻole ke kumu ʻole, aia i loko kahi laʻana o kaʻu e hana nei.
ʻO ka holoʻokoʻa maikaʻi loa (a hoʻokō maikaʻi ʻia) ʻo Apache Kafka & ZooKeeper.
- Hoʻonohonoho? Akā, luuluu! Dumb xml (no ka mea "ma waho o ka pahu").
- ʻAe, makemake ʻoe i kahi ACL? Akā, ʻoluʻolu loa! Tap-blooper... Kekahi mea like.

Akā, i kaʻu hana, he ʻokoʻa loa ia. Akau (Auwe, aneane ʻaʻole i ka manawa mua) ʻo ke kumu hoʻohālike i kūkulu ʻia e ʻae iā ʻoe e hoʻomau maʻalahi a kūlohelohe (Aneane) e houluulu i ke kii.

Ua ʻike au i kahi ʻatikala ma Habré e pili ana i ka hana paʻakikī o nā ʻepekema data...
ʻIke ʻia ua hoʻokō piha ʻia kēia manawa no lākou. A i kaʻu hana, e like me kā lākou e ʻōlelo nei, "light version". Nā hiʻohiʻona nui-nui, nā mea polokalamu hoʻomaʻamaʻa me ka OOP i ka mākaukau, etc. - e ʻike ʻia kēia ma hope i ka wā e haʻalele ai. Akā pono ka mea hoʻolālā e hoʻomaka i kahi ma ʻaneʻi a i kēia manawa.

E hele i ke kiko. Ua lawe au iā TOML ma ke ʻano he syntactic mai keia kamaaina.

No ka mea (TOML) ma kekahi ʻaoʻao, hiki ke hoʻoponopono ʻia e ke kanaka. Ma ka ʻaoʻao ʻē aʻe, ua unuhi ʻia ʻo 1:1 i kekahi o nā syntax maʻamau: XML, JSON, YAML.
Eia kekahi, ʻo ka hoʻokō aʻu i hoʻohana ai mai "github.com/BurntSushi/toml", ʻoiai ʻaʻole ʻo ia ka mea ʻoi loa (1.4 syntax nō naʻe), syntactically kūpono me ka like ("built-in") JSON.

ʻO ia, inā makemake ʻoe, hiki iā ʻoe ke ʻōlelo wale "e hele i ka ululāʻau me kēlā TOML o kāu, makemake wau iā XXX" a "patch" i ke code me hoʻokahi laina.

No laila, inā makemake ʻoe e kākau i kekahi windows e hoʻonohonoho i ka xswitcher (ʻAʻole maopopo iaʻu) ʻAʻohe pilikia i manaʻo ʻia "me kēia config damn o kāu."

No nā mea ʻē aʻe a pau, hoʻokumu ʻia ka syntax ma "key = value" (a ʻo kekahi mau koho paʻakikī, e like me = [kekahi, kēlā, array]) Kuhi wale wau
maʻalahi maʻalahi.
ʻO ka mea hoihoi kēlā "puhi" a puni ka manawa like (ma kahi o 2013). ʻAʻole wale, ʻaʻole like me aʻu, ua komo ka mea kākau o TOML ma kahi ʻano kūpono.

No laila, i kēia manawa ua maʻalahi iaʻu e hoʻoponopono i kāna hoʻokō e kūpono iaʻu iho, ʻaʻole hoʻi.

Ma ka laulā, lawe mākou i ka TOML (like loa me ka Windows INI kahiko). A loaʻa iā mākou kahi hoʻonohonoho a mākou e wehewehe ai pehea e hoʻopili ai i kahi ʻano o nā makau e pili ana i ka hoʻonohonoho o nā code scan hou loa mai ka papa keyboard. Ma lalo iho, ʻāpana i kēlā me kēia ʻāpana, ka mea i hana i kēia manawa. A he wehewehe no ke kumu i hoʻoholo ai au i kēia ala.

0. Nā unuhi kumu

  • Hoʻokaʻina code scan. Pono e hana ʻia kekahi mea e pili ana i kēia, no ka mea ʻaʻole hiki ke heluhelu ʻia nā code digital maʻalahi (ʻo wau wale nō. loloswitcher).
    Ua lulu au i ka "ecodes.go" mai "golang-evdev" (Ua moloā wau i ka nānā ʻana i ke kumu kumu, ʻoiai ua hōʻike ka mea kākau i ka moʻomeheu). Ua hoʻoponopono liʻiliʻi wau (no kēia manawa) i kahi mea weliweli loa. E like me “LEFTBRACE” → “L_BRACE”.
  • Eia hou, ua hoʻolauna ʻo ia i ka manaʻo o "nā kī mokuʻāina". No ka mea, ʻaʻole ʻae ka grammar maʻamau i nā paukū lōʻihi. (Akā hiki iā ʻoe ke nānā me ka liʻiliʻi o ke poʻo.
  • E loaʻa kahi "deuplicator" i kūkulu ʻia o ka mea i kaomi ʻia. No laila, e kākau ʻia ka mokuʻāina "repeat"=2 hoʻokahi mau manawa.

1. Māhele Māhele

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

He aha ke ʻano o ka huaʻōlelo kanaka me ka helu phonetic? (he mea paha o nā graphemes aka "hieroglyphs")? ʻO kekahi ʻano "pepa" weliweli. No laila, hoʻolauna koke wau i ka manaʻo o "template".

2. He aha kāu e hana ai ke kaomi ʻia kekahi mea (ua hiki mai kekahi code scan)

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

He 768 ka nui. (Akā "i ka hihia wale nō" ua hoʻokomo wau i ka hopu ʻana i nā "kahaha" i ka code xswitcher).
I loko ua wehewehe au i ka hoʻopiha ʻana i ka array me nā loulou i nā hana "mea e hana ai". I golang keia (hikiwawe) Ua lilo ia i mea maʻalahi a maopopo.

  • Hoʻolālā wau e hōʻemi i ka "Drop" i ka liʻiliʻi ma kēia wahi. No ka hana maʻalahi (e hōʻike wau ma lalo).

3. Papa me na papa pukaaniani

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

Aia nā lālani o ka papa ʻaina i loko o nā bracket square square me kona inoa. ʻAʻole hiki ke maʻalahi ma mua o ka pā. Ma muli o ka puka makani e hana nei i kēia manawa, hiki iā ʻoe ke koho i kēia mau koho:

  • ʻO kāu hoʻonohonoho ponoʻī o "nā kī wela" "Nā hana = ...". Inā ʻaʻole / nele, mai hana.
  • E hoʻololi i ka "MouseClickDrops" - ka mea e hana ai ke ʻike ʻia kahi kaomi ʻiole. No ka mea ma kahi i hoʻohuli ʻia ai ka xswitcher ʻaʻohe kikoʻī e pili ana i "kahi a lākou e kaomi ai," hoʻonohonoho hou mākou i ka buffer ma ke ʻano maʻamau. Akā i nā terminals (no ka laʻana) ʻaʻole pono ʻoe e hana i kēia (maʻa mau).

4. Hoʻokahi (a i ʻole) mau kaʻina o nā kaomi e hoʻāla i hoʻokahi makau

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

Hoʻokaʻawale ʻia nā makau i ʻelua ʻano. Hoʻokomo ʻia, me nā inoa "ʻōlelo" (NewWord, NewSentence, Compose) a me ka polokalamu.

Hoʻomaka nā inoa programmable me "Action." No ka mea ʻO TOML v1.4, nā inoa me nā kiko kikoʻī.

Pono e wehewehe ʻia kēlā me kēia māhele ma lalo nei me ka inoa like.

I ʻole e puhi i ka manaʻo o ka poʻe me nā "'ōlohelohe" maʻamau (mai ka ʻike, kā lākou e kākauhoʻokahi paha o ka ʻumi ʻoihana), hoʻokō koke au i ka syntax hou.

  • "OFF:" (a i ʻole "ON:") ma mua o ka regexp (hōʻike maʻamau) e hoʻokuʻu ʻia nā pihi ma lalo (a i ʻole kaomi).
    A laila e hana wau i kahi ʻōlelo maʻamau "kūpono ʻole". Me ka hoʻokaʻawale ʻana i nā ʻāpana ma waena o nā paipu "|". I mea e hōʻemi ai i ka helu o nā moʻolelo e like me "[LR]_SHIFT" (kahi ʻaʻole pono kēia).
  • "SEQ:" Inā hoʻokō ʻia ke kūlana mua (a ʻaʻole paha), a laila nānā mākou i kahi ʻōlelo maʻamau "maʻamau". No nā kikoʻī, hoʻouna koke wau iā ^W i ka waihona "regexp". No ka mea, ʻaʻole au i hopohopo e ʻike i ke kiʻekiʻe o ka launa pū me kaʻu pcre punahele (“perl compatible”).
  • Kākau ʻia ka ʻōlelo ma ke ʻano "BUTTON_1: CODE1, BUTTON_2: CODE2" etc., ma ke kauoha i loaa ai na code scan.
  • Hoʻopili mau ʻia ka māka i ka hopena o ke kaʻina, no laila ʻaʻole pono e hoʻohui i ka "$" i ka huelo.
  • Hana ʻia nā mākaʻikaʻi a pau ma kahi laina hoʻokahi ma hope o kekahi a hui pū ʻia me "I". Akā, ʻoiai ua wehewehe ʻia ka waiwai ma ke ʻano he array, hiki iā ʻoe ke kākau i kahi loiloi ʻē aʻe ma hope o ke koma. Inā pono kēia no kekahi kumu.
  • waiwai "Ka lōʻihi ka lōʻihi = 8" palena i ka nui o ka pale kahi e hana ʻia ai nā loiloi a pau. No ka mea ʻAʻole au (a hiki i kēia manawa) i ʻike i nā kumuwaiwai pau ʻole i koʻu ola.

5. Hoʻonohonoho i nā makau i wehewehe ʻia ma ka pauku mua

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

ʻO ka mea nui maʻaneʻi "Action = [Array]". E like me ka pauku mua, aia ka palena o nā hana i kūkulu ʻia. A ʻaʻole kaupalena ʻia ka hiki o ka docking ma ke kumu (Kākau iā "Action.XXX" a mai moloā e kākau i ʻāpana ʻē aʻe no ia).
ʻO ka mea kūikawā, ua māhele ʻia ka paʻi hou ʻana i kahi huaʻōlelo ma ka hoʻolālā i hoʻoponopono ʻia i ʻelua ʻāpana: "e hoʻololi i ka hoʻolālā e like me ka mea i kuhikuhi ʻia ma laila" и "retype" ("RetypeWord").

Ua kākau ʻia nā ʻāpana i koe i ka "papapalapala" ("palapala honua" ma golang) no ka hana i hāʻawi ʻia, pili kā lākou papa inoa i ka mea i kākau ʻia ma "Action".

Hiki ke wehewehe ʻia kekahi mau hana like ʻole i ka puʻu hoʻokahi (mau ʻāpana). A i ʻole hiki iā ʻoe ke huki iā ia. E like me kaʻu i hōʻike ai ma luna.

Hoʻonohonoho koke wau i ka hana "Exec" e hoʻokō i ka palapala waho. Me ke koho e pana i ka buffer i hoʻopaʻa ʻia i stdin.

  • "E kali = 1" - e kali no ka pau ʻana o ke kaʻina holo.
  • Malia paha, "i ka puʻu" makemake ʻoe e hoʻokomo i nā poʻe hou aʻe i ke kaiapuni. ʻike e like me ka inoa o ka papa pukaaniani i kāʻili ʻia ai.
    “Makemake ʻoe e hoʻopili i kāu mea hoʻokele? ʻO kēia kahi āu e hele ai. "

Phew (exhaled). Me he mea lā ʻaʻole au i poina i kekahi mea.

Auwe! ʻAe, ʻaʻole au i poina...
Aia ma hea ka hoʻonohonoho hoʻomaka? Ma ke code paʻakikī? E like me kēlā:

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

Ma hea wau i poina ai / hana hewa? (ʻaʻohe ala me ka ʻole o kēia), Ke lana nei koʻu manaʻo ʻaʻole e moloā loa ka poʻe heluhelu makaʻala e ʻō i ko lākou ihu.

Pomaikai!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka