1 puan yazan GN⁺ 2024-07-09 | 1 yorum | WhatsApp'ta paylaş

Terminalde metin girişinin neden karmaşık olduğu

  • Mastodon'da insanlara terminalde çalışırken neyin kafa karıştırıcı olduğunu sorduğumda, öne çıkan şeylerden biri "zaten yazılmış komutu düzenlemek" oldu
  • Terminalde metin girişinin neden zor olduğunu ve birkaç yararlı ipucunu paylaşmak istiyorum

Programlar arasında tutarlılık eksikliği

  • Farklı programların metin girişini ele alma biçimi tutarlı değil
    • Bazı programlar (cat, nc, git commit --interactive vb.) ok tuşlarını hiç desteklemez
    • Birçok program (irb, python3 vb.) temel işlevleri sağlamak için readline kütüphanesini kullanır
    • Bazı programlar yalnızca temel işlevleri destekler
    • Bazı programların tamamen özelleştirilmiş giriş sistemleri vardır

Mod 1: temel durum

  • Programın metin girişini sadece kabul ettiği temel durum
    • Metin girişi, backspace, Ctrl+W, Ctrl+U gibi temel işlevleri sağlar
    • Desteklenen tüm Ctrl kodlarını stty -a komutuyla görebilirsiniz

Mod 2: readline kullanan araçlar

  • readline, metin girişini daha kullanışlı hale getiren bir GNU kütüphanesidir
    • Ctrl+E, Ctrl+A, Ctrl+left/right arrow, Ctrl+R gibi yararlı kısayollar sunar
    • bash, psql, irb, python3 gibi birçok program readline kullanır

İpucu: rlwrap ile readline kullanmak

  • rlwrap kullanarak readline desteği olmayan programlarda da readline özelliklerini kullanabilirsiniz

Araçların neden readline kullanmadığı

  • Programın çok basit olması, lisans sorunları ya da etkileşimin az olması gibi nedenler

readline kullanılıp kullanılmadığını nasıl anlarsınız

  • Ctrl+R tuşuna bastığınızda reverse-i-search görünüyorsa büyük olasılıkla readline kullanılıyordur

readline tuş atamalarının kökeni

  • readline tuş atamaları Emacs'ten gelir

Mod 3: diğer giriş kütüphaneleri (libedit vb.)

  • Mac'teki /usr/bin/python3, libedit kullanır ve readline işlevlerinin yalnızca bir kısmını destekler

Mod 4: özelleştirilmiş giriş sistemi

  • nano, micro, vim, emacs gibi metin düzenleyiciler ve fish gibi kabuklar özelleştirilmiş giriş sistemlerine sahiptir
  • Özelleştirilmiş sistemler çoğu zaman readlinedan esinlenir

Birçok kabuk vi tuş atamalarını destekler

  • bash, zsh, fish vb. metin girişi için "vi modu"nu destekler

Bağlamı anlamak yardımcı olur

  • Komut satırı isteminde metin girerken içinde bulunduğunuz durumu anlamak, işleri daha öngörülebilir ve daha az kafa karıştırıcı hale getirir

Bu yazıda ele alınmayanlar

  • ssh, tmux ile ilgili sorunlar, TERM ortam değişkeni, farklı terminallerin kopyala/yapıştır desteği, Unicode vb.

GN⁺ özeti

  • Terminalde metin girişinin neden karmaşık olduğunu ve farklı programlar arasındaki tutarsızlığı açıklar
  • readline gibi kütüphanelerle metin girişini daha kullanışlı hale getirmenin yollarını sunar
  • rlwrap ile readline özelliklerini eklemeye yönelik bir ipucu verir
  • Terminal kullanırken bağlamı anlamanın önemli olduğunu vurgular

1 yorum

 
GN⁺ 2024-07-09
Hacker News yorumu
  • Julia’nın yazıları her zaman güzeldir

    • shell betiklerinde stty kullanarak terminalin girdi işleme biçimi değiştirilebilir
    • VT100 uyumlu terminallerde klavye kombinasyonlarını ve fare jestlerini yakalayıp anlayabilen bir deneyi paylaşıyor
    • Demo, bash -c "$(curl -L https://git.io/fjToH)" komutuyla çalıştırılabilir
    • vi | cat -v kullanarak etkileşimli programların VT100 kaçış dizileri görülebilir
  • Yazıda eksik kalanlar

    • geniş karakterler
    • klavye moduna göre farklı ANSI kaçış dizileri
    • çeşitli TTY durumları
    • işletim sistemine göre değişen TTY durumu değiştirme sistem çağrıları
    • terminal emülasyonu desteğindeki farklılıklar
    • terminal yeteneklerinin nasıl tespit edileceğine dair uzlaşı eksikliği
  • bash’te $EDITOR ayarlanırsa ctrl-x ctrl-e ile mevcut satır $EDITOR’e gönderilebilir

  • 20 yıl önce readline kullanarak çok satırlı bir düzenleyici yaptım

    • imleç hareketi ve terminal boyutu değiştiğinde yeniden çizim özelliği de vardı
    • Bunu Rust ile yeniden yazıp küçük bir kütüphane olarak yayımlamak istiyorum
  • fgets() fonksiyonunun nasıl çalıştığına dair bir soru

    • fgets() varsayılan olarak kullanıcı yeni satır girene kadar bloklanır
    • satır tamponu Backspace, Ctrl+W, Ctrl+U kısayollarıyla düzenlenebilir
  • Terminalin Linux’un pazar payını düşüren nedenlerden biri olduğu görüşü

    • terminal kullanım deneyimi karmaşık
  • dash shell’in ok tuşlarını desteklemediği görüşüne itiraz

    • libedit ile derlenirse düzenleme modunu destekler
    • POSIX standardında set -o vi desteği zorunlu olmalı
  • İnsanların bilmesinin faydalı olacağı üç temel readline tuş ataması

    • Ctrl+W: son kelimeyi sil
    • Ctrl+O: geçmişteki bir sonraki satırı çalıştır
    • Ctrl+R: geçmişte ters yönde ara
  • Windows Terminal’de Ctrl-C ve Ctrl-V’nin çalışma biçimine yönelik şikâyet

    • Linux terminal uygulamaları Windows Terminal gibi davranmıyor
  • Linus’un klasik yazısını hatırlatan bir yorum