āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ 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" āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ¤ā§‡ āĻĒāĻžāĻ āĻžāĻ‡āĨ¤ āĻ•āĻžāĻ°āĻŖ āĻ†āĻŽāĻŋ āĻāĻ–āĻ¨āĻ“ āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĒāĻŋāĻ¸āĻŋāĻ†āĻ° ("āĻĒāĻžāĻ°ā§āĻ˛ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ") āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯ā§‡āĻ° āĻĄāĻŋāĻ—ā§āĻ°āĻŋ āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻŋāĻ°āĻ•ā§āĻ¤ āĻ•āĻ°āĻŋāĻ¨āĻŋāĨ¤
  • āĻ…āĻ­āĻŋāĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻ†āĻ•āĻžāĻ°ā§‡ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧ "BUTTON_1: CODE1, BUTTON_2: CODE2" āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ, āĻ¯ā§‡ āĻ•ā§āĻ°āĻŽā§‡ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻ•ā§‹āĻĄāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤
  • āĻšā§‡āĻ• āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ•ā§āĻ°āĻŽ āĻļā§‡āĻˇ "snugged" āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻ˛ā§‡āĻœā§‡ “$” āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ¨ā§‡āĻ‡āĨ¤
  • āĻāĻ• āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻšā§‡āĻ• āĻāĻ•ā§‡āĻ° āĻĒāĻ° āĻāĻ• āĻ¸āĻžā§āĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ "I" āĻĻā§āĻŦāĻžāĻ°āĻž āĻŽāĻŋāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻŽāĻžāĻ¨āĻŸāĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŽāĻž āĻĒāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻšā§‡āĻ• āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻ•ā§‹āĻ¨ā§‹ āĻ•āĻžāĻ°āĻŖā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧāĨ¤
  • āĻŽāĻžāĻ¨ "SeqLength = 8" āĻŦāĻžāĻĢāĻžāĻ°ā§‡āĻ° āĻ†āĻ•āĻžāĻ° āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ¯āĻžāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ•āĻžāĻ°āĻŖ āĻ†āĻŽāĻŋ (āĻāĻ–āĻ¨ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤) āĻ†āĻŽāĻžāĻ° āĻœā§€āĻŦāĻ¨ā§‡ āĻ•āĻ–āĻ¨ā§‹āĻ‡ āĻ…āĻ¨ā§āĻ¤āĻšā§€āĻ¨ āĻ¸āĻŽā§āĻĒāĻĻā§‡āĻ° āĻ¸āĻŽā§āĻŽā§āĻ–ā§€āĻ¨ āĻšāĻ‡āĻ¨āĻŋāĨ¤

5. āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻšā§āĻ• āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž

# Action is the array, so actions could be chained (m.b., infinitely... Have I to check this?).
# For each action type, extra named parameters could be collected. Invalid parameters will be ignored(?).
[Action.RetypeWord] # Switch layout, drop last word and type it again
 Action = [ "Action.CyclicSwitch", "RetypeWord" ] # Call Switch() between layouts tuned below, then RetypeWord()

[Action.CyclicSwitch] # Cyclic layout switching
 Action = [ "Switch" ] # Internal layout switcher func
 Layouts = [0, 1]

[Action.Layout0] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 0

[Action.Layout1] # Direct layout selection
 Action = [ "Layout" ] # Internal layout selection func
 Layout = 1

[Action.Respawn] # Completely respawn xswitcher. Reload config as well
 Action = [ "Respawn" ]

[Action.Hook1] # Run external commands
  Action = [ "Exec" ]
  Exec = "/path/to/exec -a -b --key_x"
  Wait = 1
  SendBuffer = "Word" # External hook can process collected buffer by it's own means.

āĻāĻ–āĻžāĻ¨ā§‡ āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻœāĻŋāĻ¨āĻŋāĻ¸ "āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž = [āĻ…ā§āĻ¯āĻžāĻ°ā§‡]". āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ, āĻŦāĻŋāĻ˛ā§āĻŸ-āĻ‡āĻ¨ āĻ•āĻ°ā§āĻŽā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ¸ā§‡āĻŸ āĻ†āĻ›ā§‡āĨ¤ āĻāĻŦāĻ‚ āĻĄāĻ•āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻ¨ā§€āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ¨āĻ¯āĻŧ ("Action.XXX" āĻ˛āĻŋāĻ–ā§āĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ¯ āĻŦāĻŋāĻ­āĻžāĻ— āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻ…āĻ˛āĻ¸ āĻšāĻŦā§‡āĻ¨ āĻ¨āĻž).
āĻŦāĻŋāĻļā§‡āĻˇāĻ¤, āĻ¸āĻ‚āĻļā§‹āĻ§āĻŋāĻ¤ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§‡ āĻāĻ•āĻŸāĻŋ āĻļāĻŦā§āĻĻ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŸāĻžāĻ‡āĻĒ āĻ•āĻ°āĻž āĻĻā§āĻŸāĻŋ āĻ…āĻ‚āĻļā§‡ āĻŦāĻŋāĻ­āĻ•ā§āĻ¤: "āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻŋāĻ¤ āĻ˛ā§‡āĻ†āĻ‰āĻŸāĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§āĻ¨" и "āĻ°āĻŋāĻŸāĻžāĻ‡āĻĒ" ("āĻ°āĻŋāĻŸāĻžāĻ‡āĻĒāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ").

