17 คะแนน โดย GN⁺ 2026-01-11 | 10 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 แบบมินิมอล ที่แนะนำมีดังนี้
    export HISTSIZE=1000000000
    export SAVEHIST=$HISTSIZE
    setopt EXTENDED_HISTORY
    setopt autocd
    autoload -U compinit; compinit
    
    • HISTSIZE และ SAVEHIST ใช้กำหนดขนาดของประวัติคำสั่ง
    • EXTENDED_HISTORY เพิ่ม timestamp ลงในประวัติ
    • autocd ทำให้ย้ายไดเรกทอรีได้โดยไม่ต้องใช้คำสั่ง cd
    • compinit ใช้ เริ่มต้นระบบ autocomplete
  • แค่ตั้งค่าเท่านี้ก็ได้ สภาพแวดล้อมเชลล์พื้นฐานที่มีฟังก์ชัน completion แล้ว

การปรับแต่งพรอมป์ต์

  • พรอมป์ต์ใช้ Starship
    • Starship คือ พรอมป์ต์แบบรวดเร็วและมินิมอลที่ประกอบด้วยไบนารีเพียงตัวเดียว
    • มันแทนที่ปลั๊กอินและธีมเดิมของ OMZ พร้อมแสดงสถานะของ git, virtual environment และภาษาต่าง ๆ
  • ตัวอย่างการตั้งค่า Starship ปิด การแสดงผลที่เกี่ยวกับคลาวด์ เช่น AWS, GCP, Azure, NodeJS เพื่อลดสิ่งรบกวนสายตา
  • ในโปรเจกต์ Python และ Rust ภาษาที่ใช้งานจะถูกเน้นในพรอมป์ต์ และยัง แสดงเวลาที่ใช้รันคำสั่ง ด้วย
  • เปิดใช้งานได้ด้วยการเพิ่มบรรทัดนี้ใน .zshrc
    eval "$(starship init zsh)"
    

การค้นหาประวัติ

  • ปลั๊กอิน zsh-autosuggestions ที่นิยมใช้ทั่วไปจะแสดงคำแนะนำระหว่างพิมพ์ ซึ่ง อาจทำให้เสียสมาธิได้
  • ทางเลือกคือ bind fzf เข้ากับ Ctrl+R เพื่อค้นหาประวัติแบบ interactive fuzzy search
    source <(fzf --zsh)
    

ผลลัพธ์ด้านประสิทธิภาพ

  • หลังใช้การตั้งค่าข้างต้น เวลาเริ่มต้นเชลล์เป็นดังนี้
    ❯ /usr/bin/time -f "%e seconds" zsh -i -c exit
    0.07 seconds
    
  • ได้ความเร็วเริ่มต้นที่ เร็วกว่า OMZ มากกว่า 5 เท่า

เคล็ดลับเพิ่มเติม

  • ผู้ใช้ Vim สามารถเปิดโหมด Vim ใน Zsh เพื่อเพิ่มความเร็วในการแก้ไขคำสั่งได้
    set -o vi
    bindkey -v '^?' backward-delete-char
    
    • เนื่องจาก zle ใช้คีย์ไบน์ดิงแบบ Emacs เป็นค่าตั้งต้น การตั้งค่านี้จึงช่วยให้รองรับการป้อนข้อมูลแบบ Vim

บทสรุปและกรณีการใช้งาน

  • หลังย้ายออกจาก 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 ความคิดเห็น

 
roxie 2026-02-27

ถ้าไม่ปรับแต่งให้เหมาะสมก็ค่อนข้างช้าจริงครับ แต่ก็มีฟังก์ชันหลายอย่างที่คุ้นมือแล้ว เลยรู้สึกว่าตัดใจย้ายออกไปได้ไม่ง่ายเท่าไร,,

 
tesha001 2026-01-12

ก่อนหน้านี้ก็ยังไม่ได้รู้สึกว่าใช้งานลำบากจนสังเกตได้ชัดขนาดนั้น

 
princox 2026-01-12

ก็ไม่ใช่เว็บเซิร์ฟเวอร์อยู่แล้ว ถ้าไม่ได้รู้สึกว่ามันใช้งานลำบากก็ปล่อย ๆ ไปครับ..

 
zxcv123 2026-01-11

สมกับเป็นนักพัฒนาเลยนะ แค่ไม่กี่ ms ที่ไม่จำเป็นก็ยังโวยวายกันใหญ่ 555

 
kayws426 2026-01-12

