рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП Xswitcher рд▓реЗрдЖрдЙрдЯ рд╕реБрдзрд╛рд░рдХ: рдЪрд░рдг рджреЛ

рдЪреВрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди ("рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдкреНрд░рдорд╛рдг" рдЪрд░рдг рдореЗрдВ xswitcher) рдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рд░рдЪрдирд╛рддреНрдордХ рд╕рдореАрдХреНрд╖рд╛ рдорд┐рд▓реА (рдЬреЛ рдЕрдЪреНрдЫреА рд╣реИ) , рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдЕрдкрдирд╛ рдЦрд╛рд▓реА рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ред рдЕрдм рдореИрдВ рдЖрдкрдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦрд░реНрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ... рджреВрд╕рд░рд╛ рдЪрд░рдг рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рд╕реБрдЭрд╛рд╡ / рдЪрд░реНрдЪрд╛ред



рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрди рд╕рднреА рдЯреНрд╡рд┐рд╕реНрдЯ рдХреЛ рд╕реБрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрддрд╣рд╛рд╢рд╛ рдкрд░реЗрд╢рд╛рди рд╣реИрдВред

рдЖрджреЗрд╢ рдореЗрдВ рдирд┐рд░рд╛рдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрджрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
( ) Apache Kafka & ZooKeeper.
тАФ ? ! - xml ( ┬л ┬╗).
тАФ , ACL ? ! -тАж - .

рдФрд░ рдореЗрд░реЗ рдХрд╛рдо рдореЗрдВ - рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрддред рд╕рд╣реА рдврдВрдЧ рд╕реЗ (рдЕрдлрд╕реЛрд╕, рдкрд╣рд▓реА рдмрд╛рд░ рд╕реЗ рд▓рдЧрднрдЧ рдХрднреА рдирд╣реАрдВ) рдирд┐рд░реНрдорд┐рдд рдореЙрдбрд▓ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рд▓рдЧрднрдЧ) рд╕рд░реНрдХрд┐рдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред

рдбреЗрдЯрд╛-рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреА рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Habr├й рдкрд░ рдПрдХ рд▓реЗрдЦ рдЖрдпрд╛ ...
, . , , ┬л ┬╗. , .. тАФ , / . - .

рдореБрджреНрджреЗ рдкреЗ рдЖрдИрдпреЗред рдПрдХ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдирд╛рдЧрд░рд┐рдХ рд╕реЗ TOML рд▓рд┐рдпрд╛ ред

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ (TOML) рдПрдХ рдУрд░ рдорд╛рдирд╡-рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рд╣реИред рдФрд░ рджреВрд╕рд░реЗ рдкрд░ - рдпрд╣ 1: 1 рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХрд░рддрд╛ рд╣реИ: XML, JSON, YAMLред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рдореИрдВрдиреЗ "github.com/BurntSushi/toml" рд╕реЗ рдХрд┐рдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдмрд╕реЗ рдлреИрд╢рдиреЗрдмрд▓ (рдЕрднреА рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ 1.4) рдирд╣реАрдВ рд╣реИ, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдорд╛рди ("рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд") JSON рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред

рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдмрд╕ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ "рдЗрд╕ TOML рдХреЗ рд╕рд╛рде рдЬрдВрдЧрд▓ рд╕реЗ рдЧреБрдЬрд░реЗрдВ, рдореИрдВ XXX рдЪрд╛рд╣рддрд╛ рд╣реВрдВ" рдФрд░ "рдкреИрдЪ" рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рдеред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк xswitcher рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдВрдбреЛ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ) рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ "рдЖрдкрдХреЗ рдЗрд╕ рдХрдордмрдЦреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде" рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдП, "рдХреБрдВрдЬреА = рдореВрд▓реНрдп" рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ (рдФрд░ рд╕рдЪрдореБрдЪ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЯрд╛рдЗрдк рдХрд░реЗрдВ = [рдХреБрдЫ, рдлрд┐рд░, рд╕рд░рдгреА]) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХред
, ┬л┬╗ ( 2013 ). , , TOML .

, .

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо TOML (рдкреБрд░рд╛рдиреЗ рд╡рд┐рдВрдбреЛрдЬ INI рдХреЗ рд╕рдорд╛рди) рд▓реЗрддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдирд╡реАрдирддрдо рд╕реНрдХреИрди рдХреЛрдб рдХреЗ рд╕реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реБрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреИрд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдиреАрдЪреЗ - рдлрд┐рд▓рд╣рд╛рд▓ рдХреНрдпрд╛ рд╣реБрдЖред рдФрд░ рдЬреЛ рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдЙрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред

0. рдореВрд▓ рд╕рд╛рд░


  • -. - , - ( loloswitcher).
    ┬лecodes.go┬╗ ┬лgolang-evdev┬╗ ( , ). () . ┬лLEFTBRACE┬╗ тЖТ ┬лL_BRACE┬╗.
  • ┬л ┬╗. . ( . ┬л┬╗ .)
  • ┬л┬╗ . , ┬л┬╗=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])"

