α
αΆααααΆααααΈ
ααΆααααααΆα’αααααααααααααα·ααΈααααααΆαααααΆααΆαα½αα±αααα»ααα·ααα½αα±ααααΏαααα»αααΆαααα‘αΎαααΆααααααααααααΆααα’αααααα
ααΎααααΈβαα·αβα±ααβααΆαβααΌαααααΆαβαα
βαααα»αβααΊβααΆβα§ααΆα αααβααβα’αααΈβαααβαααα»αβαααα»αβαααααααΆαβααΆαα½αβα
ααα»αααααΆααααααΎαααΆααααΆαααα’ (αα·αα’αα»ααααααΆααααΆαααα’) Apache Kafka & ZooKeeper α
- ααΆααααααβαα
ααΆαααααααα? ααβαα»α! xml ααααα (αααααααΆ "α
ααααΈαααα’αα") α
- α’αΌααΎα’αααα
ααααΆα ACL ααααα? ααβαα»αβααΆαα! Tap-blooper... α’αααΈαα½αααΌα
αααα
ααα»ααααβαα βαααα»αβααΆαααΆαβααααβαααα»αβααΊβαααα»αβααΈβαααα ααααΌαα αΎαα (α’αΆα‘αΆ ααααΎααααα·ααααααΎαααΈαα½α) ααααΌαααααΆαααΆααααα’αα»ααααΆαα±ααα’αααααααααΆααααααΆααααα½α αα·αααααααΆαα· (ααααΎααα) αααααΌααααα»αααααΆααααΆαα
ααααΈαααααααα»αααΆααα½αα’ααααααα½ααα
ααΎ Habre α’αααΈααΆααα·αααααααΉααααααααααα’ααααα·ααααΆααΆααααααα·αααααα ...
ααΆααααααΆααααααααααΌαααΆαααΉααααΆααααααααααααΆαααα½αααα α αΎααα
αααα»αααΆαα’αα»αααααααααααα»α ααΌα
ααααα½ααααα·ααΆαααΆ "αααααααααΊ" α αααΌααααα α»ααα·ααΆα α’αααααααααααααα·ααΈααΆααααΌαααΆαααΆαα½α OOP αα
ααααα½α
ααΆααααα - ααΆααα’αααααααΉααααα αΆααα
αααααααααα
αααααα/ααααα·αααΎααΆαααα ααα»ααααα’ααααα
ααΆααααΌαα
αΆααααααΎααα
ααααααααΆαα½ααα
ααΈααα αα·αα₯α‘αΌααααα
ααΆααααα
ααα»α
α αααα»αααΆααα TOML ααΆααΌαααααΆαααΆααααααααααα
αααααβααΆαα (TOML) αα
ααΎαααα½α, ααα»αααα’αΆα
ααααααα½αααΆαα αααααΆααα·ααααααΆααααΌαααΆααααααα 1: 1 αα
ααΆααΆαααααααααααααΌαα
ααααααααα XML, JSON, YAML α
ααΎαααΈααααα
ααα ααΆαα’αα»ααααααααααα»αααΆαααααΎααΈ βgithub.com/BurntSushi/tomlβ αααααΈααΆαα·ααααααΆαααΌαααΆαααααααααα»α (αα
αα 1.4 ααΆααααααααααα) ααΊααααΌαααααΆααΉαααΆαααααααααααααΆαα½α JSON ααΌα
ααααΆ ("ααααΆααααααΆαα½α")α
αααααΊααααα·αααΎα’αααα αα α’αααα’αΆα αα·ααΆααααΆαααΆααααααΆ "ααααααΆααααααααΆαα½α TOML ααααα’ααα αααα»αα αα XXX" αα·α "αααα" ααΌααααααααΆαααααα½ααααααΆααα
ααΌα ααααααααα·αααΎα’αααα ααααααα windows αα½αα ααα½αααΎααααΈααααααα ααΆαααααααα xswitcher (αααα»αβαα·αβααααΆααβαα) ααααΆααααα αΆααααΌαααΆαααααΉααα»α "ααΆαα½αααΉαααΆααααααααα’αΆααααααααααααα’ααα" α
αααααΆααα’ααααααααααα ααΆαααααααααααααΊααα’ααααΎ "αααααΉα = ααααα" (αα·αααΆααααααααααααααΎααααα»αααααααΆααα½αα
ααα½αααα ααΌα
ααΆ = [αα½αα
ααα½α ααα α’αΆαα]) αααα»αβααΆα
ααΆααααα½αααααα·α
αΆααααΆαα
α’αααΈααααα½αα±ααα
αΆααα’αΆαααααααααααΊααΆ
ααΌα ααααα αΎα α₯α‘αΌαααα ααΆααΆααααααΆααααα½ααααααΆαααααα»ααααα»αααΆαααααααα½αααΆαα’αα»ααααααααααΆα±ααααααΉααααα½ααααα»α αα·αααααααα»ααααα·αααα
ααΆααΌαα ααΎααα TOML (ααααααααΉα Windows INI α αΆαα)α α αΎαβααΎαβααΆαβααΆαβαααααβαα ααΆααααααααβαα½αβαααβααΎαβαα·αααααΆβα’αααΈβααααβααααΆααβαααααβααΆβαααααααααΆααβα’αΆαααααβααΎβαααα»αβααΌαβαααααβα α»ααααααβαααα»αβααΈβααααΆαα α»α α ααΆααααααααα ααΆαα»αα ααΊααΆα’αααΈαααααΆαααΎαα‘αΎααα αΌααααααααααααα αα·αααΆαααααααα’αααΈααΌαα ααα»ααααααα»ααααααα α α·αααααααααα
0. α’ααΌααΈααΌαααααΆα
- αααααβααΆαβαα
ααΆβααΌαα α’αααΈβαα½αβα
αααΆααβααΆβααααΌαβααααΎβα’αααΈβαααα αΆβααα αααααβααΌαβααΈααΈααβααΊβαα·αβα’αΆα
βα’αΆαβααΆαβαααβααα»αααβαα (αααβααΊβααΆβαααα»αβααβααα»ααααα
loloswitcher ).
αααα»αααΆαα’αααα½α "ecodes.go" α ααααΈ "golang-evdev" (αααα»ααααα·αααααααα»αααΆαααΎααααααααΎα ααΎαααααΈααΆα’ααααα·ααααααΆαα ααα’α»ααααα αΆαααΆααΆαααααααααααα)α αααα»αααΆααααααααΌαααααα·α ααααα½α (αααααΆαααααααα) α’αααΈαα½αααααα½αα±ααααααΆα ααΆααα ααΌα ααΆ βLEFTBRACEβ β βL_BRACEβ α - ααΎαααΈααααααααΆααααΆαααααΆααααα·ααα "ααΌααααααα" α α αΆααααΆααααΈααααααΆααααααααααΆαααααααΎαα·αα’αα»ααααΆαα±ααααΆααααααααα (ααα»ααααααΆα’αα»ααααΆαα±ααα’ααααααα½ααα·αα·ααααααα αααΆααα·α αααα»αα ααααα·αααΎα’αααααααΎααααΆααα "αααααααΆαα"α)
- ααΆααΉαααΆα "α§αααααα αααα" αααααααΆααααααΆαα½αααΌαα’αααΈαααααααΌαααΆαα α»α α ααΌα αααα ααααΆαααΆα "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. α’αααΈαααααααΌαααααΎαα ααααααααΆαα’αααΈαα½αααααΌαααΆαα α»α (αααααΌαααααααα½αααααααααααΆαααααα)
[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) α
αα
ααΆααααα»ααααα»αααΆααα·αααααΆα’αααΈααΆααααααα’αΆααααΆαα½αααΉααααααααΆαααα
αα»αααΆα "α’αααΈαααααααΌαααααΎ" α αα
αααα»α 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"
αα½αβααΆααΆαβααΊβααΆβααααααβααΆαααβααΈαβαααβααΆαβαααααβααααααΆα ααΆβαα·αβα’αΆα βαααα½αβααΆαβαα»αβαα βαααβαααβααααβαααβααα α’αΆαααααβααΎβαααα’α½α βαααααβαα αα α»αααααα α’αααβα’αΆα βααααΎαβαααααΎαβααΌα βααΆαβαααααα
- αααα»α "ααααΆααα α»α αααα " ααααΆαααααα½αααααα’ααα "αααααααΆα = ... "α ααΎαα·α/ααα αα·αααααΎα’αααΈααα
- ααααΌα "MouseClickDrops" - α’αααΈαααααααΌαααααΎαα αααααΆαα α»α ααααα»αααααΌαααΆαααααΎαα αααααΆααα α ααα»α ααα xswitcher ααααΌαααΆαααΎα αα·αααΆαααααααΆααααα’α·αα’αααΈ "ααααααααααα½αααα α»α " ααΎααααααααα·ααααααα’αΆααααα‘αΎααα·αααΆαααααΆαααΎαα ααα»αααααα αααα»αααααΆααΈα (α§ααΆα ααα) α’ααααα·αα αΆαααΆα αααααΎααααααααα (ααΆααααααΆ).
4. ααααΆαααα½α (α¬α αααΎα) ααααΆαα α»α ααααα½α α¬αααααααααααααα
# 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)" ]
αααααααααΌαααΆααααα ααααΆααΈαααααααα ααααΆααααααΆαα½αααααα "αα·ααΆα" (ααΆαααααααΈ ααααααααααΈ ααα) αα·αα’αΆα ααααααααααα·ααΈααΆαα
ααααααααααα·ααΈα αΆααααααΎαααα "αααααααΆα" α αααααΆααα TOML v1.4 ααααααααααΆαα ααα»α ααααΌαααααΆααα αααα»αααααααα
αααααααΈαα½αααα½αααααααΌαααΆααα·αααααΆααΆαααααα ααΆαα½αααΉααααααααΌα ααααΆα.
ααΎααααΈβαα»αβα²ααβαααα·αβααααβααα»αααβααΆα βα’αΆααααΆαβ ααααααΆ (ααΆαβαααα·αααααβααααβαα½αβαα ααΎααααΈααααααααα ααααΆαα½ααααα»αα ααααααα α’αααααααΆα) αααα»αα’αα»ααααααΆαααααααααααααααααααααΆααα
- "αα·αα" (α¬ "ααΎαα") αα»αααα regexp (ααααααααααααΆ) αααααΌαα±αααααΌαα»αααΆααααααααααΌαααΆαα
ααααααΆα (α¬α
α»α
) α
αααααΆαααααα»αααΉαααααΎααΆααααα ααααα·ααααααΆ "α’αα»αααα·ααα" α ααΆαα½αααΉαααΆααααα½ααα·αα·αααααΆα ααααα‘ααααααααααααΆαααααα "|" α ααΎααααΈααΆαααααααα ααα½ααααααααααΆααΌα ααΆ "[LR]_SHIFT" (αααααΆα αααΆααααΆαααα·αα αΆαααΆα α)α - "SEQ:" ααααα·αααΎαααααααααα»αααααΌαααΆαααααα (α¬α’ααααααΆα) αααααΎααα·αα·ααααααααΆααααΉαααααααααααααΆ "ααααααΆ" α αααααΆααααααααΆααααα’α·α αααα»αααααΎαα ααΆαα ^W αααααΆααα βregexpβ ααααΆααα αααααΆααααααα»ααα αααα·αααααααααα»αααΆααααααααααααα·αααααΆαααααααΆααΆαα½α pcre ααααααα»αα αΌαα α·ααα ("perl compatible")α
- ααααααααααΌαααΆααααααααΆαααααα "BUTTON_1: CODE1, BUTTON_2: CODE2" αα , αα αααα»αααααΆααααααααααΌααααααααααΌαααΆαααα½αα
- ααΌααααααΆααααααααααα "ααΆαα" αα αΌααααα α»ααααα ααααααααΆααααΌα αααααα·αα αΆαααΆα ααααααα "$" αα ααααα»αααα
- ααΆααααα½ααα·αα·αααααΆααα’αααα αααα»ααααααΆαααα½αααααΌαααΆαα’αα»αααααα½ααααααΆααααΈαα½ααααααααα α αΎαααααΌαααΆαααααααα "αααα»α" α ααα»ααααβαααααΆαβαααααβααααΌαβααΆαβαα·αααααΆβααΆβα’αΆααβαα½α α’αααβα’αΆα βαααααβααΆαβαα·αα·αααβαααα½αβαααααΆααβααΈβαααααΆαααααα ααααα·αααΎαααααααΌαααΆααααααΆααα ααα»αααα½αα ααα½αα
- ααααα "SeqLength = 8" αααααααα αααααα·ααααααα’αΆαααα αααααΆααααα½ααα·αα·αααααΆααα’ααααααΌαααΆαα’αα»ααααα αααααΆααα αααα»αααΆα (αα αΌαααααααααααα) αα·αααααα½ααααααααααΆααα·αα ααα αααααα»αααΈαα·ααααααααα»αααα
5. ααΆααααααααααααααααΆααα·αααααΆαα αααα»αααααααα»αα
# 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.
ααΏαααααΆαααα
ααΈαααααΊ "αααααααΆα = [α’αΆαα]". αααααααα
ααΉαααααααα»αααα ααΆααΆαααααααααααααααΆααααααααΆααααααΆαα½αα α αΎαααααααΆαααααΆαα
ααα·αααααΌαααΆααααααααΆαααααΆαααααα (ααααα βAction.XXXβ α αΎααα»ααααα·αααααααα»αααΆααααααααααααααααααααααααΆααααΆ).
ααΆαα·ααα ααΆαααΆαααΆαααααααααααα»αααααααααααΆαααααα α
ααα
ααααΆααΈααααααα "ααααΆααααααΌααααααααΌα
αααααΆααααααΆαααα
ααΈααα" ΠΈ "ααααααααΆαααααααα" ("RetypeWord").
αααΆαααΆααααααααααα αααααααΌαααΆαααααααα "αα ααΆαα»αααα" ("αααααΈ" αα αααα»α golang) αααααΆαααααααααΆααααααΆααααααα±αα αααααΈαααααα½αααα’αΆαααααααΎα’αααΈαααααααΌαααΆαααααααα αααα»α "αααααααΆα" α
αααααααΆαααααααααααΆααΆα αααΎαα’αΆα ααααΌαααΆααα·αααααΆαα αααα»ααααααα½αα (ααααα). α¬α’αααα’αΆα ααΆαααΆααΆα αααΈααααΆα ααΌα ααααααα»αααΆααααα αΆαααΆαααΎα
αααα»αααααααααααααΆα "Exec" ααααΆααααΎααααΈααααα·ααααα·ααααααΈαααΆααααα α ααΆαα½αααΉααααααΎαααΎααααΈαα»αααα·ααααααα’αΆαααααααααΆααααααααΆα αΌααα αααα»α stdin α
- βWait = 1β β αααα αΆαααααΎαααΆαααααΎαααΆααααα ααα
- αααα ααααΆ "αα
αααα" α’αααααΉαα
ααααΆααααα»ααααααααααα
αααα»αααα·ααααΆαα ααααααΆαααΌα
ααΆαααααααααααΆαααααα’α½α
αααααΆααααΌαααΆαααααΆααα
αΆααα
"ααΎα’αααα ααααααΆααα’ααααααααααΆαααααα’ααααα? αααβααΆβααααααβαααβα’αααβααααΌαβαα Β»α
α αα (αααααα αΎαα αα) α ααΆα αΆααααΌα ααΆαααα»ααα·αααΆαααααα α’αααΈααΆααα’ααα
α±! ααΆα αααα»ααα·αααααα
αα...
ααΎααΆαααααααα
ααΆααααααααα
αΆααααααΎααα
α―ααΆ? αα
αααα»αααΌαααΉα? ααΌα
αααα
[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.
ααΎαααα»αααααα / ααααΎαα»ααα α―ααΆ? (ααααΆαααααΌααααααααΆαααααα)αααα»αβαα·αβααΆβαααααΉαβααΆβα’αααβα’αΆαβαααβααβα α·αααβαα»αβααΆααβααΉαβαα·αβαααα·αβα ααα’αΌαβαααβααα
ααΌαααααΆαααα’!
ααααα: www.habr.com