tmux

ตั้งแต่ที่ผมรู้จักสิ่งที่เรียกว่า terminal ด้วยเหตุผลบางอย่างที่จนถึงตอนนี้ผมก็ยังอธิบายไม่ได้ ผมรู้สึกหลงไหลมันมากๆ

หลังจากนั้นเป็นต้นมา ไม่แน่ใจว่าด้วยความเบียวหรือเปล่านะ ไม่ว่าจะทำอะไรผมก็พยายามหาทางใช้งานผ่าน command line ถ้ามันทำได้

พอผมได้เริ่มเข้าสู่การใช้ linux ความสุดโต่งของผมก็เริ่มมากขึ้น ผมพยายามทำให้มือติด keyboard อยู่เสมอ เริ่มใช้ wm ที่มี autotiling, custom key binding แล้วก็แน่นอน terminal based editor สุดหรูอย่าง neovim

ซึ่งก่อนที่ผมจะรู้จัก tmux น่ะ มันก็จะมีสิ่งที่ผมพบเจอได้บ่อยในชีวิตประจำวัน คือ ผมเปิด terminal ไว้เยอะไปหมด

อันนึงไว้เขียนโค้ด

อันนึงไว้ run server, test

อันนึงไว้ monitor log

ซึ่งมันก็จะทวีคูณตามจำนวน project ด้วยแหละ พอมันเยอะเกินผมก็จำไม่ได้ว่าอันไหนไว้ทำอะไร พอปิดทิ้งไปผมก็ต้องมาเปิดเข้าใหม่ถ้าจะใช้

โดยความจริงแล้วผมก็โอเคกับการใช้งานแบบนี้นะ

ถ้าผมไม่รู้จัก tmux ผมก็คงยังใช้ชีวิตแบบนั้นต่อไป

แต่ผมดันไปรู้จักมันเข้าให้

ประสบการณ์ของการใช้ terminal multiplexer

ช่วงนั้นผมได้รู้จัก screen ตอนทำ VPS สำหรับเกม Project Zomboid กับเพื่อนๆ

เป้าหมายคืออยากให้ server มันรันอยู่ตลอด และใครก็เข้าไปเล่นได้โดยไม่ต้องรอผมเปิดเครื่อง ผมใช้มันเพื่อ attach session เข้าไปกับ process ของ server เพื่อให้มันไม่หายเวลา disconnect

แต่พูดตรงๆ เลยว่า ตอนนั้นผมใช้มันแบบงูๆ ปลาๆ มาก

มันทำงานได้นะ แต่ไม่เคยรู้สึกว่ามันเป็นอะไรที่อยากเอามาใช้ใน workflow ประจำวันเท่าไร

รู้จัก tmux

อาจจะเป็นเรื่องที่น่าแปลก แต่ผมจำไม่ได้ว่าผมรู้จัก tmux ได้ยังไง คิดว่าคงเป็นคลิป youtube คลิปใดคลิปนึง

แต่ว่ามันเปลี่ยนวิธีการใช้งาน terminal ของผมไปอย่างมากเลยล่ะ ก็คือว่าจากที่มี terminal 4-5 อันต่อการใช้งาน มันลดลงเหลือ 1 เลยครับ

tmux overview

แล้วมันก็ยัง enhance การใช้ keyboard ของผมอีกด้วย ซึ่งจากรูปจะเห็นว่าจริงๆ แล้วมันคือ macos ไม่ใช่ linux ที่มี wm แบบที่ผมตั้ง key ลัดไว้สำหรับ keyboard driven workflow เลย แต่ประสบการณ์การใช้ terminal ของผม เรียกได้ว่าเหมือนเดิมเลยล่ะครับ

การใช้งาน

tmux มีส่วนประกอบที่เราใช้อยู่ 3 ส่วน คือ session, window และ pane

โดยส่วนตัวผมเองถ้าให้อธิบาย tmux ก็คล้ายๆ กับ browser นะ ตัว session ก็คือ browser ที่เปิด window ก็คือ tab แล้วแต่ละ tab ก็สามารถแบ่งจอกันได้อีกเป็น pane

session

วิธีใช้งาน tmux เริ่มต้นด้วยการสร้าง session ครับ

tmux new -s <session_name>

เมื่อเปิดเข้ามาแล้วเราก็สามารถใช้งานได้เหมือน terminal ปกติเลย

ซึ่งผมจะแบ่งการแยก session ด้วยกลุ่มใหญ่ๆ แบบเช่น งานแต่ละไซต์, งานส่วนตัว, เล่น อะไรทำนองนั้น

แต่เราสามารถ detach และ attach กลับเข้ามาใหม่ได้ โดยคำสั่งของ tmux ถ้าไม่ได้แก้ไขอะไรจะขึ้นต้นด้วยการกด ctrl + b พร้อมกัน ซึ่งผมจะขอเรียกมันว่า prefix หลังจากนั้นก็กด key อื่นๆ ได้เลย เช่น

  • prefix d สำหรับ detach ออกจาก session

