2 पॉइंट द्वारा GN⁺ 2024-10-04 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • टर्मिनल रंगों की समस्या पसंद-नापसंद से ज़्यादा standards की कमी और implementation के फर्क से जुड़ी है; वही command output भी terminal, theme और app के combination के हिसाब से पढ़ने में मुश्किल हो सकता है
  • बेसिक 16 ANSI colors, 256-color और 24-bit hex colors साथ-साथ इस्तेमाल होते हैं, लेकिन कोई color number असल में किस रंग जैसा दिखेगा, यह terminal emulator के हिसाब से बदलता है
  • नीला text/काला background, चमकीला पीला/सफेद background, Solarized की grey mapping, ngrok background color जैसे contrast conflicts तब सामने आते हैं जब program की assumptions और user theme मेल नहीं खाते
  • समाधान कई layers में बंटे हैं, जैसे palette reset, base16-shell, LS_COLORS, NO_COLOR=true, --color=always, unbuffer, और Vim/Neovim का 24-bit color support
  • iTerm2, tabby, kitty, Ghostty और Windows Terminal का minimum contrast feature परफेक्ट समाधान नहीं है, लेकिन unreadable output बनने का जोखिम घटाता है

ANSI colors और terminals के बीच फर्क

  • Terminal में आम तौर पर काला, लाल, हरा, पीला, नीला, magenta, cyan, सफेद और इनके bright versions से बने 16 ANSI colors होते हैं
  • Programs ANSI escape code output करके रंग specify करते हैं
    • उदाहरण के लिए \033[38;5;{num}m format में foreground color number specify किया जा सकता है
  • समस्या यह है कि ANSI color number असल में किस hex color से map होगा, इसके लिए consistent standard नहीं है
    • हर terminal emulator खुद रंग चुनता है
    • Wikipedia की ANSI escape code color table में भी implementations के बीच काफी फर्क दिखता है
  • इसी फर्क की वजह से ls directories के लिए जो नीला रंग इस्तेमाल करता है, वह काले background पर ठीक से नहीं दिख सकता
  • bright yellow और white background का combination भी लगभग पढ़ना मुश्किल होता है, और bright green जैसे दूसरे रंगों में भी ऐसी समस्या आ सकती है

Color palette reset करने का तरीका

  • अगर default ANSI colors पसंद नहीं हैं या contrast की समस्या है, तो palette reset से इसे संभाला जा सकता है
  • Terminal emulator में setting

    • ज्यादातर modern terminal emulators रंगों को reset करने का feature देते हैं
    • कुछ में built-in themes भी मिलती हैं
    • जितना popular terminal emulator होगा, उतनी ज्यादा selectable themes मिल सकती हैं
  • Shell script से setting

    • ANSI escape code output करके terminal emulator की color palette बदली जा सकती है
    • base16-shell की Solarized Light script कई terminals के escape code conventions इस्तेमाल करती है
    • Script TERM environment variable के हिसाब से सही escape code style चुनने की कोशिश करती है
    • Shell script वाला तरीका terminal emulator बदलने पर भी वही color settings बनाए रखना आसान बनाता है
    • हालांकि हर terminal emulator इस तरीके से palette बदलना support नहीं करता, और support करने पर भी result थोड़ा-थोड़ा अलग हो सकता है

256 colors, 24-bit colors और tool-specific themes

  • कई terminals color specify करने के 3 तरीके support करते हैं
    • 16 ANSI colors
    • extended 256 colors
    • #ffea03 जैसे 24-bit hex colors
  • fd output में ^[[38;5;48m जैसा escape code इस्तेमाल करके foreground color 48 specify करता है
    • यह रंग सामान्य terminal color table में न दिखने वाले lime color जैसा लग सकता है
    • इस्तेमाल हो रही color table के साथ इसका contrast खराब हो सकता है
  • bat भी इसी तरह colors इस्तेमाल करता है, लेकिन उसका default output अलग-अलग terminal themes में काम करने के लिए बनाया हुआ लगता है
  • fd, bat, delta जैसे कुछ नए terminal tools arbitrary custom themes support करते हैं
    • Default theme terminal background से clash कर सकती है
    • बदले में, केवल 16 ANSI colors चुनने की तुलना में tool output की theme पर ज्यादा fine-grained control मिलता है
  • bat --theme ansi इस्तेमाल करने पर bat सामान्य terminal color table में configured ANSI colors इस्तेमाल करता है

Solarized और base16 में होने वाले conflicts

  • Solarized Light में implementation के हिसाब से bright color mapping अलग दिख सकती है
  • iTerm की default Solarized Light theme मूल Solarized design की तरह colors 9~14, यानी “bright blue”, “bright red” आदि को grey shades पर map करती है
    • अगर ls directories और executables के लिए bright colors इस्तेमाल करे, तो वे grey दिख सकते हैं
  • base16 Solarized Light एक ऐसे variant की तरह इस्तेमाल हो सकता है जो bright colors को grey नहीं, बल्कि असली colors ही रखता है
  • यह फर्क संभवतः इसलिए है क्योंकि मूल Solarized को इस तरह design किया गया था कि Vim Solarized color scheme grey इस्तेमाल कर सके
  • base16-shell, base16-vim को extra colors देने के लिए colors 16~21 set करता है
    • जब ngrok background को color 16 “black” पर set करने की कोशिश करता है, और वही color bright orange में remap हुआ हो, तो बहुत अजीब background बन जाता है
    • जब program ANSI background color specify करता है और user उस color को किसी दूसरे अर्थ में remap कर देता है, तो ऐसे conflicts आसानी से पैदा होते हैं

Minimum contrast से contrast problems कम करना

  • कुछ terminals minimum contrast feature से foreground और background colors का contrast पर्याप्त न होने पर colors automatically adjust करते हैं
  • iTerm2, tabby, kitty का text_fg_override_threshold, Ghostty और Windows Terminal यह feature देते हैं
  • iTerm में minimum contrast value 40 set करने पर, ngrok background color conflict जैसा पढ़ने में मुश्किल output भी ज्यादा readable हो जाता है
  • जब color settings गलत हों या program और theme clash कर रहे हों, minimum contrast accidental readability issues कम करने वाला practical safety net है

TERM, pipes और colors disable होना

  • अगर SSH से connected system local TERM environment variable value support नहीं करता, तो colors सही से काम नहीं कर सकते
  • System terminfo database इस्तेमाल करता है, और अगर TERM value उस database में नहीं है, तो terminal के लिए सही color output पता करना मुश्किल हो जाता है
  • कोई reproducible environment नहीं था, लेकिन Stack Overflow answer ssh की जगह TERM=xterm ssh जैसे format का सुझाव देता है
  • Commands को pipe से जोड़ने पर कभी-कभी colors disable हो जाते हैं
    • fd | less color के बिना output दे सकता है
    • आम तौर पर grep जैसे tools को भेजते समय escape code के बिना plain text मिलना उपयोगी होता है
  • Colors बनाए रखना चाहते हैं तो unbuffer fd | less -r इस्तेमाल कर सकते हैं
    • unbuffer tty खोलता है ताकि command को लगे कि वह TTY पर लिख रहा है
    • यह pipe में लिखते समय program output buffering की समस्या भी हल करता है
  • कुछ commands, जैसे fd, --color=always flag से हमेशा color output दे सकते हैं

ls colors बंद करना या बदलना

  • कुछ users ls color output नहीं चाहते
    • नीला रंग काले background पर पढ़ना मुश्किल हो सकता है, या
    • वे terminal color table adjust नहीं करना चाहते, या
    • colors खुद उपयोगी नहीं लग सकते
  • Options कई हैं
    • ls --color=never से colors बंद किए जा सकते हैं
    • LS_COLORS environment variable से ls द्वारा इस्तेमाल होने वाले colors customize किए जा सकते हैं
    • कुछ programs NO_COLOR=true support करते हैं, और no-color.org पर उनकी list है
  • उदाहरण के लिए LS_COLORS="fi=0:di=0:ln=0:pi=0:so=0:bd=0:cd=0:or=0:ex=0" ls जैसा set करने पर कई file types की color style 0 पर set की जा सकती है

Vim और Neovim में बदलाव

  • Vim color settings में पहले terminal color table और Vim color scheme को match करना पड़ता था, इसलिए काफी समस्याएं होती थीं
  • Terminal के अंदर Vim color scheme set करने के मुख्य रूप से 2 तरीके हैं
    • Vim color classes को ANSI color numbers पर map करना
    • Color scheme सीधे #faea99 जैसे 24-bit hex colors इस्तेमाल करे
  • 20 साल पहले 24-bit hex colors support करने वाले terminals आम नहीं थे, और Vim भी terminal में 24-bit colors का इस्तेमाल support नहीं करता था
  • Vim ने 2016 में 24-bit color support जोड़ा
  • Neovim 0.10 मई 2024 में release हुआ, और 24-bit color support करने वाले terminals में termguicolors default रूप से on है
  • अगर 2024 में आप ऐसा terminal इस्तेमाल करने की योजना नहीं रखते जो 24-bit colors support नहीं करता, तो terminal color table और Vim color scheme को जरूर sync रखने का बोझ खत्म हो जाता है
  • इस बदलाव से base16-shell को Vim integration के लिए colors 16~21 को special तरीके से set करने की जरूरत कम हो जाती है
    • वह हिस्सा हटाने पर ngrok के orange background जैसे conflicts से बचा जा सकता है

base16 usage experience और limitations

  • base16-shell और base16-vim को साथ इस्तेमाल करने पर terminal और Vim colors match करना आसान हो जाता है
  • fish setting में कुछ lines जोड़कर और .vimrc में कुछ lines डालकर setup किया जा सकता है
  • base16 हर किसी के लिए सही तरीका नहीं है
    • Built-in themes की संख्या सीमित है और पसंद की theme नहीं मिल सकती
    • Solarized base16 theme bright ANSI colors को normal colors जैसा ही set करती है, और जिन use cases में bright colors अलग चाहिए, वहां समस्या हो सकती है
    • base16-vim को ज्यादा colors देने के लिए colors 16~21 set करने का तरीका ऐसे environments में जरूरी नहीं हो सकता जहां सिर्फ 24-bit color support वाले terminals इस्तेमाल होते हैं
    • Colors 16~21 settings Linux framebuffer terminal जैसे 256 colors support नहीं करने वाले terminals में समस्या पैदा कर सकती हैं
  • base16 का community fork tinted-theming है

Color-scheme tools और popular themes

अब भी बची हुई समस्याएं

  • tmux, SSH और Vim के combination जैसे points पर, जहां कई programs मिलते हैं, extra color problems आ सकती हैं
  • अच्छी color scheme चुनना भी अपने-आप में मुश्किल है
    • color vision deficiency वाले users के लिए सही color scheme ढूंढना मुश्किल हो सकता है
    • अगर background color cursor या selection area color के बहुत करीब हो, तो position ढूंढना मुश्किल हो जाता है
    • हर program में सही काम करने वाले colors ढूंढना मुश्किल है, और ngrok case की तरह conflicts हो सकते हैं
  • Nethack या Midnight Commander जैसे programs, जो default ANSI colors पर आधारित किसी खास “classic” look की उम्मीद करते हैं, Solarized जैसी themes में अजनबी लग सकते हैं
  • एक तरीका यह है कि program चलाने से ठीक पहले ANSI palette बदल दी जाए
    • उदाहरण के लिए Nethack चलाने से पहले yellow को ज्यादा bright yellow में remap किया जा सकता है
  • जो users चाहते हैं कि colors बस ठीक से काम करें, उनके लिए इतनी manual configuration बोझिल है; इसलिए sensible defaults और minimum contrast जैसे features महत्वपूर्ण हैं

1 टिप्पणियां

 
GN⁺ 2024-10-04
Hacker News की राय
  • सिस्टम के लिए light color theme ठीक से बनाने की कोशिश में मुझे ये और इससे भी ज़्यादा समस्याएँ झेलनी पड़ीं, और खास तौर पर दो बातें दिलचस्प लगीं
    पीछे मुड़कर देखें तो यह स्वाभाविक है, लेकिन यह देखकर हैरानी हुई कि light theme में स्क्रीन बदलने पर dark theme की तुलना में फर्क कहीं ज़्यादा सूक्ष्म तरीके से दिखता है। Hardware और software settings रंगों के output में अंतर तो पैदा करते हैं, लेकिन उजले क्षेत्रों में बदलाव को हम अंधेरे क्षेत्रों के बदलाव की तुलना में कहीं ज़्यादा महसूस करते हैं
    कई बार Linux या BSD console जैसे ऐसे माहौल तक उतरना पड़ता है जहाँ fonts और fancy color support सीमित होता है। तब fd या exa/lsd/whatever असुविधाजनक या लगभग बेकार हो सकते हैं, खासकर अगर आपने बाद वाले को ls से map कर रखा हो तो झंझट और बढ़ जाता है। लंबी माथापच्ची के बाद मैंने X के बिना भी ठीक-ठाक terminal features इस्तेमाल करने के लिए fbterm सेट किया, लेकिन fbterm की अपनी अलग समस्याएँ हैं। Vim color scheme सेट करते समय कम-feature वाले console के लिए fallback theme तैयार रखनी पड़ती है, या Vim commands बिना देखे टाइप करने की काफी practice करनी पड़ती है :D
    Edit: serious काम के लिए नहीं, लेकिन X के बिना क्या किया जा सकता है यह दिखाने वाली styled fbterm screen: https://i.imgur.com/RbDRgtD.png

    • यह हैरानी की बात नहीं कि light themes अलग-अलग screens पर ज़्यादा सूक्ष्म रूप से अलग दिखती हैं। मैं film से analog black-and-white printing करता हूँ, और यह अच्छी तरह जाना जाता है कि इंसानी आँख print के dark areas की तुलना में bright areas में छोटे-छोटे tonal changes को कहीं बेहतर पकड़ती है
      इसलिए सही exposure और contrast मिलाते समय काफी समय highlights को “बिलकुल सही” दिखाने में लगाया जाता है। मैं digital printing नहीं करता, लेकिन लगता है वही principle वहाँ भी लागू होगा
    • आम तौर पर आपको ठीक से सेट किए गए TERM variable पर भरोसा कर पाना चाहिए, और command-line utilities को भी TERM variable से पता चलने वाली capabilities का सम्मान करना चाहिए
      अफसोस की बात है कि अक्सर JavaScript में लिखे गए “modern” command-line tool frameworks इसे नज़रअंदाज़ करते हैं
      https://www.gnu.org/software/gettext/manual/html_node/The-TE...
    • हाल ही में Excel graph में बड़ी संख्या में data series को अलग-अलग रंगों में दिखाने की कोशिश की, और कई रंगों को आसानी से अलग पहचानने के लिए सबसे अच्छा विकल्प काले background पर solid-spectrum rainbow colors निकला
      Data points पर उसी रंग का हल्का “glow” effect देने की setting भी है, जिससे वे चमकते हुए dots जैसे दिखते हैं। Color saturation के नजरिए से, यानी पूरे spectrum के signal-to-noise ratio के नजरिए से, black background बेहतर होना समझ में आता है
      करीब 10 अलग-अलग रंग लगभग बिना समस्या के इस्तेमाल किए जा सकते हैं। साथ ही yellow का red और green के बीच होना, orange का red और yellow के बीच होना जैसी बातों से order/distance information देने का फायदा भी है, जिससे segment करना और यह समझना आसान हो जाता है कि दो colors कितने करीब हैं
    • शानदार font और अच्छी दिखने वाली color theme होने पर भी, कोई एक background जो कुछ characters को पढ़ना मुश्किल बना दे, सब खराब कर सकता है
  • सच कहें तो मुझे यह इतना मुश्किल नहीं लगता
    चरण 1: ज़्यादातर terminal emulators की default color palette खराब होती है, इसलिए उसे बदल देना चाहिए। निजी तौर पर मुझे Solarized पसंद है, खासकर dark theme, लेकिन light theme भी ठीक है। Solarized न भी हो, तो भी ऐसी बहुत-सी themes हैं जिनमें default background पर कोई भी रंग पढ़ा जा सकता है
    चरण 2: ऐसे command-line tools से बचना चाहिए जो default रूप से 8-bit या 24-bit color escape sequences इस्तेमाल करते हैं। इस पर विवाद हो सकता है, लेकिन निजी तौर पर मैं इसे user-hostile मानता हूं। मैंने पहले ही अपनी readability जरूरतों के हिसाब से सबसे अच्छी terminal color palette चुन रखी है; ऐसे में कोई developer खुद को नकली designer समझकर उसे override करे, इससे मदद नहीं मिलती। tool के अंदर theme चालू करने का option दिया जा सकता है, लेकिन यह default नहीं, बल्कि optional होना चाहिए
    अपनी ज़िंदगी का बड़ा हिस्सा terminal में बिताने वाले व्यक्ति के तौर पर, सिर्फ इन दो नियमों का पालन करने से लगभग बिना setup झंझट के एक consistent और पढ़ने में आसान terminal environment बनाया जा सकता है। असली समस्या यह है कि हम developers द्वारा 8-bit और 24-bit color escape codes इस्तेमाल करने को बहुत ज़्यादा स्वीकार कर लेते हैं

    • यह अच्छे defaults की समस्या से जुड़ा है। अगर user को configure करना पड़े, तो पहले उसे यह पता होना चाहिए कि configuration संभव है, और फिर सचमुच configure भी करना होगा। यह बड़ी बाधा है और बहुत कम users ऐसा कर पाते हैं
      कई सालों में मैं इस नतीजे पर पहुंचा हूं कि नए features को users के सामने साफ़-साफ़ रखना चाहिए और अच्छे defaults को मजबूती से push करना चाहिए। वरना features लगभग इस्तेमाल ही नहीं होते
      8-bit और 24-bit colors पहले से ही optional रूप से इस्तेमाल होने वाला feature हैं और configurable भी हैं। कोई terminal program ठीक से काम करता है, तो TERM और COLORTERM environment variables तय करते हैं कि ऐसे colors इस्तेमाल करने हैं या नहीं
    • खास तौर पर Solarized Dark terminal use के लिए ठीक नहीं बैठता। वजह यह है कि इसके लेखक ने “bright black” को background से लगभग मिलता-जुलता रंग बना दिया है
      कई applications उम्मीद करती हैं कि “bright black” text background पर दिखेगा। इसके कई उदाहरण यहां हैं: https://github.com/altercation/solarized/issues/220
      लगभग हर दूसरी color palette “bright black” को black background पर पढ़े जा सकने वाले gray के रूप में दिखाती है
    • भले ही कोई ऐसी theme हो जिसमें default background पर कोई भी रंग पढ़ा जा सके, कुछ applications text और background color दोनों specify करती हैं
      उदाहरण के लिए pamix background को black सेट करता है, और tmux status line या ngrok भी कुछ ऐसा ही करते हैं। फिर उसे संभालने के लिए आप rabbit hole में उतर जाते हैं
    • पहले यह पूछना चाहिए कि “सबसे अच्छा handling तरीका क्या है?”, और यहां अच्छा को define करना होगा। निजी तौर पर मुझे यह सिद्धांत पसंद है कि user customization एक ही जगह होनी चाहिए, और program पर उसका असर code lines जैसी चीज़ों के लिहाज़ से न्यूनतम होना चाहिए
      दोनों बातें संकेत देती हैं कि समाधान terminal में होना चाहिए। terminal program के पास शुरू से reasonable default colors होने चाहिए; blue पहचानने लायक blue होना चाहिए और common color vision deficiencies का भी ध्यान रखना चाहिए। उदाहरण के लिए pure red को black background पर रखना पढ़ने में मुश्किल होता है, इसलिए सिर्फ ff0000 न इस्तेमाल करके उसमें थोड़ा-सा blend करना बेहतर है
      जब terminal के पास reasonable defaults होंगे, तो command-line programs standard 16 colors इस्तेमाल कर सकते हैं। यहां 24-bit color इस्तेमाल करने की कोशिश का मतलब लगभग यह होता है कि “मैंने terminal side से sanity देने की उम्मीद छोड़ दी है” या “मुझे सबसे बेहतर पता है”; अंत में user को N programs को अलग-अलग configure करना पड़ता है। मेरी नज़र में सबसे अच्छा तरीका यही है कि command-line apps के अंदर themes define न की जाएं
      websites और fonts को भी मैं इसी तरह देखता हूं। content HTML के रूप में दिया जाना चाहिए ताकि user उसे अपनी पसंद के तरीके से देख सके, और page layout को magazine layout की तरह fixed न रखकर flow होने देना चाहिए
      desktop software में भी कुछ ऐसा ही है। Wayland compositor को window positions याद रखनी चाहिए। हर X program का अपनी window position save और restore करना मूर्खतापूर्ण था। Wayland कहता है कि environment की जानकारी होना security issue है, और मैं इससे सहमत हूं; लेकिन फिर वह memory desktop environment का काम बनती है। इससे हर app से वह code हटाया भी जा सकता है
      “software stack में इसे कहां handle किया जाना चाहिए?” यह सवाल कई क्षेत्रों में बार-बार आता है। इसे कहां रखना है, चुनते समय पहले यह जवाब देना चाहिए कि लक्ष्य क्या है; मेरा जवाब हमेशा simplicity और maintainability की तरफ झुकता है
    • मुझे जानना है कि default रूप से 8-bit या 24-bit color escape sequences इस्तेमाल करने वाले command-line tools से बचना असल में कितना मुश्किल है
      Julia का लेख भी इस idea का ज़िक्र करता है, लेकिन ठोस मुश्किलों तक नहीं जाता। इससे जुड़े तौर पर यह भी जानना चाहूंगा कि terminal color palette सिर्फ default 16 colors को संभालती है या RGB और grayscale ranges तक भी छेड़ती है। 8-bit और 16-bit colors को भी readability requirements के हिसाब से adjust किया जा सकता होगा
  • अगर आप colors चुनने की भूमिका में हैं, तो नए APCA algorithm (Advanced Perception of Colour) से colors check करना अच्छा रहेगा
    APCA आगे चलकर WCAG 3.0 में मौजूदा x:y contrast तरीके की जगह लेने वाला है, हालांकि इसमें अभी कई साल और लग सकते हैं। बताया जाता है कि यह font size, weight, foreground/background, यहां तक कि ambient lighting और environment, और intended use तक को ध्यान में रखता है
    अगर terminal emulator device के light sensor का इस्तेमाल करके environmental factors के हिसाब से contrast optimize कर सके, तो यह काफी अच्छा लगेगा

    • मैं जो terminal color palette अभी इस्तेमाल करता हूं, उसे मैंने खुद इसी तरह tune किया है। वजह यह है कि मुझे कोई भी ready-made theme नहीं मिली जो सभी ANSI colors के लिए मेरी निजी contrast requirements पूरी करती हो
  • कुछ पूर्ण पागल लोग ऐसे भी हैं जो रंगों को पूरी तरह बंद करना चाहते हैं[0]. खुद आज़माने का मन भी करता है, लेकिन मुझे सुंदर रंग भी पसंद हैं
    [0] https://no-color.org/

    • :syntax off ही मेरी इकलौती Vim सेटिंग है. क्योंकि terminal color sets को computer programmers, electrical engineers, और ऐसे लोगों ने design किया है जिन्हें यह नहीं पता कि रंगों में अहम चीज़ रंग खुद नहीं बल्कि brightness होती है
    • monochrome terminal की आदत पड़ जाए तो ज़्यादातर रंग बिखराव पैदा करने वाले और ध्यान खींचने वाले लगने लगते हैं
      मुझे जिज्ञासा है कि terminal में रंग नहीं चाहने वाले लोगों और browser में strong ad blocker इस्तेमाल करने या reading mode ज़्यादा इस्तेमाल करने वाले लोगों के बीच कोई correlation है या नहीं
    • color sequences portable नहीं होतीं और समस्याएँ पैदा करने के लिए जानी जाती हैं. उदाहरण के लिए, रंगीन pytest report की वजह से Jupyter session मर जाने के मामले होते हैं
      output को pipe करते समय रंग बिना किसी फ़ायदे के सिर्फ़ liability बन जाते हैं. मुख्य बात choice के ज़्यादा करीब है
    • मैं भी उसी तरफ़ हूँ. खासकर coding करते समय, मेरे हिसाब से लगभग सारी coloring ध्यान भटकाने वाली और उल्टा असर करने वाली होती है
      Linux और Windows के बीच आते-जाते यह और खराब हो जाता है. कई tools में रंगों का default इस्तेमाल लगभग unusable होता है या सचमुच इस्तेमाल को असंभव बना देता है
      कुछ tools --color=never option देते हैं, और काफ़ी tools NO_COLOR का सम्मान करते हैं. अफ़सोस, सभी नहीं; और जो tools ऐसा करते भी हैं, वे कभी-कभी मान लेते हैं कि वह mode सिर्फ़ pipeline या programming interface के लिए इस्तेमाल होगा. इसलिए तरह-तरह के दुर्भाग्यपूर्ण व्यवहार दिखते हैं
    • मैं भी उसी दिशा में जा रहा हूँ. zenbones देखने के बाद आखिरकार https://github.com/savq/melange-nvim पर टिक गया
      इसमें meaningful color temperature वाला एक consistent palette concept है, और बहुत ज़्यादा नीली रोशनी देखते-देखते आँखों की थकान कम करने के लिए यह गर्म रंगों की तरफ़ झुका हुआ है. alacritty color palette भी साथ देता है
  • लंबे समय से terminal में light theme इस्तेमाल करना चाहता था, लेकिन इतने सारे programs dark terminal background के लिए optimized custom non-ANSI colors इस्तेमाल करते हैं कि हर बार हार मान ली
    कुछ programs में colors configure किए जा सकते हैं, लेकिन हर program को अलग-अलग configure करना बहुत झंझट लगा. इसलिए अब मैं dark terminal background ही इस्तेमाल करता हूँ, लेकिन एक ANSI theme खुद चुनकर रखी है जिसमें सभी colors मेरे मानक के हिसाब से पर्याप्त contrast ratio रखते हैं और APCA/WCAG 3 contrast check भी pass करते हैं. संतुष्ट हूँ :)

    • जिन लोगों को higher-order visual aberrations होती हैं, उनके लिए dark mode शुरू से ही विकल्प नहीं होता. उल्टा, cataract वाले कुछ लोगों के लिए light mode ऐसा हो सकता है
      OSC 11 control sequence से program background color जान सकता है, लेकिन बहुत कम programs इसकी परवाह करते हैं. आमतौर पर किसी को yellow warning message अच्छा दिखता है तो बात वहीं खत्म हो जाती है
      यह एक और समस्या की ओर ले जाता है. कुछ popular terminals हैं जो xterm compatible नहीं हैं, फिर भी default रूप से TERM=xterm256-color set करते हैं
      edit: अभी-अभी xtermcontrol मिला; scripts में background check को abstract कर सकता है और सभी major package managers में मौजूद है
    • कुछ समय तक इस configuration hell से बचने के लिए मैंने 256-color unsupported 16-color terminal होने का दिखावा किया. लगा कि खराब रंगों से बेहतर रंग न होना है, इसलिए https://no-color.org/ भी आज़माया
      आजकल हार मानकर ज़्यादातर apps को manually ANSI colors इस्तेमाल करने के लिए set करता हूँ. जैसे fzf में command-line switch है. Vim और Emacs को ही non-ANSI apps रहने देता हूँ, और उन्हें बाकी terminal में इस्तेमाल होने वाली palette के हिसाब से configure करता हूँ. चाहें तो vim-dim जैसी चीज़ से एक कदम और आगे जा सकते हैं
    • कई terminals, जैसे trinity/tde3 का konsole, default colors को सीधे adjust करने देते हैं, जिससे मदद मिलती है
    • macOS के iTerm और जिन programs को मैं इस्तेमाल करता हूँ, जैसे neovim, उनमें कोई समस्या नहीं थी और default state में भी ठीक दिखता था
  • Emacs में एक कम खोजा जाने वाला frame-background-mode[0] है, जो असल में light या dark में से एक होता है
    जब सोचते हैं कि Emacs ने किसी item के लिए अजीब रंग क्यों चुना, तो अक्सर वजह frame-background-mode का गलत होना होती है
    [0]https://doc.endlessparentheses.com/Var/frame-background-mode...

    • बुनियादी समस्या अक्सर terminal के COLORFGBG variable set न कर पाने में होती है
      सफ़ेद text वाले dark background terminal में export COLORFGBG='15;0'
      काले text वाले light background terminal में export COLORFGBG='0;15'
    • बेहतर link: <https://www.gnu.org/software/emacs/manual/html_node/emacs/Fa...>
  • लगभग 10 साल से हल्का modified FlatUI color palette इस्तेमाल कर रहा हूँ, और वास्तव में समस्या बनी हो ऐसे हालात बहुत कम आए
    png file: https://drive.google.com/file/d/1mkMESeGf7MNdKa-rPDx7Yf9BDit...
    imgur link: https://imgur.com/a/flatui-7mqVZAY
    based on: https://flatuicolors.com/palette/defo

    • यह One Dark theme जैसी दिखती है, जो मुझे याद है Atom editor से आई थी
      मैं भी अपनी theme लगभग 10 साल से इस्तेमाल कर रहा हूँ. iTerm, vim, Emacs, vscode आदि में अच्छी तरह काम करती है
  • Apple Terminal को लंबे समय से इस्तेमाल करता आया हूं, और पहले “Terminal Fructose” नाम का एक अच्छा color scheme collection था, जिससे काम के हिसाब से अलग-अलग background color इस्तेमाल करता था। Apple ने भी किसी समय उसे theme के रूप में built-in कर दिया था
    लेकिन Apple ने Terminal support को लगभग छोड़ दिया है; यह 256 रंगों से ज़्यादा support नहीं करता और इसमें आधुनिक features भी कम हैं। Neovim+LazyVim configuration के साथ भी ठीक से फिट नहीं बैठता
    बेहतर terminal ढूंढने के लिए iTerm2, Kitty, Alacritty, Wezterm के बीच घूमता रहा, लेकिन सभी अधिक आधुनिक होते हुए भी, अलग-अलग background color/theme वाली windows जल्दी खोलने का basic “New Window with Profile ...” option नहीं दिखा। कम से कम थोड़ी मशक्कत के बिना तो नहीं
    अब Wezterm पर settle कर लिया है, मुख्य वजह यह है कि यह Windows पर भी चलता है और wezterm.lua configuration share की जा सकती है। वैसे Windows Terminal भी सच में काफी अच्छा है। फिर भी छोटे-छोटे कामों के लिए, जैसे calculations के लिए python3 को REPL की तरह इस्तेमाल करना या hexadecimal/binary test करना, अब भी अक्सर Apple Terminal launch कर लेता हूं

    • iTerm में ठीक वही feature है
    • अजीब है। मैंने तो “new tab with profile” support की वजह से Apple Terminal बहुत जल्दी छोड़कर iTerm2 अपना लिया था
    • Wezterm इस्तेमाल करते रहने की दो वजहें हैं। कई platforms पर configuration आसानी से share हो जाती है, और configuration language Lua है
      iTerm2 के कुछ features याद आते हैं, लेकिन उनमें से ज़्यादातर mouse-related हैं। बाकी चीज़ें कुछ शामों में अपनी पसंद के हिसाब से configure कर लीं, और जब cmd-n को current directory की बजाय default directory में नई window खोलने के लिए set कर दिया, तब से इसे संतोष से इस्तेमाल कर रहा हूं
    • अगर WezTerm में “New Window with Profile...” जोड़ना चाहते हैं, तो अलग shell शुरू करने वाले launch_menu [1] या command palette में item जोड़ने वाले augment-command-palette [2] में कुछ hack करके डाला जा सकता है
      [1] https://wezfurlong.org/wezterm/config/lua/config/launch_menu...
      [2] https://wezfurlong.org/wezterm/config/lua/window-events/augm...
      सही है, थोड़ी मशक्कत चाहिए। लेकिन किसी बेहद specific feature को ठीक अपनी पसंद के तरीके से program करना ही WezTerm जैसा experience का peak है
    • KDE terminal Konsole इसे support करता है। menu से कर सकते हैं या new tab icon को long-press करके। मेरी जानकारी में इसे MacOS पर भी इस्तेमाल किया जा सकता है
  • सिर्फ terminal में ही नहीं, neon signs या LED signboards में भी नीला रंग रात में आंखों पर सबसे ज़्यादा भारी पड़ता है
    दूर से देखने पर वह हमेशा धुंधला और out of focus लगता है। जब बड़ी कंपनियों को नीली रोशनी वाले विशाल signboards लगाते देखता हूं, तो हैरानी होती है कि लोग यह समझे बिना इतना पैसा खर्च कर देते हैं कि उन्हें पढ़ा ही नहीं जा सकता

  • laptop पर daylight cycle के हिसाब से light/dark mode auto-switch कर रखा है, और bright background पर dark text mode में बदलते समय टूट जाने वाले color output applications की संख्या हैरान करने वाली है
    अगर command-line tool बनाते समय रंगों का इस्तेमाल करना ही है, तो ANSI 16 colors तक ही रहें, या end user को color palette बदलने दें