- Oh My Zsh(OMZ) ยังคงถูกแนะนำอย่างแพร่หลาย แต่ก่อให้เกิด ภาระจากสคริปต์ที่ไม่จำเป็น ซึ่งทำให้เวลาเริ่มต้นเชลล์ช้าลง
- OMZ เขียนด้วยเชลล์สคริปต์ จึงต้องตีความสคริปต์ทั้งหมดทุกครั้งที่เปิดแท็บเทอร์มินัลใหม่ และ แม้ใช้ค่าตั้งต้นก็มีความหน่วงราว 0.38 วินาที
- หากใช้เพียง การตั้งค่า Zsh แบบมินิมอล, พรอมป์ต์ Starship และ การค้นหาประวัติด้วย fzf ก็สามารถลดเวลาเริ่มต้นลงเหลือ 0.07 วินาที
- Starship สร้างพรอมป์ต์ด้วยไบนารีตัวเดียว จึงแทนที่ ปลั๊กอิน git·virtualenv·ปลั๊กอินแยกตามภาษา ของ OMZ ได้
- แทนที่จะใช้ปลั๊กอินซับซ้อน การทำ คอนฟิกเชลล์แบบเบาโดยเพิ่มเฉพาะฟังก์ชันที่จำเป็นเอง มีประสิทธิภาพกว่า
ปัญหาด้านประสิทธิภาพของ Oh My Zsh
- Oh My Zsh(OMZ) ยังถูกใช้งานอย่างแพร่หลาย แต่ทำให้ความเร็วในการเริ่มต้นเชลล์ลดลงเพราะ ภาระส่วนเกิน (bloat)
- OMZ ประกอบด้วยเชลล์สคริปต์ จึงต้องตีความสคริปต์ทั้งหมดทุกครั้งที่เปิดแท็บเทอร์มินัลใหม่
- ในการตั้งค่าที่มีปลั๊กอินพื้นฐาน (git, zsh-autosuggestions, zsh-autocomplete) เมื่อรัน
/usr/bin/time -f "%e seconds" zsh -i -c exit ใช้เวลา 0.38 วินาที
- หากเปิดแท็บใหม่ในโฟลเดอร์ git repository จะรู้สึกได้ถึงความหน่วงประมาณ 1 วินาที
- OMZ จะตรวจสอบอัปเดตเป็นระยะ ซึ่งกระบวนการนี้ทำให้เกิด ความหน่วงเพิ่มอีกหลายวินาที
- การอัปเดตคอนฟิกเชลล์บ่อย ๆ ไม่จำเป็นนัก และแนะนำให้ใช้ การตั้งค่าที่เรียบง่ายโดยเพิ่มเฉพาะสิ่งที่ต้องใช้เอง
การตั้งค่า Zsh แบบมินิมอล
การปรับแต่งพรอมป์ต์
การค้นหาประวัติ
- ปลั๊กอิน
zsh-autosuggestions ที่นิยมใช้ทั่วไปจะแสดงคำแนะนำระหว่างพิมพ์ ซึ่ง อาจทำให้เสียสมาธิได้
- ทางเลือกคือ bind fzf เข้ากับ
Ctrl+R เพื่อค้นหาประวัติแบบ interactive fuzzy search
source <(fzf --zsh)
ผลลัพธ์ด้านประสิทธิภาพ
เคล็ดลับเพิ่มเติม
บทสรุปและกรณีการใช้งาน
- หลังย้ายออกจาก OMZ ก็ ปรับตัวเข้ากับ workflow ใหม่ได้ภายในไม่กี่วัน
- ปลั๊กอินที่จำเป็นสามารถ โหลดเองแบบแมนนวล ได้
- เหตุผลที่เปิดหลายแท็บคือ ใช้งานร่วมกับ tmux และเอดิเตอร์บนเทอร์มินัล (helix)
- ใน tmux มีการรัน
lazygit และตัวจัดการไฟล์ yazi แบบป๊อปอัป
- ใช้ pane แยกชั่วคราวสำหรับรันโค้ดและดูผลทดสอบ โดยแต่ละ pane ทำงานเป็นเชลล์เซสชันแยกกัน
สรุปความคิดเห็น
- ผู้ใช้บางรายบอกว่าเวลาเริ่มต้นของ OMZ ที่ ระดับ 0.03 วินาที ก็เร็วพออยู่แล้ว
- ผู้เขียนชี้ว่า ปลั๊กอิน zsh-autocomplete เป็นตัวที่ทำให้ช้าลง
- ผลจาก
zsh-bench วัดได้ว่า OMZ มี ความหน่วงก่อนขึ้นพรอมป์ต์แรก 603ms ขณะที่การตั้งค่า Zsh แบบเรียบง่ายอยู่ที่ 103ms
- Starship สามารถแทนที่ฟังก์ชันด้านพรอมป์ต์ของ OMZ ได้ด้วย เครื่องมือตัวเดียว
- ผู้ใช้อื่น ๆ ยังพูดถึงทางเลือกอย่าง Zimfw, Atuin และ bash prompt ที่เขียนเอง
10 ความคิดเห็น
ถ้าไม่ปรับแต่งให้เหมาะสมก็ค่อนข้างช้าจริงครับ แต่ก็มีฟังก์ชันหลายอย่างที่คุ้นมือแล้ว เลยรู้สึกว่าตัดใจย้ายออกไปได้ไม่ง่ายเท่าไร,,
ก่อนหน้านี้ก็ยังไม่ได้รู้สึกว่าใช้งานลำบากจนสังเกตได้ชัดขนาดนั้น
ก็ไม่ใช่เว็บเซิร์ฟเวอร์อยู่แล้ว ถ้าไม่ได้รู้สึกว่ามันใช้งานลำบากก็ปล่อย ๆ ไปครับ..
สมกับเป็นนักพัฒนาเลยนะ แค่ไม่กี่ ms ที่ไม่จำเป็นก็ยังโวยวายกันใหญ่ 555
ไม่ใช่ว่าเทคโนโลยีกำลังพัฒนาขึ้นก็เพราะไม่กี่มิลลิวินาทีที่เสียไปอย่างเปล่าประโยชน์หรอกหรือ?
ถ้าคุณใช้เทอร์มินัลบ่อย ๆ ความหน่วงที่ omz เพิ่มเข้ามานั้นน่ารำคาญไม่น้อย
ฉันเริ่มใช้พร้อมกับ omz เลย เลยคิดว่าเป็นความไม่สะดวกที่ต้องยอมรับเอง เส้า
ช่วงหลัง ๆ ก็ทยอยเอาปลั๊กอินออกทีละตัวและเปลี่ยนนโยบายการอัปเดตแล้วด้วย.. พอมาเห็นแบบนี้ก็รู้สึกว่าไม่มีก็ได้นะ
สำหรับฉัน ตอนโหลดค่าตั้งค่าด้วย tmuxinator ถ้ามีหน้าต่าง
omz update y/nโผล่มาก็ไม่ค่อยชอบเท่าไรผมเปลี่ยนไปใช้ prezto ตั้งแต่หลายเดือนก่อน แล้วก็รู้สึกว่า omz ช้าขนาดนี้เลยเหรอ
แค่ใส่ปลั๊กอินพื้นฐานไม่กี่ตัวก็ช้าลงอย่างเห็นได้ชัดแล้ว...
ผมย้ายไปใช้ starship แล้วครับ
ความคิดเห็นจาก Hacker News
ฉันมีเหตุผลเดียวที่ใช้ oh-my-zsh
เพื่อให้ได้ สภาพแวดล้อมเชลล์ที่พร้อมใช้งานและทำงานได้ทันที ไม่ว่าจะอยู่บนเครื่องใหม่ โฮสต์ระยะไกล หรือคอนเทนเนอร์ก็ตาม
แทนที่จะเสียเวลาหลายชั่วโมงไปกับการปรับแต่งค่าด้วยตัวเอง ฉันอยากเอาเวลานั้นไปทำเรื่องที่สำคัญกว่า
ยังได้ประสบการณ์แบบ “ติดตั้งแล้วใช้ได้เลย” เหมือนเดิม แต่ไม่มี ความหน่วงของพรอมป์ต์เกิน 200ms
ติดตั้งได้ด้วย
curlบรรทัดเดียว และการตั้งค่าก็เรียบง่ายคิดว่าถ้าลองแล้วจะไม่ผิดหวัง
พอทำไฟล์คอนฟิกไว้ครั้งหนึ่งแล้วจัดการด้วย git ก็ใช้ต่อบนเครื่องอื่นได้เหมือนเดิม
ตอนฉันเซ็ตเครื่องใหม่ก็แค่ดึง dotfiles มาก็ได้สภาพแวดล้อมเดิมกลับมาทันที
พูดเล่นนะ แต่การคัดลอก
.bashrcง่ายกว่าการติดตั้งเชลล์พื้นฐานเสียอีกต้องรอทุกครั้งที่เปิดแท็บใหม่ มันน่าหงุดหงิดมาก
สุดท้ายก็ไปติดตั้งปลั๊กอินที่ต้องใช้ไม่กี่ตัวเองผ่าน Homebrew ซึ่งใช้เวลาไม่ถึงชั่วโมง
ตอนนี้เชลล์เร็วและเบา ทำให้ ทำงานได้มีประสิทธิภาพขึ้นและอารมณ์ก็ดีกว่าเดิมมาก
ความเร็วตอนเริ่มเชลล์ดีมาก และการตั้งค่าก็ทำได้ง่าย
เพราะงั้นฉันเลยย้ายไปใช้ fish
มันอาจไม่ตรงใจฉันทุกอย่าง แต่ค่าพื้นฐานดีพอจนฉันก็ชินไปเอง
ตอนนี้แทบไม่ต้องเสียเวลาไปสนใจกับการตั้งค่าเชลล์อีกแล้ว
แต่ก็แนะนำให้มือใหม่อ่านเรื่องคีย์ไบน์ดิ้งไว้หน่อย
เคยมีเพื่อนร่วมทีมไม่รู้เรื่องการเติมคำสั่งด้วย tab หรือฟีเจอร์อย่าง shift+arrow เลยทำงานช้าลง
ฉันเพิ่มแค่ vim binding หรือ ปลั๊กอิน fuzzy find เป็นบางครั้ง
แค่ fish เปล่า ๆ ก็ดีมากพอแล้ว
ฉันไม่เห็นด้วยกับความเห็นที่แนะนำให้เปิด Vim mode บน Zsh
readline ปกติก็ดีพออยู่แล้วสำหรับคำสั่งเดี่ยว ๆ
ถ้าเป็นคำสั่งยาวก็แก้ไขด้วย
C-x C-eได้เวลา pair programming กัน การต้องสลับโหมดของ Vim กลับดูทำให้ช้าลงเสียมากกว่า
C-x C-eมีประโยชน์มากจริง ๆส่วนใหญ่จะอยู่ใน insert mode และใช้
C-x C-eเฉพาะเวลาที่ต้องแก้ไขเยอะ ๆถ้าคุ้นกับ vi key binding แล้ว คำสั่งอย่าง
w,b,dwจะเร็วกว่าเพราะเป็น muscle memoryการเปิด editor ขึ้นมาจะทำให้เสียจังหวะและยังบังผลลัพธ์บนหน้าจอด้วย เลยไม่ชอบ
อยากให้ในเชลล์มีฟีเจอร์แบบการ ลบระหว่างตัวอักษรใน Vim (di") ด้วย
ฉันเองก็ใช้ oh-my-zsh แค่สำหรับเซ็ตค่าเริ่มต้นเท่านั้น
ใช้แค่ git plugin ตัวเดียว และให้โหลดฟังก์ชันที่กำหนดเองอัตโนมัติ
ลองวัดด้วย
hyperfineแล้วพบว่า login shell ใช้เวลาประมาณ 54ms และ shell ปกติประมาณ 6msเลยคิดว่าความหน่วง 380ms อาจมาจากสาเหตุอื่น
มัน เริ่มทำงานได้ทันที และเพราะอยู่ในโหมดดูแลรักษาแล้ว จึงยิ่งช่วยไม่ให้เสียเวลาโดยไม่จำเป็น
zsh -lเป็น login shell เลยไม่โหลดzshrcควรทดสอบด้วย
zsh -ic exitรายละเอียดดูได้ใน คู่มือ zsh-bench
zprofลงใน.zshrcextract,z,fzfดูด้วยฉันย้ายไปใช้ชุด fish + starship
fish มี auto-completion และ syntax highlighting มาให้โดยพื้นฐาน จึงแทนความสามารถหลักของ oh-my-zsh ได้
ดูบทความที่เกี่ยวข้อง
เพราะงั้นฉันเลยยังคงใช้ zsh+starship+init script แบบเรียบง่ายต่อไป
อยากให้ fish “ใช้งานได้เลย” แบบสมบูรณ์จริง ๆ แต่ตอนนี้ยังมีจุดที่ไม่เต็มนัก
การไม่มี HEREDOC และการที่ทำ background block ไม่ได้เป็นเรื่องน่ารำคาญ
แต่ทุกวันนี้ฉันกลับชอบใช้ ภาษาที่ build ออกมาเป็น single binary มากกว่าสคริปต์ซับซ้อน
ถ้ามันนิ่งพอแล้วก็ตั้งใจจะย้ายไป nushell
ฉันย้ายไปใช้ Zim ตั้งแต่หลายปีก่อน
มีฟีเจอร์ครบตามที่ต้องการ เร็วและติดตั้งง่าย
https://zimfw.sh/
รองรับแหล่งที่มาและรูปแบบที่หลากหลาย และยังยอดเยี่ยมในการรวม zsh code เข้าด้วยกัน
ทั้ง ความเร็วและความเข้ากันได้ ดีกว่าระบบปลั๊กอินส่วนใหญ่แบบชัดเจน
เป็นเฟรมเวิร์กที่ยอดเยี่ยมจริง ๆ
ตอนเรียนมหาวิทยาลัยเมื่อประมาณ 15 ปีก่อน ฉันติดตั้ง oh-my-zsh
แล้วก็พอใจมากตั้งแต่นั้นมา จนไม่เคยรู้สึกว่าจำเป็นต้องลองเชลล์หรือการตั้งค่าอื่น
ทุกครั้งที่เซ็ตคอมพิวเตอร์ใหม่ มันคือสิ่งแรกที่ฉันติดตั้ง
ใช้ oh-my-zsh มานานมาก แต่รอบนี้ใช้ Claude ช่วยลบออกได้ใน 5 นาที
แล้วแทนที่ฟีเจอร์ที่ต้องการด้วย raw zsh เท่านั้น
เพราะใช้
starshipเป็นพรอมป์ต์อยู่แล้ว เลยแทบไม่ต้องตั้งค่าเพิ่มอะไรตอนนี้ดูเหมือนว่าทุกอย่างยังทำงานได้ดีทั้งหมด
บางคนมองว่าการบ่นเรื่อง ความหน่วง 0.5 วินาทีของ oh-my-zsh เป็นเรื่องเกินไป
แค่ใช้ bash กับ KDE konsole ก็เพียงพอแล้ว
มองว่าเชลล์เป็นแค่ตัวครอบสำหรับงานง่าย ๆ จึงไม่จำเป็นต้องใส่ใจกับการปรับจูนเล็กน้อยแบบนี้
แต่ละเชลล์เป็น ส่วนหนึ่งของ flow การทำงาน ดังนั้นต่อให้หน่วงแค่ 1 วินาทีก็รู้สึกได้ชัด
เพราะแบบนี้ฉันจึงคิดว่าเชลล์ที่เร็วจึงสำคัญ
อย่างมากก็ราว 20 ครั้ง ซึ่งถ้าแค่นั้นก็ไม่น่าใช่ปัญหาใหญ่
ถึงประสิทธิภาพที่เร็วกว่าจะดีก็จริง แต่ไม่ได้มองว่าเป็นปัญหาสำคัญโดยตัวมันเอง
การตั้งค่า zsh ของฉันมีประมาณ 90 บรรทัด และใช้ปลั๊กอินแค่ 3 ตัวเท่านั้น (compinit, vcs-info, edit-command-line)
ตั้งแต่เริ่มจนปิดใช้เวลาราว 0.32 วินาที
ใน repository ขนาดใหญ่จะมีความหน่วงจากการดึงข้อมูล branch
ปัญหาแบบนี้แก้ได้ด้วย ยูทิลิตีแคช bkt (https://github.com/dimo414/bkt)
คิดว่า Starship เองก็น่าจะใช้การแคชในลักษณะคล้ายกัน