ไม่ใช่ว่าเทคโนโลยีกำลังพัฒนาขึ้นก็เพราะไม่กี่มิลลิวินาทีที่เสียไปอย่างเปล่าประโยชน์หรอกหรือ?

 
t7vonn 2026-01-11

ถ้าคุณใช้เทอร์มินัลบ่อย ๆ ความหน่วงที่ omz เพิ่มเข้ามานั้นน่ารำคาญไม่น้อย

 
edunga1 2026-01-12

ฉันเริ่มใช้พร้อมกับ omz เลย เลยคิดว่าเป็นความไม่สะดวกที่ต้องยอมรับเอง เส้า
ช่วงหลัง ๆ ก็ทยอยเอาปลั๊กอินออกทีละตัวและเปลี่ยนนโยบายการอัปเดตแล้วด้วย.. พอมาเห็นแบบนี้ก็รู้สึกว่าไม่มีก็ได้นะ
สำหรับฉัน ตอนโหลดค่าตั้งค่าด้วย tmuxinator ถ้ามีหน้าต่าง omz update y/n โผล่มาก็ไม่ค่อยชอบเท่าไร

 
devfluotin 2026-01-12

ผมเปลี่ยนไปใช้ prezto ตั้งแต่หลายเดือนก่อน แล้วก็รู้สึกว่า omz ช้าขนาดนี้เลยเหรอ
แค่ใส่ปลั๊กอินพื้นฐานไม่กี่ตัวก็ช้าลงอย่างเห็นได้ชัดแล้ว...

 
wedding 2026-01-14

