Linux เชฎเชพเชŸเซ‡ Xswitcher เชฒเซ‡เช†เช‰เชŸ เชธเซเชงเชพเชฐเช•: เชชเช—เชฒเซเช‚ เชฌเซ‡

เชคเซเชฏเชพเชฐเชฅเซ€ เชชเชพเช›เชฒเซเช‚ เชชเซเชฐเช•เชพเชถเชจ (xswitcher เช–เซเชฏเชพเชฒเชจเชพ เชชเซเชฐเชพเชตเชพเชจเชพ เชคเชฌเช•เซเช•เซ‡) เชจเซ‡ เช˜เชฃเซ‹ เชฐเชšเชจเชพเชคเซเชฎเช• เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเชณเซเชฏเซ‹. (เชœเซ‡ เชธเชฐเชธ เช›เซ‡), เชฎเซ‡เช‚ เชฎเชพเชฐเซ‹ เช–เชพเชฒเซ€ เชธเชฎเชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เชตเชฟเชคเชพเชตเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซเชฏเซเช‚. เชนเชตเซ‡ เชนเซเช‚ เชคเชฎเชพเชฐเชพเชฎเชพเช‚เชฅเซ€ เชฅเซ‹เชกเซ‹ เช–เชฐเซเชš เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚... เชฌเซ€เชœเซเช‚ เชชเช—เชฒเซเช‚ เชฅเซ‹เชกเซเช‚ เช…เชธเชพเชฎเชพเชจเซเชฏ เชนเชถเซ‡: เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชกเชฟเชเชพเช‡เชจเชจเซ‹ เชชเซเชฐเชธเซเชคเชพเชต เชฎเซ‚เช•เชตเซ‹/เชšเชฐเซเชšเชพ เช•เชฐเชตเซ€.

Linux เชฎเชพเชŸเซ‡ Xswitcher เชฒเซ‡เช†เช‰เชŸ เชธเซเชงเชพเชฐเช•: เชชเช—เชฒเซเช‚ เชฌเซ‡

เช•เซ‹เชˆเช• เชฐเซ€เชคเซ‡ เชเชตเซเช‚ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเซ‹เชจเซ‡ เช† เชฌเชงเชพ เชจเซ‹เชฌเซเชธเชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซเช‚ เช–เซ‚เชฌ เชœ เช•เช‚เชŸเชพเชณเชพเชœเชจเช• เชฒเชพเช—เซ‡ เช›เซ‡.

เชจเชฟเชฐเชพเชงเชพเชฐ เชจ เชฐเชนเซ‡เชตเชพ เชฎเชพเชŸเซ‡, เชนเซเช‚ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚ เชคเซ‡เชจเซเช‚ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เช…เชนเซ€เช‚ เช›เซ‡.
เช…เชชเชพเชšเซ‡ เช•เชพเชซเช•เชพ เช…เชจเซ‡ เชเซ‚เช•เซ€เชชเชฐ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชกเชฟเชเชพเช‡เชจ (เช…เชจเซ‡ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชพเชฏเซ‡เชฒ) เชนเซ‹เชฏ เช›เซ‡.
โ€” เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ? เชชเชฃ เชคเซ‡ เช•เช‚เชŸเชพเชณเชพเชœเชจเช• เช›เซ‡! เชซเช•เซเชค เชฅเซ‹เชกเซเช‚ เชธเซเชฒเซ‡เชชเชกเซ‡เชถ XML (เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ "เช†เช‰เชŸ เช“เชซ เชง เชฌเซ‹เช•เซเชธ" เช›เซ‡).
โ€” เช“เชน, เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‡ เชชเชฃ ACL เชœเซ‹เชˆเช เช›เซ‡? เชชเชฃ เช เชคเซ‹ เชฌเชนเซ เชฎเซเชถเซเช•เซ‡เชฒเซ€เชญเชฐเซเชฏเซเช‚ เช›เซ‡! เชฅเชชเซเชชเชก-เชฅเชชเซเชชเชก... เช•เช‚เชˆเช• เช†เชตเซเช‚ เชœ.

