Saxeexa qaabaynta Xswitcher ee Linux: tallaabada labaad

Tan daabacaad hore (xswitcher ee "caddaynta fikradda" marxaladda) waxay heshay jawaab celin wax ku ool ah oo badan (oo fiican), Waxaan sii waday inaan wakhtigayga firaaqada ah ku bixiyo horumarinta mashruuca. Hadda waxaan rabaa inaan wax yar ka bixiyo... Talaabada labaad ma noqon doonto wax caadi ah: soo jeedin/ka doodista qaabaynta qaabaynta.

Saxeexa qaabaynta Xswitcher ee Linux: tallaabada labaad

Si kastaba ha ahaatee waxaa soo baxday in barnaamijyada caadiga ah ay u arkaan inay si cajiib ah caajis u yihiin inay dejiyaan dhammaan kontarooladaas.

Si aan sal la'aan u noqon, gudaha waxaa tusaale u ah waxa aan la tacaalayo.
Guud ahaan si heer sare ah loo raray (si wanaagsanna loo hirgeliyay) Apache Kafka & ZooKeeper.
- Habayn? Laakiin waa caajis! Dumb xml (maxaa yeelay waa "ka baxsan sanduuqa").
- Oh, miyaad sidoo kale rabtaa ACL? Laakiin aad bay u caajis badan tahay! Taabo-blooper... Wax la mid ah.

Laakiin shaqadayda waa ka soo horjeeda. Sax (Alaas, ku dhawaad ​​marnaba markii ugu horeysay) Qaabka la dhisay wuxuu kuu ogolaanayaa inaad si fudud oo dabiici ah u sii waddo (Ku dhawaad) soo ururi jaantus.

Waxaan dhawaan la kulmay maqaal ku saabsan HabrΓ© oo ku saabsan shaqada adag ee saynisyahannada xogta...
Waxay soo baxday in wakhtigan si buuxda loo xaqiiqsaday iyaga. Iyo dhaqankayga, sida ay yiraahdaan, "nooca iftiinka". Noocyo mug badan, barnaamijyo xilliyeed leh oo OOP diyaar ah, iwm. - Dhammaan tani waxay soo bixi doontaa hadhow marka/haddii ay kiciso. Laakiin naqshadeeyuhu wuxuu u baahan yahay inuu meel ka bilaabo halkan iyo hadda.

U dhaadhac qodobka. Waxaan u qaatay TOML si sal ah ka muwaadinkan.

Sababtoo ah isaga (TOML) dhanka kale, bini'aadam-ku-darimi karo. Dhanka kale, waxaa loo turjumay 1:1 mid kasta oo ka mid ah ereyada caadiga ah: XML, JSON, YAML.
Waxaa intaa dheer, hirgelinta aan ka soo qaatay "github.com/BurntSushi/toml", in kasta oo aan ahayn kan ugu moodada ah (wali 1.4 syntax), waa mid la mid ah ("lagu dhisay") JSON.

Taasi waa, haddii aad rabto, waxaad si fudud u odhan kartaa "la gudub kaynta TOML-kaaga, waxaan rabaa XXX" iyo "patch" code oo leh hal xariiq oo keliya.

Sidaa darteed, haddii aad rabto inaad qorto qaar ka mid ah daaqadaha si aad u habayso xswitcher (Ma hubo) Wax dhibaato ah lagama filayo "qaabayntan xun ee adiga."

Kuwa kale oo dhan, syntaxku wuxuu ku salaysan yahay "furaha = qiimaha" (iyo macno ahaan dhowr doorasho oo aad u adag, sida = [qaar, in, array]) waxaan filayaa
dareen ku habboon.
Waxa xiisaha lihi waa taas "Gubatay" waqti isku mid ah (qiyaastii 2013). Keliya, si ka duwan aniga, qoraaga TOML ayaa ku galay miisaan habboon.

Sidaa darteed, hadda way ii fududdahay inaan hagaajiyo hirgelinteeda si aan nafteyda ugu habboonaato, oo aan liddi ku ahayn.