ผมย้ายไปใช้ starship แล้วครับ

 
GN⁺ 2026-01-11
ความคิดเห็นจาก Hacker News
  • ฉันมีเหตุผลเดียวที่ใช้ oh-my-zsh
    เพื่อให้ได้ สภาพแวดล้อมเชลล์ที่พร้อมใช้งานและทำงานได้ทันที ไม่ว่าจะอยู่บนเครื่องใหม่ โฮสต์ระยะไกล หรือคอนเทนเนอร์ก็ตาม
    แทนที่จะเสียเวลาหลายชั่วโมงไปกับการปรับแต่งค่าด้วยตัวเอง ฉันอยากเอาเวลานั้นไปทำเรื่องที่สำคัญกว่า

    • อยากแนะนำให้ลองใช้ Starship
      ยังได้ประสบการณ์แบบ “ติดตั้งแล้วใช้ได้เลย” เหมือนเดิม แต่ไม่มี ความหน่วงของพรอมป์ต์เกิน 200ms
      ติดตั้งได้ด้วย curl บรรทัดเดียว และการตั้งค่าก็เรียบง่าย
      คิดว่าถ้าลองแล้วจะไม่ผิดหวัง
    • ถ้าเป็นเครื่องที่อนุญาตให้ใช้การตั้งค่าแบบกำหนดเองได้ ฉันคิดว่าการคัดลอก dotfiles ที่ทำเองไปใช้จะดีกว่า
      พอทำไฟล์คอนฟิกไว้ครั้งหนึ่งแล้วจัดการด้วย git ก็ใช้ต่อบนเครื่องอื่นได้เหมือนเดิม
      ตอนฉันเซ็ตเครื่องใหม่ก็แค่ดึง dotfiles มาก็ได้สภาพแวดล้อมเดิมกลับมาทันที
    • จริง ๆ แล้ว dotfiles ก็ถูกสร้างมาเพื่อจุดประสงค์แบบนี้ไม่ใช่เหรอ?
      พูดเล่นนะ แต่การคัดลอก .bashrc ง่ายกว่าการติดตั้งเชลล์พื้นฐานเสียอีก
    • ฉันก็เคยใช้ Oh My Zsh แต่เลิกเพราะมันช้าเกินไป
      ต้องรอทุกครั้งที่เปิดแท็บใหม่ มันน่าหงุดหงิดมาก
      สุดท้ายก็ไปติดตั้งปลั๊กอินที่ต้องใช้ไม่กี่ตัวเองผ่าน Homebrew ซึ่งใช้เวลาไม่ถึงชั่วโมง
      ตอนนี้เชลล์เร็วและเบา ทำให้ ทำงานได้มีประสิทธิภาพขึ้นและอารมณ์ก็ดีกว่าเดิมมาก
    • Zim ก็ใช้ได้ดีเหมือนกัน เร็วกว่า Oh My Zsh และตั้งค่าง่ายกว่า
      ความเร็วตอนเริ่มเชลล์ดีมาก และการตั้งค่าก็ทำได้ง่าย
  • เพราะงั้นฉันเลยย้ายไปใช้ fish
    มันอาจไม่ตรงใจฉันทุกอย่าง แต่ค่าพื้นฐานดีพอจนฉันก็ชินไปเอง
    ตอนนี้แทบไม่ต้องเสียเวลาไปสนใจกับการตั้งค่าเชลล์อีกแล้ว

    • ข้อดีของแนวทางนี้คือ บนโฮสต์ไหนก็ตาม แค่ติดตั้ง fish ก็ได้ สภาพแวดล้อมเดียวกันโดยไม่ต้องตั้งค่าเพิ่ม
    • fish ทำงานได้ มีประสิทธิภาพสูงและ UX ดีมาก ตั้งแต่ค่าเริ่มต้น
      แต่ก็แนะนำให้มือใหม่อ่านเรื่องคีย์ไบน์ดิ้งไว้หน่อย
      เคยมีเพื่อนร่วมทีมไม่รู้เรื่องการเติมคำสั่งด้วย tab หรือฟีเจอร์อย่าง shift+arrow เลยทำงานช้าลง
    • สงสัยว่ามีอะไรที่ค่าพื้นฐานยังขาดไปบ้าง
      ฉันเพิ่มแค่ vim binding หรือ ปลั๊กอิน fuzzy find เป็นบางครั้ง
      แค่ fish เปล่า ๆ ก็ดีมากพอแล้ว
  • ฉันไม่เห็นด้วยกับความเห็นที่แนะนำให้เปิด Vim mode บน Zsh
    readline ปกติก็ดีพออยู่แล้วสำหรับคำสั่งเดี่ยว ๆ
    ถ้าเป็นคำสั่งยาวก็แก้ไขด้วย C-x C-e ได้
    เวลา pair programming กัน การต้องสลับโหมดของ Vim กลับดูทำให้ช้าลงเสียมากกว่า

    • เพิ่งได้รู้ว่าคีย์ลัด C-x C-e มีประโยชน์มากจริง ๆ
    • ฉันก็เปิด Vim mode เหมือนกัน แล้ว เพิ่ม readline binding กลับเข้าไปอีก
      ส่วนใหญ่จะอยู่ใน 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 ขอแนะนำ zsh4humans
      มัน เริ่มทำงานได้ทันที และเพราะอยู่ในโหมดดูแลรักษาแล้ว จึงยิ่งช่วยไม่ให้เสียเวลาโดยไม่จำเป็น
    • zsh -l เป็น login shell เลยไม่โหลด zshrc
      ควรทดสอบด้วย zsh -ic exit
      รายละเอียดดูได้ใน คู่มือ zsh-bench
    • ถ้าจะวัดให้แม่นขึ้น ควรเพิ่ม zprof ลงใน .zshrc
      zmodload zsh/zprof
      ...
      zprof
      
    • แนะนำให้ลอง benchmark ภายใน git repository ด้วย
    • ลองใช้ปลั๊กอินอย่าง extract, z, fzf ดูด้วย
  • ฉันย้ายไปใช้ชุด fish + starship
    fish มี auto-completion และ syntax highlighting มาให้โดยพื้นฐาน จึงแทนความสามารถหลักของ oh-my-zsh ได้
    ดูบทความที่เกี่ยวข้อง

    • แต่ fish ก็มีข้อเสียตรงที่ ไม่รองรับ POSIX เลยมีจุดที่ใช้งานไม่สะดวก
      เพราะงั้นฉันเลยยังคงใช้ zsh+starship+init script แบบเรียบง่ายต่อไป
      อยากให้ fish “ใช้งานได้เลย” แบบสมบูรณ์จริง ๆ แต่ตอนนี้ยังมีจุดที่ไม่เต็มนัก
    • ฉันเองก็ใช้ zsh มาหลายสิบปี แต่เปลี่ยนมาใช้ fish ตั้งแต่ปีที่แล้วและยังใช้ต่อเนื่องอยู่
      การไม่มี HEREDOC และการที่ทำ background block ไม่ได้เป็นเรื่องน่ารำคาญ
      แต่ทุกวันนี้ฉันกลับชอบใช้ ภาษาที่ build ออกมาเป็น single binary มากกว่าสคริปต์ซับซ้อน
      ถ้ามันนิ่งพอแล้วก็ตั้งใจจะย้ายไป nushell
    • ที่จริง fish นั้น ดีมากอยู่แล้วตั้งแต่ค่าเริ่มต้น จนแทบไม่ต้องปรับแต่งอะไรเลย
  • ฉันย้ายไปใช้ Zim ตั้งแต่หลายปีก่อน
    มีฟีเจอร์ครบตามที่ต้องการ เร็วและติดตั้งง่าย
    https://zimfw.sh/

    • Zimfw มีระบบติดตั้งที่เร็วและยืดหยุ่นมาก
      รองรับแหล่งที่มาและรูปแบบที่หลากหลาย และยังยอดเยี่ยมในการรวม zsh code เข้าด้วยกัน
      ทั้ง ความเร็วและความเข้ากันได้ ดีกว่าระบบปลั๊กอินส่วนใหญ่แบบชัดเจน
      เป็นเฟรมเวิร์กที่ยอดเยี่ยมจริง ๆ
  • ตอนเรียนมหาวิทยาลัยเมื่อประมาณ 15 ปีก่อน ฉันติดตั้ง oh-my-zsh
    แล้วก็พอใจมากตั้งแต่นั้นมา จนไม่เคยรู้สึกว่าจำเป็นต้องลองเชลล์หรือการตั้งค่าอื่น
    ทุกครั้งที่เซ็ตคอมพิวเตอร์ใหม่ มันคือสิ่งแรกที่ฉันติดตั้ง

  • ใช้ oh-my-zsh มานานมาก แต่รอบนี้ใช้ Claude ช่วยลบออกได้ใน 5 นาที
    แล้วแทนที่ฟีเจอร์ที่ต้องการด้วย raw zsh เท่านั้น
    เพราะใช้ starship เป็นพรอมป์ต์อยู่แล้ว เลยแทบไม่ต้องตั้งค่าเพิ่มอะไร
    ตอนนี้ดูเหมือนว่าทุกอย่างยังทำงานได้ดีทั้งหมด

  • บางคนมองว่าการบ่นเรื่อง ความหน่วง 0.5 วินาทีของ oh-my-zsh เป็นเรื่องเกินไป
    แค่ใช้ bash กับ KDE konsole ก็เพียงพอแล้ว
    มองว่าเชลล์เป็นแค่ตัวครอบสำหรับงานง่าย ๆ จึงไม่จำเป็นต้องใส่ใจกับการปรับจูนเล็กน้อยแบบนี้

    • แต่ถ้าทำงานแบบ terminal-centric คุณจะเปิดเชลล์วันละหลายสิบครั้ง
      แต่ละเชลล์เป็น ส่วนหนึ่งของ flow การทำงาน ดังนั้นต่อให้หน่วงแค่ 1 วินาทีก็รู้สึกได้ชัด
      เพราะแบบนี้ฉันจึงคิดว่าเชลล์ที่เร็วจึงสำคัญ
    • ในทางกลับกันก็มีคนถามว่า วันหนึ่งเปิดเชลล์กันกี่ครั้งเชียว
      อย่างมากก็ราว 20 ครั้ง ซึ่งถ้าแค่นั้นก็ไม่น่าใช่ปัญหาใหญ่
    • อีกคนก็มองว่าประเด็นนี้ควรนับเป็นแค่ ความชอบส่วนบุคคล
      ถึงประสิทธิภาพที่เร็วกว่าจะดีก็จริง แต่ไม่ได้มองว่าเป็นปัญหาสำคัญโดยตัวมันเอง
  • การตั้งค่า zsh ของฉันมีประมาณ 90 บรรทัด และใช้ปลั๊กอินแค่ 3 ตัวเท่านั้น (compinit, vcs-info, edit-command-line)
    ตั้งแต่เริ่มจนปิดใช้เวลาราว 0.32 วินาที
    ใน repository ขนาดใหญ่จะมีความหน่วงจากการดึงข้อมูล branch
    ปัญหาแบบนี้แก้ได้ด้วย ยูทิลิตีแคช bkt (https://github.com/dimo414/bkt)
    คิดว่า Starship เองก็น่าจะใช้การแคชในลักษณะคล้ายกัน