เช…เชจเซ‡ เชฎเชพเชฐเชพ เช•เชพเชฎเชฎเชพเช‚ เชฌเชฟเชฒเช•เซเชฒ เชตเชฟเชชเชฐเซ€เชค เช›เซ‡. เชคเซ‡ เชธเชพเชšเซเช‚ เช›เซ‡. (เช…เชฐเซ‡, เชชเชนเซ‡เชฒเซ€ เชตเชพเชฐ เช†เชตเซเช‚ เชฒเช—เชญเช— เช•เซเชฏเชพเชฐเซ‡เชฏ เชฅเชคเซเช‚ เชจเชฅเซ€) เชฌเชจเชพเชตเซ‡เชฒ เชฎเซ‹เชกเซ‡เชฒ เชตเชงเซ เชธเชฐเชณ เช…เชจเซ‡ เช†เชฐเชพเชฎเชฆเชพเชฏเช• เชฌเชจเชพเชตเซ‡ เช›เซ‡ (เชฒเช—เชญเช—) เชธเชฐเซเช•เชฟเชŸ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ‹.

เชฎเชจเซ‡ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชนเซ‡เชฌเชฐ เชชเชฐ เชกเซ‡เชŸเชพ เชตเซˆเชœเซเชžเชพเชจเชฟเช•เซ‹เชจเชพ เชฎเซเชถเซเช•เซ‡เชฒ เช•เชพเชฐเซเชฏ เชตเชฟเชถเซ‡ เชเช• เชฒเซ‡เช– เชฎเชณเซเชฏเซ‹...
เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡เช“ เช† เชชเชพเชธเชพเชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€ เชฐเชนเซเชฏเชพ เช›เซ‡. เชฎเชพเชฐเชพ เช…เชจเซเชญเชตเชฎเชพเช‚, เชœเซ‡เชฎ เชคเซ‡เช“ เช•เชนเซ‡ เช›เซ‡, เชคเซ‡ เชเช• "เชนเชณเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ" เช›เซ‡. เชฎเชฒเซเชŸเซ€-เชตเซ‹เชฒเซเชฏเซเชฎ เชฎเซ‹เชกเซ‡เชฒเซเชธ, เชคเซˆเชฏเชพเชฐ OOP เชธเชพเชฅเซ‡ เช…เชจเซเชญเชตเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเซเชธ, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชตเชงเซ - เช† เชฌเชงเซเช‚ เชชเช›เซ€เชฅเซ€ เช†เชตเชถเซ‡, เชœเซเชฏเชพเชฐเซ‡/เชœเซ‹ เชคเซ‡ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡. เชชเชฐเช‚เชคเซ เชกเชฟเชเชพเช‡เชจเชฐเชจเซ‡ เช…เชนเซ€เช‚ เช…เชจเซ‡ เชนเชฎเชฃเชพเช‚ เชœ เช•เซเชฏเชพเช‚เช•เชฅเซ€ เชถเชฐเซ‚เช†เชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชšเชพเชฒเซ‹ เชฎเซเชฆเซเชฆเชพ เชชเชฐ เช†เชตเซ€เช. เชฎเซ‡เช‚ เชตเชพเช•เซเชฏเชฐเชšเชจเชพเชจเชพ เช†เชงเชพเชฐ เชคเชฐเซ€เช•เซ‡ TOML เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹. เช† เชจเชพเช—เชฐเชฟเช• เชคเชฐเชซเชฅเซ€.

เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เช›เซ‡ (TOML) เชเช• เชคเชฐเชซ, เชคเซ‡ เชฎเชพเชจเชต-เชธเช‚เชชเชพเชฆเชจเช•เซเชทเชฎ เช›เซ‡. เชฌเซ€เชœเซ€ เชคเชฐเชซ, เชคเซ‡ 1:1 เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชธเชพเชฎเชพเชจเซเชฏ เชตเชพเช•เซเชฏเชฐเชšเชจเชพเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆเชฟเชค เช•เชฐเซ‡ เช›เซ‡: XML, JSON, YAML.
เชตเชงเซเชฎเชพเช‚, เชฎเซ‡เช‚ โ€œgithub.com/BurntSushi/tomlโ€ เชฎเชพเช‚เชฅเซ€ เชœเซ‡ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เช›เซ‡, เชคเซ‡ เชธเซŒเชฅเซ€ เชซเซ‡เชถเชจเซ‡เชฌเชฒ เชจเชฅเซ€ (เชนเชœเซ€ เชชเชฃ 1.4 เชธเชฟเชจเซเชŸเซ‡เช•เซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡), เชคเซ‡ เชธเชฎเชพเชจ ("เชฌเชฟเชฒเซเชŸ-เช‡เชจ") JSON เชธเชพเชฅเซ‡ เชธเชฟเชจเซเชŸเซ‡เช•เซเชŸเชฟเช•เชฒเซ€ เชธเซเชธเช‚เช—เชค เช›เซ‡.

