มาใช้ zsh กันเถอะ


       หนึ่งในเครื่องมือที่นักพัฒนาใช้ประโยชน์แทบจะในทุกๆ วันคงหนีไม่พ้น terminal (หรือหลายๆ ครั้งเรียกว่า Shell) โดยถ้าอยู่บน Unix/Linux แล้วแทบจะเรียกได้ว่าเป็นแขนเป็นขาเลย ทีนี้เนี่ย Shell ที่เราใช้อยู่ทุกๆ วันโดยปกติแล้วหน้าจะประมาณนี้ ข้างล่างนี้หรือเรียกกันจริงๆ ว่า bash ซึ่งเป็น Shell มาตรฐานที่ติดมากับ Ubuntu ซึ่งในการใช้งานโดยปกติวิสัยแล้วมันก็เพียงพอต่อการใช้งานแทบจะครอบจักรวาลอยู่แล้ว เพียงแต่ว่า มันไม่หล่อ

อาจจะไม่มาตรฐานซะทีเดียวนะครับ เพราะอันนี้มันขี่อยู่ใน terminator
       อีกเหตุผลหนึ่งคือ ผมได้ยินมาซักพักแล้วว่าไอตัว zsh ที่เรากำลังจะพูดถึงต่อไปเนี่ยมันสามารถเพิ่ม Productivity ให้ developer ได้ แล้วหล่อด้วย พอได้โอกาสไม่รอช้าจับมันมาลงเครื่องทันที ขั้นตอนการลงง่ายๆ ตามนี้ครับ (ถ้าใช้ Ubuntu นะแต่ distro อื่นๆ ก็ไม่น่าจะต่างกันมากเท่าไร)

sudo apt-get update && sudo apt-get install -y zsh

หลังจากนั้นให้เปลี่ยน shell มาตรฐานของเราจาก bash เป็น zsh ได้โดยใช้คำสั่งข้างล่าง

sudo chsh -s $(which zsh) $(whoami)

       ข้อดีของ zsh ถ้าเทียบกับ bash ที่เป็น Shell มาตรฐานใน ubuntu หลักๆ แล้วมีอยู่ 3 อย่าง อย่างแรกคือ Auto completion ยกตัวอย่างเช่น โดยปกติแล้วถ้าเป็น Bash เวลาเราจะใช้คำสั่ง cd ตามด้วยชื่อ directory ถ้าเรากด tab มันจะลิสต์รายชื่อมาให้ซึ่งก็ต้องพิมพ์ตัวอักษรที่ใช้แล้วกด tab อีกจนกว่าจะไม่มีตัวเหมือนถึงจะ completion ให้หมด แต่ถ้าเป็น zsh นั้นพอเรากด tab มันจะแสดงรายชื่อ directory ที่อยู่ข้างใน working directory ของเราอยู่ ซึ่งเราสามารถกด tab หลายๆ ครั้งแล้วเลือกได้เลยว่าจะเอาอันไหน อีกเทคนิคหนึ่งคือ สมมติเราต้องการไปยัง directory: /usr/local/go ถ้าเราพิมพ์ใน bash ถ้าไม่กด tab ก็ต้องพิมพ์เต็มๆ ไปเรื่อยๆ ในกรณี zsh เราแค่พิมพ์ cd /u/lo/go แล้วกด tab ตัว zsh จะ auto complete ให้ทั้งหมด
       ข้อต่อมาคือ ถ้าเราพิมพ์คำสั่งบางคำสั่งผิดเช่น git เป็น gut ตัว zsh สามารถตรวจได้ (บางคำสั่ง) ให้เป็นตัวที่ถูกได้ซึ่งเราก็แค่กด y ก็ใช้งานได้ต่อไปแล้ว และข้อสุดท้ายคือ zsh นั้นรองรับ Right-hand prompt หรือการแทรกอะไรไว้ทางขวาของ shell ซึ่งมีประโยชน์มากในการใช้ร่วมกับ Plugin บางตัว ซึ่งเดี๋ยวเราจะว่ากันต่อไป นอกจากนั้นแล้ว zsh ก็มี Dotfile สำหรับแก้ไข configuration พื้นฐานไม่ต่างจาก shell ตัวอื่นๆ อีกด้วย

       แค่นี้ก็ดูเหมือนจะเพิ่ม productivity ได้เยอะแล้วใช่มั้ยครับ แต่มันยังไม่จบครับ ผมมองว่า zsh นี่คล้าย vim หรือ project opensource อีกหลายตัวคือ แค่ตัวมันเองก็เจ๋งอยู่แล้ว แต่พอมีระบบ plugin เข้ามาด้วยนี่ยิ่งดีขึ้นไปอีก ทำงานได้เร็วมากขึ้นอีก โดยในฝั่ง vim ก็จะแยกเป็น 2 ค่ายใหญ่ๆ คือ Pathogen กับ Vundle (ซึ่งเราจะไม่พูดถึงในบล็อกนี้) ในฝั่งของ zsh ก็จะแบ่งเป็น 2 ค่ายใหญ่ๆ เหมือนกันครับ คือ Oh My Zsh และ Presto