рдзреНрд╡рдиреНрдпрд╛рддреНрдордХ рд╕рдВрдХреЗрддрди рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирд╡ рднрд╛рд╖рд╛ рд╢рдмреНрдж рдХреНрдпрд╛ рд╣реИ (рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЕрдВрдЧреВрд░ рдЙрд░реНрдл тАЛтАЛ"рдЪрд┐рддреНрд░рд▓рд┐рдкрд┐" рдорд╛рдорд▓рд╛ рд╣реИ) ? рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рднрдпрд╛рдирдХ "рдЪрд╛рджрд░ред" рдЗрд╕рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд "рдЯреЗрдореНрдкрд▓реЗрдЯ" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред

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 рдХреЛрдб рдореЗрдВ "рдЖрд╢реНрдЪрд░реНрдп" рдХреА рдкрдХрдбрд╝ рдбрд╛рд▓реА)ред
рдЕрдВрджрд░ рдореИрдВрдиреЗ "рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ред рдЧреЛрд▓рдВрдЧ рдкрд░, рдпрд╣ (рдЕрдЪрд╛рдирдХ) рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рдХрд▓рд╛ред

  • рдЗрд╕ рдЬрдЧрд╣ "рдбреНрд░реЙрдк" рдореИрдВ рдПрдХ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкрдХреНрд╖ рдореЗрдВ (рдореИрдВ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛)ред

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"

рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЕрдкрдиреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдбрдмрд▓ рд╡рд░реНрдЧ рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рд╣реИрдВред рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╡рд░реНрддрдорд╛рди рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ:

  • ┬л ┬╗ ┬л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)" ]

рд╣реБрдХ рдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд┐рд▓реНрдЯ-рдЗрди, "рдЯреЙрдХрд┐рдВрдЧ" рдирд╛рдо (NewWord, NewSentence, Compose) рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдпред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╛рдо "рдПрдХреНрд╢рди" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ TOML v1.4, рдмрд┐рдВрджреАрджрд╛рд░ рдирд╛рдо рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓рд╛ рдПрдХ рдЕрдиреБрднрд╛рдЧ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред

"рдирдВрдЧреЗ" рдирд┐рдпрдорд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЛрдЧреЛрдВ рдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдЙрдбрд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ (рдЕрдиреБрднрд╡ рдореЗрдВ, рджрд╕ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ), рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реВрдВред

  • ┬лOFF:┬╗ ( ┬лON:┬╗) regexp ( ) ( ).
    ┬л┬╗ . "|". "[LR]_SHIFT" ( ).
  • ┬лSEQ:┬╗ ( ), ┬л┬╗ . ^W ┬лregexp┬╗. pcre (┬лperl compatible┬╗).
  • ┬л_1: 1, _2: 2┬╗ .., -.
  • ┬л┬╗ , "$" .
  • ┬л┬╗. , . - .
  • ┬л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" рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рди рд╣реЛрдВ) ред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рд╣реА рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╢рдмреНрдж рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: "рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╡рд╣реАрдВ рд╕реЗрдЯ рдХрд░реЗрдВ" рдФрд░ "рд░реА-рдЯрд╛рдЗрдк" ("рд░рд┐рдЯрд╛рдЗрдкрд╡рд░реНрдб") ред рдЗрд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП

рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ "рд╢рдмреНрджрдХреЛрд╖" ("рдирдХреНрд╢рд╛" рдЧреЛрд▓рдВрдЧ рдореЗрдВ) рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЙрдирдХреА рд╕реВрдЪреА "рдХрд╛рд░реНрд░рд╡рд╛рдИ" рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред

рдПрдХ рдвреЗрд░ (рдЕрдиреБрднрд╛рдЧ) рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдФрд░ рдЖрдк рдЗрд╕реЗ рдЕрд▓рдЧ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ред

рддреБрд░рдВрдд "Exec" рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ - рдмрд╛рд╣рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рд▓рд┐рдЦрд┐рдд рдмрдлрд░ рдХреЛ рд╕реНрдЯрдб рдореЗрдВ рдзрдХреЗрд▓рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рдеред

  • "рд░реБрдХреЛ = 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.


рдФрд░ рдЬрд╣рд╛рдВ рдореИрдВ рднреВрд▓ рдЧрдпрд╛ / рдПрдХ рдЧрд▓рддреА рдХреА (рдЗрд╕рдХреЗ рдмрд┐рдирд╛ - рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ) , рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЪреМрдХрд╕ рдкрд╛рдардХ рднреА рдЕрдкрдиреА рдирд╛рдХ рдкреЛрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рдирд╣реАрдВ рд╣реИрдВред

рд╕реМрднрд╛рдЧреНрдп

All Articles