เชเชŸเชฒเซ‡ เช•เซ‡, เชœเซ‹ เชคเชฎเซ‡ เช‡เชšเซเช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เชซเช•เซเชค "เชคเชฎเชพเชฐเชพ TOML เชธเชพเชฅเซ‡ เชจเชฐเช•เชฎเชพเช‚ เชœเชพเช“, เชฎเชจเซ‡ XXX เชœเซ‹เชˆเช เช›เซ‡" เช•เชนเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชซเช•เซเชค เชเช• เชœ เชฒเชพเช‡เชจเชฅเซ€ เช•เซ‹เชกเชจเซ‡ "เชชเซ‡เชš" เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เช†เชฎ, เชœเซ‹ เชคเชฎเซ‡ xswitcher เชจเซ‡ เช—เซ‹เช เชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡เชŸเชฒเซ€เช• เชตเชฟเชจเซเชกเซ‹เช เชฒเช–เชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹ (เชšเซ‹เช•เซเช•เชธ เชนเซเช‚ เชจเชนเซ€เช‚) "เชคเชฎเชพเชฐเชพ เช† เช…เชฆเซเชญเซเชค เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ" เชธเชพเชฅเซ‡ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชจเชฅเซ€.

เชฌเซ€เชœเชพ เชฌเชงเชพ เชฎเชพเชŸเซ‡, เชตเชพเช•เซเชฏเชฐเชšเชจเชพ "เช•เซ€ = เชฎเซ‚เชฒเซเชฏ" เช†เชงเชพเชฐเชฟเชค เช›เซ‡. (เช…เชจเซ‡ เชถเชพเชฌเซเชฆเชฟเช• เชฐเซ€เชคเซ‡ เชฅเซ‹เชกเชพ เชตเชงเซ เชœเชŸเชฟเชฒ เชตเชฟเช•เชฒเซเชชเซ‹, เชœเซ‡เชฎ เช•เซ‡ = [เช•เซ‡เชŸเชฒเชพเช•, เชเชฐเซ‡]) เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡
เชธเชพเชนเชœเชฟเช• เชฐเซ€เชคเซ‡ เช…เชจเซเช•เซ‚เชณ.
เชฐเชธเชชเซเชฐเชฆ เชตเชพเชค เช เช›เซ‡ เช•เซ‡ เชคเซ‡ เชชเซ‹เชคเซ‡ "เชฌเชณเซเชฏเซเช‚" เชฒเช—เชญเช— เชคเซ‡ เชœ เชธเชฎเชฏเซ‡ (เชฒเช—เชญเช— เซจเซฆเซงเซฉ). เชœเซ‹เช•เซ‡, เชฎเชพเชฐเชพเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, TOML เชจเชพ เชฒเซ‡เช–เช•เซ‡ เชฏเซ‹เช—เซเชฏ เช…เชตเช•เชพเชถ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚.

เชเชŸเชฒเชพ เชฎเชพเชŸเซ‡ เชนเชตเซ‡ เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‡ เชฎเชพเชฐเซ€ เชœเชพเชคเชจเซ‡ เช…เชจเซเช•เซ‚เชณ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชธเชฐเชณ เชฌเชจเซเชฏเซเช‚ เช›เซ‡, เชคเซ‡เชจเชพเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค.

เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เช†เชชเชฃเซ‡ TOML เชฒเชˆเช เช›เซ€เช (เชœเซ‚เชจเชพ Windows INI เชœเซ‡เชตเซเช‚ เชœ). เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชฌเชจเชพเชตเซ€เช เช›เซ€เช เชœเซ‡เชฎเชพเช‚ เช†เชชเชฃเซ‡ เช•เซ€เชฌเซ‹เชฐเซเชกเชฎเชพเช‚เชฅเซ€ เชฆเชพเช–เชฒ เช•เชฐเซ‡เชฒเชพ เชจเชตเซ€เชจเชคเชฎ เชธเซเช•เซ‡เชจ เช•เซ‹เชกเชจเชพ เช†เชงเชพเชฐเซ‡ เชนเซเช•เซเชธเชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเซ‹เชกเชตเซ€ เชคเซ‡เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เช เช›เซ€เช. เชจเซ€เชšเซ‡, เชŸเซเช•เชกเชพเช“เชฎเชพเช‚, เช†เชชเชฃเซ€ เชชเชพเชธเซ‡ เช…เชคเซเชฏเชพเชฐ เชธเซเชงเซ€ เชถเซเช‚ เช›เซ‡ เชคเซ‡ เช›เซ‡. เช…เชจเซ‡ เชฎเซ‡เช‚ เช† เชฐเซ€เชคเซ‡ เช•เซ‡เชฎ เชจเชฟเชฐเซเชฃเชฏ เชฒเซ€เชงเซ‹ เชคเซ‡เชจเซเช‚ เชธเชฎเชœเซ‚เชคเซ€.

