เบเบฑเบโเบเบฑเปเบโเปเบเป
somehow เบกเบฑเบ turns เปเบซเป เปเบซเบฑเบ เบงเปเบฒ เปเบเบ เบเบฒเบ เบเบปเบ เบเบฐ เบเบด เปเบซเบฑเบ เบงเปเบฒ เบกเบฑเบ เบซเบเปเบฒ เปเบเบทเปเบญ incredibly เบเบฒเบ เบชเปเบฒเบ เบเบฑเปเบ เบเบฒเบ เบเบงเบ เบเบธเบก เบเบฑเบ เบซเบกเบปเบ เปเบซเบผเบปเปเบฒ เบเบตเป.
เปเบเบทเปเบญเบเปเปเปเบซเปเบเปเปเบกเบตเบเบทเปเบเบเบฒเบ, เบเบฒเบเปเบเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบชเบดเปเบเบเบตเปเบเปเบญเบเบเปเบฒเบฅเบฑเบเบเบฑเบเบเบฒเบเบเบฑเบ.
เปเบเบเบฅเบงเบก conceived เบเบตเปเบเบตเปเบฅเบตเบ (เปเบฅเบฐเบเบฐเบเบดเบเบฑเบเปเบเปเบเบต) Apache Kafka & ZooKeeper.
- เบเบฒเบเบเบฑเปเบเบเปเบฒ? เปเบเปเบกเบฑเบเบซเบเปเบฒเปเบเบทเปเบญ! Dumb xml (เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบกเบฑเบเปเบเบฑเบ "เบญเบญเบเบเบฒเบเบเปเบญเบ").
- เปเบญเปเบ, เปเบเบปเปเบฒเบเบฑเบเบเปเบญเบเบเบฒเบ ACL เบเป? เปเบเปเบกเบฑเบเบซเบเปเบฒเปเบเบทเปเบญเบซเบผเบฒเบ! Tap-blooper... เบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเปเบเบฑเปเบเบเบฑเปเบ.
เปเบเปเปเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบเบเปเบญเบเบกเบฑเบเบเบปเบเบเบฑเบเบเปเบฒเบกเปเบเปเป. เบชเบดเบ (เบญเบฐเบเบดเบเบฒ, เปเบเบทเบญเบเบเปเปเปเบเบตเบเปเบเบฑเบเปเบเบทเปเบญเบเบณเบญเบดเบ) เบฎเบนเบเปเบเบเบเบฒเบเบเปเปเบชเปเบฒเบเบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบชเบทเบเบเปเปเปเบเปเบขเปเบฒเบเบเปเบฒเบเบเบฒเบเปเบฅเบฐเบเปเบฒเบกเบฐเบเบฒเบ (เปเบเบทเบญเบโเบเบฑเบโเบซเบกเบปเบ) เบเบฐเบเบญเบเปเบเบเบงเบฒเบ.
เบเปเปเบเบปเบเบกเบฒเบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบปเบเบเบปเบเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบ Habre เบเปเบฝเบงเบเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบซเบเบฑเบเบเบญเบเบเบฑเบเบงเบดเบเบฐเบเบฒเบชเบฒเบเบเปเปเบกเบนเบ ...
เบกเบฑเบ turns เปเบซเปโเปเบซเบฑเบโเบงเปเบฒโเบเบฑเบโเบเบธโเบเบฑเบโเบเบตเปโเปเบกเปเบโเปเบเปโเบฎเบฑเบโเบฎเบนเปโเบขเปเบฒเบโเปเบเบฑเบกโเบเบตเปโเบชเปเบฒโเบฅเบฑเบโเปเบเบปเบฒโเปเบเบปเปเบฒโ. เปเบฅเบฐเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบเปเบญเบ, เบเปเบญเบเบงเปเบฒเบเบงเบเปเบเบปเบฒเปเบงเบปเปเบฒเบงเปเบฒ, "เบชเบฐเบเบฑเบเปเบชเบเบชเบฐเบซเบงเปเบฒเบ". เปเบเบเบเปเบฒเบฅเบญเบเบซเบผเบฒเบเบเบฐเบฅเบดเบกเบฒเบ, เปเบเบฃเปเบเบกเบกเบตเบฅเบฐเบเบนเบเบฒเบเบเบตเปเบกเบต OOP เบเปเบญเบก, เปเบฅเบฐเบญเบทเปเบเป. โ เบเบฑเบโเบซเบกเบปเบโเบเบตเปโเบเบฐโเบเบฒโเบเบปเบโเบเบถเปเบโเบเบฒเบโเบซเบผเบฑเบโเปเบโเปเบงโเบฅเบฒโเบเบตเป / เบเปเบฒโเบซเบฒเบโเบงเปเบฒโเบกเบฑเบโเบญเบญเบโ. เปเบเปเบเบนเปเบญเบญเบเปเบเบเบเปเบญเบเบเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเบเปเบญเบเปเบเบเปเบญเบเบซเบเบถเปเบเบขเบนเปเบเบตเปเบเบตเปเปเบฅเบฐเปเบเบเบฑเบเบเบธเบเบฑเบ.
เปเบเบฎเบญเบเบเบธเบ. เบเปเบญเบเปเบญเบปเบฒ TOML เปเบเบฑเบเบเบทเปเบเบเบฒเบ syntactic
เบเปเบญเบเบงเปเบฒ (TOML) เปเบเบเบฒเบเบเบปเบเบเบฑเบเบเปเบฒเบก, เบกเบฐเบเบธเบเบชเบฒเบกเบฒเบเปเบเปเปเบเปเบเป. เปเบเบเบฒเบเบเบปเบเบเบฑเบเบเปเบฒเบก, เบกเบฑเบเบเบทเบเปเบ 1: 1 เปเบเบปเปเบฒเปเบเปเบ syntaxes เบเบปเปเบงเปเบเบเบงเปเบฒ: XML, JSON, YAML.
เบเบดเปเบเปเบเบเบงเปเบฒเบเบฑเปเบ, เบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบตเปเบเปเบญเบเปเบเปเบเบฒเบ "github.com/BurntSushi/toml", เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเปเปเปเบกเปเบเบเบปเบเบญเบฑเบเปเบเบ: เบเบตเปเบชเบธเบ (เบเบฑเบ 1.4 syntax), เปเบกเปเบ syntactically เปเบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบ JSON เบเบฝเบงเบเบฑเบ ("เบชเปเบฒเบเปเบ").
เบเบฑเปเบเปเบกเปเบ, เบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบงเบปเปเบฒเบเปเบฒเบเปเบงเปเบฒ "เบเปเบฒเบเบเปเบฒเบเปเบงเบ TOML เบเบญเบเปเบเบปเปเบฒ, เบเปเบญเบเบเปเบญเบเบเบฒเบ XXX" เปเบฅเบฐ "เปเบเปเปเบ" เบฅเบฐเบซเบฑเบเบเบฝเบเปเบเปเปเบชเบฑเปเบเบเบฝเบง.
เบเบฑเปเบเบเบฑเปเบ, เบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบเบเบฝเบเบเบฒเบเบเปเบญเบเบขเปเบฝเบกเปเบเบทเปเบญ configure xswitcher (เบเปเบญเบโเบเปเปโเปเบเปโเปเบ) เบเปเปเบกเบตเบเบฑเบเบซเบฒเปเบเปเบเบตเปเบเบฒเบเบงเปเบฒเบเบฐ "เบเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบญเบฑเบเปเบซเบเบฎเปเบฒเบเบเบตเปเบเบญเบเปเบเบปเปเบฒ."
เบชเปเบฒเบฅเบฑเบเบเบปเบเบญเบทเปเบเบเบฑเบเบซเบกเบปเบ, syntax เปเบกเปเบเบญเบตเบเปเบชเป "key = value" (เปเบฅเบฐเบฎเบนเปเบซเบเบฑเบเบชเบทเบชเบญเบเบชเบฒเบกเบเบฒเบเปเบฅเบทเบญเบเบเบตเปเบชเบฑเบเบชเบปเบเบซเบผเบฒเบ, เปเบเบฑเปเบ = [เบเบฒเบเบญเบฑเบ, เบญเบฑเบเบเบฑเปเบ, เบญเบฒเปเบฃ]) เบเปเบญเบโเปเบเบปเบฒโเบงเปเบฒ
เบชเบฐเบเบงเบ intuitively.
เบชเบดเปเบเบเบตเปเบซเบเปเบฒเบชเบปเบเปเบเปเบกเปเบเบงเปเบฒ
เบเบฑเปเบเบเบฑเปเบ, เบเบญเบเบเบตเปเบกเบฑเบเบเปเบฒเบเบเบงเปเบฒเบชเปเบฒเบฅเบฑเบเบเปเบญเบเบเบตเปเบเบฐเบเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบกเบฑเบเปเบซเปเปเบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบเบเบปเบงเบเปเบญเบเปเบญเบ, เปเบฅเบฐเบเปเปเปเบกเปเบเปเบเบเบฒเบเบเบฑเบเบเบฑเบ.
เปเบเบเบเบปเปเบงเปเบ, เบเบงเบเปเบฎเบปเบฒเปเบญเบปเบฒ TOML (เบเปเบฒเบเบเบทเบเบฑเบเบเบฑเบ Windows INI เปเบเบปเปเบฒ). เปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบตเปเบเบงเบเปเบฎเบปเบฒเบญเบฐเบเบดเบเบฒเบเบงเบดเบเบตเบเบฒเบเบเบดเบเบเบธเบเบเบญเบ hook เบเบถเปเบเบเบฑเบเบเบธเบเบเบญเบเบฅเบฐเบซเบฑเบเบชเบฐเปเบเบเบซเบฅเปเบฒเบชเบธเบเบเบฒเบเปเบเปเบเบเบดเบก. เบเปเบฒเบเบฅเบธเปเบกเบเบตเป, เบชเบดเปเบเปเบเบเบชเบดเปเบ, เปเบกเปเบเบชเบดเปเบเบเบตเปเปเบเบตเบเบเบถเปเบเบกเบฒเปเบเบดเบเบเบญเบเบเบฑเปเบ. เปเบฅเบฐเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบงเปเบฒเปเบเบฑเบเบซเบเบฑเบเบเปเบญเบเบเบถเปเบเบเบฑเบเบชเบดเบเปเบเปเบเบเบเบตเป.
0. เบเบปเบเบเบฑเบเบซเบเปเปเบเบทเปเบเบเบฒเบ
- เบชเบฐเปเบเบเบฅเบฐเบซเบฑเบเบญเบญเบเปเบเบ. เบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเบเปเบญเบเปเบฎเบฑเบเบเปเบฝเบงเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเปเปเบเปเบเบญเบ, เปเบเบฒเบฐเบงเปเบฒเบเบฝเบเปเบเปเบฅเบฐเบซเบฑเบเบเบดเบเบดเบเบญเบเปเบกเปเบเบเปเปเบชเบฒเบกเบฒเบเบญเปเบฒเบเปเบเปเบเบญเบเบกเบฐเบเบธเบเบขเปเบฒเบเปเบเปเบเบดเบ (เบเบฑเปเบเปเบกเปเบเบเปเบญเบเปเบเบปเปเบฒเบเบฑเปเบ.
loloswitcher ).
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบชเบฑเปเบ "ecodes.go" เบเบฒเบ "golang-evdev" (เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบตเปเบเบฝเบเปเบเบตเบเปเบเบเบตเปเบเบฐเปเบเบดเปเบเปเบซเบผเปเบเบเบปเปเบเบชเบฐเบเบฑเบ, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเบนเปเบเบฝเบเบเบตเปเปเบซเปเปเบซเบฑเบเบกเบฑเบเบเปเบญเบเบเปเบฒเบเบงเบฑเบเบเบฐเบเบฐเบเปเบฒ). เปเบฅเบฑเบเบเปเบญเบ (เบชเปเบฒเบฅเบฑเบเปเบเบเบฑเบเบเบธเบเบฑเบ) เปเบเปเปเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเบซเบเปเบฒเบขเปเบฒเบเบเบปเบงเบซเบผเบฒเบ. เบกเบฑเบ โLEFTBRACEโ โ โL_BRACEโ. - เบเบญเบเบเบฒเบเบเบฑเปเบ, เบฅเบฒเบงเปเบเปเปเบเบฐเบเปเบฒเปเบเบงเบเบงเบฒเบกเบเบดเบเบเบญเบ "เบเบฐเปเบเบเบญเบเบฅเบฑเบ". เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเปเบงเบเบฒเบเบญเบเบเบปเบเบเบฐเบเบดเบเบตเปเปเบเปเบเปเปเปเบเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเบชเปเบฒเบฅเบฑเบ passages เบเบฒเบง. (เปเบเปโเบงเปเบฒโเบกเบฑเบโเบญเบฐโเบเบธโเบเบฒเบโเปเบซเปโเบเปเบฒเบโเบชเบฒโเบกเบฒเบโเบเบงเบโเบชเบญเบโเบเบตเปโเบกเบตโเบเปเบฒโเปเบเปโเบเปเบฒเบโเบซเบเปเบญเบโเบเบตเปโเบชเบธเบโ. เบเปเบฒโเบซเบฒเบโเบงเปเบฒโเบเปเบฒเบโเปเบเปโเบเบฝเบโเปเบเปโเบเบฒเบโเบเบฑเบโเบเบถเบ "เบเบปเบโ"โ.
- เบเบฐเบกเบตเบเบปเบงเบชเปเบฒเบ "เบเบปเบงเบซเบเปเป" เบเบญเบเบชเบดเปเบเบเบตเปเบเบทเบเบเบปเบเบเบฑเบ. เบเบฑเปเบเบเบฑเปเบ, เบฅเบฑเบ "repeat"=2 เบเบฐเบเบทเบเบเบฝเบ ะพะดะธะฝ เบเบตเปเปเบเปเปเบงเบฅเบฒ.
1. เบเบฒเบเบชเปเบงเบเปเบกเปเปเบเบ
[Templates] # "@name@" to simplify expressions
# Words can consist of these chars (regex)
"WORD" = "([0-9A-Z`;']|[LR]_BRACE|COMMA|DOT|SLASH|KP[0-9])"
เบเบณเบชเบฑเบเบเบฒเบชเบฒเบกเบฐเบเบธเบเบเบตเปเบกเบตเบเบปเบงเปเบฒเบเบญเบญเบเบชเบฝเบเบเบฐเบเบญเบเบเปเบงเบเบซเบเบฑเบ? (เบเปเปเบงเปเบฒเบเบฐเปเบเบฑเบ graphemes aka "hieroglyphs")? เบเบฒเบเบเบฐเปเบเบเบเบญเบ "เปเบเปเบ". เปเบเบฒเบฐเบชเบฐเบเบฑเปเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเบฐเบเปเบฒเปเบเบงเบเบงเบฒเบกเบเบดเบเบเบญเบ "เปเบกเปเปเบเบ".
2. เบเบฐโเปเบฎเบฑเบโเปเบเบงโเปเบโเปเบโเปเบงโเบฅเบฒโเบเบตเปโเบกเบตโเบเบฒเบโเบชเบดเปเบโเบเบฒเบโเบขเปเบฒเบโเบเบทเบโเบเบฅเบดเบ (เบฅเบฐโเบซเบฑเบ 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"]
เบกเบตเบเบฑเบเปเบปเบ 768 เบฅเบฐเบซเบฑเบ. (เปเบเป "เปเบเบเปเบฅเบฐเบเบต" เบเปเบญเบเปเบเปเปเบชเป "เบเบงเบฒเบกเปเบเบเปเบ" เปเบเบปเปเบฒเปเบเปเบเบฅเบฐเบซเบฑเบ xswitcher).
เบเบฒเบเปเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบญเบฐเบเบดเบเบฒเบเบเบฒเบเบเบทเปเบก array เบเปเบงเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเบซเบเปเบฒเบเบตเป "เบชเบดเปเบเบเบตเปเบเปเบญเบเปเบฎเบฑเบ". เปเบ golang เบเบตเปเปเบกเปเบ (เบขเปเบฒเบเบเบฐเบเบฑเบเบซเบฑเบ) เบกเบฑเบโเปเบเปโเบเบฒเบโเปเบเบฑเบโเบชเบฐโเบเบงเบโเปเบฅเบฐโเบเบฐโเปเบเปเบโ.
- เบเปเบญเบเบงเบฒเบเปเบเบเบเบตเปเบเบฐเบซเบผเบธเบ "เบซเบผเบธเบเบฅเบปเบ" เบขเบนเปเปเบเบเปเบฒเปเบชเบธเบเบเบตเปเบขเบนเปเปเบเบชเบฐเบเบฒเบเบเบตเปเบเบตเป. เปเบเบเบงเบฒเบกเปเบเบเบเบฒเบเบเบญเบเบเบฒเบเบเบธเบเปเบเปเบเบเบตเปเบกเบตเบเบงเบฒเบกเบเบทเบเบซเบเบธเปเบเบซเบผเบฒเบ (เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเบเปเบฒเบเบฅเบธเปเบกเบเบตเป).
3. เบเบฒเบเบฐเบฅเบฒเบเบเบตเปเบกเบตเบซเปเบญเบเบฎเบฝเบเบเปเบญเบเบขเปเบฝเบก
# 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"
เปเบเบงเบเบญเบเบเบฒเบเบฐเบฅเบฒเบเบขเบนเปเปเบเบงเบปเบเปเบฅเบฑเบเบชเบญเบเปเบเบปเปเบฒเบเบตเปเบกเบตเบเบทเปเบเบญเบเบกเบฑเบ. เบกเบฑเบโเบเปเปโเบชเบฒโเบกเบฒเบโเปเบเปโเบฎเบฑเบโเบเบฒเบโเบเปเบฒเบโเบเบถเปเบโเบญเบญเบโเบเบฒเบ bat เปเบเปโ. เบญเบตเบเบเบฒเบกเบเปเบญเบเบขเปเบฝเบกเบเบตเปเปเบเบตเบเปเบเปเปเบเบเบฑเบเบเบธเบเบฑเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฅเบทเบญเบเบเบปเบงเปเบฅเบทเบญเบเบเปเปเปเบเบเบตเป:
- เบเบธเบเบเบญเบเบเปเบฒเบเปเบญเบเบเบญเบ "เบเบฐเปเบเบฎเปเบญเบ" "เบเบฒเบเบเบฐเบเปเบฒ = ... ". เบเปเบฒเบเปเป / เบซเบงเปเบฒเบ, เบเปเปเปเบฎเบฑเบเบซเบเบฑเบ.
- เบเปเบฝเบ โMouseClickDropsโ - เบชเบดเปเบเบเบตเปเบเปเบญเบเปเบฎเบฑเบเปเบกเบทเปเบญเบเบงเบเบเบปเบเบเบฒเบเบเบฅเบดเบเปเบกเบปเปเบฒ. เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบขเบนเปเปเบเบเบธเบเบเบตเป xswitcher เบเบทเบเปเบเบตเบเปเบเป, เบเปเปเบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเปเบฝเบงเบเบฑเบ "เบเปเบญเบเบเบตเปเบเบงเบเปเบเบปเบฒเบเบฅเบดเบ", เบเบงเบเปเบฎเบปเบฒเบเบฑเปเบเบเปเบฒ buffer เปเบซเบกเปเบเบฒเบกเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ. เปเบเปเปเบ terminals (เบเบปเบงเบขเปเบฒเบ) เบเปเบฒเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบฎเบฑเบเปเบเบงเบเบตเป (เบเบปเบเบเบฐเบเบด).
4. เบฅเปเบฒเบเบฑเบเบซเบเบถเปเบ (เบซเบผเบทเบซเบผเบฒเบ) เบเบญเบเบเบฒเบเบเบฅเบดเบเบเบปเบเบเบฐเบเบปเบเบเปเปเบซเบเบถเปเบเบซเบผเบท hook เบญเบทเปเบ
# 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 เปเบเปเบเบญเบญเบเปเบเบฑเบเบชเบญเบเบเบฐเปเบเบ. Built-in, เบกเบตเบเบทเป "เปเบงเบปเปเบฒ" (NewWord, NewSentence, Compose) เปเบฅเบฐเบชเบฒเบกเบฒเบเบเบฑเปเบเปเบเบเบเบฒเบเปเบเป.
เบเบทเปเปเบเบเบเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบ "เบเบฒเบเบเบฐเบเบดเบเบฑเบ." เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ TOML v1.4, เบเบทเปเบเบตเปเบกเบตเบเบธเบเบเปเบญเบเบขเบนเปเปเบเบงเบปเบเบขเบทเบก.
เปเบเปเบฅเบฐเบเบฒเบเบเบงเบเบเบฐเบเบทเบเบญเบฐเบเบดเบเบฒเบเบเปเบฒเบเบฅเบธเปเบกเบเบตเป เบเบตเปเบกเบตเบเบทเปเบเบฝเบงเบเบฑเบ.
เปเบเบเปเบฒเบชเบฑเปเบเบเบตเปเบเบฐเบเปเปเปเบฎเบฑเบเปเบซเปเบเบดเบเปเบเบเบญเบเบเบฐเบเบฒเบเบปเบเบเบฑเบ "naked" เบเบปเบเบเบฐเบเบด (เบเบฒเบเบเบฐเบชเบปเบเบเบฒเบ, เบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒ to writeเบเบฒเบเบเบตเบซเบเบถเปเบเปเบเบชเบดเบ เบเบนเปเบเปเบฝเบงเบเบฒเบ), เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฑเบเบเบตเบเบฐเบเบดเบเบฑเบ syntax เปเบเบตเปเบกเปเบเบตเบก.
- "เบเบดเบ:" (เบซเบผเบท "เปเบเบตเบ:") เบเปเบญเบ regexp (เบเบฒเบเบชเบฐเปเบเบเบญเบญเบเบเบปเบเบเบฐเบเบด) เบฎเบฝเบเบฎเปเบญเบเปเบซเปเบเบธเปเบกเบเปเปเปเบเบเบตเปเบเบทเบเบเปเบญเบเบญเบญเบเบกเบฒ (เบซเบผเบทเบเบปเบ).
เบเปเปเปเบเบเปเบญเบเบเบฐเปเบฎเบฑเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบเปเบเบฑเบเบเบปเบเบเบฐเบเบด "เบเปเปเบเบธเบเบเบดเบเปเบฒ". เบกเบตเบเบฒเบเบเบงเบเบชเบญเบเปเบเบเบเปเบฒเบเบซเบฒเบเบเบญเบเบเปเบญเบเบฅเบฐเบซเบงเปเบฒเบเบเปเป "|". เปเบเบทเปเบญเบซเบผเบธเบเบเปเบญเบเบเปเบฒเบเบงเบเบเบฑเบเบเบถเบเปเบเบฑเปเบ "[LR]_SHIFT" (เบเปเบญเบเบเบตเปเบญเบฑเบเบเบตเปเปเบกเปเบเบเปเปเบเปเบฒเปเบเบฑเบเบขเปเบฒเบเบเบฑเบเปเบเบ). - "SEQ:" เบเปเบฒเปเบเบทเปเบญเบเปเบเบเบตเปเบเปเบฒเบเบกเบฒเปเบกเปเบเบเบฑเบเบฅเบธเปเบเป (เบซเบผเบทเบเปเปเบกเบต), เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบเบงเบเปเบเบดเปเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบเบเบปเบเบเบฐเบเบด "เบเบปเบเบเบฐเบเบด". เบชเปเบฒเบฅเบฑเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ, เบเปเบญเบเบชเบปเปเบเปเบเบเบตเป ^W เบซเปเบญเบเบชเบฐเปเบธเบ โregexpโ เบเบฑเบเบเบต. เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฑเบเบเปเปเบเบฑเบเปเบเป bothered เปเบเบทเปเบญเบเบญเบเบซเบฒเบฅเบฐเบเบฑเบเบเบญเบเบเบงเบฒเบกเปเบเบปเปเบฒเบเบฑเบเปเบเปเบเบฑเบ pcre favorite เบเบญเบเบเปเบฒเบเบฐเปเบเบปเปเบฒ ("perl compatible").
- เบเบฒเบเบชเบฐเปเบเบเบญเบญเบเปเบกเปเบเบเบฝเบเปเบเบฎเบนเบเปเบเบ "BUTTON_1: CODE1, BUTTON_2: CODE2" เปเบฅเบฐเบญเบทเปเบเป, เปเบเบเปเบฒเบชเบฑเปเบเบเบตเปเปเบเปเบฎเบฑเบเบฅเบฐเบซเบฑเบเบชเบฐเปเบเบ.
- เบเบฒเบเบเบงเบเบชเบญเบเปเบกเปเบเบชเบฐเปเบซเบกเบต "snuged" เปเบเบเบญเบเบเปเบฒเบเบเบญเบเบฅเปเบฒเบเบฑเบ, เบเบฑเปเบเบเบฑเปเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบก "$" เปเบชเปเบซเบฒเบ.
- เบเบฒเบเบเบงเบเบชเบญเบเบเบฑเบเบซเบกเบปเบเปเบเบซเบเบถเปเบเปเบชเบฑเปเบเปเบกเปเบเบเบฐเบเบดเบเบฑเบเบซเบเบถเปเบเบซเบผเบฑเบเบเบฒเบเบเบตเปเบญเบทเปเบ เปเบฅเบฐเบเบทเบเบฅเบงเบกเปเบเบปเปเบฒเบเบฑเบเปเบเบ "เบเปเบญเบ". เปเบเปเปเบเบทเปเบญเบเบเบฒเบเบเปเบฒเบเบทเบเบญเบฐเบเบดเบเบฒเบเปเบเบฑเบ array, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฝเบเบเบฒเบเบเบงเบเบชเบญเบเบเบฒเบเปเบฅเบทเบญเบเบซเบผเบฑเบเบเบฒเบเปเบเบทเปเบญเบเปเบฒเบเบเบธเบ. เบเปเบฒเบเบตเปเปเบเบฑเบเบชเบดเปเบเบเปเบฒเปเบเบฑเบเบชเปเบฒเบฅเบฑเบเปเบซเบเบเบปเบเบเบฒเบเบขเปเบฒเบ.
- เบกเบนเบเบเปเบฒ "SeqLength = 8" เบเปเบฒโเบเบฑเบโเบเบฐโเบซเบเบฒเบโเบเบญเบ buffer เบเบตเปโเบเบฒเบโเบเบงเบโเบชเบญเบโเบเบฑเบโเบซเบกเบปเบโเปเบกเปเบโเปเบเปโเบฎเบฑเบโเบเบฒเบโเบเบฐโเบเบดโเบเบฑเบโ. เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ เบเปเบญเบเบกเบต (เบเบปเบเบเปเบงเบฒเปเบเบเบฑเบเบเบธเบเบฑเบ) เบเปเปเปเบเบตเบเบเบปเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบตเปเบเปเปเบกเบตเบเบตเปเบชเบดเปเบเบชเบธเบเปเบเบเบตเบงเบดเบเบเบญเบเบเปเบญเบ.
5. เบเบฒเบเบเบฑเปเบเบเปเบฒ hooks เบญเบฐเบเบดเบเบฒเบเปเบเบเบฒเบเบเบตเปเบเปเบฒเบเบกเบฒ
# 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.
เบชเบดเปเบเบเบตเปเบชเปเบฒเบเบฑเบเบขเบนเปเบเบตเปเบเบตเปเปเบกเปเบ "เบเบฒเบเบเบฐเบเบดเบเบฑเบ = [เบญเบฒเปเบฃ]". เบเปเบฒเบเบเบทเบเบฑเบเบเบฑเบเบเบฒเบเบเบตเปเบเปเบฒเบเบกเบฒ, เบกเบตเบเบฒเบเบเปเบฒเบเบฑเบเบเบญเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเปเปเบชเปเบฒเบเปเบ. เปเบฅเบฐเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเปเบเบญเบ docking เปเบกเปเบเบเปเปเบเปเบฒเบเบฑเบเปเบเบซเบผเบฑเบเบเบฒเบ (เบเบฝเบ โAction.XXXโ เปเบฅเบฐเบขเปเบฒเบเบตเปเบเปเบฒเบเปเบเบตเบเปเบเบเบตเปเบเบฐเบเบฝเบเบเบฒเบเบญเบทเปเบเปเบซเปเบกเบฑเบ).
เปเบเบเบชเบฐเปเบเบฒเบฐ, เบเบฒเบเบเบดเบกเบเบทเบเบเบญเบเบเปเบฒเบเบตเปเบขเบนเปเปเบเบฎเบนเบเปเบเบเบเบตเปเบเบทเบเปเบเปเปเบเปเบกเปเบเปเบเปเบเบญเบญเบเปเบเบฑเบเบชเบญเบเบชเปเบงเบ: "เบเปเบฝเบเบฎเบนเบเปเบเบเบเบฒเบกเบเบตเปเบฅเบฐเบเบธเปเบงเป" ะธ "เบเบดเบกเปเบซเบกเป" ("RetypeWord").
เบเบปเบงเบเปเบฒเบเบปเบเบเบฒเบเบเบตเปเบเบฑเบเปเบซเบผเบทเบญเปเบกเปเบเบเบฝเบเปเบชเป "เบงเบฑเบเบเบฐเบเบฒเบเบธเบเบปเบก" ("เปเบเบเบเบตเป" เปเบ golang) เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบซเบเบถเปเบ, เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบกเปเบเบเบถเปเบเบเบฑเบเบชเบดเปเบเบเบตเปเบเบฝเบเปเบงเปเปเบ "เบเบฒเบเบเบฐเบเปเบฒ".
เบเบฒเบเบเบฐเบเบณเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบซเบผเบฒเบเบญเบฑเบเบชเบฒเบกเบฒเบเบเบทเบเบญเบฐเบเบดเบเบฒเบเปเบงเปเปเบเปเบถเปเบ heap (เบเบฒเบเบชเปเบงเบ). เบซเบผเบทเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบถเบเบกเบฑเบเบญเบญเบเบเบฒเบเบเบฑเบ. เบเบฑเปเบเบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเบเปเบฒเบเปเบเบดเบ.
เบเปเบญเบเบเบฑเปเบเบเบฒเบเบเบฐ เบเบณ "Exec" เบเบฑเบเบเบตเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบชเบฐเบเบดเบเบเบฒเบเบเบญเบ. เบเปเบงเบเบเบฒเบเปเบฅเบทเบญเบเบเบตเปเบเบฐเบเบนเป buffer เบเบตเปเบเบฑเบเบเบถเบเปเบงเปเปเบเบปเปเบฒเปเบเปเบ stdin.
- โเบฅเปเบเปเบฒ = 1โ โ เบฅเปเบเปเบฒเปเบซเปเบเบฐเบเบงเบเบเบฒเบเปเบฅเปเบเบชเบณเปเบฅเบฑเบ.
- เบญเบฒเบเบเบฐ, "เปเบ heap" เปเบเบปเปเบฒเบเบฐเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเปเบฎเบฑเบเปเบซเปเบเบปเบเปเบเบตเปเบกเปเบเบตเบกเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก. เบเปเปโเบกเบนเบโเปเบเบฑเปเบโเบเบทเปโเบเบญเบโเบซเปเบญเบโเบเปเบญเบโเบขเปเบฝเบกโเบเบฒเบโเบเบตเปโเบกเบฑเบโเปเบเปโเบเบทเบโเบชเบฐโเบเบฑเบโ.
โเบเปเบฒเบเบเปเบญเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบปเบงเบเบฑเบเบเบฒเบเบเบญเบเปเบเบปเปเบฒเบเป? เบเบตเปเปเบกเปเบเบเปเบญเบเบเบตเปเปเบเบปเปเบฒเบเปเบญเบเปเบ.โ
Phew (exhaled). เปเบเบดเปเบเบเบทเบงเปเบฒเบเปเบญเบเบเปเปเปเบเปเบฅเบทเบกเบซเบเบฑเบเปเบฅเบตเบ.
เบญเบธเบ! เปเบกเปเบเปเบฅเปเบง, เบเปเบญเบเบเปเปเปเบเปเบฅเบทเบก ...
เบเบฒเบเบเบฑเปเบเบเปเบฒเบเบฒเบเปเบเบตเบเบเบปเบงเบขเบนเปเปเบช? เปเบเบฅเบฐเบซเบฑเบเบเบฒเบ? เปเบเบฑเปเบเบงเปเบฒ:
[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.
เบเปเบญเบเบฅเบทเบก/เปเบฎเบฑเบเบเบดเบเบขเบนเปเปเบช? (เบเปเปเบกเบตเบเบฒเบเบเบตเป), เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเบซเบงเบฑเบโเบงเปเบฒโเบเบนเปโเบญเปเบฒเบโเบเบตเปโเปเบญเบปเบฒโเปเบโเปเบชเปโเบเบฐโเบเปเป lazy เปเบเบตเบโเปเบโเปเบเบทเปเบญ pooke เบเบฑเบโเบเบญเบโเปเบเบปเบฒโเปเบเบปเปเบฒโ.
เปเบเบเบเบต!
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com