рдЕрд╕рд▓реНрдпрд╛рдиреЗ
рдХрд╕реЗ рддрд░реА рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рдирд╛ рд╣реА рд╕рд░реНрд╡ рдирд┐рдпрдВрддреНрд░рдгреЗ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХрдкрдгреЗ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рд╡рд╛рдЯрддреЗ.
рдирд┐рд░рд╛рдзрд╛рд░ рд╣реЛрдК рдирдпреЗ рдореНрд╣рдгреВрди, рдореА рдХрд╛рдп рд╡рд╛рдЧрддреЛ рдпрд╛рдЪреЗ рдЖрддреВрди рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ.
рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рдЖрдгрд┐ рдЭреВрдХреАрдкрд░ рдПрдХрдВрджрд░реАрдд рдЙрддреНрдХреГрд╖реНрдЯ рдХрд▓реНрдкрд┐рдд (рдЖрдгрд┐ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗрд▓реЗ)
- рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди? рдкрдг рддреЗ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рдЖрд╣реЗ! рдбрдВрдм xml (рдХрд╛рд░рдг рддреЗ "рдмреЙрдХреНрд╕рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░" рдЖрд╣реЗ).
- рдЕрд░реЗ, рддреБрд▓рд╛рд╣реА ACL рд╣рд╡реЗ рдЖрд╣реЗ рдХрд╛? рдкрдг рддреЗ рдЦреВрдк рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рдЖрд╣реЗ! рдЯреЕрдк-рдмреНрд▓реВрдкрд░... рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА.
рдкрдг рдорд╛рдЭреНрдпрд╛ рдХрд╛рдорд╛рдд рдпрд╛рдЪреНрдпрд╛ рдЕрдЧрджреА рдЙрд▓рдЯ рдЖрд╣реЗ. рдмрд░реЛрдмрд░ (рдЕрд░реЗ, рдЬрд╡рд│рдЬрд╡рд│ рдХрдзреАрдЪ рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛рдЪ рдирд╛рд╣реА) рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рдореЙрдбреЗрд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреБрдвреЗ рд╕рд╣рдЬ рдЖрдгрд┐ рдиреИрд╕рд░реНрдЧрд┐рдХрд░рд┐рддреНрдпрд╛ рдкреБрдвреЗ рдЪрд╛рд▓реВ рдареЗрд╡рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ (рдЬрд╡рд│рдЬрд╡рд│) рдПрдХ рдЖрдХреГрддреА рдПрдХрддреНрд░ рдХрд░рд╛.
рдбреЗрдЯрд╛ рд╢рд╛рд╕реНрддреНрд░рдЬреНрдЮрд╛рдВрдЪреНрдпрд╛ рдХрдареЛрд░ рдкрд░рд┐рд╢реНрд░рдорд╛рдмрджреНрджрд▓ рдореА рдЕрд▓реАрдХрдбреЗрдЪ рд╣реЕрдмреНрд░реЗрд╡рд░ рдПрдХ рд▓реЗрдЦ рдкрд╛рд╣рд┐рд▓рд╛...
рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рд╣рд╛ рдХреНрд╖рдг рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдкреВрд░реНрдгрдкрдгреЗ рд▓рдХреНрд╖рд╛рдд рдЖрд▓рд╛ рдЖрд╣реЗ. рдЖрдгрд┐ рдорд╛рдЭреНрдпрд╛ рд╕рд░рд╛рд╡ рдордзреНрдпреЗ, рдЬрд╕реЗ рддреЗ рдореНрд╣рдгрддрд╛рдд, "рд╣рд▓рдХреА рдЖрд╡реГрддреНрддреА". рдорд▓реНрдЯреА-рд╡реНрд╣реЙрд▓реНрдпреВрдо рдореЙрдбреЗрд▓реНрд╕, рддрдпрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ OOP рд╕рд╣ рдЕрдиреБрднрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗ. тАФ рд╣реЗ рд╕рд░реНрд╡ рдирдВрддрд░ рджрд┐рд╕реЗрд▓/рдЬреЗрд╡реНрд╣рд╛ рддреЗ рдмрдВрдж рд╣реЛрдИрд▓. рдкрд░рдВрддреБ рдбрд┐рдЭрд╛рдпрдирд░рд▓рд╛ рдпреЗрдереЗ рдЖрдгрд┐ рдЖрддрд╛ рдХреБрдареЗрддрд░реА рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдореБрджреНрджреНрдпрд╛рд╡рд░ рдпрд╛. рдореА TOML рд▓рд╛ рд╕рд┐рдВрдЯреЕрдХреНрдЯрд┐рдХ рдЖрдзрд╛рд░ рдореНрд╣рдгреВрди рдШреЗрддрд▓реЗ
рдХрд╛рд░рдг рддреЛ (TOML) рдПрдХреАрдХрдбреЗ, рдорд╛рдирд╡реА-рд╕рдВрдкрд╛рджрди рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп. рджреБрд╕рд░реАрдХрдбреЗ, рд╣реЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд░рдЪрдирд╛рдВрдордзреНрдпреЗ 1:1 рдЪреЗ рднрд╛рд╖рд╛рдВрддрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ: XML, JSON, YAML.
рд╢рд┐рд╡рд╛рдп, рдореА тАЬgithub.com/BurntSushi/tomlтАЭ рд╡рд░реВрди рд╡рд╛рдкрд░рд▓реЗрд▓реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА, рдЬрд░реА рд╕рд░реНрд╡рд╛рдд рдлреЕрд╢рдиреЗрдмрд▓ рдирд╕рд▓реА рддрд░реА (рдЕрджреНрдпрд╛рдк 1.4 рд╡рд╛рдХреНрдпрд░рдЪрдирд╛), рд╕рдорд╛рди (тАЬрдЕрдВрдЧрднреВрддтАЭ) JSON рд╢реА рд╕рд┐рдВрдЯреЕрдХреНрдЯрд┐рдХрд▓реА рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ.
рдореНрд╣рдгрдЬреЗрдЪ, рддреБрдордЪреА рдЗрдЪреНрдЫрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рдлрдХреНрдд "рддреБрдордЪреНрдпрд╛ рддреНрдпрд╛ TOML рд╕рд╣ рдЬрдВрдЧрд▓рд╛рдд рдЬрд╛, рдорд▓рд╛ XXX рдкрд╛рд╣рд┐рдЬреЗ" рдЕрд╕реЗ рдореНрд╣рдгреВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдлрдХреНрдд рдПрдХрд╛ рдУрд│реАрдиреЗ рдХреЛрдб "рдкреЕрдЪ" рдХрд░реВ рд╢рдХрддрд╛.
рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ xswitcher рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реА рд╡рд┐рдВрдбреЛ рд▓рд┐рд╣рд╛рдпрдЪреНрдпрд╛ рдЕрд╕рддреАрд▓ (рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдирд╛рд╣реА) "рддреБрдордЪреНрдпрд╛ рдпрд╛ рдирд┐рдВрджрдиреАрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣" рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рдорд╕реНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╛рд╣реАрдд.
рдЗрддрд░ рд╕рд░реНрд╡рд╛рдВрд╕рд╛рдареА, рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ "рдХреА = рдореВрд▓реНрдп" рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ (рдЖрдгрд┐ рдЕрдХреНрд╖рд░рд╢рдГ рдЖрдгрдЦреА рдХрд╛рд╣реА рдХреНрд▓рд┐рд╖реНрдЯ рдкрд░реНрдпрд╛рдп, рдЬрд╕реЗ рдХреА = [рдХрд╛рд╣реА, рддреЗ, рдЕреЕрд░реЗ]) рдорд▓рд╛ рд╡рд╛рдЯрддреЗ
рдЕрдВрддрд░реНрдЬреНрдЮрд╛рдирд╛рдиреЗ рд╕реЛрдпреАрд╕реНрдХрд░.
рдордиреЛрд░рдВрдЬрдХ рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ
рдореНрд╣рдгреВрди, рдЖрддрд╛ рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕реНрд╡рддрдГрд▓рд╛ рдЕрдиреБрдХреВрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ, рдЙрд▓рдЯ рдирд╛рд╣реА.
рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЖрдореНрд╣реА TOML (рдЬреБрдиреНрдпрд╛ рд╡рд┐рдВрдбреЛрдЬ INI рд╕рд╛рд░рдЦреЗрдЪ) рдШреЗрддреЛ. рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдореНрд╣реА рдХреАрдмреЛрд░реНрдбрд╡рд░реАрд▓ рдирд╡реАрдирддрдо рд╕реНрдХреЕрди рдХреЛрдбрдЪреНрдпрд╛ рд╕реЗрдЯрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рд╣реБрдХрдЪреА рдорд╛рд▓рд┐рдХрд╛ рдХрд╢реА рдЬреЛрдбрд╛рдпрдЪреА рдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ. рдЦрд╛рд▓реА, рддреБрдХрдбрд╛ рддреБрдХрдбрд╛, рдЖрддрд╛рдкрд░реНрдпрдВрдд рдХрд╛рдп рдЭрд╛рд▓реЗ рдЖрд╣реЗ. рдЖрдгрд┐ рдореА рдЕрд╕рд╛ рдирд┐рд░реНрдгрдп рдХрд╛ рдШреЗрддрд▓рд╛ рдпрд╛рдЪреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг.
рек.рез. рдореВрд▓рднреВрдд рдЕрдореВрд░реНрддрддрд╛
- рд╕реНрдХреЕрди рдХреЛрдб рдкрджрдирд╛рдо. рдпрд╛рдмрджреНрджрд▓ рдирд┐рд╢реНрдЪрд┐рддрдкрдгреЗ рдХрд╛рд╣реАрддрд░реА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдХрд╛рд░рдг рдлрдХреНрдд рдбрд┐рдЬрд┐рдЯрд▓ рдХреЛрдб рдорд╛рдирд╡реА рд╡рд╛рдЪрдгреНрдпрд╛рдпреЛрдЧреНрдп рдирд╛рд╣реАрдд (рддреЗ рдлрдХреНрдд рдореА рдЖрд╣реЗ
loloswitcher ).
рдореА тАЬрдЧреЛрд▓рд╛рдВрдЧ-рдПрд╡рджреЗрд╡тАЭ рд╡рд░реВрди тАЬecodes.goтАЭ рдХрд╛рдврд▓реЗ (рдореА рдореВрд│ рд╕реНрддреНрд░реЛрддрд╛рдХрдбреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕ рдЦреВрдк рдЖрд│рд╢реА рд╣реЛрддреЛ, рдЬрд░реА рд▓реЗрдЦрдХрд╛рдиреЗ рддреЗ рдЕрдЧрджреА рд╕рд╛рдВрд╕реНрдХреГрддрд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рд╕реВрдЪрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ). рдореА рдереЛрдбреЗрд╕реЗ (рдЖрддреНрддрд╛рд╕рд╛рдареА) рдХрд╛рд╣реАрддрд░реА рджреБрд░реБрд╕реНрдд рдХреЗрд▓реЗ рдЬреЗ рдЦреВрдк рднреАрддреАрджрд╛рдпрдХ рд╣реЛрддреЗ. рдЬрд╕реЗ рдХреА тАЬрд▓реЗрдлреНрдЯрдмреНрд░реЗрд╕тАЭ тЖТ тАЬ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"
рдЯреЗрдмрд▓рдЪреНрдпрд╛ рдкрдВрдХреНрддреА рддреНрдпрд╛рдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╕рд╣ рджреБрд╣реЗрд░реА рдЪреМрдХреЛрдиреА рдХрдВрд╕рд╛рдд рдЖрд╣реЗрдд. рдмреЕрдЯрдордзреВрди рд╣реЗ рд╕реЛрдкреЗ рдЕрд╕реВ рд╢рдХрдд рдирд╡реНрд╣рддреЗ. рд╕рдзреНрдпрд╛ рд╕рдХреНрд░рд┐рдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд┐рдВрдбреЛрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди, рддреБрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рдкрд░реНрдпрд╛рдп рдирд┐рд╡рдбреВ рд╢рдХрддрд╛:
- рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ тАЬрд╣реЙрдЯ рдХреАтАЭ тАЬрдХреНрд░рд┐рдпрд╛ = тАжтАЭ рдЪрд╛ рд╕рдВрдЪ. рдирд╕рд▓реНрдпрд╛рд╕/рд░рд┐рдХреНрдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдХрд╛рд╣реАрд╣реА рдХрд░реВ рдирдХрд╛.
- "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" рдЗ., рдЬреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рд╕реНрдХреЕрди рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛рдд.
- рдЪреЗрдХ рдиреЗрд╣рдореА рдХреНрд░рдорд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА "snugged" рдЖрд╣реЗ, рддреНрдпрд╛рдореБрд│реЗ рд╢реЗрдкрдЯреАрд▓рд╛ тАЬ$тАЭ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.
- рдПрдХрд╛ рдУрд│реАрдд рд╕рд░реНрд╡ рддрдкрд╛рд╕рдгреНрдпрд╛ рдПрдХрд╛рдорд╛рдЧреВрди рдПрдХ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ "I" рджреНрд╡рд╛рд░реЗ рдПрдХрддреНрд░ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рдкрд░рдВрддреБ рд╡реНрд╣реЕрд▓реНрдпреВрдЪреЗ рд╡рд░реНрдгрди рдЕреЕрд░реЗ рдореНрд╣рдгреВрди рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреБрдореНрд╣реА рд╕реНрд╡рд▓реНрдкрд╡рд┐рд░рд╛рдорд╛рдирдВрддрд░ рдкрд░реНрдпрд╛рдпреА рдЪреЗрдХ рд▓рд┐рд╣реВ рд╢рдХрддрд╛. рдХрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рд╣реЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕.
- рдореВрд▓реНрдп "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" рдХреНрд░рд┐рдпрд╛ рд╕реЗрдЯ рдХреЗрд▓реА. рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗрд▓реЗ рдмрдлрд░ stdin рдордзреНрдпреЗ рдврдХрд▓рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рд╕рд╣.
- тАЬрдкреНрд░рддреАрдХреНрд╖рд╛ = 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