рд▓рд┐рдирдХреНрд╕рд╕рд╛рдареА рдПрдХреНрд╕рд╕реНрд╡рд┐рдЪрд░ рд▓реЗрдЖрдЙрдЯ рдХрд░реЗрдХреНрдЯрд░: рдкрд╛рдпрд░реА рджреЛрди

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

рд▓рд┐рдирдХреНрд╕рд╕рд╛рдареА рдПрдХреНрд╕рд╕реНрд╡рд┐рдЪрд░ рд▓реЗрдЖрдЙрдЯ рдХрд░реЗрдХреНрдЯрд░: рдкрд╛рдпрд░реА рджреЛрди

рдХрд╕реЗ рддрд░реА рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рдирд╛ рд╣реА рд╕рд░реНрд╡ рдирд┐рдпрдВрддреНрд░рдгреЗ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХрдкрдгреЗ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рд╡рд╛рдЯрддреЗ.

рдирд┐рд░рд╛рдзрд╛рд░ рд╣реЛрдК рдирдпреЗ рдореНрд╣рдгреВрди, рдореА рдХрд╛рдп рд╡рд╛рдЧрддреЛ рдпрд╛рдЪреЗ рдЖрддреВрди рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ.
рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ рдЖрдгрд┐ рдЭреВрдХреАрдкрд░ рдПрдХрдВрджрд░реАрдд рдЙрддреНрдХреГрд╖реНрдЯ рдХрд▓реНрдкрд┐рдд (рдЖрдгрд┐ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗрд▓реЗ)
- рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди? рдкрдг рддреЗ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рдЖрд╣реЗ! рдбрдВрдм xml (рдХрд╛рд░рдг рддреЗ "рдмреЙрдХреНрд╕рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░" рдЖрд╣реЗ).
- рдЕрд░реЗ, рддреБрд▓рд╛рд╣реА ACL рд╣рд╡реЗ рдЖрд╣реЗ рдХрд╛? рдкрдг рддреЗ рдЦреВрдк рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рдЖрд╣реЗ! рдЯреЕрдк-рдмреНрд▓реВрдкрд░... рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА.

рдкрдг рдорд╛рдЭреНрдпрд╛ рдХрд╛рдорд╛рдд рдпрд╛рдЪреНрдпрд╛ рдЕрдЧрджреА рдЙрд▓рдЯ рдЖрд╣реЗ. рдмрд░реЛрдмрд░ (рдЕрд░реЗ, рдЬрд╡рд│рдЬрд╡рд│ рдХрдзреАрдЪ рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛рдЪ рдирд╛рд╣реА) рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ рдореЙрдбреЗрд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреБрдвреЗ рд╕рд╣рдЬ рдЖрдгрд┐ рдиреИрд╕рд░реНрдЧрд┐рдХрд░рд┐рддреНрдпрд╛ рдкреБрдвреЗ рдЪрд╛рд▓реВ рдареЗрд╡рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ (рдЬрд╡рд│рдЬрд╡рд│) рдПрдХ рдЖрдХреГрддреА рдПрдХрддреНрд░ рдХрд░рд╛.

