[geek] บันทึกการย้ายมาสู่ Zsh

tulakann bio photo

By tulakann

เวลาว่างส่วนใหญ่หายไปกับการนอน

Email Twitter Google+ Github

Reading time ~18 minutes

tulakann bio photo

By tulakann

เวลาว่างส่วนใหญ่หายไปกับการนอน

Email Twitter Google+ Github

สวัสดีทุกคน บล็อกใหม่มาอีกละแถมเป็นบล็อก geek อีกตะหาก จริงๆ ก็ไม่ได้ตั้งใจจะเขียน แต่เนื่องจากไปขุดเจอ Gist ที่เคยเขียนไว้ก็เลยนึกขึ้นได้ว่าเอามาแปลงบล็อกด้วยดีกว่า เผื่อมีใครมาเจอแล้วสนใจอยากลองหรือมาแลกเปลี่ยนกันมันก็น่าจะหาเจอง่ายกว่าทิ้งไว้ใน Gist แบบนั้น ว่าแล้วก็เริ่มเลยดีกว่า

ย้ายมาสู่ Zsh

หลังจากใช้ bash และ default terminal มาตั้งแต่เริ่มใช้แมคก็เริ่มรู้สึกอยากลองอะไรใหม่ๆ โดยเฉพาะหลังจากได้มารู้จักกับ tmux (A Terminal Multiplexer) แล้วต้องตั้งค่าหลายขั้นตอนเพื่อใช้เม้าส์ (ก่อนที่ OS X 10.11 จะมาถึง) ก็เลยได้ฤกษ์ย้ายมาใช้ iTerm2 และคิดว่าไหนๆ ก็ไหนๆ แล้ว อยากลองใช้ Zsh ดูพอดี ย้ายมันทั้งคู่เลยละกัน ก็เลยจัดการย้ายทั้ง terminal ทั้ง shell พร้อมๆ กันซะเลย หลังจากย้ายเสร็จก็ได้จดขั้นตอนไว้ใน Gist แล้วก็เอามาแปลงเป็นบล็อกนี้ ซึ่งมันก็ไม่มีอะไรมากไปกว่าการเป็นบันทึกของสิ่งต่างๆ ที่ได้ค้นหามาแล้วก็เอามาปรับแต่งใช้เอง จริงๆ แล้วเคยเขียน Gist ทำนองนี้แต่เป็นเวอร์ชันของ bash ไว้ด้วย

ทำไมต้อง Zsh ล่ะ?

เอาจริงๆ ก็ไม่มีเหตุผลที่ชัดเจน แต่จำได้ว่าตอนนั้นได้ยินเกี่ยวกับ Zsh กับ fish shell พร้อมๆ กัน เลยนึกอยากลองขึ้นมา แต่ fish shell ค่อนข้างจะปรับแต่งยากเล็กน้อยเนื่องจากโครงสร้างสคริปต์ที่แตกต่างจาก bash ปกติ กอปรกับไอเราก็ขี้เกียจเรียนรู้มากขนาดนั้น ก็เลยตัดสินใจลองย้ายมา Zsh ด้วยเหตุผลหลักๆ ที่ว่ามันมีธีมให้เลือกหรือเขียนเองก็ได้ แล้วก็ autocompletion ที่ทำได้ยืดหยุ่นกว่า bash แต่ก็นั่นแหละ จริงๆ คืออยากลองของใหม่นั่นเอง

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

ส่วนอันนี้คือปลั๊กอินของ Zsh ก็มีสองตัวที่ดังๆ คือ Oh-My-Zsh กับ Prezto แต่อันนี้เราเองก็ยังคงใช้ Oh-My-Zsh อยู่ ยังไม่ได้ย้ายแต่อย่างใด

เริ่มติดตั้ง

