เบ•เบปเบงเปเบเป‰เป„เบ‚เบฎเบนเบšเปเบšเบš Xswitcher เบชเปเบฒเบฅเบฑเบš Linux: เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเบชเบญเบ‡

เบ™เบฑเบšโ€‹เบ•เบฑเป‰เบ‡โ€‹เปเบ•เปˆ เบเบฒเบ™โ€‹เบžเบดเบกโ€‹เป€เบœเบตเบโ€‹เปเบœเปˆโ€‹เบ—เบตเปˆโ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฒโ€‹ (xswitcher เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™ "เบซเบผเบฑเบเบ–เบฒเบ™เบชเบฐเปเบ”เบ‡เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”") เป„เบ”เป‰เบฎเบฑเบšเบ„เปเบฒเบ„เบถเบ”เบ„เปเบฒเป€เบซเบฑเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบชเบฑเบ™เบซเบผเบฒเบ (เป€เบŠเบดเปˆเบ‡เบ”เบต), เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเบทเบšเบ•เปเปˆเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบงเปˆเบฒเบ‡เบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ„เบ‡เบเบฒเบ™. เบ”เบฝเบงเบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเปƒเบŠเป‰เป€เบงเบฅเบฒเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ ... เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ—เบตโ€‹เบชเบญเบ‡โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹เบซเบผเบฒเบโ€‹: เบเบฒเบ™โ€‹เบชเบฐโ€‹เป€เบซเบ™เบต / เบเบฒเบ™โ€‹เบชเบปเบ™โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เบเบฒเบ™โ€‹เบญเบญเบโ€‹เปเบšเบšโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹.

เบ•เบปเบงเปเบเป‰เป„เบ‚เบฎเบนเบšเปเบšเบš Xswitcher เบชเปเบฒเบฅเบฑเบš Linux: เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเบชเบญเบ‡

somehow เบกเบฑเบ™ turns เปƒเบซเป‰ เป€เบซเบฑเบ™ เบงเปˆเบฒ เป‚เบ„เบ‡ เบเบฒเบ™ เบ›เบปเบ เบเบฐ เบ•เบด เป€เบซเบฑเบ™ เบงเปˆเบฒ เบกเบฑเบ™ เบซเบ™เป‰เบฒ เป€เบšเบทเปˆเบญ incredibly เบเบฒเบ™ เบชเป‰เบฒเบ‡ เบ•เบฑเป‰เบ‡ เบเบฒเบ™ เบ„เบงเบš เบ„เบธเบก เบ—เบฑเบ‡ เบซเบกเบปเบ” เป€เบซเบผเบปเปˆเบฒ เบ™เบตเป‰.

เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบšเปเปˆเบกเบตเบžเบทเป‰เบ™เบ–เบฒเบ™, เบžเบฒเบเปƒเบ™เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบš.
เป‚เบ”เบเบฅเบงเบก conceived เบ—เบตเปˆเบ”เบตเป€เบฅเบตเบ” (เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบ”เบต) Apache Kafka & ZooKeeper.
- เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ? เปเบ•เปˆเบกเบฑเบ™เบซเบ™เป‰เบฒเป€เบšเบทเปˆเบญ! Dumb xml (เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™ "เบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡").
- เป‚เบญเป‰เบ, เป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™ ACL เบšเป? เปเบ•เปˆเบกเบฑเบ™เบซเบ™เป‰เบฒเป€เบšเบทเปˆเบญเบซเบผเบฒเบ! Tap-blooper... เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบฑเป‰เบ™.

เปเบ•เปˆเปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเบกเบฑเบ™เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบกเปเบ—เป‰เป†. เบชเบดเบ” (เบญเบฐเบ™เบดเบˆเบฒ, เป€เบเบทเบญเบšเบšเปเปˆเป€เบ„เบตเบเป€เบ›เบฑเบ™เป€เบ—เบทเปˆเบญเบ—เบณเบญเบดเบ”) เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบทเบšเบ•เปเปˆเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบ—เปเบฒเบกเบฐเบŠเบฒเบ” (เป€เบเบทเบญเบšโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”) เบ›เบฐเบเบญเบšเปเบœเบ™เบงเบฒเบ”.

เบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบปเบšเบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบš Habre เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบซเบ™เบฑเบเบ‚เบญเบ‡เบ™เบฑเบเบงเบดเบ—เบฐเบเบฒเบชเบฒเบ”เบ‚เปเป‰เบกเบนเบ™ ...
เบกเบฑเบ™ turns เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบงเปˆเบฒโ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบฎเบนเป‰โ€‹เบขเปˆเบฒเบ‡โ€‹เป€เบ•เบฑเบกโ€‹เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹. เปเบฅเบฐเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบงเบปเป‰เบฒเบงเปˆเบฒ, "เบชเบฐเบšเบฑเบšเปเบชเบ‡เบชเบฐเบซเบงเปˆเบฒเบ‡". เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบซเบผเบฒเบเบ›เบฐเบฅเบดเบกเบฒเบ™, เป‚เบ›เบฃเปเบเบกเบกเบตเบฅเบฐเบ”เบนเบเบฒเบ™เบ—เบตเปˆเบกเบต OOP เบžเป‰เบญเบก, เปเบฅเบฐเบญเบทเปˆเบ™เป†. โ€” เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เบ›เบฒโ€‹เบเบปเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹เบžเบฒเบโ€‹เบซเบผเบฑเบ‡โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆ / เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบญเบญเบโ€‹. เปเบ•เปˆเบœเบนเป‰เบญเบญเบเปเบšเบšเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™.

เป„เบ›เบฎเบญเบ”เบˆเบธเบ”. เบ‚เป‰เบญเบเป€เบญเบปเบฒ TOML เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™ syntactic เบˆเบฒเบเบžเบปเบ™เบฅเบฐเป€เบกเบทเบญเบ‡เบ™เบตเป‰.

เบเป‰เบญเบ™เบงเปˆเบฒ (TOML) เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบกเบฐเบ™เบธเบ”เบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เป„เบ”เป‰. เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบกเบฑเบ™เบ–เบทเบเปเบ› 1: 1 เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ syntaxes เบ—เบปเปˆเบงเป„เบ›เบเบงเปˆเบฒ: XML, JSON, YAML.
เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ‚เป‰เบญเบเปƒเบŠเป‰เบˆเบฒเบ "github.com/BurntSushi/toml", เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเปเปˆเปเบกเปˆเบ™เบ„เบปเบ™เบญเบฑเบšเป€เบ”เบ”: เบ—เบตเปˆเบชเบธเบ” (เบเบฑเบ‡ 1.4 syntax), เปเบกเปˆเบ™ syntactically เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบš JSON เบ”เบฝเบงเบเบฑเบ™ ("เบชเป‰เบฒเบ‡เปƒเบ™").

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเบ‡เปˆเบฒเบเป†เบงเปˆเบฒ "เบœเปˆเบฒเบ™เบ›เปˆเบฒเบ”เป‰เบงเบ TOML เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™ XXX" เปเบฅเบฐ "เปเบเป‰เป„เบ‚" เบฅเบฐเบซเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเป€เบชเบฑเป‰เบ™เบ”เบฝเบง.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบšเบฒเบ‡เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเป€เบžเบทเปˆเบญ configure xswitcher (เบ‚เป‰เบญเบโ€‹เบšเปเปˆโ€‹เปเบ™เปˆโ€‹เปƒเบˆ) เบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†เบ—เบตเปˆเบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐ "เบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบฑเบ™เป‚เบซเบ”เบฎเป‰เบฒเบเบ™เบตเป‰เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ."

