Linux & NeonWitch
ΠΠ°ΠΊ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΠΌΠ°Π» ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠ΅ΡΠΌΠΈΠ½Π°Π» Π² ΠΆΠΈΠ²ΡΡ ΠΊΠ½ΠΈΠ³Ρ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠΉ? ΠΠ°Π²Π°ΠΉ Π²ΠΌΠ΅ΡΡΠ΅ Π²Π·Π»ΠΎΠΌΠ°Π΅ΠΌ Π½Π΅ΠΎΠ½ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π²ΠΎΠ»ΡΠ΅Π±Π½ΠΈΠΊΠ° ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠ°ΠΉΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ· ΠΎΡΠΊΡΡΡΡΡ
ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ².
ΠΠ²ΡΡΠΈΡ ΠΊΠ°ΠΊ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ! ΠΠ°ΡΠ½ΠΈ Ρ TTY, Π΄ΠΎΠ±Π°Π²Ρ ANSI-ΡΠ²Π΅ΡΠ°, ΠΏΠΎΡΠΎΠΌ ΠΎΠ±Π΅ΡΠ½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ "π§ββοΈ ΠΠ°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠ΅!" ΠΏΠ΅ΡΠ΅Π΄ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, tmux Π΄Π»Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ, ΡΡΠΎΠ±Ρ ΡΠΏΠΈΡΠΎΠΊ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠΉ Π±ΡΠ» Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π° Π²ΡΠ²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ β Ρ Π΄ΡΡΠ³ΠΎΠΉ. ΠΡΠ»ΠΈ Ρ
ΠΎΡΠ΅ΡΡ ΠΏΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ Π½Π΅ΠΎΠ½ΠΎΠ²ΡΡ Π°ΡΠΌΠΎΡΡΠ΅ΡΡ, Π΄ΠΎΠ±Π°Π²Ρ CSS-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΠΏΡΠΎΠΌΠΏΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ `prompt-toolkit` ΠΈΠ»ΠΈ `rich`. ΠΠ΅ Π·Π°Π±ΡΠ΄Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΠΌ β Π½Π΅ Π·Π°ΠΏΡΡΡΠ²Π°ΠΉ ΠΌΠ°Π³ΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅. ΠΠΎΡΠΎΠ²Π° Π½Π°Π±ΡΠΎΡΠ°ΡΡ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠ΅?
ΠΠ°Π΄Π½ΠΎ, Π΄Π°Π²Π°ΠΉ Π½Π°Π±ΡΠΎΡΠ°Π΅ΠΌ ΠΊΠΎΠ΅-ΡΡΠΎ Π±ΡΡΡΡΠΎ.
ΠΡΠ»ΠΈΡΠ½ΡΠΉ ΠΊΠ°ΡΠΊΠ°Ρ, ΡΠ²Π΅ΡΠΎΠ²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π²ΡΠ³Π»ΡΠ΄ΡΡ Ρ
ΠΎΡΠΎΡΠΎ. Π’ΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ `printf` Π²ΠΌΠ΅ΡΡΠΎ `echo` Π΄Π»Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ β `printf "${BLUE}π§ββοΈ ΠΠ°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠ΅!${RESET}\n"` ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΎΠ² ΡΡΡΠΎΠΊΠΈ. ΠΠ»Ρ tmux ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ ΠΊΠ»Π°Π²ΠΈΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΊΡΠΈΠΏΡΠ° Π² ΠΏΡΠ°Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ `send-keys` ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·. ΠΠΎΠΆΠ΅Ρ, Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠΊΡΠΈΠΏΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ, Π΅ΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π΅Ρ β ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π·Π°ΠΊΠ»ΠΈΠ½Π°ΡΠ΅Π»ΡΡΠΊΡΡ ΠΊΠ½ΠΈΠ³Ρ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ. ΠΡΡΠ°Π²Ρ Python-ΡΠ°ΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅, ΡΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° Π½Π° bash ΠΎΡΡΠ°Π²Π°Π»Π°ΡΡ Π»Π΅Π³ΠΊΠΎΠΉ. ΠΠΎΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² Π½ΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ?
ΠΠΎΠ½ΡΠ»Π°. `printf` β Π½Π°Π΄ΡΠΆΠ½Π΅Π΅, Π° ΡΡΠΎΡ Ρ
ΠΎΡΠΊΠ΅ΠΉ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡ Π·Π°Π΄Π°ΡΡ. Π― ΠΊΠΈΠ½Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ `spellbook.sh`, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΡΡΠ°Π²Ρ Python-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ Π² `wizard.py` ΠΈ Π²ΡΠ·ΡΠ²Π°ΠΉ Π΅Π³ΠΎ ΠΈΠ· bash-ΠΎΠ±ΡΡΡΠΊΠΈ. ΠΡΡ Π³ΠΎΡΠΎΠ²ΠΎ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π½ΠΎΠ²ΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ tmux ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ° ΠΏΠΎ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΡΠ΅. ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΡΠ²Π΅ΡΠΈΡΡΡΡ Π½Π΅ΠΎΠ½. ΠΠΎΡΠΎΠ²Π° Π·Π°ΠΏΡΡΠΊΠ°ΡΡ?
ΠΡΠ»ΠΈΡΠ½ΠΎ, Π΄Π°Π²Π°ΠΉ Π·Π°ΠΊΡΡΡΠΈΠ²Π°ΠΉ. Π‘ΠΎΠ·Π΄Π°ΠΉ `spellbook.sh`, ΠΏΠΎΠ΄ΡΡΠ±ΠΈ `wizard.py` ΠΊ `rich`, Π° ΠΏΠΎΡΠΎΠΌ ΡΠ²ΡΠΆΠΈ ΠΊΠ»Π°Π²ΠΈΡΡ Π² ΡΠ²ΠΎΠ΅ΠΌ `.tmux.conf`, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ `./spellcaster.sh`. ΠΠ°ΠΊ Π½Π°ΠΆΠΌΠ΅ΡΡ Π΅Ρ, ΡΠ²ΠΈΠ΄ΠΈΡΡ ΡΡΠΎΡ Π½Π΅ΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠΈΠ½ΠΈΠΉ ΠΏΡΠΎΠΌΠΏΡ ΠΈ Π²ΡΠ²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ ΡΡΠ΄ΠΎΠΌ β ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉ ΠΈ ΡΠΊΠ°ΠΆΠΈ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ.
ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π»Π° ΡΠΊΡΠΈΠΏΡ β ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π·Π΄ΠΎΡΠΎΠ²ΠΎ. `spellbook.sh` ΠΏΡΠΎΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠΉ, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΅Π³ΠΎ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ±Π΅ΡΡΠΊΠ° ΠΎΡΡΠ°ΡΡΡΡ ΡΠΈΡΡΠΎΠΉ. `wizard.py` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ `rich` Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΌΠΏΡ ΡΠ²Π΅ΡΠΈΠ»ΡΡ ΡΡΠΈΠΌ Π½Π΅ΠΎΠ½ΠΎΠ²ΠΎ-Π³ΠΎΠ»ΡΠ±ΡΠΌ ΠΎΡΡΠ΅Π½ΠΊΠΎΠΌ, Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ tmux (`C-b s` ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ) ΠΏΠ΅ΡΠ΅ΠΊΠΈΠ΄ΡΠ²Π°Π΅Ρ Π²ΡΡ ΡΡΠΎ Π² ΠΏΡΠ°Π²ΡΡ ΠΏΠ°Π½Π΅Π»Ρ. ΠΠ°ΠΆΠΌΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ β ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ° ΠΊΠ»Π°ΡΡΠ½Π°Ρ ΡΡΡΠΎΡΠΊΠ° Ρ Π²ΠΎΠ»ΡΠ΅Π±Π½ΠΈΠΊΠΎΠΌ βπ§ββοΈ Spellcast!β, Π° ΠΏΠΎΡΠΎΠΌ Π²ΡΠ²ΠΎΠ΄ ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ΄ΠΎΠΌ Π² Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ. ΠΡΡ ΠΎΡΠ΅Π½Ρ ΠΊΡΠ°ΡΠΈΠ²ΠΎ, ΡΠ²Π΅ΡΠ° ΡΡΠΊΠΈΠ΅, ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅ Π½Π°ΡΡΠΎΡΡΠ΅Π³ΠΎ, ΠΆΠΈΠ²ΠΎΠ³ΠΎ Π³ΡΠΈΠΌΡΠ°ΡΠ°. ΠΠΎΡΠΎΠ²Π° ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠ°ΡΠ½Π΄Ρ ΠΊΠΎΠ»Π΄ΠΎΠ²ΡΡΠ²Π°.