- Starship एक ओपन source prompt प्रोजेक्ट है, जो अलग-अलग shell environments में उपयोग के लिए हल्का, उच्च-प्रदर्शन और लचीला है
- Bash, Zsh, Fish, Powershell, Tcsh आदि ज़्यादातर प्रमुख shell को सपोर्ट करने वाली व्यापक compatibility देता है
- हर shell के लिए initialization script को आसानी से जोड़कर इसे configure और apply किया जा सकता है
- Rust में लिखा गया है, इसलिए तेज़ speed और safety सुनिश्चित करता है, और single binary के रूप में उपलब्ध है
- हर छोटी से छोटी चीज़ तक customise की जा सकती है
- Android, BSD, Linux, macOS, Windows जैसे कई platforms पर common environment setup को सपोर्ट करता है, जिससे productivity और ease of use बेहतर होती है
Starship ओपन source प्रोजेक्ट
- Starship एक prompt tool है, जो performance और customisation दोनों को साथ में सपोर्ट करता है, और अलग-अलग operating systems तथा shells में इस्तेमाल किया जा सकता है
- पारंपरिक भारी prompts की तुलना में इसकी तेज़ response speed और कम resource usage इसकी खासियत है, और इसकी उच्च customisation क्षमता developer productivity बढ़ाने में मदद करती है
हर shell environment में सेटअप का तरीका
- Bash:
~/.bashrc फ़ाइल के अंत में eval "$(starship init bash)" कोड जोड़ें
- Fish:
~/.config/fish/config.fish फ़ाइल के अंत में starship init fish | source जोड़ें
- Zsh:
~/.zshrc फ़ाइल के अंत में eval "$(starship init zsh)" कोड जोड़ें
- Powershell:
Microsoft.PowerShell_profile.ps1 फ़ाइल में Invoke-Expression (&starship init powershell) जोड़ें
- PowerShell profile फ़ाइल का स्थान
$PROFILE वेरिएबल से देखा जा सकता है
- Ion:
~/.config/ion/initrc फ़ाइल में eval $(starship init ion) कोड दर्ज करें
- Elvish:
- केवल v0.18 या उससे ऊपर के versions सपोर्टेड हैं
~/.elvish/rc.elv फ़ाइल में eval (starship init elvish) कोड जोड़ें
- Tcsh:
~/.tcshrc फ़ाइल में eval \starship init tcsh`` कोड दर्ज करें
- Nushell:
- केवल v0.96 या उससे ऊपर सपोर्टेड है, आगे चलकर setup method बदल सकता है
- config फ़ाइल का path
$nu.config-path कमांड से देखा जा सकता है
- उस path पर
starship init nu | save -f ... कोड से apply करें
- Xonsh:
~/.xonshrc फ़ाइल के अंत में execx($(starship init xonsh)) कोड दर्ज करें
- Cmd (Clink आवश्यक):
- Clink v1.2.30 या उससे ऊपर आवश्यक है
starship.lua फ़ाइल बनाकर Clink script directory में सेव करें
- उसके अंदर
load(io.popen('starship init cmd'):read("*a"))() कोड जोड़ें
2 टिप्पणियां
जिस चीज़ को मैं कई सालों से अच्छी तरह इस्तेमाल कर रहा हूँ, उसे यहाँ देखना नया-सा लग रहा है :)
मैं तो इसे तब से इस्तेमाल कर रहा हूँ जब यह Zsh थीम के रूप में उपलब्ध था... हाहाहा
Hacker News राय
मैं उन यूज़र्स में हूँ जिन्हें मैक्सिमलिस्ट prompt पसंद है, और dev machine सेटअप के लिए अक्सर Starship के साथ Shell Bling Ubuntu इंस्टॉल करता हूँ
लेकिन यह स्टाइल हर किसी के लिए सही नहीं है
अगर आप सिर्फ सबसे ज़्यादा घनी और काम की जानकारी जोड़ना चाहते हैं, तो prompt में वह समय दिखाना अच्छा रहेगा जब prompt दिखाई दिया, और पिछला command चलने में कितना समय लगा
सिर्फ इन दो जानकारियों से यह समझना आसान हो जाता है कि क्या कब हुआ, और बाद में debugging या record management में भी बड़ा फ़ायदा मिलता है
यह तरीका Michael W. Lucas की किताब 『Networking for System Administrators』 से मिला था, और network basics सीखने वाले developers को मैं यह किताब अक्सर recommend भी करता हूँ
अगर थोड़ा extra nerd point चाहिए, तो समय को UNIX epoch के seconds में दिखाइए
इससे time delta निकालना बहुत आसान हो जाता है
Shell Bling Ubuntu repo देखें
nushell में यह जानकारी default रूप से मिलती है
history में command का start timestamp, execution time, current directory, exit status जैसी detailed जानकारी देखी जा सकती है
यह सिर्फ commands के बीच का time gap ही नहीं, बल्कि command के अपने execution time को भी सीधे दिखाता है, इसलिए बहुत सुविधाजनक है
मैंने prompt customization लगभग कभी नहीं किया
क्योंकि emacs इस्तेमाल करने पर जो जानकारी चाहिए होती है वह editor में पहले से दिख जाती है
सिर्फ तब Starship सेटअप करता हूँ जब किसी और को दिखाना हो, जैसे pair programming में, और उसके लिए अलग terminal app खोल लेता हूँ ताकि अपनी private setting दिखानी न पड़े
पिछले command का exit code भी ऊपर जैसी वजहों से बहुत उपयोगी जानकारी है
current time को human-readable format में दिखाना भी काफ़ी मददगार होता है
और अगर पिछले command का exit status 0 न हो, यानी failure हो, तो उसे दिखाना debugging में काम आता है
मेरे लिए सिर्फ current directory की जानकारी ही काफ़ी है
पिछले command के success/failure के हिसाब से prompt का color बदल जाए, बस इतना काफी है
extra जानकारी ज़रूरत पड़ने पर अलग से देखी जा सकती है
Starship यूज़र्स की age distribution जानने की जिज्ञासा हो रही है
मेरे साथ समय के साथ prompt customization में रुचि काफ़ी कम हो गई है
आख़िरकार यह निष्कर्ष निकला कि prompt को कितना भी सजाएँ, उसमें दिखने वाली 90% जानकारी 90% समय बेकार ही रहती है
बल्कि बहुत ज़्यादा जानकारी visual noise बन जाती है और दिमाग़ उसे ignore करने लगता है, यहाँ तक कि यह भी भूल जाते हैं कि वह जानकारी वहाँ है
सच में महत्वपूर्ण जानकारी prompt से पूरी तरह नहीं मिल पाती; जैसे यह दिख जाए कि Git branch बदल गई है, तब भी कौन-सी files बदली हैं यह जानने के लिए अलग command चलाना ही पड़ता है
मुझे development का 20+ साल का अनुभव है
prompt में Git जानकारी होना मेरे लिए बहुत उपयोगी है
इससे बारीक details तो नहीं मिलतीं, लेकिन uncommitted changes या भूले हुए stash जैसी चीज़ें याद आ जाती हैं, जो अच्छा है
Starship दिलचस्प लगा तो तुरंत इंस्टॉल किया, लेकिन tool versions जैसी चीज़ें बहुत noisy लगीं और अंत में uninstall कर दिया
command timing या success/failure status जैसे options अच्छे थे, पर complex custom config संभालने की मेहनत के हिसाब से लाभ कम लगा
25+ साल के senior industry experience के नज़रिए से, मैं आम तौर पर flashy modern tools ज़्यादा इस्तेमाल नहीं करता
पहले मैं <pre><code>export PS1="[\033[1;32m][\t \u@\h \w]\$[\033[0m]"</code></pre> जैसा बहुत simple PS1 इस्तेमाल करता था, जिसमें समय, मेरा account, connected host और current path जैसी चीज़ें ही दिखती थीं
दूसरे advanced prompts भी कई बार आज़माए, लेकिन उनसे लगभग कोई मदद नहीं मिली
अभी कुछ सालों से Starship आराम से इस्तेमाल कर रहा हूँ
इसे सिर्फ ज़रूरी जानकारी दिखाने लायक customize किया है, इसलिए यह बहुत fast और comfortable लगता है
मेरे prompt customization का सबसे उपयोगी हिस्सा पिछले command का exit status दिखाना है
कभी-कभी command बिना किसी error message के fail हो जाता है, इसलिए failure indicator बहुत बड़ा signal होता है
लेकिन सामान्य समय में noise न बने, इसलिए इसे सिर्फ failure होने पर ही दिखाता हूँ
उदाहरण: <pre><code>» true » false (last command returned 1.)</code></pre>
अगर signal की वजह से terminate हुआ हो तो उसे भी translate करके दिखाता हूँ, जैसे "last command exited on SIGSEGV"
उल्टा, जब कोई program error message तो देता है लेकिन success code के साथ exit करता है, तब भी यह उपयोगी होता है
दशकों के UNIX अनुभव वाले एक "very senior" यूज़र के रूप में, मुझे Starship का minimal mode साफ़-सुथरा लगने की वजह से पसंद है
पहले कई साल अलग-अलग zsh settings से जूझता रहा, लेकिन अब hassle लगभग नहीं है
अगर आपने सोचा हो कि Starship यूज़र सब JavaScript में emoji उड़ाने वाली नई पीढ़ी के होंगे, तो मेरे जैसे लोग भी हैं
बड़े परिप्रेक्ष्य में देखें तो यह पूरे computing environment पर लागू होने वाली बात है
कम उम्र में मैं Gentoo के साथ खुद OS बनाना, CPU optimization flags, window manager, bashrc aliases और functions, यहाँ तक कि prompt तक obsessively tune करता था
इस तरह की optimization अपने growth phase में काफ़ी उपयोगी सीख होती है
woodworking की analogy लें तो शुरुआती दौर में ज़्यादातर समय tools और छोटी tricks बनाने-सँवारने में जाता है, लेकिन एक समय बाद focus असली काम पर शिफ्ट हो जाता है
आज भी Linux पसंद है, लेकिन व्यस्त जीवन में efficiency या perfection से ज़्यादा “काम” प्राथमिकता बन जाता है, इसलिए बस Debian और KDE के default environment पर रहता हूँ
मुझे अनावश्यक सजावट या information overload पसंद नहीं, इसलिए minimal terminal environment पसंद है
लेकिन Starship ज़रूरत पड़ने पर context बहुत अच्छे से दिखाता है, और इसे बारीकी से customize भी किया जा सकता है
मेरा default prompt सिर्फ current directory, समय और % दिखाता है
अगर कोई specific environment variable, जैसे KUBECONFIG या OS_CLOUD, set हो, तो वही संबंधित जानकारी भी जोड़ देता है
Go, Python जैसी language versions भी usage context के हिसाब से अपने-आप दिख जाती हैं
Starship यह setup सचमुच बहुत आसान बना देता है, और complex zsh plugin configuration के बिना न्यूनतम overhead के साथ काम करता है
खासकर evalcache के साथ उपयोग करने पर initialization speed भी बहुत तेज़ हो जाती है
Starship के fan के रूप में कुछ comments
इसका Rust में safe और fast तरीके से लिखा जाना, और compiled binary होना, performance के लिहाज़ से इसे Python-based powerline, shell script-based ohmybash, zshell-based ohmyzsh और spaceship से कहीं बेहतर बनाता है
zsh, bash, sh, fish का support तो है ही, साथ में MS Windows CMD और Powershell भी supported हैं
एक single config file से हर system का prompt manage कर पाना लगभग unique है
अगर जानकारी बहुत ज़्यादा लगे तो उसे आसानी से बदल सकते हैं, icons भी disable किए जा सकते हैं
लगभग 100 modules होने से customization की सीमा लगभग नहीं है
मैं नहीं समझ पाता कि Starship को “minimal” कहकर क्यों market किया जाता है
<pre><code>: ▶</code></pre>असल में इसमें बहुत सारी functionality है, और जो लोग इसे इस्तेमाल करते दिखते हैं उनके prompts भी बड़े और तरह-तरह की सजावट से भरे होते हैं
मैं तो इसे इस तरह बहुत simple रखता हूँ
अगर सच में minimal चाहिए, तो ऐसे customization framework की ज़रूरत ही नहीं है
दूसरे shells और prompts की तुलना में Starship की config file का एक फ़ायदा यह है कि complexity बढ़ने पर भी यह काफ़ी intuitive रहती है
इसकी सारी functionality disable की जा सकती है
<pre><code>format = """ $username\ $hostname\ $shlvl\ $directory\ $git_branch\ $git_commit\ $git_state\ $git_metrics\ $git_status\ $package\ $python\ $rust\ $env_var\ $custom\ $cmd_duration\ $jobs\ $time\ $status\ $shell\ $character"""</code></pre>मैं अभी कुछ इस तरह की minimal configuration इस्तेमाल कर रहा हूँ
Starship को minimal तरीके से इस्तेमाल करना संभव है, लेकिन उसकी असली प्रकृति एक maximalist prompt की है, जिसमें जितनी हो सके उतनी जानकारी और content भरी जा सकती है
अच्छा होगा अगर इस बात को माना जाए
मैं इससे भी पतला arrow इस्तेमाल करता हूँ
<pre><code>PROMPT='%{%F{red}%}%~ %{%F{yellow}%}% › %{%F{reset_color}%}%'</code></pre>साफ़, simple और minimal implementation
यह देखकर हैरानी होती है कि लोग customizable होने और maximalism को मिला देते हैं
default setting थोड़ी ज़्यादा हो सकती है, लेकिन इसे अपनी ज़रूरत के हिसाब से कम किया जा सकता है
मैं कई AWS environments और अलग-अलग runtimes में काम करता हूँ, और prompt में context information सचमुच बहुत मदद करती है
व्यक्तिगत रूप से मैं लंबे समय से Starship + Nushell का combo इस्तेमाल कर रहा हूँ
इसे एक बार install कर लो, फिर दोबारा छेड़ने की ज़रूरत नहीं पड़ती, इसलिए मुझे पसंद है
मैं चाहता हूँ कि shell node 20 पर है या 22 पर, rust stable है या nightly, यह सब तुरंत दिख जाए
और Starship बिना extra मेहनत के यह सब सीधा दिखा देता है, इसलिए संतोष है
Starship से अलग, zsh prompt में Enter दबाते समय cursor का पलभर के लिए line की शुरुआत में जाकर “flash” करना परेशान करता है
ultra-fast prompt होने पर यह कम दिखता है, लेकिन prompt में थोड़ा भी कुछ होता हो तो यह effect बहुत साफ़ नज़र आता है
कई terminals में यह एक जैसा देखा गया है: gnome-terminal, wezterm, kitty, alacritty, xterm
सिर्फ urxvt terminal में यह समस्या नहीं होती
video reproduction देखें
इस flashing effect का कारण और इससे बचने का तरीका जानना चाहूँगा
जब हर बार prompt render होने पर git status जैसी बेकार जानकारी 100ms में भी चेक की जाती है, तो इससे अदृश्य productivity loss होता है
terminal एक responsive memory tool होना चाहिए, और उसे अनावश्यक सजावट में नहीं बदलना चाहिए
code execution speed की इतनी चिंता करना लेकिन अपनी typing latency के प्रति उदार बने रहना ही समस्या है
Starship सचमुच तेज़ है
ज़रूरी data इकट्ठा करने में इसे बस कुछ ms लगते हैं, और कौन-सी जानकारी निकालनी है यह आसानी से control किया जा सकता है
अब तक जिन दूसरे tools का इस्तेमाल किया, उनमें noticeable delay हमेशा परेशान करता था, लेकिन Starship में अनुभव का फ़र्क साफ़ महसूस होता है
इंसान के महसूस किए जाने वाले 100ms और CPU optimization के 100ms पूरी तरह अलग होते हैं
मेरे हिसाब से यह सोचना चाहिए कि अगर prompt को git branch या status दिखाने में 100ms लगते हैं, तो “flow” किससे ज़्यादा टूटता है—इससे, या मुझसे command टाइप करने में लगने वाले समय से
ठीक-ठाक convenience features पर खर्च होने वाले कुछ ms स्वीकार करने लायक हैं
अंत में बात convenience और minimalism के बीच संतुलन ढूँढने की है
बहुत ज़्यादा minimalism और बहुत ज़्यादा सजावट, दोनों ही inefficiency ला सकते हैं
मुझे यह delay खलता था, इसलिए मैंने kitty terminal को patch करके Starship prompt को vim या emacs की तरह नीचे की status bar, यानी modeline, में ले जाकर इस्तेमाल किया
modeline asynchronously update होती है, इसलिए prompt response बहुत fast रहता है
downside यह है कि kitty को खुद patch करना पड़ता है, और मैंने इसे अपने निजी Linux environment के बाहर test भी नहीं किया है
संबंधित patch project देखें
जिज्ञासा है कि क्या कोई prompt tool, TUI की तरह, prompt output पूरी तरह लौटाने के बाद भी prompt area को asynchronously modify कर सकता है; जैसे kubectl, git, aws cli बाद में 200ms के बाद अतिरिक्त जानकारी जोड़ दें
इससे यूज़र बिना इंतज़ार किए तुरंत अगला command टाइप कर सकता है, और extra जानकारी बाद में स्वाभाविक रूप से दिख सकती है
मुझे लगता है कि code execution optimization से ज़्यादा, शायद layers बढ़ते जाने की वजह से prompt input latency को optimize करना वास्तव में और कठिन हो रहा है
official website पर जाने पर मुझे यह स्पष्ट नहीं लगा कि Starship क्यों इस्तेमाल करना चाहिए
<pre><code>- पिछले command का result (रंग: हरा, लाल, बैंगनी)हाल में मेरा prompt customization एक नज़र में यह जानकारी दिखाता है
अगर पिछला command सफल रहा हो तो हरा, fail होने पर लाल, और interrupt होने पर बैंगनी दिखता है
मैं शायद उनके target users में आता हूँ, लेकिन homepage से मुझे यह साफ़ नहीं समझ आया कि इसे “क्यों” इस्तेमाल करूँ, या इससे क्या सुधार मिलता है