1 पॉइंट द्वारा GN⁺ 2024-07-09 | 1 टिप्पणियां | WhatsApp पर शेयर करें

टर्मिनल में टेक्स्ट इनपुट जटिल क्यों है

  • जब Mastodon पर लोगों से पूछा गया कि वे टर्मिनल के साथ काम करते समय किस बात को लेकर उलझन में पड़ते हैं, तो "पहले से टाइप किए गए कमांड को एडिट करना" खास तौर पर सामने आया
  • टर्मिनल में टेक्स्ट इनपुट कठिन क्यों होता है और उससे जुड़े कुछ उपयोगी टिप्स साझा करने की कोशिश की गई है

प्रोग्रामों के बीच एकरूपता की कमी

  • अलग-अलग प्रोग्राम टेक्स्ट इनपुट को संभालने के तरीके में एक जैसे नहीं होते
    • कुछ प्रोग्राम (cat, nc, git commit --interactive आदि) arrow keys को बिल्कुल support नहीं करते
    • कई प्रोग्राम (irb, python3 आदि) बुनियादी सुविधाओं के लिए readline लाइब्रेरी का उपयोग करते हैं
    • कुछ प्रोग्राम सिर्फ बहुत बुनियादी फीचर support करते हैं
    • कुछ प्रोग्रामों के पास पूरी तरह custom input system होता है

मोड 1: बुनियादी स्थिति

  • यह वह बुनियादी स्थिति है जिसमें प्रोग्राम सिर्फ टेक्स्ट इनपुट स्वीकार करता है
    • टेक्स्ट इनपुट, backspace, Ctrl+W, Ctrl+U जैसी बुनियादी सुविधाएँ देता है
    • stty -a कमांड से आप सभी supported Ctrl codes देख सकते हैं

मोड 2: readline का उपयोग करने वाले टूल

  • readline एक GNU लाइब्रेरी है जो टेक्स्ट इनपुट को अधिक सुविधाजनक बनाती है
    • यह Ctrl+E, Ctrl+A, Ctrl+left/right arrow, Ctrl+R जैसे उपयोगी shortcuts देती है
    • bash, psql, irb, python3 जैसे कई प्रोग्राम readline का उपयोग करते हैं

टिप: rlwrap के साथ readline का उपयोग

  • rlwrap का उपयोग करके उन प्रोग्रामों में भी readline फीचर इस्तेमाल किए जा सकते हैं जिनमें इसका support नहीं है

टूल readline का उपयोग क्यों नहीं करते

  • क्योंकि प्रोग्राम बहुत सरल हो सकता है, लाइसेंस से जुड़े मुद्दे हो सकते हैं, या उसमें इंटरैक्शन बहुत कम हो सकता है

कैसे पता करें कि readline इस्तेमाल हो रहा है या नहीं

  • अगर Ctrl+R दबाने पर reverse-i-search दिखाई देता है, तो बहुत संभव है कि प्रोग्राम readline का उपयोग कर रहा है

readline key bindings की उत्पत्ति

  • readline key bindings की शुरुआत Emacs से हुई है

मोड 3: दूसरी input लाइब्रेरी (libedit आदि)

  • Mac का /usr/bin/python3 libedit का उपयोग करता है और readline की केवल कुछ सुविधाएँ support करता है

मोड 4: custom input system

  • nano, micro, vim, emacs जैसे टेक्स्ट एडिटर और fish जैसे shell, custom input system रखते हैं
  • custom system अक्सर readline से प्रेरित होते हैं

कई shell vi key bindings support करते हैं

  • bash, zsh, fish आदि टेक्स्ट इनपुट के लिए "vi mode" support करते हैं

स्थिति को समझना मददगार होता है

  • कमांड लाइन प्रॉम्प्ट पर टेक्स्ट टाइप करते समय अगर आप स्थिति को समझते हैं, तो चीजें अधिक पूर्वानुमेय और कम उलझाऊ लगती हैं

इस लेख में क्या शामिल नहीं है

  • ssh, tmux से जुड़े मुद्दे, TERM environment variable, अलग-अलग टर्मिनल में copy/paste support, Unicode आदि

GN⁺ का सार

  • यह टर्मिनल में टेक्स्ट इनपुट जटिल होने के कारणों और अलग-अलग प्रोग्रामों के बीच एकरूपता की कमी को समझाता है
  • यह दिखाता है कि readline जैसी लाइब्रेरी का उपयोग करके टेक्स्ट इनपुट को अधिक सुविधाजनक कैसे बनाया जा सकता है
  • यह rlwrap के जरिए readline फीचर जोड़ने का एक उपयोगी टिप देता है
  • यह ज़ोर देता है कि टर्मिनल इस्तेमाल करते समय संदर्भ को समझना महत्वपूर्ण है

1 टिप्पणियां

 
GN⁺ 2024-07-09
Hacker News की राय
  • Julia की लिखी चीज़ें हमेशा अच्छी होती हैं

    • shell script में stty का इस्तेमाल करके terminal के input handling के तरीके को बदला जा सकता है
    • VT100-compatible terminal में keyboard combinations और mouse gestures को capture और समझने वाला एक experiment साझा किया गया है
    • bash -c "$(curl -L https://git.io/fjToH)" कमांड से demo चलाया जा सकता है
    • vi | cat -v का उपयोग करके interactive program की VT100 escape sequences देखी जा सकती हैं
  • लेख में छूटी हुई बातें

    • wide characters
    • keyboard mode के अनुसार अलग ANSI escape sequences
    • अलग-अलग TTY states
    • OS के अनुसार TTY state बदलने वाली system calls
    • terminal emulation support में अंतर
    • terminal capabilities की जाँच कैसे करें, इस पर सहमति की कमी
  • bash में $EDITOR सेट करने पर ctrl-x ctrl-e से मौजूदा लाइन को $EDITOR में भेजा जा सकता है

  • 20 साल पहले readline का उपयोग करके एक multiline editor बनाया था

    • इसमें cursor movement और terminal size बदलने पर redraw की सुविधा शामिल थी
    • इसे Rust में फिर से लिखकर एक छोटी library के रूप में जारी करना चाहता हूँ
  • fgets() function के व्यवहार के बारे में सवाल

    • fgets() मूल रूप से तब तक block रहता है जब तक उपयोगकर्ता नई पंक्ति दर्ज नहीं करता
    • backspace, Ctrl+W, Ctrl+U shortcuts का उपयोग करके line buffer को edit किया जा सकता है
  • एक राय कि terminal Linux की market share कम होने के कारणों में से एक है

    • terminal का उपयोग अनुभव जटिल है
  • इस राय का खंडन कि dash shell arrow keys को support नहीं करता

    • libedit के साथ compile करने पर editing mode को support करता है
    • POSIX standard के अनुसार set -o vi को support करना चाहिए
  • तीन बुनियादी readline keybindings जिन्हें जानना लोगों के लिए उपयोगी है

    • Ctrl+W: आख़िरी शब्द हटाना
    • Ctrl+O: history से अगली पंक्ति चलाना
    • Ctrl+R: history में reverse search
  • Windows Terminal में Ctrl-C और Ctrl-V के व्यवहार को लेकर शिकायत

    • Linux terminal apps, Windows Terminal की तरह व्यवहार नहीं करतीं
  • एक राय कि यह Linus की classic पोस्ट की याद दिलाता है