เบชเปเบฒเบฅเบฑเบšเบ„เบปเบ™เบญเบทเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, syntax เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆ "key = value" (เปเบฅเบฐเบฎเบนเป‰เบซเบ™เบฑเบ‡เบชเบทเบชเบญเบ‡เบชเบฒเบกเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ, เป€เบŠเบฑเปˆเบ™ = [เบšเบฒเบ‡เบญเบฑเบ™, เบญเบฑเบ™เบ™เบฑเป‰เบ™, เบญเบฒเป€เบฃ]) เบ‚เป‰เบญเบโ€‹เป€เบ”เบปเบฒโ€‹เบงเปˆเบฒ
เบชเบฐเบ”เบงเบ intuitively.
เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบกเปˆเบ™เบงเปˆเบฒ "เป€เบœเบปเบฒ" เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ (เบ›เบฐเบกเบฒเบ™ 2013). เบžเบฝเบ‡เปเบ•เปˆ, เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบšเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡ TOML เป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ•เบญเบ™เบ™เบตเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบเบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเบ—เบตเปˆเบˆเบฐเบ›เบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™เปƒเบซเป‰เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ•เบปเบงเบ‚เป‰เบญเบเป€เบญเบ‡, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เปƒเบ™เบ—เบฒเบ‡เบเบฑเบšเบเบฑเบ™.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒ TOML (เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš Windows INI เป€เบเบปเปˆเบฒ). เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบŠเบธเบ”เบ‚เบญเบ‡ hook เบ‚เบถเป‰เบ™เบเบฑเบšเบŠเบธเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบชเบฐเปเบเบ™เบซเบฅเป‰เบฒเบชเบธเบ”เบˆเบฒเบเปเบ›เป‰เบ™เบžเบดเบก. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰, เบชเบดเป‰เบ™เป‚เบ”เบเบชเบดเป‰เบ™, เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบกเบฒเป€เบ–เบดเบ‡เบ•เบญเบ™เบ™เบฑเป‰เบ™. เปเบฅเบฐเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ‚เป‰เบญเบเบˆเบถเปˆเบ‡เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเปเบšเบšเบ™เบตเป‰.

