- ผู้ใช้ที่ใช้ iTerm 2 มานานได้ลอง WezTerm อีกครั้งเพื่อใช้ การตั้งค่าแบบข้อความ และแชร์ dotfiles โดยปรับแต่งรูปลักษณ์, keybinding, multiplexing และ workspace ได้ละเอียดผ่าน API การตั้งค่า Lua
- การตั้งค่าอยู่ใน
wezterm.lua และจะ hot reload ทันทีเมื่อบันทึก อีกทั้งตรวจสอบ log และ Lua REPL ได้โดยตรงจาก debug overlay ด้วย CTRL + SHIFT + L
- การตั้งค่าด้วย Lua ช่วยให้กำหนด color scheme ในตัวกว่า 1,000 แบบ, การเชื่อมกับโหมดมืด/สว่างของระบบ, ฟอนต์, การตกแต่งหน้าต่างบน macOS และ status bar สไตล์ powerline ได้แบบไดนามิก
- สามารถคงหรือปิด keybinding พื้นฐานได้ และกำหนดเองได้ทั้งการเลื่อนทีละคำด้วย
Option + Arrow, การเปิด config ด้วย CMD +, รวมถึงการจัดการ pane ด้วย leader key และ key table
- multiplexing ในตัวและ workspaces ช่วยคงสถานะหน้าต่าง, pane และ tab แยกตามโปรเจกต์คล้าย session ของ tmux และยังสร้าง UI เลือกโปรเจกต์กับ flow การสลับได้ด้วย Lua
เหตุผลที่ลองย้ายจาก iTerm 2 มา WezTerm
- ใช้ iTerm 2 มาเกือบ 10 ปี แต่ต้องการ terminal ที่จัดการการตั้งค่าทั้งหมดเป็นข้อความได้ เพื่อใส่ไว้ใน dotfiles และแชร์ระหว่างเครื่องทำงานกับเครื่องส่วนตัว
- จุดเด่นของ WezTerm คือ API ที่ทรงพลังและ Lua config และในการลองครั้งที่สองก็สามารถจัด terminal ให้ดูดีขึ้นและใช้งานได้มากขึ้น
- ขอบเขตที่พูดถึงคือรูปลักษณ์, keybinding, multiplexing, การย้าย workspace, status bar และการตั้งค่า theme แบบไดนามิก
- ยังมีฟีเจอร์อื่นที่บทความนี้ไม่ได้พูดถึง
- กฎ highlight hyperlink แบบกำหนดเอง
- scrollback ที่ค้นหาได้
- quick copy mode
- รองรับรูปภาพ
- ตัวอย่าง config อิงกับประสบการณ์ใช้งานบน macOS และไม่ได้ทดสอบบนระบบอื่น แต่ WezTerm เองทำงานได้ในหลายสภาพแวดล้อม
- ตัวอย่าง config สุดท้ายมีให้ใน gist
การติดตั้งและโครงสร้างพื้นฐานของการตั้งค่า Lua
brew install wezterm
- ใช้ flow ที่วางไฟล์ config ไว้ที่
$XDG_CONFIG_HOME/wezterm/wezterm.lua
- ในระบบส่วนใหญ่รวมถึง macOS จะถูกตีความเป็น
~/.config/wezterm/wezterm.lua
- หากใช้ไดเรกทอรีแทนการวางทุกอย่างไว้ใน
~/.wezterm.lua ไฟล์เดียว จะจัดการแยก config เป็นหลายไฟล์ได้ง่ายกว่า
local wezterm = require 'wezterm'
local config = wezterm.config_builder()
return config
- config ของ WezTerm เขียนด้วย Lua จึงสร้างการตั้งค่าแบบไดนามิกที่ซับซ้อนกว่า YAML หรือ TOML ได้ง่าย
- Lua เป็นภาษาโปรแกรม จึงเรียนรู้ยากกว่า YAML/TOML แต่ถ้ามีประสบการณ์ภาษา dynamic อย่าง Ruby, Python หรือ JavaScript ก็อ่านโค้ดตัวอย่างได้ง่าย
- สามารถดูเอกสารเรียน Lua ได้ที่ Getting Started guide
Hot reload และ debug overlay
- WezTerm ตรวจจับการเปลี่ยนไฟล์ config และ reload อัตโนมัติ จึงเห็นผลการตั้งค่าได้ทันทีโดยไม่ต้อง restart terminal
- ถ้าบันทึก config ที่มี error เช่นชื่อฟังก์ชันผิด จะมี popup runtime error แสดงทันที
wezterm.config_builderZ()
- เขียน log ได้ด้วย
wezterm.log_info()
wezterm.log_info("hello world! my name is " .. wezterm.hostname())
- เปิด debug overlay ด้วย
CTRL + SHIFT + L เพื่อดู log และ Lua REPL ได้
- รัน expression ของ Lua เช่น
1 + 1 ได้
- ตรวจค่าจาก module
wezterm เช่น wezterm.home_dir ได้ด้วย
- การใช้ hot reload ร่วมกับ debug overlay ทำให้ feedback loop ระหว่างแก้ config กับตรวจผลสั้นลง
การตั้งค่ารูปลักษณ์: สี, theme ของระบบ, ฟอนต์, สไตล์หน้าต่าง
-
Color scheme และการตั้งค่าแบบไดนามิก
- WezTerm มี color scheme ในตัวมากกว่า 1,000 แบบ และเลือกด้วย
config.color_scheme
config.color_scheme = 'Tokyo Night'
- ดูรายชื่อ color scheme ได้ที่ WezTerm colorschemes
- ใช้ event
window-config-reloaded และ wezterm.color.get_builtin_schemes() เพื่อทำ การตั้งค่าแบบไดนามิก ที่สุ่ม color scheme ให้แต่ละหน้าต่างใหม่ได้
- หลังตั้ง config override รายหน้าต่างแล้ว หากกลับไปใช้ color scheme แบบ static อาจทำให้ hot reload ไม่ถูกนำมาใช้ทันที
- ล้าง override ได้โดยรัน
window:set_config_overrides({}) ใน debug terminal หรือปิดแล้วเปิดหน้าต่างใหม่
-
เชื่อมกับโหมดมืด/สว่างของระบบ
- แยก config เป็น module
appearance.lua เพื่อเปลี่ยน color scheme ตามรูปลักษณ์ของระบบปฏิบัติการได้
- ตรวจว่าเป็น dark mode หรือไม่โดยมองหา string
"Dark" จาก wezterm.gui.get_appearance()
- ในสภาพแวดล้อมที่ไม่มี
wezterm.gui จะถือว่าเป็น dark mode โดย default
if appearance.is_dark() then
config.color_scheme = 'Tokyo Night'
else
config.color_scheme = 'Tokyo Night Day'
end
-
ฟอนต์และการตกแต่งหน้าต่าง
- WezTerm รวม JetBrains Mono และ Nerd Font Symbols มาให้โดย default
- config ตัวอย่างใช้ Berkeley Mono 13pt
config.font = wezterm.font({ family = 'Berkeley Mono' })
config.font_size = 13
- ตัวอย่างสไตล์หน้าต่างบน macOS รวมถึงพื้นหลังโปร่งแสง, blur, เอา title bar ออก และตั้งค่าฟอนต์ของ tab bar
config.window_background_opacity = 0.9
config.macos_window_background_blur = 30
config.window_decorations = 'RESIZE'
Status bar และ WezTerm Event API
- เพิ่ม segment รูปแบบ powerline ใน status bar ฝั่งขวาด้วย callback ของ event
update-status
- ตัวอย่างแรกแสดง segment hostname โดยใช้สีพื้นหลัง/สีตัวอักษรของ color scheme ปัจจุบันและ
wezterm.hostname()
wezterm.on ใช้เชื่อม callback เข้ากับ event ของ terminal
update-status เกิดเป็นระยะเมื่อพร้อมอัปเดตสถานะ
- WezTerm จัดการให้มีการอัปเดตทำงานทีละหนึ่งครั้ง และจะหยุด handler หากโค้ดใช้เวลานานเกินไป
- ดึง palette ปัจจุบันที่รวม override แล้วได้ด้วย
window:effective_config().resolved_palette
wezterm.format ใช้ใส่ style ให้ string เช่นสี, ตัวหนา, ขีดเส้นใต้
- ตัวอย่างช่วงท้ายเพิ่ม segment ใน status bar ให้มากขึ้น
- workspace ปัจจุบัน
- วันที่และเวลา
- hostname
- คำนวณสี gradient จาก theme ปัจจุบันด้วย
wezterm.color.parse, color:lighten, color:darken, wezterm.color.gradient
Keybinding: การเลื่อนทีละคำบน macOS และการเปิด config
- WezTerm มี keybinding พื้นฐานให้ และตัวอย่างนี้ยังคงใช้งานไว้
- หากต้องการปิด keybinding พื้นฐาน ใช้
config.disable_default_key_bindings = true ได้
- บน macOS ส่ง
ESC + b, ESC + f เพื่อให้ Option + LeftArrow, Option + RightArrow เลื่อนทีละคำเหมือน iTerm 2 และ Terminal.app
{
key = 'LeftArrow',
mods = 'OPT',
action = wezterm.action.SendString '\x1bb',
}
- ตั้งค่าให้
CMD + , เปิดไฟล์ config ของ WezTerm ใน tab ใหม่ได้
- ตัวอย่างใช้
nvim และ wezterm.config_file
- ถ้า WezTerm ถูกเปิดจาก macOS Finder คำสั่งอาจล้มเหลวเพราะไม่มี binary ของ editor ใน
PATH
- หากเสริม environment variable พื้นฐานด้วย
config.set_environment_variables environment เดียวกันจะถูกส่งต่อให้คำสั่ง spawn หลังจากนั้นด้วย
config.set_environment_variables = {
PATH = '/opt/homebrew/bin:' .. os.getenv('PATH')
}
Multiplexing ในตัวและ leader key
- Multiplexing ในตัวของ WezTerm เป็นฟีเจอร์ที่ใช้แทน tmux ได้
- ฟีเจอร์ในตัวมี scrollback buffer แยกตาม pane, การควบคุมด้วย mouse ที่ดีกว่า, การเลือกที่ง่ายกว่า และโดยรวมประสิทธิภาพเร็วกว่า
- เปิด command palette ด้วย
CTRL + SHIFT + P แล้วรันคำสั่งอย่าง “Shell: Split Horizontally”, “Shell: Split Vertically” ได้
- shortcut สำหรับ split พื้นฐานค่อนข้างซับซ้อนเพื่อหลีกเลี่ยงการชนกัน จึงใช้ leader key เพื่อสร้างชุดปุ่มที่ง่ายกว่าได้
config.leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1000 }
- ตัวอย่างใช้สไตล์ tmux โดยกด
" หลัง leader เพื่อ split แนวนอน และกด % เพื่อ split แนวตั้ง
{
key = '"',
mods = 'LEADER',
action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
}
- เมื่อต้องการส่ง
CTRL + A เองเข้า terminal ให้ map ชุด LEADER|CTRL เพื่อส่ง CTRL + A กลับไป
การย้าย pane, resize และ key table
- การย้าย pane map ปุ่มสไตล์ทิศทางของ vim คือ
h, j, k, l กับชุด leader
- ใช้
ActivatePaneDirection เพื่อย้ายไป Down, Up, Left, Right
- ลด Lua table ที่ซ้ำกันได้ด้วยฟังก์ชัน
local function move_pane(key, direction)
return {
key = key,
mods = 'LEADER',
action = wezterm.action.ActivatePaneDirection(direction),
}
end
- resize pane ทำด้วย mouse ได้ แต่ตัวอย่างใช้ key table เพื่อ flow ที่เน้น keyboard
- key table คือวิธีเข้าสู่ mode เฉพาะแล้วใช้ keybinding สำหรับ mode นั้น
- คล้าย leader key แต่ทำให้ไม่ถูกปิดใช้งานทันทีหลังทำงานหนึ่งครั้งได้
- เหมาะกับงานที่ต้องกดปุ่มเดิมซ้ำ เช่น resize
- ตัวอย่างเปิดใช้ key table
resize_panes ด้วย LEADER + r แล้วปรับขนาด pane ทีละ 3 cell ด้วย h/j/k/l
- ตั้ง
timeout_milliseconds = 1000 เพื่อออกจาก resize mode หลัง 1 วินาที
- ผู้ใช้ Neovim ดู smart-splits.nvim ที่ช่วยย้ายระหว่าง WezTerm pane กับ vim pane ได้
การจัด workspace แยกตามโปรเจกต์
- เมื่อต้องทำงานหลายโปรเจกต์พร้อมกัน จะอยากคงสถานะแยกของ multiplexer instance, หน้าต่าง, pane และ tab สำหรับแต่ละโปรเจกต์
- ใน WezTerm ใช้ workspaces เพื่อจุดประสงค์คล้าย session ของ tmux
- ใช้โครงสร้างที่สร้าง
projects.lua แล้วเรียกฟังก์ชันเลือกโปรเจกต์จาก config หลัก
- ตัวอย่างแรกระบุ path โปรเจกต์เอง แล้วเปิด UI เลือกด้วย
InputSelector
- เปิด fuzzy search ด้วย
fuzzy = true
- ช่วงแรกผลลัพธ์ที่เลือกจะแสดงเป็น log ใน debug overlay เท่านั้น
- ตั้ง
LEADER + p ให้เปิด UI เลือกโปรเจกต์ และ LEADER + f ให้แสดงรายการ workspace เดิมพร้อม fuzzy search
action = wezterm.action.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES' }
- ลดความไม่สะดวกจากการจัดการ path โปรเจกต์เองด้วย
wezterm.glob() เพื่อรวบรวมไดเรกทอรีย่อยใต้โฟลเดอร์โปรเจกต์โดยอัตโนมัติ
- ตัวอย่างใช้ไดเรกทอรีย่อยใต้
~/Projects เป็นโปรเจกต์ และรวม home directory ไว้ในรายการโปรเจกต์ด้วย
- เมื่อเลือกโปรเจกต์ จะรัน
SwitchToWorkspace
- หาก workspace มีอยู่แล้ว จะสลับไป
- หากยังไม่มี จะสร้างใหม่
- ชื่อ workspace ใช้ segment สุดท้ายของ path
- current working directory ของ terminal ใหม่ถูกตั้งเป็น path โปรเจกต์ที่เลือก
สิ่งที่ลองต่อได้
- WezTerm ยังมีฟีเจอร์อีกมากใน รายการฟีเจอร์
- ดูความเป็นไปได้ของการตั้งค่า Lua เพิ่มเติมได้ใน WezTerm API docs
- config ที่ทำตามทีละขั้นควรเหลือไว้เฉพาะรายการที่จะใช้จริง เขียนใหม่ตามสไตล์ของตัวเอง แล้วค่อยเพิ่มฟีเจอร์ที่ต้องการ
- หากถูกใจ WezTerm ก็สามารถ สนับสนุน Wez ที่ทำงานโอเพนซอร์สได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เพิ่งย้ายมาใช้ WezTerm และพอใจมาก
ก่อนหน้านี้ใช้ kitty และตอนย้ายมาจาก iTerm2 ก็ชอบเรื่องการตั้งค่าและความเรียบง่าย แต่ในแง่ฟีเจอร์ที่มีมาให้ WezTerm ดีกว่ามาก การตั้งค่าเทอร์มินัลก็สั้นพอจะอยู่ในหน้าจอเดียวของเอดิเตอร์ได้ และหลังจากนั้นเทอร์มินัลก็ไม่มากวนใจอีก เลยไม่ต้องคอยคิดถึงมัน
จุดชี้ขาดที่ทำให้เลิกใช้ kitty คือทุกครั้งที่เจอปัญหาหรือพยายามทำฟีเจอร์ของ iTerm2 ให้เหมือนเดิม ก็มักจะเห็นคำตอบสั้น ๆ และดูเหมือนดูแคลนจาก maintainer
เช่น จำได้ว่ามีคำถามว่า “จะตั้งค่า tmux ใน kitty อย่างไร?” แล้วตอบประมาณว่า “อย่าทำ tmux มันโง่” แล้วก็ปิดประเด็นไป สุดท้ายเลยถอดใจ
แน่นอนว่าเป็นโปรเจกต์ของเขาเองและเขาเป็นโปรแกรมเมอร์ที่เก่งมาก แต่ถ้ามีความถ่อมตัวสักหน่อยก็คงไม่เสียหาย
สำหรับคนที่ไม่คุ้น มันคือหน้าต่างที่ใช้คีย์ลัดเฉพาะเพื่อสลับแสดง/ซ่อน และเมื่อแสดงก็จะลอยอยู่เหนือหน้าต่างทั้งหมด ทำให้เรียกใช้เทอร์มินัลได้ทันทีจากทุกที่ ถึงไม่มีมันก็อยู่ได้ แต่เป็นฟีเจอร์ที่ไม่อยากยอมเสียไปโดยไม่จำเป็น ดังนั้นแม้ฟีเจอร์อื่น ๆ ของ WezTerm จะดีแค่ไหน ถ้าไม่มีอันนี้ สำหรับผมก็หมดสิทธิ์ตั้งแต่เริ่ม
ภายนอกมักดูเหมือนเป็นผลิตภัณฑ์ที่ดีที่สุด แต่พอเริ่มใช้ลึก ๆ แล้ว จะติดอยู่กับทางเลือกของคนนั้นและไม่มีทางถอยกลับ
แต่ตอนเริ่มใช้ WezTerm เมื่อต้นปีนี้ ผมประหลาดใจจริง ๆ ได้อ่านงานเขียนของ Wez หลายชิ้น และทุกครั้งน้ำเสียงก็สมบูรณ์แบบ รู้สึกว่ายอดเยี่ยมมาก
สิ่งที่เป็นสัญลักษณ์คือ แม้แต่ UI เก่าแก่ของ Linux อย่าง
make menuconfigก็ยังเรนเดอร์ไม่ได้ถูกต้อง และแก้ด้วยการตั้งค่าไม่ได้ เพราะตัวเขาไม่เชื่อในการตั้งค่า พออ่าน issue tracker ก็ไม่ใช่แค่รู้สึกถูกดูถูกเท่านั้น แต่ยังทำให้เกิดความรู้สึกเหมือนต้อง “ปกป้อง” วิธีใช้เทอร์มินัลแบบสุ่ม ๆ ด้วยความรุนแรงเท่ากัน ซึ่งไม่ดีต่อสุขภาพใจไม่อาจรู้แน่ชัด แต่ถึงแม้ผมจะเห็นตรงกับเขาในทุกเรื่องเกี่ยวกับเทอร์มินัล ผมก็คงยังรู้สึกเหมือนเดิมว่าแทนที่จะใช้เทอร์มินัลของเขา ผมไปทำเทอร์มินัลเองดีกว่า
จากประสบการณ์ของผม Wez ตอบสนองต่อ GitHub issue ได้เร็วอย่างน่าทึ่ง และถ้าเป็นจุดที่ผิดจริง ๆ ก็มักแก้ให้ภายในหนึ่งหรือสองวัน
นอกจากข้อตำหนิเล็ก ๆ หนึ่งสองอย่างเกี่ยวกับ modifier key ผ่าน SSH แล้ว ฟีเจอร์ต่าง ๆ แทบจะตรงกับความต้องการของผมอย่างสมบูรณ์ แถมยังเร็วด้วย เมื่อก่อนผมเป็นแฟนตัวยงของ Alacritty แต่ต้องการการรองรับ modifier ที่ดีกว่าสำหรับ Emacs ระยะไกล
แม้ผมจะไปคอมเมนต์ใน issue ที่ปิดไปแล้ว แต่ถึงอย่างไรก็ถูกปิดด้วยเหตุผล “won’t do” และคอมเมนต์ของผมก็ถูกมองข้าม ผมไม่อยากเปิด issue ใหม่ด้วยเรื่องเดิมที่ถูกปฏิเสธไปแล้ว
https://github.com/wez/wezterm/issues/4706
คีย์ผสมอย่าง
C-S-"ไม่มีวิธีที่ดีในการส่ง เพราะโปรโตคอลเทอร์มินัลไม่รองรับ ดังนั้นจึงให้ WezTerm ส่ง" c s '"แทน แล้วเพิ่ม binding ใน Emacs ด้วยเทคนิค F12 นี้ จึงส่งคีย์ผสมที่ค่อนข้างซับซ้อนซึ่งโปรโตคอลเทอร์มินัลไม่รองรับได้เดิมทีผมติดตั้ง WezTerm ตอนย้ายจาก Kubuntu ไป Ubuntu เพราะอยากใช้ฟีเจอร์บางอย่างของ Konsole เช่น scrollback แบบไม่จำกัด และการค้นหาใน scrollback โดยไม่ต้องติดตั้ง Konsole
รู้ว่าใน Gnome ก็ติดตั้ง Konsole ได้ แต่รู้สึกว่ามันไม่ค่อยเข้ากันเท่าไร WezTerm ถูกใจทันที แต่พออ่านบทความนี้ก็รู้ว่าความสามารถในการตั้งค่ายังเป็นแค่ระดับแตะผิวเผินเท่านั้น
ข้อบ่นเดียวคือฟีเจอร์หลายอย่างค้นเจอได้ไม่ง่าย เอกสารดีมากจริง ๆ และผู้เขียนก็แอ็กทีฟและเป็นมิตร แต่ยกตัวอย่าง ผมเคยหาวิธีเลือกบล็อกข้อความขนาดใหญ่ด้วยคีย์บอร์ดอย่างเดียว ลองทำครั้งหนึ่งแล้วคิดว่า “ต้องจำอันนี้ไว้!” แต่ก็ลืมทันที ตอนนี้เลยกลับไปเลือกด้วยเมาส์เหมือนมือใหม่เต็มตัว เพราะมันไม่ใช่สิ่งที่ทำบ่อยอยู่แล้ว และเร็วกว่าไปกูเกิลหาหน้าเอกสารนั้นใหม่
หน้าที่พูดถึงคือ https://wezfurlong.org/wezterm/copymode.html และแม้ดูจากชื่อเหมือนจะเป็นสิ่งที่หาอยู่ แต่ไม่ใช่ฟีเจอร์อีกอย่างที่ต่างกันโดยสิ้นเชิงอย่าง https://wezfurlong.org/wezterm/quickselect.html อันนั้นก็มีประโยชน์มากและเป็นไอเดียที่ดี แต่ไม่ใช่สิ่งที่ผมหาอยู่
https://github.com/bbkane/dotfiles/tree/master/wezterm
แค่ค่าเริ่มต้นก็มีประโยชน์แล้ว แต่จุดแข็งจริง ๆ คือปรับแต่ง regex ที่จะใช้ match ได้ ผมเพิ่ม regex ตัวหนึ่งสำหรับหาไฟล์เนมทั้งหมดในผลลัพธ์ของ
eza --iconsโดย\p{Co}จะ match กับไอคอน ดังนั้นหลังจากตั้ง alias ให้lsเป็นezaแล้ว ก็สามารถกด shift+ตัวอักษร QuickSelect เพื่อป้อนไฟล์เนมไหนก็ได้ทันทีผมยังหาวิธีนั้นไม่เจอ เลยมักเปิดเซสชัน Konsole ไว้คู่กันบ่อย ๆ เวลาตามดู log แบบ tail ฟีเจอร์สองอย่างนี้ทรงพลังจริง ๆ
ลองใช้ Mac Terminal, iTerm2, Kitty, Warp ฯลฯ มาแล้ว สุดท้ายก็มาลงเอยที่ WezTerm
ตั้งค่าง่าย เร็ว และดูดี ผมทำธีมไว้ธีมหนึ่งด้วย
https://tiniri.vlad.studio/
ผมบังเอิญเจอเว็บนี้ตอนจะเทียบเทอร์มินัลหลายตัว: https://terminaltrove.com/terminals/
ดูค่อนข้างมีประโยชน์สำหรับคนที่อยากเปรียบเทียบเทอร์มินัล
ใช้ WezTerm มาประมาณ 1 ปี และสนับสนุน Wez บน GitHub อยู่ เป็นเทอร์มินัลที่ยอดเยี่ยม และเขาก็เป็นนักพัฒนาที่ดี
บทความนี้บอกว่าจะไม่พูดถึง แต่หนึ่งในฟีเจอร์ที่ผมชอบที่สุดคือ Quick Copy และโหมดคัดลอกอื่น ๆ ใช้ตลอดจริง ๆ แค่กด
C-S-Spaceแล้วพิมพ์ตัวอักษรที่แสดงข้างรายการที่อยากคัดลอกกรณีใช้งานใหญ่ ๆ คือใช้ฟีเจอร์คล้าย mosh+tmux จากแล็ปท็อป macOS ไปยังเครื่อง Linux ของบริษัท ผมเปิดเซสชันไว้ตลอดและทำงานบนเครื่องบริษัทจาก Mac ได้ มีเซสชันที่เชื่อมต่อใหม่ได้ พร้อม pane และ tab ทำให้ทำงานได้แม้ออกจากโต๊ะไปแล้ว และคุณภาพดีมาก
รู้สึกว่า WezTerm แทบไม่มีอะไรที่ไม่น่าชอบเลย
ฟีเจอร์ที่ผมชอบที่สุดแต่คนมักมองข้ามคือ การรองรับข้าม OS อย่างสมบูรณ์ สำหรับสภาพแวดล้อมแบบผมที่ใช้ทั้ง Linux, macOS และ Windows แค่เรียนรู้ WezTerm ตัวเดียวก็จบ การตั้งค่าเทอร์มินัลส่วนใหญ่ของผมก็แชร์ข้ามระบบปฏิบัติการด้วย
อาจเป็นปัญหาเฉพาะของผมหรือเกิดจากวิธีที่ใช้ tmux ก็ได้ แต่เวลาคัดลอกตอนที่บรรทัดถูก wrap อยู่ ดูเหมือนข้อความที่คัดลอกมาจะมีอักขระขึ้นบรรทัดใหม่ติดมาด้วย มันกวนใจมาก และผมมองว่าเป็นผลจากปฏิสัมพันธ์ระหว่าง WezTerm กับ tmux
ผมไม่มีหลักฐานพอจะเขียนบั๊กรีพอร์ตดี ๆ ได้ และ WezTerm ก็มีเซิร์ฟเวอร์ terminal multiplexing ของตัวเองที่เรียกว่า “ssh domains” อยู่แล้ว จึงอาจไม่สำคัญพอให้แก้ แต่ผมก็ไม่อยากติดตั้งเซิร์ฟเวอร์ multiplexing ของ WezTerm ไปทุกที่ และเครื่องที่ผม SSH เข้าไปส่วนใหญ่ก็มี tmux อยู่แล้ว
นอกเหนือจากนั้น WezTerm ยอดเยี่ยมมาก
ตัวเลือกการตั้งค่าบน macOS มีจำกัดและต้องใช้ทางอ้อมหลายอย่าง จะปรับ Linux ให้เข้ากับ macOS ก็ได้ แต่โดยตัวปุ่มลัดของ macOS เองผมก็ไม่ค่อยชอบอยู่แล้ว สุดท้ายเลยกลายเป็นสถานะผสมแปลก ๆ และทุกครั้งที่สลับเครื่องก็เผลอกดปุ่มผิดอยู่เรื่อย
อยากรู้ว่ามีใครเจอการตั้งค่าที่ลงตัวบ้างไหม
ผมไม่รู้สาเหตุและไม่รู้จะวินิจฉัยอย่างไร ข้อสันนิษฐานเดียวคือ scrollback ที่มีขนาดใหญ่ แต่ผมยอมเสียสิ่งนั้นไม่ได้ สุดท้ายจึงย้ายไป Kitty และแม้ Kitty ก็มีปัญหาของมันเอง แต่อย่างน้อยมันก็ใช้งานได้
ภาษา Lua สำหรับตั้งค่า เปล่งประกาย เพราะทำให้การเปลี่ยนแปลงตามแต่ละสภาพแวดล้อมทำได้ค่อนข้างง่าย ผมยังคิดว่ามีผลข้างเคียงที่ถูกประเมินค่าต่ำของ Rust อยู่ด้วย เครื่องมือ Rust สมัยใหม่มักรองรับข้ามแพลตฟอร์มได้ดีมาก อาจเพราะมีชั้น abstraction ระหว่างภาษาและระบบปฏิบัติการที่ดี
ราวปี 2019 แค่ได้ลองเปรียบเทียบ repo ของ wez กับตัวอื่น ๆ ในแง่ GitHub Actions, issue และเอกสาร ก็โน้มน้าวผมได้พอแล้ว และตั้งแต่นั้นก็ไม่เคยกลับไปใช้ตัวเดิมอีก มันยังรองรับฟีเจอร์ tab มาเป็นค่าเริ่มต้นด้วย
เป็นเทอร์มินัลตัวแรกที่แทนที่ urxvt ได้จริงทั้งด้านการรองรับและความเร็ว ก่อนหน้านั้นผมใช้ termite และยังเก็บ urxvt ไว้เป็นตัวสำรอง เผื่อ termite มีบั๊กในสถานการณ์แปลก ๆ
เหตุผลที่ผมยังอยู่กับ iTerm2 คือ
Edit->Selection Respects Soft Boundariesเป็นฟีเจอร์ที่ว่า “เมื่อเปิดใช้ จะตีความเส้นแนวตั้งของอักขระ pipe
|เหมือนเส้นแบ่ง pane ใน vim หรือ emacs และ selection จะ wrap ที่จุดนั้น”ในกรณีของผม จำเป็นเวลาจะเลือกข้อความใน IRC
https://github.com/wez/wezterm/issues/596
ไม่มีใครต้องการทุกฟีเจอร์ทั้งหมด แต่แต่ละคนมีฟีเจอร์เฉพาะทางที่ตัวเองอยากได้ 10 อย่าง และ 10 อย่างนั้นก็ไม่เหมือนกัน ดังนั้นถ้าอยากได้ฟีเจอร์เฉพาะทาง 10 อย่าง ก็ต้องยอมรับความบวมพอง
แก้ไข: พูดห้วนไปหน่อย ขอโทษครับ ผมพลาดส่วนที่บอกว่าใช้ใน IRC
ผมเป็นผู้ใช้ iTerm2 มาตั้งแต่เริ่มใช้ macOS ครั้งแรกเมื่อเกือบ 10 ปีก่อน
แต่ช่วงหลังรู้สึกว่ามันช้าลงจริง ๆ และถึงจุดที่ทนไม่ไหวเมื่อต้องรอกว่า 1 วินาทีให้เทอร์มินัลโผล่ขึ้นมาหลังสลับด้วย
cmd-tabผมลองดูทางเลือกอยู่หลายตัว แต่ไม่มีตัวไหนพอดี บางเทอร์มินัลต้องมีบัญชี/ล็อกอินถึงจะใช้งานได้ ซึ่งเป็นข้อเสียใหญ่ ส่วนอีกตัวเขียนด้วย {Java,Type}Script และด้วยลักษณะ asynchronous ของสตรีมใน Node.js แม้แต่คำสั่งง่าย ๆ อย่าง
yesก็พังจนถึงตอนนี้ผมชอบ WezTerm มาก มันค่อนข้างเร็ว ปรับแต่งได้สูง และมีธีม OneDark(base16) ที่ผมเคยตั้งไว้ใน iTerm2 มาให้เป็นค่าเริ่มต้น
ความไม่สะดวกเดียวในตอนแรกคือผมต้องเพิ่มการตั้งค่า
cmd-leftและcmd-rightเองใน config Lua ซึ่งน่าจะดีถ้ามีอยู่ในค่าเริ่มต้นWez ก็กำลังเขียนหนังสือ programming ระบบด้วย Rust อยู่ด้วย
https://leanpub.com/sysprog
เป็นบทความที่ดีจนผมอาจลองใช้ WezTerm ดู แต่เพิ่งย้ายมา Kitty เมื่อไม่นานมานี้ เลยไม่อยากเปลี่ยนบ่อยเกินไป
อย่างไรก็ตาม ต้องแก้ความเข้าใจเกี่ยวกับ Kitty หน่อย Kitty ไม่ได้ใช้ YAML หรือ TOML แต่ใช้ DSL สำหรับตั้งค่าแบบเรียบง่ายของตัวเอง และนอกเหนือจากนั้นก็สามารถ สคริปต์ได้เต็มรูปแบบด้วย Python