Oh My Zsh अनावश्यक ओवरहेड जोड़ता है
(rushter.com)- Oh My Zsh(OMZ) अब भी व्यापक रूप से सुझाया जाता है, लेकिन यह शेल स्टार्टअप समय को धीमा करने वाला अनावश्यक स्क्रिप्ट ओवरहेड पैदा करता है
- OMZ शेल स्क्रिप्ट में लिखा गया है, इसलिए हर बार नया टर्मिनल टैब खोलने पर सभी स्क्रिप्ट्स को इंटरप्रेट करना पड़ता है, और सिर्फ डिफ़ॉल्ट सेटिंग्स में भी लगभग 0.38 सेकंड की देरी होती है
- सरल न्यूनतम Zsh सेटअप, Starship prompt, और fzf-आधारित history search इस्तेमाल करने पर स्टार्टअप समय 0.07 सेकंड तक घटाया जा सकता है
- Starship एक ही binary से prompt बनाता है, और OMZ के git·virtual environment·language-specific plugins को replace कर देता है
- जटिल plugins की बजाय ज़रूरत के फीचर्स ही सीधे जोड़ने वाला हल्का शेल कॉन्फ़िगरेशन ज़्यादा प्रभावी है
Oh My Zsh की प्रदर्शन समस्या
- Oh My Zsh(OMZ) अब भी बहुत इस्तेमाल होता है, लेकिन अनावश्यक ओवरहेड (bloat) की वजह से शेल स्टार्टअप की गति कम हो जाती है
- OMZ शेल स्क्रिप्ट्स से बना है, इसलिए हर बार नया टर्मिनल टैब खोलने पर सभी स्क्रिप्ट्स को इंटरप्रेट करना पड़ता है
- डिफ़ॉल्ट plugins (
git,zsh-autosuggestions,zsh-autocomplete) शामिल सेटअप में/usr/bin/time -f "%e seconds" zsh -i -c exitचलाने पर 0.38 सेकंड लगे
- git repository फ़ोल्डर में नया टैब खोलने पर अनुभव के हिसाब से लगभग 1 सेकंड की देरी महसूस होती है
- OMZ समय-समय पर updates की जाँच करता है, और इस प्रक्रिया से कुछ सेकंड की अतिरिक्त देरी हो सकती है
- शेल कॉन्फ़िगरेशन को बार-बार अपडेट करना अनावश्यक है, और केवल ज़रूरी फीचर्स सीधे जोड़ने वाला सरल सेटअप सुझाया जाता है
न्यूनतम Zsh सेटअप
- प्रस्तावित न्यूनतम Zsh सेटअप इस प्रकार है
export HISTSIZE=1000000000 export SAVEHIST=$HISTSIZE setopt EXTENDED_HISTORY setopt autocd autoload -U compinit; compinitHISTSIZEऔरSAVEHISTcommand history का आकार तय करते हैंEXTENDED_HISTORYhistory में timestamp जोड़ता हैautocdसेcdकमांड के बिना directory बदली जा सकती हैcompinitauto-completion system को initialize करता है
- सिर्फ इस सेटअप से भी completion फीचर वाला बुनियादी शेल environment मिल जाता है
prompt customization
- prompt के लिए Starship इस्तेमाल किया गया है
- Starship एक binary में बना तेज़ और न्यूनतम prompt है
- यह OMZ के मौजूदा plugins और themes को replace करता है, और git·virtual environment·language-specific status दिखाता है
- Starship कॉन्फ़िगरेशन उदाहरण में AWS, GCP, Azure, NodeJS जैसे cloud-संबंधित संकेत बंद करके दृश्य शोर कम किया गया है
- Python और Rust projects में संबंधित language prompt में उभरकर दिखती है, और command execution time भी दिखता है
- इसे सक्रिय करने के लिए
.zshrcमें यह एक लाइन जोड़ेंeval "$(starship init zsh)"
history search
- आम तौर पर इस्तेमाल होने वाला
zsh-autosuggestionsplugin टाइप करते समय suggestions दिखाता है, जिससे ध्यान भटक सकता है - इसकी जगह fzf को
Ctrl+Rसे bind करके history को interactive fuzzy search के ज़रिए खोजा जा सकता हैsource <(fzf --zsh)
प्रदर्शन सुधार का परिणाम
- ऊपर के सेटअप के बाद शेल स्टार्टअप समय इस प्रकार रहा
❯ /usr/bin/time -f "%e seconds" zsh -i -c exit 0.07 seconds - OMZ की तुलना में लगभग 5 गुना से अधिक तेज़ स्टार्टअप हासिल हुआ
अतिरिक्त टिप्स
- Vim users Zsh में Vim mode चालू करके command editing की गति बढ़ा सकते हैं
set -o vi bindkey -v '^?' backward-delete-charzleडिफ़ॉल्ट रूप से Emacs key bindings इस्तेमाल करता है, इसलिए यह सेटिंग Vim-style input सक्षम करती है
निष्कर्ष और उपयोग के मामले
- OMZ से स्विच करने के बाद कुछ ही दिनों में नए workflow के अनुरूप ढल गए
- ज़रूरत के plugins को सीधे manual load किया जा सकता है
- कई टैब खोलने का कारण tmux और terminal-based editor (helix) का साथ में उपयोग है
- tmux में
lazygitऔरyazifile manager को popup रूप में चलाया जाता है - code execution और test output के लिए अस्थायी split panes उपयोग होते हैं, और हर एक अलग शेल session की तरह काम करता है
- tmux में
टिप्पणियों का सार
- कुछ users का कहना है कि OMZ का स्टार्टअप समय 0.03 सेकंड के स्तर पर काफ़ी तेज़ है
- लेखक ने इशारा किया कि
zsh-autocompleteplugin गति को धीमा करता है zsh-benchपरिणामों में OMZ के लिए first prompt delay 603ms और सरल Zsh सेटअप के लिए 103ms मापा गया- Starship, OMZ की prompt-संबंधित सुविधाओं को एक ही टूल से replace करता है
- अन्य users ने Zimfw, Atuin, और खुद लिखे गए bash prompt जैसे विकल्पों का उल्लेख किया
10 टिप्पणियां
अब तक यह इतनी ज़्यादा ध्यान खींचने वाली असुविधा जैसी तो नहीं लगी थी।
वेब सर्वर भी नहीं है, और जब तक इतनी असुविधा महसूस न हो कि खलने लगे, तब तक इसे ऐसे ही चलने देता हूँ..
डेवलपर्स हैं तो क्या, बेकार के कुछ ms को लेकर भी हंगामा मचा रहे हैं, lol
मैंने शुरुआत omz के साथ की थी, इसलिए लगा कि यह बस वही असुविधा है जिसे झेलना पड़ता है, उफ़ उफ़
हाल में मैंने plugins भी एक-एक करके हटाए और update policy भी बदल दी.. यह देखकर लगा कि इसके बिना भी काम चल जाएगा।
मेरे लिए, जब tmuxinator से config लोड करते समय omz update y/n दिखता है, तो वह खास पसंद नहीं आता।
मैं कुछ महीने पहले prezto पर स्विच किया था, तो लगा कि omz क्या पहले भी इतना धीमा था?
सिर्फ कुछ बेसिक plugins ही जोड़ो तो भी यह काफ़ी धीमा हो जाता है...
मैं starship पर शिफ्ट हो गया हूँ
क्या बेकार के कुछ ms के लिए ही टेक्नोलॉजी आगे नहीं बढ़ रही थी?
अगर आप टर्मिनल का अक्सर इस्तेमाल करते हैं, तो omz की वजह से जुड़ने वाली अतिरिक्त देरी काफ़ी खटकती है।
Hacker News की राय
मैं oh-my-zsh सिर्फ़ एक वजह से इस्तेमाल करता हूँ
ताकि नई मशीन, remote host, या container कहीं भी मुझे तुरंत इस्तेमाल करने लायक फ़ौरन प्रोडक्टिव shell environment मिल जाए
config खुद छेड़ने में घंटों लगाने से बेहतर है कि वह समय ज़्यादा अहम कामों में लगाऊँ
इसमें भी “install करो और तुरंत इस्तेमाल करो” वाला अनुभव मिलता है, लेकिन 200ms से ज़्यादा prompt latency नहीं होती
एक
curlलाइन से install हो जाता है, और config भी सरल हैमुझे लगता है, इसे आज़माकर पछतावा नहीं होगा
एक बार config files बना कर git से manage कर लो, तो दूसरी मशीनों पर भी वही इस्तेमाल कर सकते हो
मैं भी नई मशीन सेट करते समय सिर्फ़ dotfiles लाता हूँ और मेरा परिचित environment तुरंत चलने लगता है
मज़ाक अपनी जगह, लेकिन default shell setup install करने से
.bashrcकॉपी करना कहीं आसान हैहर बार tab खोलते समय इंतज़ार करना पड़ता था, जो काफ़ी चिढ़ाने वाला था
आख़िर में मैंने Homebrew से सिर्फ़ ज़रूरी plugins खुद install किए, और इसमें एक घंटा भी नहीं लगा
अब shell तेज़ और हल्का है, इसलिए मैं कहीं ज़्यादा प्रोडक्टिव हूँ और बेहतर महसूस करता हूँ
shell startup बहुत तेज़ है और setup भी आसान है
इसलिए मैं fish पर चला गया
यह पूरी तरह मेरे मन का नहीं है, लेकिन इसकी default settings इतनी अच्छी हैं कि बस आदत पड़ गई
अब shell config पर मुझे लगभग कभी ध्यान नहीं देना पड़ता
हाँ, नए users को key bindings ज़रूर पढ़नी चाहिए
मेरे एक teammate को tab completion या shift+arrow जैसे features का पता नहीं था, इसलिए उसकी गति धीमी हो गई थी
मैं कभी-कभी सिर्फ़ vim bindings या fuzzy find plugin जोड़ता हूँ
सिर्फ़ default fish भी काफ़ी शानदार है
मैं इस राय से सहमत नहीं हूँ कि Zsh में Vim mode चालू करने की सलाह दी जानी चाहिए
default readline भी single command के लिए काफ़ी अच्छा है
लंबी command को
C-x C-eसे edit किया जा सकता हैpair programming करते समय, Vim mode switching की वजह से उल्टा यह धीमा लगता है
C-x C-eshortcut सच में बहुत काम का हैज़्यादातर समय insert mode में रहता हूँ, और बड़ी editing की ज़रूरत हो तो ही
C-x C-eइस्तेमाल करता हूँअगर आप vi key bindings के आदी हैं, तो
w,b,dwजैसे commands muscle memory की वजह से ज़्यादा तेज़ लगते हैंeditor खोलना flow तोड़ देता है और output भी छिपा देता है, इसलिए मुझे वह पसंद नहीं
काश shell में भी Vim का अक्षरों के बीच delete करना (di") जैसा feature होता
मैं भी oh-my-zsh को सिर्फ़ base setup के लिए इस्तेमाल करता हूँ
सिर्फ़ git plugin इस्तेमाल करता हूँ, और custom functions auto-load कराता हूँ
hyperfineसे मापने पर login shell लगभग 54ms और सामान्य shell लगभग 6ms निकलामुझे लगता है कि 380ms delay की कोई दूसरी वजह भी हो सकती है
इसमें instant startup मिलता है, और maintenance mode में होने की वजह से उल्टा समय की बर्बादी रुकती है
zsh -llogin shell है, इसलिए यहzshrcload नहीं करताtesting
zsh -ic exitसे करनी चाहिएविस्तार से जानने के लिए zsh-bench guide देखें
zprofको.zshrcमें जोड़ना बेहतर हैextract,z,fzfजैसे plugins भी आज़माने लायक हैंमैं fish + starship के combination पर आ गया हूँ
fish default रूप से autocompletion और syntax highlighting देता है, इसलिए oh-my-zsh के मुख्य features की जगह ले लेता है
संबंधित लेख देखें
इसीलिए मैं zsh+starship+एक simple init script बनाए रखता हूँ
चाहता हूँ कि fish पूरी तरह “बस काम करे”, लेकिन अभी थोड़ी कमी लगती है
HEREDOC का न होना और background block का काम न करना असुविधाजनक है,
लेकिन आजकल मैं complex scripts की जगह ज़्यादा single binary में build होने वाली languages पसंद करता हूँ
जब यह stable हो जाएगा, तो nushell पर जाने का सोच रहा हूँ
मैं कुछ साल पहले Zim पर चला गया था
इसमें ज़रूरी features सब हैं, और यह तेज़ है और install करना आसान है
https://zimfw.sh/
यह कई तरह के sources और formats को support करता है, और zsh code integration भी बेहतरीन है
ज़्यादातर plugin systems की तुलना में इसकी speed और compatibility कहीं बेहतर है
यह सच में शानदार framework है
लगभग 15 साल पहले, कॉलेज के समय मैंने oh-my-zsh install किया था,
और तब से मैं इससे इतना संतुष्ट हूँ कि किसी दूसरे shell या setup को आज़माने की ज़रूरत ही महसूस नहीं हुई
नई computer setup करते समय यह सबसे पहले install करता हूँ
मैं लंबे समय से oh-my-zsh इस्तेमाल कर रहा था, लेकिन इस बार Claude की मदद से 5 मिनट में इसे हटा दिया
ज़रूरी features को सिर्फ़ raw zsh से बदल लिया
क्योंकि prompt के लिए
starshipइस्तेमाल करता हूँ, इसलिए extra config की लगभग ज़रूरत नहीं पड़ीअभी तक सब कुछ ठीक से काम करता दिख रहा है
कुछ लोगों को लगता है कि oh-my-zsh की 0.5 सेकंड की देरी को समस्या बनाना बढ़ा-चढ़ाकर कहना है
उनका कहना है कि बस bash और KDE konsole इस्तेमाल कर लो, वही काफ़ी है
shell तो सिर्फ़ साधारण कामों के लिए एक wrapper है, इसलिए ऐसी micro-optimization पर ध्यान देने की ज़रूरत नहीं
और हर shell workflow का हिस्सा होता है, इसलिए 1 सेकंड की देरी भी साफ़ महसूस होती है
इसी वजह से तेज़ shell महत्वपूर्ण लगता है
ज़्यादा से ज़्यादा 20 बार ही, और उनके हिसाब से यह कोई बड़ी समस्या नहीं
performance तेज़ होना अच्छा है, लेकिन यह कोई मूलभूत समस्या नहीं है
मेरी zsh config लगभग 90 lines की है और मैं सिर्फ़ 3 plugins (compinit, vcs-info, edit-command-line) इस्तेमाल करता हूँ
startup से exit तक लगभग 0.32 सेकंड लगते हैं
बड़े repositories में branch info लाने के कारण delay होता है
bkt caching utility(https://github.com/dimo414/bkt) से ऐसी समस्या हल की जा सकती है
शायद Starship भी इसी तरह caching का उपयोग करता है
अगर optimization न करें तो यह सच में काफ़ी धीमा है। लेकिन इसकी कई features की आदत पड़ गई है, इसलिए इसे छोड़ना थोड़ा,, आसान नहीं है।