เกริ่นยาวอีกละ ไปเริ่มติดตั้งเลยละกัน ในส่วนนี้ก็เป็นการบันทึกการติดตั้งของเราเอง ซึ่งก็มีหลายอย่างที่ไม่ได้จำเป็นเช่น tmux, spf13 หรือ youtube-dl แต่ก็ไม่เป็นไร อยากข้ามขั้นไหนก็ข้ามโลด แล้วก็สมมติว่ามี Homebrew อยู่แล้วด้วยเนาะ ถ้าไม่มีก็จิ้มตามลิงค์ไปดูวิธีติดตั้งได้

Dependencies

  • Zsh - จริงๆ มีติดมากับแมคอยู่แล้ว แต่จะดีกว่าถ้าลงเวอร์ชันใหม่
  • Oh-My-Zsh - ปลั๊กอินสำหรับ Zsh แต่ผู้พัฒนาเค้าเรียกว่า Zsh configuration framework น่ะนะ
  • tmux - ก็เอ่อไม่รู้จะอธิบายยังไง แต่มันคือ terminal multiplexer ไม่รู้จะบอกประโยชน์ยังไง แต่ใช้แล้วก็สะดวกดี
  • reattach-to-user-namespace - อันนี้เพื่อให้ tmux สามารถก็อปปี้ไปลงคลิปบอร์ดได้ บน Linux ไม่ต้องลงนะ
  • vim - text editor on terminal ก็มีติดมากับแมคเช่นกัน แต่ลงใหม่สดใหม่กว่า
  • spf13 - อันนี้คือ distribution of vim plugins ข้ามๆ ไปก็ได้ ปัญหาเยอะเหมือนกัน ถึงเราจะยังใช้อยู่ก็เถอะ
  • youtube-dl - อันนี้แถม เป็น command line app เขียนด้วย python ไว้โหลด youtube (ไม่ควรเผยแพร่ไฟล์ที่โหลดมาไม่ว่ากรณีใดๆ นะ)

Installation

brew install zsh # Zsh
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" # Oh-My-Zsh
brew install tmux # tmux
brew install reattach-to-user-namespace # tmux patch
brew install vim # editor
curl http://j.mp/spf13-vim3 -L -o - | sh # spf13
brew install youtube-dl # add-on

การปรับแต่ง

หลักๆ แล้วไฟล์ที่จะต้องใช้ในการปรับแต่งก็จะอยู่ใน home directory ( ~ ) หลักๆ ที่เราใช้ก็มีสามอันนี้

  • ~/.zshrc
  • ~/.custom-bash
  • ~/.tmux.conf

.zshrc

.zshrc นี่ก็เทียบได้กับ .bashrc คือจะโดนเรียกทุกครั้งที่เปิดหน้าต่างใหม่ของ terminal อย่างไรก็ตามบนแมคก็มีข้อยกเว้นอยู่ ถ้าสนใจก็ลองไปอ่านดูได้ ในส่วนของการตั้งค่า เนื่องจากเราได้ทำการติดตั้ง Oh-My-Zsh ด้วย จึงทำให้เราไม่ต้องทำอะไรกับมันมากนัก เพราะพวกการเซ็ต path หรือตั้งค่าอื่นๆ ที่จะทำให้ไฟล์รกเราจะไปทำที่อื่น แทน แล้วค่อย source ไฟล์นั้นใน .zshrc

สรุปก็คือ ใน .zshrc เราทำแค่สองอย่างคือใส่ปลั๊กอินของ Oh-My-Zsh แล้วก็ source ไฟล์ดอท (dot file)

# ประมาณบรรทัดที่ 52 เราใช้สามอันนี้ อยากใส่อะไรก็ลองไปอ่านดูนะ แปะลิงค์ไว้ตรงคำว่าปลั๊กอิน
plugins=(web-search chucknorris tmuxinator)

# ที่ท้ายสุดของไฟล์ จะให้ source ไฟล์ดอทของเรา
source ~/.custom-bash

.custom-bash

อันนี้เป็นคอลเล็กชันของเราเอง ก็ตัดๆ ออกไปบ้าง เหลือไว้แค่บางอันเพราะมันไร้สาระเกิน

# Export
export PATH="/usr/local/bin:$PATH"
export EDITOR='vim'

# Alias
## github page - jekyll serve
alias ghpjks='bundle exec jekyll serve'

