αž§αž”αž€αžšαžŽαŸαž€αŸ‚αž”αŸ’αž›αž„αŸ‹ Xswitcher αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αžΈαž“αž»αž…αŸ– αž‡αŸ†αž αžΆαž“αž‘αžΈαž–αžΈαžš

αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈ αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž˜αž»αž“αŸ” (xswitcher αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› "αž—αžŸαŸ’αžαž»αžαžΆαž„αž“αŸƒαž‚αŸ†αž“αž·αž") αž”αžΆαž“αž‘αž‘αž½αž›αž“αžΌαžœαž˜αžαž·αžŸαŸ’αžαžΆαž”αž“αžΆαž™αŸ‰αžΆαž„αž…αŸ’αžšαžΎαž“ (αžŠαŸ‚αž›αž›αŸ’αž’)αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž“αŸ’αžαž…αŸ†αžŽαžΆαž™αž–αŸαž›αž‘αŸ†αž“αŸαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‚αž˜αŸ’αžšαŸ„αž„αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž…αŸ†αžŽαžΆαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αž“αŸ’αžαž·αž…... αž‡αŸ†αž αžΆαž“αž‘αžΈαž–αžΈαžšαž“αžΉαž„αž˜αž·αž“αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž’αž˜αŸ’αž˜αžαžΆαž‘αŸαŸ– αžŸαŸ†αžŽαžΎ/αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž€αžΆαžšαžšαž…αž“αžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ”

αž§αž”αž€αžšαžŽαŸαž€αŸ‚αž”αŸ’αž›αž„αŸ‹ Xswitcher αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αžΈαž“αž»αž…αŸ– αž‡αŸ†αž αžΆαž“αž‘αžΈαž–αžΈαžš

αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αž˜αŸ’αž˜αžαžΆαž™αž›αŸ‹αžαžΆαžœαžΆαž‚αž½αžšαž±αŸ’αž™αž’αž»αž‰αž˜αž·αž“αž‚αž½αžšαž±αŸ’αž™αž‡αžΏαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž˜αž·αž“β€‹αž±αŸ’αž™β€‹αž˜αžΆαž“β€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž‚αžΊβ€‹αž‡αžΆβ€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž“αŸƒβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αž‰αž»αŸ†β€‹αž€αŸ†αž–αž»αž„β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž‡αžΆαž˜αž½αž™β€‹αŸ”
αžŸαžšαž»αž”αž˜αž€αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž”αžΆαž“αž™αŸ‰αžΆαž„αž›αŸ’αž’ (αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž”αžΆαž“αž™αŸ‰αžΆαž„αž›αŸ’αž’) 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 (αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž”αŸ’αžšαžΆαž€αžŠβ€‹αž‘αŸ) αž‚αŸ’αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ†αž–αžΉαž„αž‘αž»αž€ "αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸαž’αžΆαž€αŸ’αžšαž€αŸ‹αž“αŸαŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€" αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎ "αž‚αž“αŸ’αž›αžΉαŸ‡ = αžαž˜αŸ’αž›αŸƒ" (αž“αž·αž„αžαžΆαž˜αž–αŸ’αž™αž‰αŸ’αž‡αž“αŸˆαž‡αž˜αŸ’αžšαžΎαžŸαžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž˜αž½αž™αž…αŸ†αž“αž½αž“αž‘αŸ€αž αžŠαžΌαž…αž‡αžΆ = [αž˜αž½αž™αž…αŸ†αž“αž½αž“ αž“αŸ„αŸ‡ ធអរេ]) αžαŸ’αž‰αž»αŸ†β€‹αž‘αžΆαž™
αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸ„αž™αžœαž·αž…αžΆαžšαžŽαž‰αžΆαžŽαŸ”
αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αŸ„αŸ‡αž‚αžΊαžαžΆ "ដុត" αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆ (αž”αŸ’αžšαž αŸ‚αž›αž†αŸ’αž“αžΆαŸ† 2013) αŸ” αž˜αž·αž“αžŠαžΌαž…αžαŸ’αž‰αž»αŸ†αž‘αŸ αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’ TOML αž”αžΆαž“αž…αžΌαž›αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž₯αž‘αžΌαžœαž“αŸαŸ‡ αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžšαž”αžŸαŸ‹αžœαžΆαž±αŸ’αž™αžŸαž˜αž“αžΉαž„αžαŸ’αž›αž½αž“αžαŸ’αž‰αž»αŸ† αž˜αž·αž“αž˜αŸ‚αž“αž•αŸ’αž‘αž»αž™αž˜αž€αžœαž·αž‰αž‘αŸαŸ”

αž‡αžΆαž‘αžΌαž‘αŸ… αž™αžΎαž„αž™αž€ 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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