0. เบšเบปเบ”เบ„เบฑเบ”เบซเบเปเป‰เบžเบทเป‰เบ™เบ–เบฒเบ™

  • เบชเบฐเปเบเบ™เบฅเบฐเบซเบฑเบ”เบญเบญเบเปเบšเบš. เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปเบ™เปˆเบ™เบญเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบฅเบฐเบซเบฑเบ”เบ”เบดเบˆเบดเบ•เบญเบ™เปเบกเปˆเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เบ‚เบญเบ‡เบกเบฐเบ™เบธเบ”เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡ (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ‚เป‰เบญเบเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. loloswitcher).
    เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเบฑเปˆเบ™ "ecodes.go" เบˆเบฒเบ "golang-evdev" (เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เบตเป‰เบเบฝเบ”เป€เบเบตเบ™เป„เบ›เบ—เบตเปˆเบˆเบฐเป€เบšเบดเปˆเบ‡เปเบซเบผเปˆเบ‡เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบœเบนเป‰เบ‚เบฝเบ™เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบกเบฑเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบงเบฑเบ”เบ—เบฐเบ™เบฐเบ—เปเบฒ). เป€เบฅเบฑเบเบ™เป‰เบญเบ (เบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™) เปเบเป‰เป„เบ‚เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบขเป‰เบฒเบ™เบเบปเบงเบซเบผเบฒเบ. เบกเบฑเบ โ€œLEFTBRACEโ€ โ†’ โ€œL_BRACEโ€.
  • เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบฅเบฒเบงเป„เบ”เป‰เปเบ™เบฐเบ™เปเบฒเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ "เบเบฐเปเบˆเบ‚เบญเบ‡เบฅเบฑเบ”". เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเป„เบงเบเบฒเบเบญเบ™เบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเปƒเบŠเป‰เบšเปเปˆเป„เบ”เป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบชเปเบฒเบฅเบฑเบš passages เบเบฒเบง. (เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เปˆเบฒโ€‹เปƒเบŠเป‰โ€‹เบˆเปˆเบฒเบโ€‹เบซเบ™เป‰เบญเบโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ”โ€‹. เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เปƒเบŠเป‰โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบ "เบเบปเบ‡โ€‹"โ€‹.
  • เบˆเบฐเบกเบตเบ•เบปเบงเบชเป‰เบฒเบ‡ "เบ•เบปเบงเบซเบเปเป‰" เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ–เบทเบเบเบปเบ”เบ”เบฑเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบฅเบฑเบ” "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. เบˆเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เปเบ™เบงโ€‹เปƒเบ”โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบšเบฒเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบ–เบทเบโ€‹เบ„เบฅเบดเบ (เบฅเบฐโ€‹เบซเบฑเบ” scan เบญเบทเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบกเบฒโ€‹เป€เบ–เบดเบ‡โ€‹)

[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).
เบžเบฒเบเปƒเบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ•เบทเปˆเบก array เบ”เป‰เบงเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆ "เบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”". เปƒเบ™ 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"

เปเบ–เบงเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบขเบนเปˆเปƒเบ™เบงเบปเบ‡เป€เบฅเบฑเบšเบชเบญเบ‡เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ‚เบญเบ‡เบกเบฑเบ™. เบกเบฑเบ™โ€‹เบšเปเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ‡เปˆเบฒเบโ€‹เบ‚เบถเป‰เบ™โ€‹เบญเบญเบโ€‹เบˆเบฒเบ bat เป„เบ”เป‰โ€‹. เบญเบตเบ‡เบ•เบฒเบกเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ—เบตเปˆเป€เบ›เบตเบ”เปƒเบŠเป‰เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบทเบญเบเบ•เบปเบงเป€เบฅเบทเบญเบเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบŠเบธเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เบ‚เบญเบ‡ "เบเบฐเปเบˆเบฎเป‰เบญเบ™" "เบเบฒเบ™เบเบฐเบ—เปเบฒ = ... ". เบ–เป‰เบฒเบšเปเปˆ / เบซเบงเปˆเบฒเบ‡, เบšเปเปˆเป€เบฎเบฑเบ”เบซเบเบฑเบ‡.
  • เบ›เปˆเบฝเบ™ โ€œMouseClickDropsโ€ - เบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เป€เบกเบทเปˆเบญเบเบงเบ”เบžเบปเบšเบเบฒเบ™เบ„เบฅเบดเบเป€เบกเบปเป‰เบฒ. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบขเบนเปˆเปƒเบ™เบˆเบธเบ”เบ—เบตเปˆ xswitcher เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰, เบšเปเปˆเบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบš "เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบ„เบฅเบดเบ", เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ buffer เปƒเบซเบกเปˆเบ•เบฒเบกเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เปเบ•เปˆเปƒเบ™ terminals (เบ•เบปเบงเบขเปˆเบฒเบ‡) เบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปเบ™เบงเบ™เบตเป‰ (เบ›เบปเบเบเบฐเบ•เบด).

4. เบฅเปเบฒเบ”เบฑเบšเบซเบ™เบถเปˆเบ‡ (เบซเบผเบทเบซเบผเบฒเบ) เบ‚เบญเบ‡เบเบฒเบ™เบ„เบฅเบดเบเบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบซเบ™เบถเปˆเบ‡เบซเบผเบท hook เบญเบทเปˆเบ™

# 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)" ]

Hooks เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบชเบญเบ‡เบ›เบฐเป€เบžเบ”. Built-in, เบกเบตเบŠเบทเปˆ "เป€เบงเบปเป‰เบฒ" (NewWord, NewSentence, Compose) เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เป‚เบ„เบ‡เบเบฒเบ™เป„เบ”เป‰.

เบŠเบทเปˆเป‚เบ„เบ‡เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ "เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”." เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ TOML v1.4, เบŠเบทเปˆเบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ•เป‰เบญเบ‡เบขเบนเปˆเปƒเบ™เบงเบปเบ‡เบขเบทเบก.

เปเบ•เปˆเบฅเบฐเบžเบฒเบเบ„เบงเบ™เบˆเบฐเบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰ เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ”เบฝเบงเบเบฑเบ™.

เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบˆเบดเบ”เปƒเบˆเบ‚เบญเบ‡เบ›เบฐเบŠเบฒเบŠเบปเบ™เบเบฑเบš "naked" เบ›เบปเบเบเบฐเบ•เบด (เบˆเบฒเบเบ›เบฐเบชเบปเบšเบเบฒเบ™, เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ to writeเบšเบฒเบ‡เบ—เบตเบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบดเบš เบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™), เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ—เบฑเบ™เบ—เบตเบ›เบฐเบ•เบดเบšเบฑเบ” syntax เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

  • "เบ›เบดเบ”:" (เบซเบผเบท "เป€เบ›เบตเบ”:") เบเปˆเบญเบ™ regexp (เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ›เบปเบเบเบฐเบ•เบด) เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบ›เบธเปˆเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒ (เบซเบผเบทเบเบปเบ”).
    เบ•เปเปˆเป„เบ›เบ‚เป‰เบญเบเบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเป€เบ›เบฑเบ™เบ›เบปเบเบเบฐเบ•เบด "เบšเปเปˆเบเบธเบ”เบ•เบดเบ—เปเบฒ". เบกเบตเบเบฒเบ™เบเบงเบ”เบชเบญเบšเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ‚เบญเบ‡เบ•เปˆเบญเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ—เปเปˆ "|". เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบšเบฑเบ™เบ—เบถเบเป€เบŠเบฑเปˆเบ™ "[LR]_SHIFT" (เบšเปˆเบญเบ™เบ—เบตเปˆเบญเบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™).
  • "SEQ:" เบ–เป‰เบฒเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰ (เบซเบผเบทเบšเปเปˆเบกเบต), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ›เบปเบเบเบฐเบ•เบด "เบ›เบปเบเบเบฐเบ•เบด". เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”, เบ‚เป‰เบญเบเบชเบปเปˆเบ‡เป„เบ›เบ—เบตเปˆ ^W เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ” โ€œregexpโ€ เบ—เบฑเบ™เบ—เบต. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰ bothered เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบš pcre favorite เบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ ("perl compatible").
  • เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเปเบกเปˆเบ™เบ‚เบฝเบ™เปƒเบ™เบฎเบนเบšเปเบšเบš "BUTTON_1: CODE1, BUTTON_2: CODE2" เปเบฅเบฐเบญเบทเปˆเบ™เป†, เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบซเบฑเบ”เบชเบฐเปเบเบ™.
  • เบเบฒเบ™เบเบงเบ”เบชเบญเบšเปเบกเปˆเบ™เบชเบฐเป€เบซเบกเบต "snuged" เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบฅเปเบฒเบ”เบฑเบš, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก "$" เปƒเบชเปˆเบซเบฒเบ‡.
  • เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบซเบ™เบถเปˆเบ‡เป€เบชเบฑเป‰เบ™เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เบถเปˆเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบญเบทเปˆเบ™ เปเบฅเบฐเบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป‚เบ”เบ "เบ‚เป‰เบญเบ". เปเบ•เปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เปˆเบฒเบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเป€เบ›เบฑเบ™ array, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบซเบผเบฑเบ‡เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบˆเบธเบ”. เบ–เป‰เบฒเบ™เบตเป‰เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡.
  • เบกเบนเบ™เบ„เปˆเบฒ "SeqLength = 8" เบˆเปเบฒโ€‹เบเบฑเบ”โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เบญเบ‡ buffer เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบ‚เป‰เบญเบเบกเบต (เบˆเบปเบ™เบเปˆเบงเบฒเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™) เบšเปเปˆเป€เบ„เบตเบเบžเบปเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ—เบตเปˆเบชเบดเป‰เบ™เบชเบธเบ”เปƒเบ™เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ.

5. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ hooks เบญเบฐเบ—เบดเบšเบฒเบเปƒเบ™เบžเบฒเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ

# 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.

เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™ "เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” = [เบญเบฒเป€เบฃ]". เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบžเบฒเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบกเบตเบเบฒเบ™เบˆเปเบฒเบเบฑเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปƒเบ™. เปเบฅเบฐเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡ docking เปเบกเปˆเบ™เบšเปเปˆเบˆเปเบฒเบเบฑเบ”เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™ (เบ‚เบฝเบ™ โ€œAction.XXXโ€ เปเบฅเบฐเบขเปˆเบฒเบ‚เบตเป‰เบ„เป‰เบฒเบ™เป€เบเบตเบ™เป„เบ›เบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบžเบฒเบเบญเบทเปˆเบ™เปƒเบซเป‰เบกเบฑเบ™).
เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบเบฒเบ™เบžเบดเบกเบ„เบทเบ™เบ‚เบญเบ‡เบ„เปเบฒเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบ–เบทเบเปเบเป‰เป„เบ‚เปเบกเปˆเบ™เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบชเบญเบ‡เบชเปˆเบงเบ™: "เบ›เปˆเบฝเบ™เบฎเบนเบšเปเบšเบšเบ•เบฒเบกเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰" ะธ "เบžเบดเบกเปƒเบซเบกเปˆ" ("RetypeWord").

เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เบ‚เบฝเบ™เปƒเบชเปˆ "เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบก" ("เปเบœเบ™เบ—เบตเปˆ" เปƒเบ™ golang) เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ”เบซเบ™เบถเปˆเบ‡, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ "เบเบฒเบ™เบเบฐเบ—เปเบฒ".

เบเบฒเบ™เบเบฐเบ—เบณเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบเบญเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เปœเบถเปˆเบ‡ heap (เบžเบฒเบเบชเปˆเบงเบ™). เบซเบผเบทเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เบถเบ‡เบกเบฑเบ™เบญเบญเบเบˆเบฒเบเบเบฑเบ™. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

เบ‚เป‰เบญเบเบ•เบฑเป‰เบ‡เบเบฒเบ™เบเบฐ เบ—เบณ "Exec" เบ—เบฑเบ™เบ—เบตเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฐเบ„เบดเบšเบžเบฒเบเบ™เบญเบ. เบ”เป‰เบงเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเบเบนเป‰ buffer เบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ stdin.

  • โ€œเบฅเปเบ–เป‰เบฒ = 1โ€ โ€” เบฅเปเบ–เป‰เบฒเปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบฅเปˆเบ™เบชเบณเป€เบฅเบฑเบ”.
  • เบญเบฒเบ”เบˆเบฐ, "เป„เบ› heap" เป€เบˆเบปเป‰เบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบปเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก. เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เป€เบŠเบฑเปˆเบ™โ€‹เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เบซเป‰เบญเบ‡โ€‹เบ›เปˆเบญเบ‡โ€‹เบขเป‰เบฝเบกโ€‹เบˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เบกเบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบชเบฐโ€‹เบเบฑเบ”โ€‹.
    โ€œเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบšเป? เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เป„เบ›.โ€

Phew (exhaled). เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบฅเบทเบกเบซเบเบฑเบ‡เป€เบฅเบตเบ.

เบญเบธเบ! เปเบกเปˆเบ™เปเบฅเป‰เบง, เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบฅเบทเบก ...
เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบขเบนเปˆเปƒเบช? เปƒเบ™เบฅเบฐเบซเบฑเบ”เบเบฒเบ? เป€เบŠเบฑเปˆเบ™เบงเปˆเบฒ:

[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.

เบ‚เป‰เบญเบเบฅเบทเบก/เป€เบฎเบฑเบ”เบœเบดเบ”เบขเบนเปˆเปƒเบช? (เบšเปเปˆเบกเบตเบ—เบฒเบ‡เบ™เบตเป‰), เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบซเบงเบฑเบ‡โ€‹เบงเปˆเบฒโ€‹เบœเบนเป‰โ€‹เบญเปˆเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เป€เบญเบปเบฒโ€‹เปƒเบˆโ€‹เปƒเบชเปˆโ€‹เบˆเบฐโ€‹เบšเปเปˆ lazy เป€เบเบตเบ™โ€‹เป„เบ›โ€‹เป€เบžเบทเปˆเบญ pooke เบ”เบฑเบ‡โ€‹เบ‚เบญเบ‡โ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹.

เป‚เบŠเบเบ”เบต!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™