## source .bash_profile
alias srcbpf='source ~/.bash_profile'
alias srcz='source ~/.zshrc'

## hide & show files
alias unhideFiles='defaults write com.apple.finder AppleShowAllFiles YES; killall Finder /System/Library/CoreServices/Finder.app'
alias hideFiles='defaults write com.apple.finder AppleShowAllFiles NO; killall Finder /System/Library/CoreServices/Finder.app'

## command
#alias l='ls -tlcras'
alias s='du -sh'
alias mux='tmuxinator'

##########

# App shortcuts
## Safari
safari() {
  open -a Safari.app "$1"
}

## Chrome
chrome() {
  open -a "Google Chrome.app" "$1"
}

## VS Code
code () {
  VSCODE_CWD="$PWD" open -n -b "com.microsoft.VSCode" --args $* ;
}

##########

# Some useful stuffs
## Song Trimmer
## trimmer <song> <start(sec)> <duration(sec)>
trimmer() {
  ffmpeg -i "$1" -ss "$2" -t "$3" -acodec copy cut_"$1"
}

##########

.tmux.conf

สุดท้ายเป็นการตั้งค่า tmux ซึ่งใครไม่ได้ลงก็ไม่ต้องสนใจตรงนี้เลยก็ได้ โดยปกติ tmux จะต้องกดคีย์ผสมโดยจะมีปุ่มนำที่เรียกว่า prefix แล้วก็ปุ่มตามเป็นคำสั่ง ซึ่งค่าเริ่มต้นมันต้องกด C-b หรือ control-b แต่ขี้เกียจกดสองปุ่มไง ก็เลยย้ายไปไว้ที่ปุ่ม ` แต่จริงๆ แล้วเราจะตั้งเป็นอะไรก็ได้ ไม่ได้มีข้อจำกัดอะไร ใครถนัดอะไรก็ตั้งตามนั้นได้โลด

คีย์ผสมพวกนี้ก็เกิดจากการตั้งขึ้นเอง โดยรวมๆ ยำๆ มาจากลิงค์ด้านล่าง ถ้าตั้งใหม่แล้วลืมว่าคีย์ไหนทำอะไรก็สามารถเช็คได้จากใน tmux โดยกด ` + ?

ที่มาของการตั้งค่า tmux

## BASIC STUFFS
# use zsh as default shell
set-option -g default-shell /bin/zsh

# using ` as prefix
unbind C-b
set-option -g prefix `
bind ` send-prefix

# change split keys
unbind %
bind - split-window -v
unbind '"'
bind | split-window -h

# easily source .tmux.conf
unbind r
bind-key r source-file ~/.tmux.conf \; \
  display-message "source-file done"

#count windows and panes from 1
set -g base-index 1
setw -g pane-base-index 1

## MOUSE
# tmux 2.1+
set-option -g mouse on
# tmux 1.8-
# set -g mode-mouse on
# set -g mouse-select-pane on
# set -g mouse-resize-pane on
# set -g mouse-select-window on

## COLOR
set -g default-terminal "screen-256color"

## PASTE BUFFER TO CLIPBOARD
# Copy-paste integration
set-option -g default-command "reattach-to-user-namespace -l zsh"

# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

# Bind ']' to use pbpaste
bind ] run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

# Kill session
bind k confirm-before -p "kill-session #S? (y/n)" kill-session

สรุป

ก็หมดละสำหรับการตั้งค่าของเรา ซึ่งอันนี้เป็นเวอร์ชันเมื่อสามเดือนก่อนแล้วก็มีตัดๆ อะไรบางอย่างทิ้งไปบ้าง แต่ก็น่าจะยังใช้ได้เหมือนเดิม ถ้ามีอะไรจะแนะนำหรือแลกเปลี่ยนก็ทิ้งคอมเม้นต์ไว้ได้นะครับ สุดท้ายนี้ขอฝาก Gist ของ youtube-dl ไว้หน่อยเผื่อจะมีประโยชน์ (ล่ะมั้ง) :p