0. เชฎเซ‚เชณเชญเซ‚เชค เช…เชฎเซ‚เชฐเซเชคเชคเชพ

  • เชธเซเช•เซ‡เชจ เช•เซ‹เชก เชนเซ‹เชฆเซเชฆเซ‹. เช† เชตเชฟเชถเซ‡ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เช•เช‚เชˆเช• เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชซเช•เซเชค เชกเชฟเชœเชฟเชŸเชฒ เช•เซ‹เชก เชœ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เชพเชคเชพ เชจเชฅเซ€ (เชนเซเช‚ เชซเช•เซเชค เช•เชŸเชพเช•เซเชท เช•เชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚). เชฒเซ‹เชฒเซ‹เชธเซเชตเชฟเชšเชฐ).
    เชฎเซ‡เช‚ "golang-evdev" เชฎเชพเช‚เชฅเซ€ "ecodes.go" เช•เชพเชขเซเชฏเซเช‚ (เชฒเซ‡เช–เช•เซ‡ เช–เซ‚เชฌ เชœ เชจเชฎเซเชฐเชคเชพเชชเซ‚เชฐเซเชตเช• เชคเซ‡เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชนเซเช‚ เชธเซ‹เชฐเซเชธ เช•เซ‹เชกเชฎเชพเช‚ เช–เซ‹เชฆเช•เชพเชฎ เช•เชฐเชตเชพเชฎเชพเช‚ เช–เซ‚เชฌ เช†เชณเชธเซ เชนเชคเซ‹). เชฎเซ‡เช‚ (เชนเชพเชฒ เชฎเชพเชŸเซ‡) เช•เช‚เชˆเช• เชเชตเซเช‚ เชธเซเชงเชพเชฐเซเชฏเซเช‚ เชœเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช•เชฆเชฐเซ‚เชชเซเช‚ เชนเชคเซเช‚. เชœเซ‡เชฎ เช•เซ‡ "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])"

เชงเซเชตเชจเซเชฏเชพเชคเซเชฎเช• เชธเช‚เช•เซ‡เชค เชธเชพเชฅเซ‡ เชฎเชพเชจเชต เชญเชพเชทเชพเชจเชพ เชถเชฌเซเชฆเชฎเชพเช‚ เชถเซเช‚ เชนเซ‹เชฏ เช›เซ‡? (เช—เซเชฐเชพเชซเซ€เชฎเซเชธ, เช‰เชฐเซเชซเซ‡ "เชนเชพเชฏเชฐเซ‹เช—เซเชฒเชฟเชซเซเชธ," เชเช• เช…เชฒเช— เชฌเชพเชฌเชค เช›เซ‡)? เช•เซ‡เชŸเชฒเซ€ เชญเชฏเช‚เช•เชฐ "เชถเซ€เชŸ" เช›เซ‡. เชคเซ‹ เชนเซเช‚ เชคเชฐเชค เชœ "เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸ" เชจเซ€ เชตเชฟเชญเชพเชตเชจเชพ เชฐเชœเซ‚ เช•เชฐเซเช‚ เช›เซเช‚.

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

เช•เซเชฒ เซญเซฌเซฎ เช•เซ‹เชก เช›เซ‡. (เชชเชฐเช‚เชคเซ "เชฎเชพเชคเซเชฐ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚" เชฎเซ‡เช‚ 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 เชธเช•เซเชทเชฎเชคเชพ เชฌเชฟเช‚เชฆเซ เช•เซ‹เชˆ เชšเซ‹เช•เซเช•เชธ เช•เซเชฒเชฟเช• เชธเซเชฅเชพเชจเซ‹เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชคเซเช‚ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เชกเชฟเชซเซ‹เชฒเซเชŸ เชตเชฐเซเชคเชฃเซ‚เช• เชฌเชซเชฐเชจเซ‡ เชซเซเชฒเชถ เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชŸเชฐเซเชฎเชฟเชจเชฒเซเชธเชฎเชพเช‚ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡), เช† เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€. (เชจเชฟเชฏเชฎ เชชเซเชฐเชฎเชพเชฃเซ‡).

