Terminalde renkler ve animasyonlar nasıl oluşur?

Bu flood’da terminalde renkli yazılar çıkarma, kursörü hareket ettirme, bir satırı silme, kelimelerin altını ve üzerini çizme gibi işlemleri yapmamızı sağlayan ANSI Escape Sequences'ı tanıyacağız.

Terminalde renkli yazılar oluştururken, vim'de kursör ile karakter karakter, kelime kelime atlarken, komut satırından bir paket yüklerken ve aşağıdaki gibi Docker Hub'dan bir imaj indirirken ANSI kaçış kodlarının kullanıldığını görürüz.

ANSI kaçış kodları ile video terminal donanımlarında belirli karakter sekanslarının belirli işlemleri yapması standart hale getirilmiştir. Günümüzde kullanmakta olduğumuz terminal emülatörleri de bu standarda uymaktadır.

Adından da anlaşılacağı üzere ANSI, terminal üzerinde yapılan işlemler için kaçış kodları sağlamaktadır. Bu kaçış kodları ESC karakteri ile başlamakta ve [ karakteri ile devam etmekte daha sonra ise yapılmak istenen işleme ilişkin kod gelmektedir.

Terminale kırmızı renkte Hello World yazdırmak istersek bash ile echo -e "\033[31mHello World" komutunu verebiliriz. Aldığı -e parametresi ile echo, kaçış kodlarını değerlendirmesi gerektiğini anlar.

Kırmızı renkle yazılan Hello World'ün altının çizili olmasını istersek 31 olan renk kodunun yanına ; ile 4 sembolünü koyabiliriz. Burada kırmızı renkteki Hello World'ün altının çizildiğine fakat prompt'un da bundan etkilendiğine dikkat edin.

ANSI kaçış kodları aksi bildirilinceye kadar ayarlanan modda kalırlar. Bir önceki örnekte ayarlanan grafik ayarlarını varsayılan ayara döndürmek için 0 sembolü kullanılabilir. Aşağıdaki örnekte prompt'un altının çizilmediğine dikkat edin.

ANSI kaçış kodlarının düzenli bir listesine http://ascii-table.com/ansi-escape-sequences.php adresinden ulaşılabilir. Şimdi bu listedeki bilgileri kullanarak terminalde bir animasyon yapalım.

Animasyonlar için Python3 kullanılabilir. bash ile ESC[ kaçış sekansını göstermek için 033[ kullanılmıştı. Python3'te aynı sekans Unicode Escape kullanılarak \u001b[ ile yapılabilir. 001b unicode karakteri ESC'ye denk gelmektedir.

Aşağıdaki animasyonda terminalde basit bir sayaç yapılmıştır.

Yukarıdaki örnekte kursörü aynı satırda sola doğru getirmek için Esc[ValueD kaçış kodu kullanılmıştır. Kursörün sürekli en başa gelmesi için Value, 1000 olarak kullanılmıştır, aslında backspace tuşuna 1000 kere basılmış ve satır başına geçilmiştir.

Görüldüğü üzere, ANSI kaçış kodları kullanılarak bash'e benzer basit bir kabuk, vim'e benzer basit bir metin editörü vb yapılabilir.