เจฒเฉ€เจจเจ•เจธ เจฒเจˆ Xswitcher เจฒเฉ‡เจ†เจ‰เจŸ เจธเฉเจงเจพเจฐเจ•: เจ•เจฆเจฎ เจฆเฉ‹

เจฒเฉˆ เจชเจฟเจ›เจฒเฉ‡ เจชเฉเจฐเจ•เจพเจธเจผเจจ ("เจธเฉฐเจ•เจฒเจช เจฆเจพ เจธเจฌเฉ‚เจค" เจชเฉœเจพเจ… 'เจคเฉ‡ xswitcher) เจจเฉ‚เฉฐ เจ•เจพเจซเจผเฉ€ เจฐเจšเจจเจพเจคเจฎเจ• เจซเฉ€เจกเจฌเฉˆเจ• เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ‡เจ† เจนเฉˆ (เจœเฉ‹ เจตเจงเฉ€เจ† เจนเฉˆ), เจฎเฉˆเจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ†เจชเจฃเจพ เจ–เจพเจฒเฉ€ เจธเจฎเจพเจ‚ เจฌเจฟเจคเจพเจ‰เจฃเจพ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฟเจ†เฅค เจนเฉเจฃ เจฎเฉˆเจ‚ เจคเฉเจนเจพเจกเจพ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจ–เจฐเจš เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ ... เจฆเฉ‚เจœเจพ เจ•เจฆเจฎ เจฌเจนเฉเจค เจ†เจฎ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ: เจธเฉฐเจฐเจšเจจเจพ เจกเจฟเจœเจผเจพเจˆเจจ เจฆเจพ เจชเฉเจฐเจธเจคเจพเจต/เจšเจฐเจšเจพเฅค

เจฒเฉ€เจจเจ•เจธ เจฒเจˆ Xswitcher เจฒเฉ‡เจ†เจ‰เจŸ เจธเฉเจงเจพเจฐเจ•: เจ•เจฆเจฎ เจฆเฉ‹

เจ•เจฟเจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจ‡เจน เจชเจคเจพ เจšเจฒเจฆเจพ เจนเฉˆ เจ•เจฟ เจ†เจฎ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจน เจธเจพเจฐเฉ‡ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจฌเจนเฉเจค เจฌเฉ‹เจฐเจฟเฉฐเจ— เจฒเฉฑเจ—เจฆเฉ€ เจนเฉˆ.

เจฌเฉ‡เจฌเฉเจจเจฟเจ†เจฆ เจจเจพ เจนเฉ‹เจฃ เจฒเจˆ, เจ…เฉฐเจฆเจฐ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจนเฉˆ เจœเจฟเจธ เจจเจพเจฒ เจฎเฉˆเจ‚ เจจเจœเจฟเฉฑเจ  เจฐเจฟเจนเจพ เจนเจพเจ‚.
เจ•เฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจ•เฉ‡ เจธเจผเจพเจจเจฆเจพเจฐ เจขเฉฐเจ— เจจเจพเจฒ เจ•เจฒเจชเจจเจพ เจ•เฉ€เจคเฉ€ เจ—เจˆ (เจ…เจคเฉ‡ เจšเฉฐเจ—เฉ€ เจคเจฐเฉเจนเจพเจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ) เจ…เจชเจพเจšเฉ‡ เจ•เจพเจซเจ•เจพ เจ…เจคเฉ‡ เจœเจผเฉ‚เจ•เฉ€เจชเจฐเฅค
- เจธเฉฐเจฐเจšเจจเจพ? เจชเจฐ เจ‡เจน เจฌเฉ‹เจฐเจฟเฉฐเจ— เจนเฉˆ! เจกเฉฐเจฌ xml (เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน "เจฌเจพเจ•เจธ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ" เจนเฉˆ)เฅค
- เจ“, เจ•เฉ€ เจคเฉเจธเฉ€เจ‚ เจตเฉ€ เจเจธเฉ€เจเจฒ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹? เจชเจฐ เจ‡เจน เจฌเจนเฉเจค เจฌเฉ‹เจฐเจฟเฉฐเจ— เจนเฉˆ! เจŸเฉˆเจช-เจฌเจฒเฉ‚เจชเจฐ... เจ…เจœเจฟเจนเจพ เจ•เฉเจเฅค

เจชเจฐ เจฎเฉ‡เจฐเฉ‡ เจ•เฉฐเจฎ เจตเจฟเฉฑเจš เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจ‰เจฒเจŸ เจนเฉˆเฅค เจธเฉฑเจœเจพ (เจนเจพเจ, เจฒเจ—เจญเจ— เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ เจ•เจฆเฉ‡ เจจเจนเฉ€เจ‚) เจจเจฟเจฐเจฎเจฟเจค เจฎเจพเจกเจฒ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจ…เจคเฉ‡ เจ•เฉเจฆเจฐเจคเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ (เจฒเจ—เจญเจ—) เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเฉ‹.

เจฎเฉˆเจ‚ เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจตเจฟเจ—เจฟเจ†เจจเฉ€เจ†เจ‚ เจฆเฉ€ เจธเจ–เจผเจค เจฎเจฟเจนเจจเจค เจฌเจพเจฐเฉ‡ เจนเฉˆเจฌเจฐเฉ‡ เจ‰เฉฑเจคเฉ‡ เจ‡เฉฑเจ• เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจ†เจ‡เจ† ...
เจ‡เจน เจชเจคเจพ เจšเจฒเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจชเจฒ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ…เจจเฉเจญเจต เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ. เจ…เจคเฉ‡ เจฎเฉ‡เจฐเฉ‡ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เจน เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจจ, "เจนเจฒเจ•เจพ เจธเฉฐเจธเจ•เจฐเจฃ". เจฎเจฒเจŸเฉ€-เจตเฉ‹เจฒเจฟเจŠเจฎ เจฎเจพเจกเจฒ, เจคเจฟเจ†เจฐ 'เจคเฉ‡ เจ“เจ“เจชเฉ€ เจตเจพเจฒเฉ‡ เจคเจœเจฐเจฌเฉ‡เจ•เจพเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ, เจ†เจฆเจฟเฅค - เจ‡เจน เจธเจญ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เจพ เจœเจฆเฉ‹เจ‚/เจœเฉ‡ เจ‡เจน เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจกเจฟเจœเจผเจพเจˆเจจเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจฅเฉ‡ เจ…เจคเฉ‡ เจนเฉเจฃ เจ•เจฟเจคเฉ‡ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ.

เจฌเจฟเฉฐเจฆเฉ‚ 'เจคเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹. เจฎเฉˆเจ‚ TOML เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจฟเฉฐเจŸเฉˆเจ•เจŸเจฟเจ• เจ…เจงเจพเจฐ เจตเจœเฉ‹เจ‚ เจฒเจฟเจ† เจ‡เจธ เจจเจพเจ—เจฐเจฟเจ• เจคเฉ‹เจ‚.

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน (TOML) เจ‡เฉฑเจ• เจชเจพเจธเฉ‡, เจฎเจจเฉเฉฑเจ–เฉ€-เจธเฉฐเจชเจพเจฆเจจเจฏเฉ‹เจ—เฅค เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, เจ‡เจธเจฆเจพ เจ…เจจเฉเจตเจพเจฆ 1:1 เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจตเจงเฉ‡เจฐเฉ‡ เจ†เจฎ เจธเฉฐเจŸเฉˆเจ•เจธ เจตเจฟเฉฑเจš เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ: XML, JSON, YAMLเฅค
เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจฎเฉˆเจ‚ "github.com/BurntSushi/toml" เจคเฉ‹เจ‚ เจตเจฐเจคเจฟเจ† เจ—เจฟเจ† เจ…เจฎเจฒ, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจซเฉˆเจธเจผเจจเฉ‡เจฌเจฒ (เจ…เจœเฉ‡ เจตเฉ€ 1.4 เจธเฉฐเจŸเฉˆเจ•เจธ) เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‰เจธเฉ‡ ("เจฌเจฟเจฒเจŸ-เจ‡เจจ") JSON เจจเจพเจฒ เจธเจฟเฉฐเจŸเฉˆเจ•เจŸเจฟเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจนเฉˆเฅค

เจญเจพเจต, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจšเจพเจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจฌเจธ เจ•เจนเจฟ เจธเจ•เจฆเฉ‡ เจนเฉ‹ "เจคเฉเจนเจพเจกเฉ‡ เจฆเฉ‡ เจ‰เจธ TOML เจจเจพเจฒ เจœเฉฐเจ—เจฒ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜เฉ‹, เจฎเฉˆเจจเฉ‚เฉฐ XXX เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ" เจ…เจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจฒเจพเจˆเจจ เจจเจพเจฒ "เจชเฉˆเจš" เจ•เจฐเฉ‹เฅค

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ xswitcher เจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ•เฉเจ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฒเจฟเจ–เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ (เจฎเฉˆเจ‚ เจชเฉฑเจ•เจพ เจจเจนเฉ€เจ‚ เจ•เจนเจฟ เจธเจ•เจฆเจพ) "เจคเฉเจนเจพเจกเฉ€ เจ‡เจธ เจฒเจพเจนเจจเจค เจธเฉฐเจฐเจšเจจเจพ เจจเจพเจฒ" เจ•เจฟเจธเฉ‡ เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€เฅค

เจฌเจพเจ•เฉ€ เจธเจญ เจฒเจˆ, เจธเฉฐเจŸเฉˆเจ•เจธ "เจ•เฉเฉฐเจœเฉ€ = เจฎเฉเฉฑเจฒ" 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจนเฉˆ (เจ…เจคเฉ‡ เจธเจผเจพเจฌเจฆเจฟเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉเจ เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจตเจฟเจ•เจฒเจช, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ = [เจ•เฉเจ, เจ‰เจน, เจเจฐเฉ‡]) เจธเจผเจพเจ‡เจฆ
เจ…เจจเฉเจญเจตเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ•เฅค
เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ "เจธเฉœเจฟเจ†" เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ (2013 เจฆเฉ‡ เจ†เจธ-เจชเจพเจธ)เฅค เจ•เฉ‡เจตเจฒ, เจฎเฉ‡เจฐเฉ‡ เจคเฉ‹เจ‚ เจ‰เจฒเจŸ, TOML เจฆเจพ เจฒเฉ‡เจ–เจ• เจธเจนเฉ€ เจชเฉˆเจฎเจพเจจเฉ‡ 'เจคเฉ‡ เจ—เจฟเจ†.

เจ‡เจธ เจฒเจˆ, เจนเฉเจฃ เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจ‡เจธ เจฆเฉ‡ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃเจพ เจธเฉŒเจ–เจพ เจนเฉˆ, เจจเจพ เจ•เจฟ เจ‰เจฒเจŸเฅค

เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ…เจธเฉ€เจ‚ TOML (เจชเฉเจฐเจพเจฃเฉ‡ เจตเจฟเฉฐเจกเฉ‹เจœเจผ INI เจฆเฉ‡ เจธเจฎเจพเจจ) เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค เจ…เจคเฉ‡ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจธเฉฐเจฐเจšเจจเจพ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจตเจฐเจฃเจจ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ•เฉ€เจฌเฉ‹เจฐเจก เจคเฉ‹เจ‚ เจจเจตเฉ€เจจเจคเจฎ เจธเจ•เฉˆเจจ เจ•เฉ‹เจกเจพเจ‚ เจฆเฉ‡ เจธเฉˆเฉฑเจŸ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจนเฉเฉฑเจ•เจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจœเฉ‹เฉœเจจเจพ เจนเฉˆเฅค เจนเฉ‡เจ เจพเจ‚, เจŸเฉเจ•เฉœเฉ‡-เจŸเฉเจ•เฉœเฉ‡, เจนเฉเจฃ เจคเฉฑเจ• เจ•เฉ€ เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค เจ…เจคเฉ‡ เจ‡เจธ เจ—เฉฑเจฒ เจฆเฉ€ เจตเจฟเจ†เจ–เจฟเจ† เจ•เจฟ เจฎเฉˆเจ‚ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เจฟเจ‰เจ‚ เจ•เฉ€เจคเจพเฅค

0 เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจเจฌเจธเจŸเจฐเฉˆเจ•เจธเจผเจจ

  • เจ•เฉ‹เจก เจ…เจนเฉเจฆเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจธเจ•เฉˆเจจ เจ•เจฐเฉ‹เฅค เจ‡เจธ เจฌเจพเจฐเฉ‡ เจจเจฟเจธเจผเจšเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉเจ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจฟเจฐเจซเจผ เจกเจฟเจœเฉ€เจŸเจฒ เจ•เฉ‹เจก เจฎเจจเฉเฉฑเจ–เฉ€-เจชเฉœเฉเจนเจจ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเจจ (เจ‡เจน เจธเจฟเจฐเจซเจผ เจฎเฉˆเจ‚ เจนเจพเจ‚ loloswitcher).
    เจฎเฉˆเจ‚ "เจ—เฉ‹เจฒเจพเจ‚เจ—-เจเจตเจฆเฉ‡เจต" เจคเฉ‹เจ‚ "ecodes.go" เจจเฉ‚เฉฐ เจนเจฟเจฒเจพ เจฆเจฟเฉฑเจคเจพ (เจฎเฉˆเจ‚ เจ…เจธเจฒ เจธเจฐเฉ‹เจค เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฃ เจฒเจˆ เจฌเจนเฉเจค เจ†เจฒเจธเฉ€ เจธเฉ€, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจฒเฉ‡เจ–เจ• เจจเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจพเจซเจผเฉ€ เจธเฉฑเจญเจฟเจ†เจšเจพเจฐเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจฆเจฐเจธเจพเจ‡เจ† เจนเฉˆ)เฅค เจฎเฉˆเจ‚ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ (เจนเฉเจฃ เจฒเจˆ) เจ•เฉเจ เจ เฉ€เจ• เจ•เฉ€เจคเจพ เจœเฉ‹ เจ•เจพเจซเจผเฉ€ เจกเจฐเจพเจ‰เจฃเจพ เจธเฉ€เฅค เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ โ€œLEFTBRACEโ€ โ†’ โ€œ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 ("เจชเจฐเจฒ เจ…เจจเฉเจ•เฉ‚เจฒ") เจจเจพเจฒ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจฆเฉ€ เจกเจฟเจ—เจฐเฉ€ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฆเฉ€ เจ–เฉ‡เจšเจฒ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจนเฉˆเฅค
  • เจธเจฎเฉ€เจ•เจฐเจจ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ "BUTTON_1: CODE1, BUTTON_2: CODE2" เจ†เจฆเจฟ, เจœเจฟเจธ เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš เจธเจ•เฉˆเจจ เจ•เฉ‹เจก เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค
  • เจ•เฉเจฐเจฎ เจฆเฉ‡ เจ…เฉฐเจค เจคเฉฑเจ• เจšเฉˆเจ• เจนเจฎเฉ‡เจธเจผเจพ "เจธเฉฐเจจเจ—เจก" เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจชเฉ‚เจ› เจตเจฟเฉฑเจš "$" เจœเฉ‹เฉœเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค
  • เจ‡เฉฑเจ• เจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจœเจพเจ‚เจšเจพเจ‚ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เฉฑเจ• เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ เจ…เจคเฉ‡ "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.

เจ‡เฉฑเจฅเฉ‡ เจฎเฉเฉฑเจ– เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ "เจเจ•เจธเจผเจจ = [เจเจฐเฉ‡]". เจชเจฟเจ›เจฒเฉ‡ เจญเจพเจ— เจฆเฉ‡ เจธเจฎเจพเจจ, เจฌเจฟเจฒเจŸ-เจ‡เจจ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉ€เจฎเจค เจธเจฎเฉ‚เจน เจนเฉˆเฅค เจ…เจคเฉ‡ เจกเฉŒเจ•เจฟเฉฐเจ— เจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจธเจฟเจงเจพเจ‚เจค เจตเจฟเฉฑเจš เจธเฉ€เจฎเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆ (โ€œเจเจ•เจธเจผเจจ.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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