рдбреЗрдЯрд╛ рд╢рд╛рд╕реНрддреНрд░рдЬреНрдЮрд╛рдВрдЪреНрдпрд╛ рдХрдареЛрд░ рдкрд░рд┐рд╢реНрд░рдорд╛рдмрджреНрджрд▓ рдореА рдЕрд▓реАрдХрдбреЗрдЪ рд╣реЕрдмреНрд░реЗрд╡рд░ рдПрдХ рд▓реЗрдЦ рдкрд╛рд╣рд┐рд▓рд╛...
рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рд╣рд╛ рдХреНрд╖рдг рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдкреВрд░реНрдгрдкрдгреЗ рд▓рдХреНрд╖рд╛рдд рдЖрд▓рд╛ рдЖрд╣реЗ. рдЖрдгрд┐ рдорд╛рдЭреНрдпрд╛ рд╕рд░рд╛рд╡ рдордзреНрдпреЗ, рдЬрд╕реЗ рддреЗ рдореНрд╣рдгрддрд╛рдд, "рд╣рд▓рдХреА рдЖрд╡реГрддреНрддреА". рдорд▓реНрдЯреА-рд╡реНрд╣реЙрд▓реНрдпреВрдо рдореЙрдбреЗрд▓реНрд╕, рддрдпрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ OOP рд╕рд╣ рдЕрдиреБрднрд╡реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗ. тАФ рд╣реЗ рд╕рд░реНрд╡ рдирдВрддрд░ рджрд┐рд╕реЗрд▓/рдЬреЗрд╡реНрд╣рд╛ рддреЗ рдмрдВрдж рд╣реЛрдИрд▓. рдкрд░рдВрддреБ рдбрд┐рдЭрд╛рдпрдирд░рд▓рд╛ рдпреЗрдереЗ рдЖрдгрд┐ рдЖрддрд╛ рдХреБрдареЗрддрд░реА рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдореБрджреНрджреНрдпрд╛рд╡рд░ рдпрд╛. рдореА TOML рд▓рд╛ рд╕рд┐рдВрдЯреЕрдХреНрдЯрд┐рдХ рдЖрдзрд╛рд░ рдореНрд╣рдгреВрди рдШреЗрддрд▓реЗ рдпрд╛ рдирд╛рдЧрд░рд┐рдХрд╛рдХрдбреВрди.

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

рдореНрд╣рдгрдЬреЗрдЪ, рддреБрдордЪреА рдЗрдЪреНрдЫрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рдлрдХреНрдд "рддреБрдордЪреНрдпрд╛ рддреНрдпрд╛ TOML рд╕рд╣ рдЬрдВрдЧрд▓рд╛рдд рдЬрд╛, рдорд▓рд╛ XXX рдкрд╛рд╣рд┐рдЬреЗ" рдЕрд╕реЗ рдореНрд╣рдгреВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдлрдХреНрдд рдПрдХрд╛ рдУрд│реАрдиреЗ рдХреЛрдб "рдкреЕрдЪ" рдХрд░реВ рд╢рдХрддрд╛.

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ xswitcher рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реА рд╡рд┐рдВрдбреЛ рд▓рд┐рд╣рд╛рдпрдЪреНрдпрд╛ рдЕрд╕рддреАрд▓ (рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдирд╛рд╣реА) "рддреБрдордЪреНрдпрд╛ рдпрд╛ рдирд┐рдВрджрдиреАрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣" рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рдорд╕реНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╛рд╣реАрдд.

рдЗрддрд░ рд╕рд░реНрд╡рд╛рдВрд╕рд╛рдареА, рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ "рдХреА = рдореВрд▓реНрдп" рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ (рдЖрдгрд┐ рдЕрдХреНрд╖рд░рд╢рдГ рдЖрдгрдЦреА рдХрд╛рд╣реА рдХреНрд▓рд┐рд╖реНрдЯ рдкрд░реНрдпрд╛рдп, рдЬрд╕реЗ рдХреА = [рдХрд╛рд╣реА, рддреЗ, рдЕреЕрд░реЗ]) рдорд▓рд╛ рд╡рд╛рдЯрддреЗ
рдЕрдВрддрд░реНрдЬреНрдЮрд╛рдирд╛рдиреЗ рд╕реЛрдпреАрд╕реНрдХрд░.
рдордиреЛрд░рдВрдЬрдХ рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ "рдЬрд│рд▓реЗрд▓реЗ" рддреНрдпрд╛рдЪ рд╡реЗрд│реА (рд╕реБрдорд╛рд░реЗ 2013). рдлрдХреНрдд, рдорд╛рдЭреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, TOML рдЪреЗ рд▓реЗрдЦрдХ рдпреЛрдЧреНрдп рдкреНрд░рдорд╛рдгрд╛рдд рдЖрд▓реЗ.

рдореНрд╣рдгреВрди, рдЖрддрд╛ рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕реНрд╡рддрдГрд▓рд╛ рдЕрдиреБрдХреВрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ, рдЙрд▓рдЯ рдирд╛рд╣реА.

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЖрдореНрд╣реА 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