Kwa ena onse, mawuwo amachokera pa "key = value" (ndipo njira zingapo zovuta, monga = [zina, izo, mndandanda]) ndikuganiza mwachilengedwe yabwino.
Chosangalatsa ndichakuti "kuwotcha" nthawi yomweyo (mozungulira 2013). Kokha, mosiyana ndi ine, wolemba TOML adalowa mumlingo woyenera.
Chifukwa chake, tsopano ndizosavuta kwa ine kusintha kukhazikitsidwa kwake kuti zigwirizane ndi ine ndekha, osati mosemphanitsa.
Kawirikawiri, timatenga TOML (yofanana kwambiri ndi Windows INI yakale). Ndipo tili ndi kasinthidwe komwe timafotokozera momwe mungagwirizanitsire zingwe zotsatizana kutengera ma code aposachedwa kuchokera pa kiyibodi. M'munsimu, chidutswa ndi chidutswa, ndi zomwe zachitika mpaka pano. Ndipo kufotokoza chifukwa chake ndinaganiza motere.
0. Basic abstractions
Jambulani ma code. Chinachake chiyenera kuchitika pa izi, chifukwa manambala a digito sangawerengedwe ndi anthu (ndi ine ndekha. loloswitcher).
Ndinagwedeza "ecodes.go" kuchokera ku "golang-evdev" (ndinali waulesi kuti ndiyang'ane gwero loyambirira, ngakhale wolemba adaziwonetsa mwachikhalidwe). Ndinakonza pang'ono (pakadali pano) china chake chomwe chinali chowopsa. Monga "LEFTBRACE" β "L_BRACE".
[Templates] # "@name@" to simplify expressions
# Words can consist of these chars (regex)
"WORD" = "([0-9A-Z`;']|[LR]_BRACE|COMMA|DOT|SLASH|KP[0-9])"
Kodi liwu lachiyankhulo chamunthu lokhala ndi mawu ofotokozera limaphatikizapo chiyani? (mwina nkhani ya graphemes aka "hieroglyphs")? Mtundu wina wa "mapepala" oyipa. Chifukwa chake, nthawi yomweyo ndimayambitsa lingaliro la "template".
2. Zoyenera kuchita mukadindidwa china chake (kodi ya scan yafika)
[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"]
Pali ma code 768 onse. (Koma "ngati" ndidayikapo "zodabwitsa" mu code xswitcher).
M'katimo ndidalongosola kudzaza mndandandawo ndi maulalo ogwirira ntchito "zoyenera kuchita". Mu golang izi (mwadzidzi) Zinakhala zosavuta komanso zowonekeratu.
# 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"
Mizere ya tebuloyo ili m'mabulaketi aΕ΅iri masikweya awiri okhala ndi dzina lake. Sizikanakhala zophweka kuchokera pamleme. Kutengera ndi zenera lomwe likugwira ntchito pano, mutha kusankha izi:
4. Kudina kumodzi (kapena zingapo) kumayambitsa mbedza imodzi kapena ina
# 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)" ]
Njoka zimagawidwa m'mitundu iwiri. Omangidwa mkati, okhala ndi mayina odzifotokozera okha (NewWord, NewSentence, Compose) ndi okonzeka.
Mayina otha kukonzedwa amayamba ndi "Zochita." Chifukwa TOML v1.4, mayina okhala ndi madontho akuyenera kukhala m'mawu.
Gawo lirilonse liyenera kufotokozedwa pansipa ndi dzina lomwelo.
Kuti musawombere malingaliro a anthu ndi "maliseche" okhazikika (kuchokera ku zochitika, zawo kulembamwina mmodzi mwa khumi akatswiri), nthawi yomweyo ndimagwiritsa ntchito mawu owonjezera.
"ZOZIMA:" (kapena "ON:") pamaso regexp (mawu okhazikika) amafuna kuti mabatani otsatirawa atulutsidwe (kapena kukanikizidwa).
Kenako ndipanga mawu "opanda chilungamo" pafupipafupi. Ndi macheke osiyana a zidutswa pakati pa mapaipi "|". Kuti muchepetse kuchuluka kwa zolemba ngati "[LR]_SHIFT" (pomwe izi sizofunikira).
"SEQ:" Ngati chikhalidwe cham'mbuyomu chikakwaniritsidwa (kapena kulibe), ndiye kuti timayang'ana motsutsana ndi mawu akuti "zabwinobwino". Kuti mudziwe zambiri, ndimatumiza nthawi yomweyo ku ^W laibulale ya "regexp". Chifukwa sindinavutikebe kuti ndipeze kuchuluka kwa kugwirizana ndi pcre yomwe ndimakonda ("perl compatible").
Cheke nthawi zonse "yotsekemera" mpaka kumapeto kwa mndandanda, kotero palibe chifukwa chowonjezera "$" kumchira.
Macheke onse pamzere umodzi amachitidwa chimodzi ndi china ndipo amaphatikizidwa ndi "I". Koma popeza mtengowo ukufotokozedwa ngati gulu, mutha kulemba cheke china pambuyo pa koma. Ngati izi zikufunika pazifukwa zina.
5. Kukhazikitsa mbedza zomwe zafotokozedwa mu gawo lapitalo
# 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.
Chinthu chachikulu apa ndi "Zochita = [Zotsatira]". Mofanana ndi gawo lapitalo, pali zochepa zomwe zimapangidwira. Ndipo kuthekera kwa docking sikuli ndi malire (lembani "Action.XXX" ndipo musakhale aulesi kuti mulembe gawo lina).
Makamaka, kulembanso kwa mawu pamakonzedwe okonzedwa kumagawidwa m'magawo awiri: "Sinthani masanjidwe monga momwe zafotokozedwera pamenepo" ΠΈ "Lembaninso" ("RetypeWord").
Zotsalira zotsalira zalembedwa ku "dikishonale" ("mapu" mu golang) pakuchitapo kanthu, mndandanda wawo umadalira zomwe zalembedwa mu "Zochita".
Oops! Inde, sindinayiwala ...
Kodi masinthidwe otsegulira ali kuti? Mu hard code? Monga choncho:
[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.