āĻ…āĻŦāĻļāĻŋāĻˇā§āĻŸ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋ "āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨" āĻ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧ (āĻ—ā§‹āĻ˛āĻžāĻ™ā§‡ "āĻŽāĻžāĻ¨āĻšāĻŋāĻ¤ā§āĻ°") āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻ•āĻ°ā§āĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ¤āĻžāĻĻā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž "āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨" āĻ āĻ•āĻŋ āĻ˛ā§‡āĻ–āĻž āĻ†āĻ›ā§‡ āĻ¤āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡āĨ¤

āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ¤ā§‚āĻĒā§‡ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ (āĻŦāĻŋāĻ­āĻžāĻ—). āĻ…āĻĨāĻŦāĻž āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻŋ āĻ†āĻ˛āĻžāĻĻāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻ†āĻŽāĻŋ āĻ‰āĻĒāĻ°ā§‡ āĻĻā§‡āĻ–āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ.

āĻ†āĻŽāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻŦāĻšāĻŋāĻ°āĻžāĻ—āĻ¤ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ "Exec" āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻž āĻŦāĻžāĻĢāĻžāĻ°āĻŸāĻŋāĻ•ā§‡ stdin āĻ āĻĒā§āĻļ āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ¸āĻšāĨ¤

  • "āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨ = 1" - āĻšāĻ˛āĻŽāĻžāĻ¨ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤
  • āĻ¸āĻŽā§āĻ­āĻŦāĻ¤, "āĻ¸ā§āĻ¤ā§āĻĒā§‡" āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ˛ā§‹āĻ• āĻ°āĻžāĻ–āĻ¤ā§‡ āĻšāĻžāĻ‡āĻŦā§‡āĻ¨āĨ¤ āĻ¤āĻĨā§āĻ¯ āĻ¯ā§‡āĻŽāĻ¨ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻ•ā§āĻ˛āĻžāĻ¸ā§‡āĻ° āĻ¨āĻžāĻŽ āĻ¯ā§‡āĻ–āĻžāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻāĻŸāĻŋ āĻ†āĻŸāĻ•āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤
    "āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨? āĻāĻ–āĻžāĻ¨ā§‡āĻ‡ āĻ¤ā§‹āĻŽāĻžāĻ•ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤"

āĻ‰āĻĢ (āĻ¨āĻŋāĻƒāĻļā§āĻŦāĻžāĻ¸)āĨ¤ āĻŽāĻ¨ā§‡ āĻšāĻšā§āĻ›ā§‡ āĻ†āĻŽāĻŋ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ­ā§āĻ˛āĻŋāĻ¨āĻŋāĨ¤

āĻ‰āĻĢ! āĻšā§āĻ¯āĻžāĻ, āĻ†āĻŽāĻŋ āĻ­ā§āĻ˛āĻŋāĻ¨āĻŋ...
āĻ˛āĻžā§āĻš āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ? āĻšāĻžāĻ°ā§āĻĄ āĻ•ā§‹āĻĄā§‡? āĻ¸ā§‡ āĻ°āĻ•āĻŽāĻ‡:

[ScanDevices]
 # Must exist on start. Self-respawn in case it is younger then 30s
 Test = "/dev/input/event0"
 Respawn = 30
 # Search mask
 Search = "/dev/input/event*"
 # In my thinkPads there are such a pseudo-keyboards whith tons of unnecessary events
 Bypass = "(?i)Video|Camera" # "(?i)" obviously differs from "classic" pcre's.

āĻ†āĻŽāĻŋ āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ āĻ­ā§āĻ˛ā§‡ āĻ—ā§‡āĻ›āĻŋ/āĻ­ā§āĻ˛ āĻ•āĻ°ā§‡āĻ›āĻŋ? (āĻāĻŸāĻž āĻ›āĻžāĻĄāĻŧāĻž āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻ¨ā§‡āĻ‡), āĻ†āĻŽāĻŋ āĻ¸āĻ¤ā§āĻ¯āĻŋāĻ‡ āĻ†āĻļāĻž āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻŽāĻ¨ā§‹āĻ¯ā§‹āĻ—ā§€ āĻĒāĻžāĻ āĻ•āĻ°āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻ¨āĻžāĻ• āĻ–ā§‹āĻāĻšāĻžāĻ¤ā§‡ āĻ…āĻ˛āĻ¸ āĻšāĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤

āĻ¸ā§ŒāĻ­āĻžāĻ—ā§āĻ¯ āĻ•āĻžāĻŽāĻ¨āĻž āĻ•āĻ°āĻ›āĻŋ!

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