Guud ahaan, waxaan qaadanaa TOML (aad u la mid ah Windows INI hore). Oo waxaan leenahay qaabeynta kaas oo aan ku sifayneyno sida loogu dhejiyo silsilado taxane ah oo ku xiran qaabka koodhka sawir ee ugu dambeeyay ee kumbuyuutarka. Hoos, gabal gabal, waa waxa dhacay ilaa hadda. Iyo sharaxaad ku saabsan sababta aan sidan u go'aansaday.

0. Waxyaabaha Aasaasiga ah

  • Iskaan garee nambarada summada Wax hubaal ah ayaa loo baahan yahay in arrintan wax laga qabto, maadaama si fudud koodhadhka dhijitaalka ah aysan gabi ahaanba ahayn kuwo la akhriyi karo aadanaha (taasi waa aniga oo keliya loloswitcher).
    Waxaan ka ruxay "ecodes.go" oo ka yimid "golang-evdev" (Aad ayaan u caajisay inaan eego isha asalka ah, in kasta oo qoraagu uu si cad u tilmaamay). Waxaan saxay wax yar (hadda) wax aad looga baqo. Sida "LEFTBRACE" β†’ "L_BRACE".
  • Intaa waxaa dheer, wuxuu soo bandhigay fikradda "furayaasha gobolka". Maadaama naxwaha caadiga ah ee la isticmaalo aanu ogolayn marino dhaadheer. (Laakin waxay kuu ogolaanaysaa inaad ku hubiso korka ugu yar. Haddii aad isticmaasho kaliya duubitaan "toos ah".)
  • Waxaa jiri doona "deduplicator" oo ku dhex jira waxa la riixo. Markaa, gobolka "ku celi"=2 ayaa la qori doonaa ΠΎΠ΄ΠΈΠ½ jeer.

1. Qaybta moodooyinka

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

Muxuu ka kooban yahay kelmadda luqadda bini'aadamka oo leh dhawaaq dhawaaqeed? (ama arrin graphemes aka "hieroglyphs")? Nooc ka mid ah "sheet" xun. Sidaa darteed, waxaan isla markiiba soo bandhigay fikradda "Template".

2. Waxa la sameeyo marka wax la riixo (koodhka kale ee iskaanka ayaa yimid)

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

Guud ahaan waxaa jira 768 code. (Laakin "waa haddii ay dhacdo" waxaan geliyey qabashada "yaab" koodka xswitcher).
Gudaha waxaan ku sifeeyay buuxinta array-ga xiriirinta shaqooyinka β€œwaxa la sameeyo”. In golang kani waa (si lama filaan ah) Waxay noqotay mid ku habboon oo muuqata.

  • Waxaan qorsheynayaa inaan meeshan ku yareeyo "Drop" ilaa ugu yaraan. Iyada oo ay ugu wacan tahay habayn dabacsanaan badan (waxaan ku tusi doonaa hoos).

3. Shaxda leh fasalada daaqada

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

Safafka miisku waa inay ku yaalliin saldhigyo labajibbaaran oo magaceedu ku yaal. Ma fududayn karin isla markiiba fiidmeerta. Iyada oo ku xidhan daaqadda hadda firfircoon, waxaad dooran kartaa xulashooyinka soo socda:

  • Qayb adiga kuu gaar ah oo ah "furaha kulul" "Ficilka = …". Haddaysan ahayn/madhan, waxba ha samayn.
  • Bedel "MouseClickDrops" - waxa la sameeyo marka mouse-ka la ogaado. Maaddaama marka xswitcher uu shido ma jiraan wax tafaasiil ah oo ku saabsan "meesha ay gujiyaan," waxaan dib u dejineynaa kaydinta si caadi ah. Laakiin terminaalka (tusaale ahaan) uma baahnid inaad tan sameyso (sida caadiga ah).

4. Hal (ama dhowr) oo taxane ah oo gujisyo ah ayaa kicinaya hal ama mid kale

# 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 waxa loo qaybiyaa laba nooc. Lagu dhex dhisay, oo wata magacyo "ku hadla" (NewWord, NewSentence, Compose) iyo barnaamij la samayn karo.

Magacyada barnaamijku waxay ku bilowdaan "Ficil." Sababtoo ah TOML v1.4, magacyada leh dhibco waa inay ku jiraan xigashooyin.

Qayb kasta waa in lagu qeexaa hoos oo isku magac ah.