tmux session

  • prefix ? สามารถใช้เพื่อดู help ได้นะ

tmux help

window

อย่างที่เคยกล่าวไป window มันเหมือนๆ การเปิด tab ใหม่ โดยผมมักจะใช้แยกเป็น repository ซะส่วนใหญ่ หรืออะไรที่อยู่ในหมวดหมู่เดียวกัน หรือไม่ก็อะไรที่ต้องการพื้นที่เฉพาะของมันก็มี

วิธีการเปิด window ผมใช้อยู่ 2 แบบหลักๆ

  • prefix c สร้าง window ใหม่เลย

หรือใช้ commad mode ก็ได้ โดยการเปิด command mode ทำได้โดย prefix :

# create new window
new-window
# create new window with name
new-window -n <window_name>

tmux window

pane

ส่วนที่เราจะได้ใช้งานมากที่สุดก็คือ pane ซึ่งจริงๆ ก็คือตัว terminal ของเรานี่แหละครับ

วิธีการที่ผมจะแบ่ง pane จริงๆ ก็ตาม process (program) นั่นแหละ

pane สำหรับเขียนโค้ด pane สำหรับรัน test pane สำหรับรัน server

โดยส่วนมากจะใช้ไม่เกิน 3 pane เพราะว่าเยอะกว่านี้มันก็จะแน่นๆ ละ

วิธีสร้าง pane

  • prefix % คือ split pane แบบแนวตั้ง
  • prefix ” คือ split pane แบบแนวนอน

“key ลัดแบบตั้งต้นมันก็จะดูแปลกๆ หน่อยนะแรกๆ แต่ผมชินแล้วล่ะ”

tmux pane

config

หลังจากใช้ tmux มาได้สักพักผมก็ได้ไปเจอว่า tmux สามารถสร้าง popup display ได้ด้วย ซึ่งผมรู้สึกว่าเท่ดี ก็เลยเอามาปรับใช้ด้วยซะเลย

ซึ่งประโยชน์ของมันคือผมสามารถเปิด program อื่นขึ้นมาแบบลอย ไว้ใช้งานชั่วคราวได้แบบไวๆ โดยไม่ต้องสร้าง window หรือ pane ใหม่ครับ

สำหรับ file config ของ tmux จะอยู่ที่ตำแหน่ง ~/.config/tmux/tmux.conf

และนี่คือ config ที่ผมใช้สำหรับเปิด display popup

# Keymap
bind C-d display-popup -d "#{pane_current_path}" -w 80% -h 80% -E "ranger"
bind C-s display-popup -d "#{pane_current_path}" -w 80% -h 80% -E ${SHELL}
bind C-k display-popup -w 80% -h 80% -E "tmux list-keys | fzf"
bind C-e display-popup -w 80% -h 80% -E "lua || node"
bind C-g display-popup -d "#{pane_current_path}" -w 80% -h 80% -E "lazygit"
##

หลักๆ แล้วมันคือการตั้งปุ่มแหละ ส่วนใหญ่ผมก็ใช้เปิดพวก file manager, shell หรือ tool ที่อยากเรียกขึ้นมาไวๆ แล้วปิดทิ้งหลังใช้เสร็จ

tmux pane

สุดท้ายแล้วเป็นยังไง

ตั้งแต่ที่ผมเริ่มหัดใช้ tmux ผมรู้สึกได้เลยว่าผมมีความสนุกกับการใช้งาน terminal ได้มากขึ้นจริงๆ นะ เมื่อก่อนถ้าไม่ได้ใช้ linux + wm ผมจะรู้สึกว่าประสบการณ์มันขาดอะไรไปหน่อย

แต่พอมี tmux กลายเป็นว่า wm ดูมีความสำคัญน้อยลง เพราะประสบการณ์ที่ผมใช้ terminal มันเหมือนเดิม ได้ความรู้สึกสนุกเหมือนกันไม่ว่าจะใช้งานที่ไหน

ซึ่งทั้งหมดนี้ก็คือเหตุผลที่ทุกวันนี้ผมยังใช้ tmux อยู่แทบทุกวันครับ

สำหรับคนที่สงสัย จริงๆ แล้วตัว tmux ของผมมีการลง plugin เพิ่มนะ หน้าตามันก็เลยจะแตกต่างจากตัวดั้งเดิมหน่อย

ขอบคุณสำหรับเวลาที่สละมาอ่านนะครับ ไว้เจอกันใหม่

แล้วก็เหมือนเดิมสำหรับคนที่สนใจผมมี repo ที่ setup ตัว tmux ของผมไว้ สามารถดูได้ที่นี่เลยครับ