ProHoster > Blog > Pulega > Fa'atonu fa'atonu Xswitcher mo Linux: la'asaga lua
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.
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.