2 पॉइंट द्वारा GN⁺ 2024-01-31 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • टर्मिनल Emacs में Solarized जैसी थीम को सही तरह देखने के लिए 24-बिट रंग अपने आप से ज्यादा यह महत्वपूर्ण है कि terminal, terminfo, tmux और mosh एक ही color capability को अंत तक समझते हैं या नहीं
  • RGB रंग ESC[38;2;<r>;<g>;<b>m रूप में व्यापक रूप से इस्तेमाल होते हैं, लेकिन standard के ज्यादा करीब colon syntax और वास्तविक implementations में फैले semicolon syntax दोनों बने रहने से compatibility जटिल हो जाती है
  • xterm-256color और xterm-direct क्रमशः 256-color palette और 16,777,216 रंगों का विज्ञापन करते हैं, लेकिन terminfo का palette-केंद्रित model direct RGB colors को साफ़ तरीके से व्यक्त नहीं कर पाता
  • वास्तविक environments में ncurses-term के -direct entries, tmux-direct, mosh 1.4 series, vscode-direct जैसे वैकल्पिक TERM values की जरूरत पड़ सकती है, और कुछ layers अब भी केवल semicolon तरीका स्वीकार करती हैं
  • आधुनिक terminal capabilities को भरोसेमंद तरीके से इस्तेमाल करने के लिए सिर्फ TERM और terminfo काफी नहीं हैं; terminal name और version के हिसाब से capabilities को ज्यादा तेजी से update करने वाली अलग representation की जरूरत है

टर्मिनल Emacs में 24-बिट रंगों की जरूरत क्यों है

  • graphical environment में Emacs अपने-आप 24-बिट रंग support करता है और Solarized जैसी themes और fonts को सही दिखाता है
  • terminal में वही theme इस्तेमाल करने पर color expression सीमित हो सकता है, जिससे screen कम आकर्षक दिख सकती है
  • लोकप्रिय terminals लंबे समय से 24-बिट रंग support करते आए हैं, लेकिन program द्वारा उनका उपयोग करने के लिए capability detection और settings दोनों सही होने चाहिए
  • लक्ष्य दो हैं
    • मौजूदा terminal environment में truecolor support चालू करने का तरीका खोजना
    • यह देखना कि Emacs color समस्या 1970–1990 के दशक के terminal standards से कैसे जुड़ती है

ANSI escape codes और color extension का इतिहास

  • शुरुआती hardware terminals अलग-अलग control code systems इस्तेमाल करते थे, और portable software बनाने के लिए ANSI standardization की जरूरत थी
  • ANSI escape codes 1970 के दशक से चले आ रहे हैं, और colors में SGR(Select Graphics Rendition) मुख्य है
    • bold या brightness
    • italic
    • blink
    • foreground color और background color
    • अन्य character display attributes
  • शुरुआत में colors RGB cube के 8 vertices के बराबर 3-bit colors थे
    • black, white, additive primary colors और subtractive primary colors शामिल थे
  • बाद में bright color या bold bit जुड़ने से यह 16 colors तक बढ़ा
    • “bright black” गहरे gray के बराबर है
  • 1999 में Todd Larason ने xterm में 256-color support patch जोड़ा
    • 6x6x6 RGB color cube sampling
    • 24-step grayscale ramp
    • एक दुर्लभ लेकिन अब भी supported 88-color variant भी मौजूद है

24-बिट color syntax कैसे बना

  • 8-bit colors और 24-bit colors compatible terminals में निम्न रूपों में set किए जाते हैं
    • ESC[38;5;<n>m: palette के color number n को foreground color के रूप में set करता है
    • ESC[38;2;<r>;<g>;<b>m: RGB values r, g, b को foreground color के रूप में set करता है
  • संख्या 5 और 2 ISO 8613-6, यानी ITU T.416 के extended color modes से जुड़ी हैं
    • 2: RGB space का direct color
    • 5: indexed color
  • standardization flow इस प्रकार है
    • 1970s: ANSI ने terminal escape sequences को standardize किया, जिससे ANSI X3.64 और ECMA-48 बने
    • 1979: ECMA-48 2nd edition ने SGR 30~37, 40~47 को 3-bit foreground और background colors को assign किया
    • 1984: ECMA-48 3rd edition ने default foreground और background color concepts पेश किए और 39, 49 assign किए
    • 1991: ECMA-48 5th edition ने 38 और 48 को “future standardization” के लिए छोड़ा और ISO 8613-6 को clue के रूप में रखा
    • 1993: ISO 8613-6 ने 38 और 48 को extended foreground/background color modes के रूप में define किया
  • sub-parameters अलग करने के लिए colon का उपयोग standard के ज्यादा करीब है, लेकिन वास्तविक implementations ने semicolon को व्यापक रूप से अपनाया
    • ESC[38;5;3m SGR 38 न जानने वाले terminal में 38, 5, 3 जैसे अलग parameters के रूप में interpret हो सकता है
    • Thomas Dickey की xterm FAQ बताती है कि उस समय ITU T.416 की copies महंगी थीं, और RGB values को अन्य SGR parameters की तरह semicolon से अलग करना गलती थी
  • संबंधित timeline इस प्रकार है
    • 1999: Thomas Dickey ने Todd Larason का 256-color patch xterm में merge किया, और ambiguous semicolon syntax शामिल हो गया
    • 2006: Konsole ने xterm जैसे semicolon syntax के साथ 256-color और 24-bit truecolor support किया
    • 2012: xterm को standard के ज्यादा करीब colon syntax भी स्वीकार करने के लिए modify किया गया
    • 2016: Windows 10 built-in console ने ANSI escape codes और 24-bit colors support किए, लेकिन semicolon syntax इस्तेमाल किया
    • 2019: Windows Terminal भी ANSI escape codes support करता है, लेकिन semicolon syntax इस्तेमाल करता है
    • 2022: Microsoft ने legacy VGA-style console subsystem से ANSI terminal emulation की ओर ecosystem transition की घोषणा की
    • 2022: Konsole ने standards-compatible colon syntax support किया

terminfo color capabilities को कैसे व्यक्त करता है

  • terminfo terminal capability database और उपयुक्त escape sequences generate करने की capability देता है
  • TERM environment variable उस terminfo record की ओर इशारा करता है जिसे program इस्तेमाल करेगा, और ssh connection में भी अपने-आप forward होता है
  • toe installed terminfo records की list दिखाता है, और infocmp किसी खास record की capabilities check करने के लिए इस्तेमाल होता है
  • color से जुड़ी तीन important capabilities हैं
    • colors: terminal द्वारा supported colors की संख्या
    • setaf: foreground color setting
    • setab: background color setting
  • xterm-256color का setaf color number के हिसाब से अलग sequences निकालता है
    • 0~7: ANSI 30~37 SGR parameters का उपयोग
    • 8~15: non-standard 90~97 bright colors का उपयोग
    • उससे आगे: 38;5;<n> रूप में 256-color palette का उपयोग
  • xterm-direct 24-bit RGB के लिए terminfo entry है, जो colors को 16,777,216 के रूप में advertise करता है
    • यह ccc को बंद करता है, जिससे संकेत मिलता है कि color indexes को नए RGB values assign नहीं किए जा सकते
    • initc, oc, rs1 जैसे runtime color-change related entries भी गायब हैं
    • setaf और setab colon-based 38:2::... form इस्तेमाल करते हैं

terminfo के direct color model की सीमाएं

  • terminfo और ncurses का programming model मूल रूप से palette entries केंद्रित है
    • N palette entries होते हैं
    • हर entry में default RGB value होती है
    • यह model मानता है कि terminal इस value को बदल सकता है
  • -direct terminal 24-bit colors दिखाने के लिए ऐसा प्रस्तुत करता है जैसे 16,777,216 palette entries हों
    • हर entry 8:8:8 RGB cube से मेल खाती है
    • values बदली नहीं जा सकतीं
  • compatibility के लिए xterm-direct तरीका सबसे गहरे blue के 7 values को default ANSI 8 colors के साथ compatibility के लिए उपयोग करता है
    • black शामिल नहीं है
    • यह ऐसे मामलों से बचने की व्यवस्था है जहां पुराने programs setaf का meaning assume करते हुए लगभग अदृश्य dark blue output कर दें
  • इस वजह से -direct तरीका और -256color तरीका आपस में compatible नहीं हैं
    • program को पता होना चाहिए कि 256 colors indexed colors हैं और 16,777,216 colors direct colors हैं
    • सबसे गहरे blue के 7 values से बचने वाला exception भी है
  • termwiz से जुड़ी समस्या में program xterm-256color palette की उम्मीद कर रहा था, लेकिन असल में पढ़ने में कठिन dark blue range output कर रहा था
    • वह issue लिखे जाने के समय open था, लेकिन @quark-zju ने fix शामिल किया और अब termwiz reasonable तरीके से काम करता है
  • मुख्य बात terminal itself से ज्यादा terminfo constraints के करीब है
    • 24-bit color support करने वाले terminals xterm 256-color palette और RGB values dynamic changes भी support करते प्रतीत होते हैं
    • terminfo modern terminal emulator ecosystem को accurate और जल्दी express करने के लिए पर्याप्त नहीं है

TERM settings और semicolon compatibility

  • बहुत सारे programs terminfo इस्तेमाल करते हैं, इसलिए TERM value सही set होनी चाहिए
  • colon-based SGR syntax पर standardize करना चाहें तब भी कई environments अब भी केवल semicolon syntax support करते हैं
    • Windows built-in console Conhost
    • Mintty और Cygwin environment में कुछ behavior
    • Mosh
    • PuTTY
    • Ubuntu 22.04 LTS में शामिल Konsole version
  • terminfo entries building blocks से बनी होती हैं
    • xterm+direct: standard के ज्यादा करीब colon syntax
    • xterm+indirect: केवल semicolon support करने वाले legacy terminals के लिए
  • xterm+indirect खोजने पर vscode-direct सबसे उपयुक्त लगा
    • क्योंकि यह Microsoft terminals को target करता है, इसलिए Windows Terminal और Windows Console के काफी करीब माना गया
    • सभी capabilities audit नहीं की गईं, लेकिन यह काम करता है
  • कई servers में -direct terminfo entries installed नहीं हो सकते
    • अधिकांश systems में default terminfo database ncurses-base package में होता है
    • extended terminal entries के लिए ncurses-term package चाहिए
  • लिखते समय ncurses में winconsole terminfo entry जोड़ी गई थी, लेकिन यह 24-bit color support नहीं करती और अभी तक किसी ncurses version में release नहीं हुई है

Emacs truecolor कैसे detect करता है

  • Emacs ने TTY में truecolor support detect करने का तरीका document किया है
  • M-x eval-expression में (display-color-cells) चलाने पर check किया जा सकता है कि Emacs 16,777,216 colors पहचानता है या नहीं
  • Emacs documentation -direct mode की terminfo limitations भी cover करता है
    • RGB capability वाले terminals #000001 से #000007 तक को direct RGB के बजाय indexed colors की तरह treat कर सकते हैं
    • यह direct color न जानने वाले applications के साथ backward compatibility बनाए रखने के लिए है
    • अगर यह समस्या बने तो setb24, setf24 वाली custom terminal definition इस्तेमाल की जा सकती है
  • Emacs पहले setf24 और setb24 strings खोजता है, और न मिलने पर RGB को fallback capability के रूप में इस्तेमाल करता है
  • जांचे गए system के terminfo entries में setf24 शामिल नहीं था

nested terminals में सभी layers का मेल खाना जरूरी है

  • सामान्य workflow कई terminal layers को nest करता है
    • local desktop पर graphical terminal emulator खोलना
    • remote machine या VM में mosh से connect करना
    • tmux start करना
    • Emacs internal terminal, Asciinema, GNU Screen आदि को अतिरिक्त रूप से इस्तेमाल करना
  • हर layer अपनी ANSI escape sequence state machine implement करती है
  • 24-bit colors चलाने के लिए सभी layers को inner TERM value के terminfo से generated escape sequences समझने चाहिए और outer terminfo के अनुसार सही तरीके से pass करना चाहिए
  • इसलिए संबंधित software sufficiently recent होना चाहिए
    • मौजूदा Ubuntu LTS mosh 1.3 देता है, इसलिए mosh-dev PPA enable करना पड़ा
  • हर layer के अंदर TERM भी accurate होना चाहिए
    • tmux के अंदर tmux-direct इस्तेमाल करें
    • mosh के लिए standard terminfo नहीं है, इसलिए sufficiently close value चुनना होगा

environment-specific settings

  • graphical terminal emulator

    • ज्यादातर terminals appropriate default TERM set करते हैं या user को override करने देते हैं
    • Konsole में TERM value चुनने का option है
  • ssh

    • ssh TERM value को नए shell में forward करता है
    • remote host में वही terminfo record हो तो configuration relatively simple है
  • tmux

    • tmux चलाने पर TERM screen पर set हो सकता है
    • इसे ~/.tmux.conf में default terminal बदलकर हल किया जाता है
    set -g default-terminal "tmux-direct"
    
    • यह भी consider किया जा सकता है कि outer TERM 24-bit colors support करने पर ही conditionally tmux-direct set करें, वरना screen या tmux-256color बनाए रखें
  • mosh

    • latest mosh 24-bit colors support करता है, लेकिन खुद केवल 8-color या 256-color advertise करता है
    • इसलिए user को TERM उचित रूप से set करना होगा
    • mosh xterm compatibility target करता है, लेकिन SGR 38 और 48 में केवल semicolon syntax support करता है
    • TERM=xterm-direct काम नहीं करता
    • vscode-direct को xterm-direct के सबसे करीबी alternative के रूप में इस्तेमाल किया गया
    • mosh चल रहा है या नहीं बताने वाला convenient variable नहीं है, इसलिए detect-mosh.rs script लिखकर .bashrc से call किया गया
    • यह check करने का तरीका है कि shell process mosh-server का child है या नहीं
    • login path में Rust compile करने वाला तरीका low-performance hosts के लिए उपयुक्त है या नहीं, यह तय नहीं किया गया

अंतिम परिणाम और बची समस्याएं

  • settings के बाद tmux और mosh के अंदर Emacs में भी theme 24-bit colors में दिखती है
  • बची समस्याएं तीन बिंदुओं में summarized हैं
    • terminals syntax और capabilities पर पूरी तरह सहमत नहीं हैं
    • terminfo capability lookup का standard path है
    • terminfo सीमित और कभी-कभी inaccurate है, और नए version releases भी बार-बार नहीं आते

terminfo के बाद की दिशा

  • modern terminal capabilities का पूरा फायदा उठाने वाले software को terminfo से आगे जाने की जरूरत है
  • संभावित directions इस प्रकार हैं
    • व्यापक रूप से supported TERM variable का उपयोग जारी रखें
    • OS या distribution के पुराने terminfo पर ही निर्भर न रहकर program को terminal capabilities स्वतंत्र रूप से जानने दें
    • अक्सर update होने वाली library में पिछले लगभग 10 वर्षों के terminal emulator information को name और version के आधार पर रखें
    • अब इस्तेमाल करना कठिन hardware terminal support शामिल न करें
    • OS-provided terminfo files और terminfo file format को support जारी रखें, लेकिन कौन-सी जानकारी latest है यह तय करने के लिए protocol रखें
    • optional TERMVERSION से 2022 Konsole और 2023 Konsole जैसी version-specific capability differences अलग करें
    • 24-bit colors, 256-color palette animation, URL links, Kitty graphics protocol जैसी modern capabilities को स्पष्ट रूप से express करें
  • legacy programs के लिए backward-compatible तरीका भी संभव है
    • .bashrc से चलने वाला program TERM और TERMVERSION का उपयोग करके $HOME/.terminfo/ में binary terminfo file generate करे
    • RGB, setf24, setb24 जैसी स्पष्ट 24-bit color capabilities generate करे
    • RGB न जानने वाले programs को 256-color palette assume करने वाला मानकर colors#0x100, initc, oc बनाए रखे

1 टिप्पणियां

 
GN⁺ 2024-01-31
Hacker News टिप्पणियाँ
  • terminfo को खंगालना ऐसा लगता है जैसे किसी गहरे भूमिगत मकबरे में टिमटिमाती मशाल से चित्रलिपि पढ़ रहे हों
    यह अजीब है कि एक टर्मिनल ऐप में कितनी जटिलता भरी होती है, और इससे iTerm और Kitty जैसे टर्मिनल डेवलपर्स के लिए और ज़्यादा आभार महसूस होता है
    iTerm+zsh में टैब रंग सेट करने वाले functions यहाँ संकलित हैं: https://gist.github.com/aclarknexient/84ebe33c1879f921685304...
    पहले की तरह telnet से HTTP या SMTP में जुड़ने के तरीकों से तुलना करें, तो टेक्स्ट खुद भले सरल हो, लेकिन उस टेक्स्ट को दिखाने वाला हिस्सा हर तरह की सुविधाएँ सँभालने वाला एक जटिल application है

    • अपना बनाया हुआ टर्मिनल इस्तेमाल करते समय शुरुआत में मैंने terminfo की परवाह नहीं की और rxvt होने का दिखावा करने का फैसला किया, और जो समस्याएँ आएँ उन्हें स्वीकार किया
      यह अभी इसलिए संभव है क्योंकि उस टर्मिनल का उपयोगकर्ता लगभग सिर्फ मैं ही हूँ, लेकिन आधुनिक टर्मिनल काफ़ी बड़ा common subset सपोर्ट करते हैं, इसलिए apps का अनजान TERM वैल्यू देखकर भ्रमित होना उससे भी ज़्यादा दर्दनाक है
      बेशक, अगर आप नए सिस्टम में अक्सर SSH से लॉगिन नहीं करते, तो यह कम महत्वपूर्ण समस्या है
    • अगर टैब रंग वास्तव में लागू होने का screenshot साझा कर सकें तो अच्छा होगा
    • Mac पर जिस software की सबसे ज़्यादा कमी महसूस होती है, वह iTerm है
      यह सबसे तेज़ terminal emulator नहीं है, लेकिन दिखने में यह बहुत आगे है
  • अलग-अलग terminal apps में 16-रंग palette को समायोजित करना, application-side terminal code को ठीक-ठीक मिलाने से आसान लगा
    ~/.Xdefaults में rxvt-unicode के रंग सेट किए, और Emacs theme .el में graphic display है या नहीं उसके आधार पर अलग रंग नाम तय करके कई faces पर लागू किया
    बोनस के तौर पर रंगों वाला ls output भी ज़्यादा अच्छा दिखने लगा। डिफ़ॉल्ट 16-रंग palette अक्सर बहुत ज़्यादा saturated होती है और उसका contrast भी खराब होता है

    • असली कुंजी तो (if (display-graphic-p) ही है
      Emacs सच में graphic output सपोर्ट करता है, और X11/Cocoa/Win32 में Esc सचमुच Esc की तरह काम करता है, साथ ही Ctrl+Shift या Cmd bindings, एक साथ कई fonts का उपयोग, images दिखाना, cursor shape बदलना आदि भी संभव हैं
      यह मानो आपको 20 साल आगे, यानी 1989 में ले जाने वाली टाइम मशीन हो
    • पुराने TTL displays में उससे ज़्यादा संभव ही नहीं था, इसलिए रंग इतने saturated थे
      लाल लाइन या तो तेज़ लाल होती थी या बंद, और intensity लाइन जुड़ने पर वह 100% लाल बन जाती थी
    • अगर DIRCOLORS में sequences डालें, तो ls भी वास्तव में 24-bit color सपोर्ट करता है
    • मैं भी Terminology की 16-रंग palette को INI फ़ाइल में अपनी पसंदीदा theme के हिसाब से समायोजित करके, console और terminal apps (vim) में एक जैसा style इस्तेमाल करता हूँ
    • मैं भी लगभग यही तरीका इस्तेमाल करता हूँ
      बेस रंग dark background की तुलना में बहुत गहरे थे, इसलिए मैंने सभी रंगों की luminance बढ़ा दी
  • अगर लेखक को export COLORTERM=truecolor पता होता, तो शायद उसे बहुत कम परेशानी होती
    linked Emacs दस्तावेज़ के truecolor detection footnote में भी यह आता है और Konsole screenshot में भी दिखता है, लेकिन संभव है कि terminal multiplexer की कई परतों के भीतर यह गायब हो गया हो
    यह वैल्यू सेट करने पर apps तुरंत समझ लेते हैं कि truecolor चाहिए, इसलिए मुश्किल हिस्से छोड़े जा सकते हैं और terminfo database की भी ज़रूरत नहीं पड़ती

    • सही है। इस इतिहास में COLORTERM और RGB terminfo feature जैसी trial-and-error बातें भी शामिल होनी चाहिए थीं
      हालांकि सभी programs COLORTERM का सम्मान नहीं करते, इसलिए मैंने .bashrc में linux | screen* होने पर COLORTERM unset किया था और बाकी में COLORTERM=truecolor export किया था
      आजकल Screen 24-bit color सपोर्ट करता है, तो शायद यह Ubuntu 18 के समय की setting रही होगी
    • या फिर अपनी पसंद का GUI Emacs tramp या sshfs के साथ इस्तेमाल कर सकते हैं
    • सही बात। terminfo के रास्ते उतरते ही सिर्फ़ पागलपन इंतज़ार करता है
      एक वजह यह भी है कि ncurses maintainer काफ़ी conservative है, जबकि नए terminal developers तेज़ी से आगे बढ़ना चाहते हैं
    • terminfo database की ज़रूरत न रहना Emacs 28 से शुरू हुआ
      उससे पुराने Emacs में अब भी terminfo database चाहिए
    • COLORTERM भी काफ़ी अजीब है
      ज़्यादातर समय इसे define करने की ज़रूरत नहीं होती, लेकिन screen session में अगर COLORTERM=truecolor सेट हो, तो अचानक स्क्रीन बहुत अजीब दिखने लगती है, और environment variable हटा दें तो सब फिर सामान्य दिखता है
  • Emacs के साथ काम करते समय ज़रूरी नहीं कि टर्मिनल ही इस्तेमाल किया जाए
    MacOS, Windows, X.org, Wayland के लिए ग्राफिकल फ्रंटएंड इस्तेमाल किए जा सकते हैं
    ग्राफिकल Emacs, अगर toolbar बंद हो, तो टर्मिनल में चलने वाले Emacs जैसा इतना मिलता-जुलता दिखता है कि Emacs को न जानने वाला कोई व्यक्ति सहकर्मी के कंप्यूटर पर दिख रही ग्राफिकल Emacs विंडो को टर्मिनल विंडो समझ सकता है
    Emacs user survey में 80% लोगों ने कहा कि वे ग्राफिकल फ्रंटएंड इस्तेमाल करते हैं

    • इसके जवाब में, अगर आप पूरी GUI की भारीपन के बिना टर्मिनल इस्तेमाल करना चाहते हैं, तो सिर्फ xterm-mouse-mode से भी 80% फायदे मिल सकते हैं
      mouse, xterm-mouse-mode, mouse-wheel-mode, scroll settings वगैरह जोड़ दें तो यह काफ़ी उपयोगी हो जाता है, और auto-save-default को ईश्वर की इच्छा के अनुसार nil पर छोड़ा जाता है
    • Emacs को टर्मिनल emulator के अंदर नहीं चलाया जाता। Emacs ही terminal emulator है
      सभी terminal programs ग्राफिकल Emacs के shell-mode buffer में चलाए जाते हैं, और केवल वे दुर्लभ programs जिन्हें full-screen control चाहिए, उनके लिए term-mode इस्तेमाल होता है
      यह न सबसे ज़्यादा feature-rich है न सबसे तेज़, लेकिन इसमें दूसरे buffers की तरह move किया जा सकता है और एडिट हो रही सामग्री के साथ इसे सहज रूप से संभाला जा सकता है
      अगर remote computer पर ग्राफिकल Emacs नहीं चलाया जा सकता, तो tramp से remote files एडिट करते हैं, या headless Emacs server चलाकर ग्राफिकल emacsclient से कनेक्ट करते हैं
    • यह अच्छी बात है
      मैंने कभी सोचा ही नहीं था कि लोग यह मान सकते हैं कि मैं Emacs को टर्मिनल में चला रहा हूँ
      ग्राफिकल Emacs काफ़ी बेहतर है, लेकिन टर्मिनल में भी लगभग 90% चीज़ें उसी तरह काम करना और दिखना फिर भी शानदार है
    • मैं X आधारित Emacs इस्तेमाल करता हूँ, और protocol काफ़ी efficient है
      अनुभव में यह टर्मिनल जितना हल्का लगता है और VNC जैसा महसूस नहीं होता
      इसमें fonts, एक साथ अलग-अलग fonts का उपयोग, menus, mouse, colors, कई frames/windows जैसी खूबियाँ हैं
      अगर graphics लोकल पर चलें और remote system तक tramp से पहुँचा जाए, तो practically सिर्फ busybox वाले remote Linux आधारित router की config files भी तमाम सुविधाओं के साथ एडिट की जा सकती हैं
    • आख़िरकार मैं हमेशा terminal-based Emacs पर लौट आता हूँ, इसके दो कारण हैं
      90 के दशक से X11 को बीच-बीच में इस्तेमाल करता आया हूँ, लेकिन fonts आज भी ऐसी चीज़ हैं जिनके लिए खोजते-खोजते कोई command मिल जाए जो काम करे, और फिर उसे दोबारा छेड़ा न जाए
      corporate environment में इस्तेमाल होने वाली ज़्यादातर X11 setups की तुलना में, अधिकतर terminal programs की display performance अब भी साफ़ तौर पर तेज़ है
  • आजकल बस नया Emacs install करें, 24-bit xterm सपोर्ट करने वाला टर्मिनल खोलें, और emacs -nw चला दें
    theme लगाने के बाद अगर ठीक दिखे तो काम ख़त्म, और अगर नहीं, तो .bashrc, .zshrc, .fishrc वगैरह में export COLORTERM=truecolor जोड़ें, फिर shell को reload करें या सिर्फ वही line चला दें और emacs -nw दोबारा शुरू करें
    यह लेख ऐसा दिखाता है मानो terminfo में गहराई तक जाना पड़ेगा, लेकिन आम तौर पर इसकी ज़रूरत नहीं होती। 10 साल पहले की बात अलग थी, अब नहीं
    मैंने जल्दी से MacOS के iTerm और Linux के Alacritty, Kitty, Gnome Terminal में फिर जाँच लिया, और आजकल 24-bit xterm support आम बात है

  • आज पता चला कि Windows 10 Command Prompt में standard ANSI escape sequences भी काम करते हैं
    24-bit colors भी ठीक से काम करते हैं
    echo ^[[48;2;255;0;0mHello^[[0m चलाने पर Hello लाल RGB(255,0,0) background के साथ दिखता है, और ^[[0m रंग को वापस सामान्य कर देता है
    ^[ को CTRL-[ से टाइप करना होता है; ^ और [ को अलग-अलग नहीं टाइप करना चाहिए

    • अगर आप command line में non-printable characters सीधे नहीं डालना चाहते, तो escape codes स्वीकार करने वाले command के साथ \x1b escape code या \e alias इस्तेमाल कर सकते हैं
      उदाहरण के लिए echo -e '\e[48;2;255;0;0mHello\e[0m' जैसा कर सकते हैं
      लेकिन scripts में echo -e non-standard है और सामान्य echo भी edge cases में अलग व्यवहार करता है, इसलिए हमेशा printf '\e[48;2;255;0;0mHello\e[0m\n' इस्तेमाल करना बेहतर है
    • C:\CONFIG.SYS फ़ाइल में DEVICE=C:\DOS\ANSI.SYS जोड़ना न भूलें
  • vim/neovim की तुलना में Emacs की सबसे अच्छी बात यह है कि इसमें केवल विंडो के अंदर का terminal emulator नहीं, बल्कि first-class GUI support है
    मुझे पता है कि gVim और कई अधूरे neovim फ्रंटएंड मौजूद हैं, लेकिन Emacs का default execution mode एक असली GUI है, और यही बात अच्छी लगती है
    टर्मिनल भी ठीक है, लेकिन उसमें ऐतिहासिक बोझ और पाबंदियाँ बहुत ज़्यादा हैं, और आज के समय में कुछ बातें बिल्कुल बेमानी लगती हैं
    अगर remote server पर Emacs चलाना समस्या है, तो TRAMP और emacsclient मौजूद हैं

    • जब सब कुछ टर्मिनल में चलाते हैं, तो एक अच्छी बात यह है कि टर्मिनल में जो भी दिख रहा हो, उसे कॉपी किया जा सकता है
      जब GUI app दिख रहे text को कॉपी नहीं करने देता और उसे हाथ से फिर से टाइप करना पड़ता है, तो बहुत झुंझलाहट होती है
    • यह सही नहीं है। Neovim के लिए कई native frontends हैं, और उसकी डिज़ाइन शुरू से ही ऐसी architecture को संभव बनाने के लिए की गई थी
      https://github.com/neovim/neovim/wiki/Related-projects#gui
    • पूरी तरह सहमत
      मुझे modal editing और vim सच में बहुत पसंद हैं, लेकिन terminal editor जो आधा-अधूरा समाधान देता है, उसे सहना मुश्किल था
      जब समृद्ध graphical platforms मौजूद हैं, तो उनका इस्तेमाल क्यों न किया जाए?
    • यह workflow पर बहुत निर्भर करता है
      उदाहरण के लिए vim लगभग सिर्फ files एडिट करने के लिए इस्तेमाल होता है, और git, linter, formatter, debugger, file tree manipulation जैसे बाहरी tools के लिए वापस shell में चला जाता है
      इसलिए मेरा मुख्य application पहले से ही terminal emulator है, और इस workflow में dedicated GUI न होना लगभग मायने नहीं रखता
  • मुझे तो अच्छा लगेगा अगर मेरा Emacs कुछ ऐसा दिखे: https://imgur.com/a/h0jA1ro
    कोई गंभीर बात नहीं, बस मज़ाक है। Cool Retro Term मैं सिर्फ़ प्रेज़ेंटेशन के समय इस्तेमाल करता हूँ
    देखा तो पता चला कि मेरे Emacs में 24-बिट रंग डिफ़ॉल्ट रूप से काम करते हैं: https://imgur.com/a/BM5OTxp
    बस syntax highlighting थोड़ी खटकती है

    • https://muppetlabs.com/~mikeh/crt_emacs.png
      Cool Retro Term शानदार है, और मैं भी इसे किसी प्रेज़ेंटेशन में आज़माना चाहूँगा
    • मुझे Cool Retro Term सच में बहुत पसंद है, लेकिन अफ़सोस है कि प्रोजेक्ट लगभग छोड़ दिया गया है और MacOS पर कई समस्याएँ हैं
      व्यक्तिगत रूप से, दूसरे retro terminal मुझे इतने अच्छे नहीं लगते
    • मैं वास्तव में Windows Terminal में हल्का-सा customized CRT effect इस्तेमाल करता हूँ
  • standard को इतनी महँगी कीमत के पीछे बंद कर देना वाकई शर्मनाक है
    लोग उसे खरीदने से बचने के लिए इतना घुमावदार रास्ता अपनाने पर मजबूर होते हैं, और ऐसे नतीजे भी सामने आ सकते हैं
    अगर वह standard है, तो वह सुलभ होना चाहिए। जब यह सिर्फ़ किताब के रूप में आता था, तब printing cost लेना समझ में आता था, लेकिन एक साधारण PDF के लिए 200 डॉलर लेना यक़ीन करना मुश्किल है

  • मैंने xterm का 24-बिट रंग patch लिखा था, लेकिन आज ही पता चला कि xterm-direct के साथ ncurses कैसे चलाया जा सकता है
    मैं पहले से ही Lisp में बनी अपनी terminal library इस्तेमाल कर रहा था, फिर भी ncurses के साथ एक fallback path रखना अब भी उपयोगी है
    Stack Overflow सवाल का जवाब देने वाले Mr. Dickey और यह बात उठाने वाले Chad का धन्यवाद