Si aan maskaxda dadka loogu afuufin "qaawan" joogto ah (laga bilaabo waayo-aragnimada, ay si aad u qortomalaha tobankiiba mid xirfadlayaasha), Isla markiiba waxaan hirgeliyaa syntax dheeraad ah.

  • "Dami:" (ama "Daran:") ka hor regexp (hadalka caadiga ah) waxay u baahan yihiin in badhamada soo socda la sii daayo (ama la riixo).
    Marka xigta waxaan samayn doonaa odhaah joogto ah oo "caddaalad-darro ah". Iyadoo si gaar ah loo eegayo qaybo ka mid ah tuubooyinka dhexdooda "|". Si loo dhimo tirada diiwaanada sida "[LR]_SHIFT" (halka ay tani si cad aan loo baahnayn).
  • "SEQ:" Haddii shuruudii hore la buuxiyo (ama maqan tahay), markaa waxaanu hubinaynaa "caadi" odhaah joogto ah. Faahfaahinta, waxaan isla markiiba u diray ^W maktabadda "regexp". Sababtoo ah weli kuma dhibin inaan ogaado heerka ku habboonaanta pcre-ka aan jeclahay ("perl compatible").
  • Odhaahdu waxay ku qoran tahay qaabka "BUTTON_1: CODE1, BUTTON_2: CODE2" iwm., sida ay u kala horreeyaan code-yada iskaanka loo helo.
  • Jeegagu had iyo jeer waa "lagu dhejiyaa" ilaa dhamaadka taxanaha, markaa looma baahna in "$" lagu daro dabada.
  • Dhammaan jeegaga hal xariiq ayaa la sameeyaa midba midka kale waxaana lagu daray "I". Laakin maadaama qiimihii lagu sifeeyay hannaan, waxaad qori kartaa jeeg kale ka dib kooma. Haddii tan loo baahdo sabab qaar ka mid ah.
  • qiimaha "Length Seq = 8" Waxay xaddidaysaa cabbirka kaydka kaas oo dhammaan hubinta lagu sameeyay. Sababtoo ah Anigu (ilaa hadda) weligay lama kulmin kheyraad aan dhammaanayn noloshayda.

5. Dejinta qabsatooyinka lagu tilmaamay qaybta hore

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

Waxa ugu muhiimsan halkan waa "Ficil = [Array]". Si la mid ah qaybta hore, waxaa jira go'an xaddidan oo la dhisay. Iyo suurtogalnimada in lagu xidho mabda' ahaan ma xaddidna (qor "Action.XXX" oo ha ka caajisin inaad u qorto qayb kale).
Gaar ahaan, ku celcelinta kelmadda qaabka la saxay waxa loo qaybiyaa laba qaybood: "Beddel qaabka sida halkaas lagu qeexay" ΠΈ "dib u qor" ("RetypeWord").

Halbeegyada soo hadhay waxa loo qoray "qaamuuska" ("maab" in golang) Ficil la siiyay, liiskoodu wuxuu ku xiran yahay waxa ku qoran "Ficil".

Dhowr fal oo kala duwan ayaa lagu sifeyn karaa hal meel (Qaybaha). Ama waad kala jiidan kartaa. Sida aan kor ku muujiyay.

Isla markiiba waxaan dejiyay ficilka "Exec" si aan u fuliyo qoraalka dibadda. Iyada oo ikhtiyaarka ah in lagu riixo kaydka duuban ee stdin.

  • "Sug = 1" - sug inta habka socodsiinta uu dhammaanayo.
  • Malaha, "tuulo" waxaad u baahan doontaa inaad dad dheeraad ah geliso deegaanka. macluumaadka sida magaca fasalka daaqada kaas oo laga soo dhexgalay.
    "Ma waxaad doonaysaa inaad ku xidho maamulahaaga? Tani waa meesha aad u baahan tahay inaad tagto."

Phew (la neefsaday). Waxay u egtahay inaanan waxba iloobin.

Haah! Haa, maan iloobin...
Aaway qaabaynta bilaabista? In koodka adag? Sidan oo kale:

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

Halkee ayaan ku ilaaway/ khaldamay? (Ma jiro jid la'aantiis), Runtii waxaan rajeynayaa in akhristayaasha fiirsada aysan aad uga caajisin inay sanka ka qabtaan.

nasiib wacan!

Source: www.habr.com

Add a comment