credit: http://ohmyz.sh/
       Oh my zsh เป็น framework ที่รวบรวม plugin และ theme สำหรับ zsh ให้มันใช้งานได้อย่างมีประสิทธิภาพยิ่งขึ้นโดยตัวมันเองจะรวบรวม plugin สำหรับโปรแกรมหลายๆ ตัวที่เราใช้กันบ่อยๆ อย่างเช่น git, vagrant, composer, rails, docker ฯลฯ ที่มี alias ให้ใช้งานโปรแกรมพวกนี้ได้ง่ายขึ้น พิมพ์น้อยลง คิดให้มากขึ้น ประมาณนั้น นอกจากนั้นแล้วยังมี theme ให้เราเลือกใช้มากกว่าร้อยรูปแบบเพื่อเพิ่มประสิทธิภาพในการแสดงสถานะของ shell โดยสามารถดูตัวอย่างได้ที่ https://github.com/robbyrussell/oh-my-zsh/wiki/Themes ในส่วนของการติดตั้ง Oh my zsh นั้นทำได้ง่ายๆ โดยพิมพ์คำสั่งตามนี้เลยครับ

sudo apt-get install -y curl
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | bash

credit: https://github.com/sorin-ionescu/prezto
         ส่วน Presto นั้นเป็น oh-my-zsh เวอร์ชั่นที่ปรับปรุงความเร็วแล้ว ซึ่งโดยส่วนตัวเองผมยังไม่รู้สึกว่ามันเร็วขึ้นจนสังเกตุได้ถ้าเทียบกัน ก็ถ้าใครลองใช้แล้วรู้สึกว่าเร็วกว่าจนเห็นได้ชัดมาบอกผมด้วยก็ดีนะครับ วิธีการลงของ Presto ก็จะต่างออกไปซึ่งสามารถอ่านได้จากหน้า github ของโปรเจ็คได้เลย https://github.com/sorin-ionescu/prezto

       ก็ประมาณนี้นะครับ สำหรับ zsh เป็นหนึ่งในเครื่องมือหลายๆ ตัวที่ผมอยากใช้มานาน จนถึงเวลาได้มีโอกาสถึงเข้าใจว่ามันมีประโยชน์จริงๆ อาจจะไม่เห็นผลในระยะสั้นๆ มากเท่าไร แต่ระยะยาวทำให้เราทำงานได้เร็วขึ้น (บ้าง) แถมหล่อด้วย หวังว่าหลังจากนี้แล้วหลายคนคงจะเลิกใช้ bash ไปเลยนะครับ

       คำเตือน : การเปลี่ยน shell มีผลกับตัวแปรและ alias ต่างๆ ที่เคยทำไว้ใน .bashrc เช่น java หรือ golang ให้ทำการเพิ่มสิ่งที่เปลี่ยนแปลงเอาไว้ในไฟล์ดังกล่าวมาลงไฟล์ .zshrc ด้วย

Reference
http://mikebuss.com/2014/02/02/a-beautiful-productive-terminal-experience/
http://blog.coolaj86.com/articles/zsh-is-to-bash-as-vim-is-to-vi.html
http://ohmyz.sh/
https://github.com/sorin-ionescu/prezto

Comments