Fa'atonu fa'atonu Xswitcher mo Linux: la'asaga lua

talu lomiga talu ai (xswitcher i le tulaga "faʻamaoniga o manatu") maua le tele o faʻamatalaga aoga (lea e manaia), sa faaauau pea ona ou faaalu lo'u taimi avanoa i le atinaeina o le galuega faatino. O lea ou te fia faʻaalu sina vaega o lau... O le laasaga lona lua o le a le masani ai: talosaga/talanoaga o le fa'atulagaina o mamanu.

Fa'atonu fa'atonu Xswitcher mo Linux: la'asaga lua

I se isi itu e foliga mai o tagata fai polokalame masani e matua le manaia le setiina o nei pulega uma.

Ina ia aua neʻi faʻamaonia, o totonu o se faʻataʻitaʻiga o mea o loʻo ou feagai.
Aotelega sili ona lelei (ma fa'atinoina) Apache Kafka & ZooKeeper.
- Fa'atulagaina? Ae e le manaia! Lego xml (ona o le "mai le pusa").
- Oi, e te manaʻo foʻi i se ACL? Ae e ese le manaia! Tap-blooper... O se mea faapena.

Ae o la’u galuega e matua faafeagai lava. Tauagavale (Aue, toetoe lava a leai se taimi muamua) o le faʻataʻitaʻiga fausia e mafai ai ona e faʻaauau atili faigofie ma masani (toetoe lava) tuufaatasia se ata.

Talu ai nei na ou tau ai i se tusiga i luga o Habré e uiga i le galue malosi o saienitisi faʻamaumauga...
E foliga mai o lenei taimi ua atoatoa ona iloa mo i latou. Ma i laʻu faʻataʻitaʻiga, e pei ona latou fai mai, "faʻamatalaga mama". Fa'ata'ita'iga tele-volume, fa'apolokalame fa'amasani ma le OOP ua sauni, ma isi. — o le a aliali uma mai mulimuli ane pe a/pe a alu ese. Ae e manaʻomia e le mamanu ona amata i se mea iinei ma le taimi nei.

Ia oo i le tulaga. Na ou faʻaaogaina TOML o se faʻavae faʻavae mai lenei tagatanuu.

Aua o ia (TOML) i le tasi itu, e mafai ona faasa'oina e tagata. I le isi itu, ua faaliliuina 1: 1 i soʻo se faʻasologa masani: XML, JSON, YAML.
E le gata i lea, o le faʻatinoga na ou faʻaaogaina mai le "github.com/BurntSushi/toml", e ui lava e le o le sili ona faʻalelei (1.4 syntax pea), e fetaui lelei ma le tutusa ("built-in") JSON.

O lona uiga, afai e te manaʻo ai, e mafai ona e fai atu "alu i totonu o le togavao ma lau TOML, ou te manaʻo i le XXX" ma "patch" le code i le tasi laina.

O lea, afai e te manaʻo e tusi ni faʻamalama e faʻapipiʻi le xswitcher (Ou te le mautinoa) E leai ni faʻafitauli e faʻamoemoeina "i lenei faʻalavelave leaga a oe."

Mo isi uma, o le syntax e faʻavae i luga o le "key = value" (ma o ni nai filifiliga sili atu ona faigata, pei o = [o nisi, lena, array]) Masalo
intuitively faigofie.
O le mea e manaia ai lena "mu" i le taimi lava e tasi (e tusa ma le 2013). Naʻo, e le pei o aʻu, o le tusitala o le TOML na alu i luga o se fua saʻo.

O le mea lea, o lenei ua sili atu ona faigofie ia te aʻu ona fetuunai lona faʻatinoga e fetaui ma aʻu lava, ae le o le isi itu.

I se tulaga lautele, matou te ave TOML (e tutusa lelei ma le Windows INI tuai). Ma o loʻo i ai le matou faʻatulagaga lea matou te faʻamatalaina pe faʻafefea ona faʻapipiʻi se faasologa o matau e faʻatatau i le seti o code scan lata mai mai le piano. Lalo, vaega ma lea vaega, o le mea na tupu i le taimi nei. Ma se faʻamatalaga pe aisea na ou filifili ai i lenei auala.

0. Fa'amatalaga fa'avae

  • Fa'ailoga fa'ailoga numera. E mautinoa lava e tatau ona fai se mea e uiga i lenei mea, talu ai na o numera numera e matua le mafai ona faitau e tagata (naʻo aʻu. loloswitcher).
    Na ou luluina le "ecodes.go" mai le "golang-evdev" (Sa ou paie e tilotilo i le uluai puna, e ui lava na faailoa mai e le tusitala i se aganuu). Sa ou faasa'oina teisi (mo le taimi nei) se mea sa fai si mata'utia. Pei o le “LEFTBRACE” → “L_BRACE”.
  • E le gata i lea, na ia faʻalauiloaina le manatu o "setete ki". Talu ai o le kalama masani o loʻo faʻaaogaina e le faʻatagaina ai ni fuaitau uumi. (Ae e fa'atagaina oe e siaki i luga ole la'ititi la'ititi. Afai e te fa'aaogaina na'o le "sa'o" pu'eina.)
  • O le ai ai se "deuplicator" fausia i totonu o mea oomi. O lea, o le setete "toe fai"=2 o le a tusia один taimi.

1. Vaega o mamanu

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

O le a le mea e aofia ai i se upu gagana a le tagata e iai le fa'aupuga? (po o se mataupu o graphemes aka "hieroglyphs")? O se ituaiga o "pepa" mataʻutia. O le mea lea, ou te vave faʻalauiloaina le manatu o le "faʻataʻitaʻiga".

2. O le a le mea e fai pe a kiliki se mea (ua o'o mai se isi fa'ailoga fa'ailoga)

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

E 768 numera atoa. (Ae "naʻo le tulaga" Na ou faʻaofiina le puʻeina o "mea faʻateʻia" i le code xswitcher).
I totonu na ou faʻamatalaina le faʻatumuina o le laina ma fesoʻotaʻiga i galuega "mea e fai". I golang o le (fa'afuase'i) Na foliga mai e faigofie ma manino.

  • Ou te fuafua e faʻaitiitia le "Paʻu" i se mea maualalo i lenei nofoaga. Fa'afetai i le fa'agaoioiga e sili atu ona fetu'una'i (O le a ou fa'aali atu i lalo).

3. Laulau ma vasega faamalama

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

O laina o le laulau o lo'o i puipui sikuea lua ma lona igoa. Semanu e le'i faigofie i le taimi lava lena. Fa'alagolago i le fa'amalama o lo'o galue nei, e mafai ona e filifilia filifiliga nei:

  • O lau lava seti o "ki vevela" "Actions = ...". Afai e leai/gaogao, aua le faia se mea.
  • Suia le “MouseClickDrops” - o le a le mea e fai pe a iloa se kiki o le isumu. Talu ai i le tulaga o loʻo faʻaalia ai le xswitcher e leai ni faʻamatalaga e uiga i le "mea latou te kiliki ai," matou te toe setiina le paʻu e ala i le faaletonu. Ae i faʻailoga (mo se faʻataʻitaʻiga) e te le tau faia lenei mea (masani).

4. Tasi (po o le tele) fa'asologa o kiliki e fa'aoso ai le tasi po'o le isi matau

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

Ua vaevaeina matau i ituaiga e lua. Fausia i totonu, fa'atasi ai ma igoa fa'amalamalamaga (NewWord, NewSentence, Compose) ma fa'apolokalameina.

O igoa e mafai ona fa'apolokalame e amata i le "Gaioiga." Aua TOML v1.4, igoa ma togitogi e tatau ona i ai i upusii.

E tatau ona fa'amatalaina vaega ta'itasi i lalo ma le igoa e tasi.

Ina ia aua neʻi feulaina mafaufau o tagata i tagata masani "le lavalava" (mai le poto masani, latou tusiatonu o le tasi mai le sefulu polofesa), Ou te vave faʻatinoina faʻaopoopoga faʻaopoopo.

  • "OFF:" (po'o le "ON:") a'o le'i o'o i le regexp (fa'aaliga masani) e mana'omia le tu'u (pe oomi) fa'amau nei.
    Le isi o le a ou faia se "le talafeagai" faʻamatalaga masani. Fa'atasi ai ma le siakiina eseese o fasi i le va o paipa "|". Ina ia faʻaitiitia le numera o faʻamaumauga e pei o le "[LR]_SHIFT" (lea e manino lava e le manaʻomia).
  • "SEQ:" Afai e ausia le tulaga muamua (pe leai), ona matou siaki lea e faasaga i se faaupuga masani "masani". Mo faʻamatalaga, ou te vave auina atu i le ^W le faletusi "regexp". Aua ou te leʻi faʻalavelave lava e suʻe le maualuga o le fetaui ma laʻu pcre e sili ona ou fiafia i ai ("perl compatible").
  • Ua tusia le faaupuga i le fomu "BUTTON_1: CODE1, BUTTON_2: CODE2" ma isi, i le fa'asologa o lo'o maua ai fa'ailoga fa'ailoga.
  • O le siaki e masani lava ona "snugged" i le faaiuga o le faasologa, o lea e leai se manaʻoga e faʻaopoopo le "$" i le siʻusiʻu.
  • O siaki uma i le laina e tasi e faia le tasi ma le isi ma ua tuufaatasia e le “I”. Ae talu ai o le tau o loʻo faʻamatalaina o se laina, e mafai ona e tusia se isi siaki pe a uma le koma. Afai e manaʻomia lenei mea mo se mafuaʻaga.
  • tāua "SeqLength = 8" fa'atapula'a le tele o le pa'u e fa'atatau i siaki uma. Aua Ou te (seia oo mai i le taimi nei) ou te lei fetaiai lava ma punaoa e le gata i loʻu olaga.

5. Fa'atulagaina o matau o lo'o fa'amatalaina i le vaega muamua

# 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 le mea autu iinei o le "Gaioiga = [Array]". E tutusa ma le vaega muamua, o loʻo i ai se seti faʻatapulaʻa o gaioiga faʻapipiʻiina. Ma o le avanoa e faʻapipiʻi ai e le faʻatapulaʻaina i le mataupu faavae (tusi le "Action.XXX" ma aua le paie e tusi se isi vaega mo ia).
Aemaise lava, o le toe taina o se upu i le faʻatonuga faʻasaʻo ua vaevaeina i ni vaega se lua: "suia le faʻatulagaina e pei ona faʻamaonia iina" и “Retype” (“RetypeWord”).

O vaega o lo'o totoe o lo'o tusia i le "dictionary" ("faafanua" i golang) mo se gaioiga ua tuʻuina atu, o la latou lisi e faʻalagolago i mea o loʻo tusia i le "Action".

E tele gaioiga eseese e mafai ona fa'amatalaina ile fa'aputuga e tasi (vaega). Pe mafai ona e toso ese. E pei ona ou faaalia i luga.

Na vave ona ou setiina le gaioiga "Exec" e faʻatino ai le tusitusiga i fafo. Fa'atasi ai ma le filifiliga e tulei le fa'amau fa'amau i totonu o le stdin.

  • "Faatali = 1" - faʻatali mo le faagasologa o le taʻavale e maeʻa.
  • Masalo, "i le faupuʻega" e te manaʻo e tuʻu nisi tagata i le siosiomaga. fa'amatalaga e pei o le igoa ole vasega fa'amalama na fa'asalaina ai.
    "E te manaʻo e faʻafesoʻotaʻi lau faʻaulu? O le mea lea e tatau ona e alu i ai.”

Phew (mamafa). E foliga mai e leai se mea o galo ia te au.

Oi! Ioe, ou te le'i galo...
O fea oi ai le fa'atulagaga fa'alauiloa? I tulafono faigata? E pei o lena:

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

O fea na galo ia te au/faia se mea sese? (leai se auala e aunoa ma lenei), Ou te matua faʻamoemoe o le a le paie le au faitau faitau e tuʻi o latou isu.

manuia!

puna: www.habr.com

Faaopoopo i ai se faamatalaga