เซช. เช•เซเชฒเชฟเช•เซเชธเชจเชพ เชเช• (เช…เชฅเชตเชพ เชตเชงเซ) เช•เซเชฐเชฎ เชšเซ‹เช•เซเช•เชธ เชนเซ‚เช• เชฒเซ‹เชจเซเชš เช•เชฐเซ‡ เช›เซ‡

# 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:" เชœเซ‹ เชชเชนเซ‡เชฒเชพเชจเซ€ เชถเชฐเชค เชชเซ‚เชฐเซ€ เชฅเชพเชฏ (เช…เชฅเชตเชพ เช—เซ‡เชฐเชนเชพเชœเชฐ เชนเซ‹เชฏ), เชคเซ‹ เช†เชชเชฃเซ‡ เช†เช—เชณ "เชจเชฟเชฏเชฎเชฟเชค" เชจเชฟเชฏเชฎเชฟเชค เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ เชธเชพเชฎเซ‡ เชคเชชเชพเชธ เช•เชฐเซ€เชถเซเช‚. เชตเชงเซ เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡, เชนเซเช‚ เชคเชฎเชจเซ‡ เชธเซ€เชงเชพ "regexp" เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชฎเชพเช‚ เชฎเซ‹เช•เชฒเซ€เชถ. เช•เชพเชฐเชฃ เช•เซ‡ เชฎเซ‡เช‚ เชนเชœเซ เชธเซเชงเซ€ เชฎเชพเชฐเชพ เชฎเชจเชชเชธเช‚เชฆ pcre ("perl compatible") เชธเชพเชฅเซ‡ เชธเซเชธเช‚เช—เชคเชคเชพเชจเซ€ เชกเชฟเช—เซเชฐเซ€ เชถเซ‹เชงเชตเชพเชจเซ€ เชคเชธเซเชฆเซ€ เชฒเซ€เชงเซ€ เชจเชฅเซ€.
  • เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ เช† เชฐเซ€เชคเซ‡ เชฒเช–เชพเชฏเซ‡เชฒ เช›เซ‡ "BUTTON_1: CODE1, BUTTON_2: CODE2" เชตเช—เซ‡เชฐเซ‡, เชธเซเช•เซ‡เชจ เช•เซ‹เชกเซเชธ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เช•เซเชฐเชฎเชฎเชพเช‚.
  • เชšเซ‡เช• เชนเช‚เชฎเซ‡เชถเชพ เช•เซเชฐเชฎเชจเชพ เช…เช‚เชค เชธเซเชงเซ€ "เชฆเชฌเชพเชตเชตเชพเชฎเชพเช‚" เช†เชตเซ‡ เช›เซ‡., เชคเซ‡เชฅเซ€ เชชเซ‚เช‚เช›เชกเซ€เชฎเชพเช‚ "$" เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.
  • เชเช• เชฒเชพเช‡เชจเชฎเชพเช‚ เชฌเชงเชพ เชšเซ‡เช• เชเช• เชชเช›เซ€ เชเช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชจเซ‡ "AND" เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเซ‹เชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชฎเซ‚เชฒเซเชฏเชจเซ‡ เชเชฐเซ‡ เชคเชฐเซ€เช•เซ‡ เชตเชฐเซเชฃเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฒเซเชชเชตเชฟเชฐเชพเชฎ เชชเช›เซ€ เชตเซˆเช•เชฒเซเชชเชฟเช• เชšเซ‡เช• เชฒเช–เซ€ เชถเช•เชพเชฏ เช›เซ‡. เชœเซ‹ เช•เซ‹เชˆ เช•เชพเชฐเชฃเซ‹เชธเชฐ เชคเซ‡ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ.
  • เช•เชฟเช‚เชฎเชค "เชธเซ‡เช•เชฒเซ‡เชจเซเชฅ = 8" เชฌเชซเชฐเชจเชพ เช•เชฆเชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชจเซ€ เชธเชพเชฎเซ‡ เชฌเชงเซ€ เชคเชชเชพเชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช•เชพเชฐเชฃ เช•เซ‡ เชฎเชพเชฐเชพ เชœเซ€เชตเชจเชฎเชพเช‚ (เช…เชคเซเชฏเชพเชฐ เชธเซเชงเซ€) เชฎเซ‡เช‚ เช•เซเชฏเชพเชฐเซ‡เชฏ เช…เชจเช‚เชค เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเซเชฏเซ‹ เชจเชฅเซ€.

เซซ. เช…เช—เชพเช‰เชจเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชนเซเช•เซเชธ เชธเซ‡เชŸ เช•เชฐเชตเชพ

# 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