4 คะแนน โดย GN⁺ 2024-08-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ผู้ใช้ที่ใช้ 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 ความคิดเห็น

 
GN⁺ 2024-08-13
ความคิดเห็นจาก Hacker News
  • เพิ่งย้ายมาใช้ WezTerm และพอใจมาก
    ก่อนหน้านี้ใช้ kitty และตอนย้ายมาจาก iTerm2 ก็ชอบเรื่องการตั้งค่าและความเรียบง่าย แต่ในแง่ฟีเจอร์ที่มีมาให้ WezTerm ดีกว่ามาก การตั้งค่าเทอร์มินัลก็สั้นพอจะอยู่ในหน้าจอเดียวของเอดิเตอร์ได้ และหลังจากนั้นเทอร์มินัลก็ไม่มากวนใจอีก เลยไม่ต้องคอยคิดถึงมัน
    จุดชี้ขาดที่ทำให้เลิกใช้ kitty คือทุกครั้งที่เจอปัญหาหรือพยายามทำฟีเจอร์ของ iTerm2 ให้เหมือนเดิม ก็มักจะเห็นคำตอบสั้น ๆ และดูเหมือนดูแคลนจาก maintainer
    เช่น จำได้ว่ามีคำถามว่า “จะตั้งค่า tmux ใน kitty อย่างไร?” แล้วตอบประมาณว่า “อย่าทำ tmux มันโง่” แล้วก็ปิดประเด็นไป สุดท้ายเลยถอดใจ

    • ผมก็ย้ายจาก Kitty มา WezTerm เพราะคำตอบแบบนั้นของ maintainer เหมือนกัน
      แน่นอนว่าเป็นโปรเจกต์ของเขาเองและเขาเป็นโปรแกรมเมอร์ที่เก่งมาก แต่ถ้ามีความถ่อมตัวสักหน่อยก็คงไม่เสียหาย
    • สงสัยว่า WezTerm รองรับฟีเจอร์ที่เทียบเท่า hotkey window ของ iTerm หรือไม่
      สำหรับคนที่ไม่คุ้น มันคือหน้าต่างที่ใช้คีย์ลัดเฉพาะเพื่อสลับแสดง/ซ่อน และเมื่อแสดงก็จะลอยอยู่เหนือหน้าต่างทั้งหมด ทำให้เรียกใช้เทอร์มินัลได้ทันทีจากทุกที่ ถึงไม่มีมันก็อยู่ได้ แต่เป็นฟีเจอร์ที่ไม่อยากยอมเสียไปโดยไม่จำเป็น ดังนั้นแม้ฟีเจอร์อื่น ๆ ของ WezTerm จะดีแค่ไหน ถ้าไม่มีอันนี้ สำหรับผมก็หมดสิทธิ์ตั้งแต่เริ่ม
    • ยิ่งอายุมากขึ้น ยิ่งรู้สึกว่า maintainer ที่ยึดความคิดตัวเองมากเกินไปและดูแคลนผู้อื่น เป็นสัญญาณเตือนใหญ่ที่สุดว่าควรหลีกเลี่ยงโปรเจกต์นั้น
      ภายนอกมักดูเหมือนเป็นผลิตภัณฑ์ที่ดีที่สุด แต่พอเริ่มใช้ลึก ๆ แล้ว จะติดอยู่กับทางเลือกของคนนั้นและไม่มีทางถอยกลับ
    • ผมไม่ได้มองว่า maintainer ของ Kitty มีปัญหาร้ายแรงอะไรเป็นพิเศษ นอกจากค่อนข้างปากคมไปบ้าง และ maintainer ก็ไม่ได้มีหน้าที่ต้องมาเป็นเพื่อนกับผู้ใช้
      แต่ตอนเริ่มใช้ WezTerm เมื่อต้นปีนี้ ผมประหลาดใจจริง ๆ ได้อ่านงานเขียนของ Wez หลายชิ้น และทุกครั้งน้ำเสียงก็สมบูรณ์แบบ รู้สึกว่ายอดเยี่ยมมาก
    • นักพัฒนา kitty ดูเหมือนเชื่อว่าตัวเองรู้ดีกว่าทุกคนว่าควรใช้เทอร์มินัลอย่างไร และมองว่ามุมมองของคนอื่นผิดโดยพื้นฐาน
      สิ่งที่เป็นสัญลักษณ์คือ แม้แต่ UI เก่าแก่ของ Linux อย่าง make menuconfig ก็ยังเรนเดอร์ไม่ได้ถูกต้อง และแก้ด้วยการตั้งค่าไม่ได้ เพราะตัวเขาไม่เชื่อในการตั้งค่า พออ่าน issue tracker ก็ไม่ใช่แค่รู้สึกถูกดูถูกเท่านั้น แต่ยังทำให้เกิดความรู้สึกเหมือนต้อง “ปกป้อง” วิธีใช้เทอร์มินัลแบบสุ่ม ๆ ด้วยความรุนแรงเท่ากัน ซึ่งไม่ดีต่อสุขภาพใจ
      ไม่อาจรู้แน่ชัด แต่ถึงแม้ผมจะเห็นตรงกับเขาในทุกเรื่องเกี่ยวกับเทอร์มินัล ผมก็คงยังรู้สึกเหมือนเดิมว่าแทนที่จะใช้เทอร์มินัลของเขา ผมไปทำเทอร์มินัลเองดีกว่า
  • จากประสบการณ์ของผม Wez ตอบสนองต่อ GitHub issue ได้เร็วอย่างน่าทึ่ง และถ้าเป็นจุดที่ผิดจริง ๆ ก็มักแก้ให้ภายในหนึ่งหรือสองวัน
    นอกจากข้อตำหนิเล็ก ๆ หนึ่งสองอย่างเกี่ยวกับ modifier key ผ่าน SSH แล้ว ฟีเจอร์ต่าง ๆ แทบจะตรงกับความต้องการของผมอย่างสมบูรณ์ แถมยังเร็วด้วย เมื่อก่อนผมเป็นแฟนตัวยงของ Alacritty แต่ต้องการการรองรับ modifier ที่ดีกว่าสำหรับ Emacs ระยะไกล

    • ผมก็เปิด issue ไว้เหมือนกัน (https://github.com/wez/wezterm/issues/4917) ไม่เพียงได้รับคำตอบ แต่ยังตอบคำถามข้างเคียงด้วย และ PR แก้ไขสองอันที่ผมทำก็ถูก merge เร็วมากจริง ๆ
    • ประสบการณ์ของผมไม่ได้เป็นบวกขนาดนั้น
      แม้ผมจะไปคอมเมนต์ใน issue ที่ปิดไปแล้ว แต่ถึงอย่างไรก็ถูกปิดด้วยเหตุผล “won’t do” และคอมเมนต์ของผมก็ถูกมองข้าม ผมไม่อยากเปิด issue ใหม่ด้วยเรื่องเดิมที่ถูกปฏิเสธไปแล้ว
      https://github.com/wez/wezterm/issues/4706
    • เกี่ยวกับ Emacs ระยะไกล WezTerm สามารถ ดักจับและกำหนดใหม่ให้กับคีย์ผสมได้อย่างสมบูรณ์
      คีย์ผสมอย่าง 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 อันนั้นก็มีประโยชน์มากและเป็นไอเดียที่ดี แต่ไม่ใช่สิ่งที่ผมหาอยู่

    • ผมใส่การตั้งค่า WezTerm ไว้ใน repo dotfiles และจดโน้ตแบบนี้ไว้ใน README เพื่อให้หาได้ง่ายในภายหลัง
      https://github.com/bbkane/dotfiles/tree/master/wezterm
    • โหมด QuickSelect นี่สุดยอดจริง ๆ
      แค่ค่าเริ่มต้นก็มีประโยชน์แล้ว แต่จุดแข็งจริง ๆ คือปรับแต่ง regex ที่จะใช้ match ได้ ผมเพิ่ม regex ตัวหนึ่งสำหรับหาไฟล์เนมทั้งหมดในผลลัพธ์ของ eza --icons โดย \p{Co} จะ match กับไอคอน ดังนั้นหลังจากตั้ง alias ให้ ls เป็น eza แล้ว ก็สามารถกด shift+ตัวอักษร QuickSelect เพื่อป้อนไฟล์เนมไหนก็ได้ทันที
    • อยากรู้ว่าหมายความว่ามีวิธีทำ scrollback แบบไม่จำกัดและค้นหา scrollback แบบเรียลไทม์ ใน WezTerm ได้เหมือน Konsole หรือเปล่า
      ผมยังหาวิธีนั้นไม่เจอ เลยมักเปิดเซสชัน Konsole ไว้คู่กันบ่อย ๆ เวลาตามดู log แบบ tail ฟีเจอร์สองอย่างนี้ทรงพลังจริง ๆ
    • อยากรู้ว่าทำไมถึงย้ายออกจาก Kubuntu พอดีกำลังคิดจะติดตั้ง เลยถามดู
  • ลองใช้ Mac Terminal, iTerm2, Kitty, Warp ฯลฯ มาแล้ว สุดท้ายก็มาลงเอยที่ WezTerm
    ตั้งค่าง่าย เร็ว และดูดี ผมทำธีมไว้ธีมหนึ่งด้วย
    https://tiniri.vlad.studio/

    • ผมก็ลองเทอร์มินัลพวกนี้มาเหมือนกัน แต่สุดท้ายอยู่กับ WezTerm และตอนนี้มันเป็นหนึ่งในเทอร์มินัลที่ชอบที่สุด
      ผมบังเอิญเจอเว็บนี้ตอนจะเทียบเทอร์มินัลหลายตัว: https://terminaltrove.com/terminals/
      ดูค่อนข้างมีประโยชน์สำหรับคนที่อยากเปรียบเทียบเทอร์มินัล
    • ธีมนี้ดีมาก อยากรู้ว่ามีวิธีใช้กับ JetBrains editor ไหม
    • ชอบธีม Vlad แบบสว่าง เลยติดตั้งแล้ว
    • ธีมสีดีมากจริง ๆ ถ้ามีสำหรับ Konsole กับ Sublime Text ด้วยก็คงดี
  • ใช้ WezTerm มาประมาณ 1 ปี และสนับสนุน Wez บน GitHub อยู่ เป็นเทอร์มินัลที่ยอดเยี่ยม และเขาก็เป็นนักพัฒนาที่ดี
    บทความนี้บอกว่าจะไม่พูดถึง แต่หนึ่งในฟีเจอร์ที่ผมชอบที่สุดคือ Quick Copy และโหมดคัดลอกอื่น ๆ ใช้ตลอดจริง ๆ แค่กด C-S-Space แล้วพิมพ์ตัวอักษรที่แสดงข้างรายการที่อยากคัดลอก
    กรณีใช้งานใหญ่ ๆ คือใช้ฟีเจอร์คล้าย mosh+tmux จากแล็ปท็อป macOS ไปยังเครื่อง Linux ของบริษัท ผมเปิดเซสชันไว้ตลอดและทำงานบนเครื่องบริษัทจาก Mac ได้ มีเซสชันที่เชื่อมต่อใหม่ได้ พร้อม pane และ tab ทำให้ทำงานได้แม้ออกจากโต๊ะไปแล้ว และคุณภาพดีมาก

    • ฟีเจอร์ที่เจ๋งมากอย่างหนึ่งของโหมด Quick Copy คือถ้าพิมพ์ตัวอักษรเป็น เวอร์ชันตัวพิมพ์ใหญ่ ค่านั้นจะถูกวางกลับเข้าไปในพรอมป์ต์เทอร์มินัลโดยอัตโนมัติ
    • เพิ่งรู้จัก QuickSelect ตอนนี้เอง และคิดว่าต่อไปคงได้ใช้เยอะ
  • รู้สึกว่า WezTerm แทบไม่มีอะไรที่ไม่น่าชอบเลย
    ฟีเจอร์ที่ผมชอบที่สุดแต่คนมักมองข้ามคือ การรองรับข้าม OS อย่างสมบูรณ์ สำหรับสภาพแวดล้อมแบบผมที่ใช้ทั้ง Linux, macOS และ Windows แค่เรียนรู้ WezTerm ตัวเดียวก็จบ การตั้งค่าเทอร์มินัลส่วนใหญ่ของผมก็แชร์ข้ามระบบปฏิบัติการด้วย

    • สิ่งหนึ่งที่ผมไม่ชอบใน WezTerm และเป็นเหตุผลที่เลิกใช้ คือเกี่ยวกับวิธี คัดลอกบรรทัดที่ถูกตัดบรรทัดลงคลิปบอร์ด
      อาจเป็นปัญหาเฉพาะของผมหรือเกิดจากวิธีที่ใช้ tmux ก็ได้ แต่เวลาคัดลอกตอนที่บรรทัดถูก wrap อยู่ ดูเหมือนข้อความที่คัดลอกมาจะมีอักขระขึ้นบรรทัดใหม่ติดมาด้วย มันกวนใจมาก และผมมองว่าเป็นผลจากปฏิสัมพันธ์ระหว่าง WezTerm กับ tmux
      ผมไม่มีหลักฐานพอจะเขียนบั๊กรีพอร์ตดี ๆ ได้ และ WezTerm ก็มีเซิร์ฟเวอร์ terminal multiplexing ของตัวเองที่เรียกว่า “ssh domains” อยู่แล้ว จึงอาจไม่สำคัญพอให้แก้ แต่ผมก็ไม่อยากติดตั้งเซิร์ฟเวอร์ multiplexing ของ WezTerm ไปทุกที่ และเครื่องที่ผม SSH เข้าไปส่วนใหญ่ก็มี tmux อยู่แล้ว
      นอกเหนือจากนั้น WezTerm ยอดเยี่ยมมาก
    • ความเจ็บปวดที่สุดเวลาเปลี่ยนไปมาระหว่าง MacBook ของบริษัทกับเครื่อง Linux ส่วนตัวคือ ปุ่มลัด
      ตัวเลือกการตั้งค่าบน 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

    • นี่แทบจะเป็น ปัญหาการบวมพองแบบ Microsoft Word
      ไม่มีใครต้องการทุกฟีเจอร์ทั้งหมด แต่แต่ละคนมีฟีเจอร์เฉพาะทางที่ตัวเองอยากได้ 10 อย่าง และ 10 อย่างนั้นก็ไม่เหมือนกัน ดังนั้นถ้าอยากได้ฟีเจอร์เฉพาะทาง 10 อย่าง ก็ต้องยอมรับความบวมพอง
    • ฟีเจอร์นี้ดูยอดเยี่ยมมาก อยากรู้ว่ามีเทอร์มินัลบน Linux ตัวไหนรองรับไหม
    • zellij รองรับสิ่งนี้เป็นค่าเริ่มต้นถ้าเทอร์มินัลรองรับฟีเจอร์ OSC ที่เหมาะสม เทอร์มินัลในเธรดนี้น่าจะรองรับ
      แก้ไข: พูดห้วนไปหน่อย ขอโทษครับ ผมพลาดส่วนที่บอกว่าใช้ใน IRC
    • ถ้าได้เห็นของจริง ผมเห็นด้วย 100% ว่านี่เป็น ฟีเจอร์ UI/UX ที่ยอดเยี่ยม
    • ผมใช้ iTerm มาหลายปีแล้วแต่ไม่รู้จักการตั้งค่านี้เลย เป็นฟีเจอร์ชี้ขาดสำหรับการใช้งาน Emacs ของผม
  • ผมเป็นผู้ใช้ iTerm2 มาตั้งแต่เริ่มใช้ macOS ครั้งแรกเมื่อเกือบ 10 ปีก่อน
    แต่ช่วงหลังรู้สึกว่ามันช้าลงจริง ๆ และถึงจุดที่ทนไม่ไหวเมื่อต้องรอกว่า 1 วินาทีให้เทอร์มินัลโผล่ขึ้นมาหลังสลับด้วย cmd-tab
    ผมลองดูทางเลือกอยู่หลายตัว แต่ไม่มีตัวไหนพอดี บางเทอร์มินัลต้องมีบัญชี/ล็อกอินถึงจะใช้งานได้ ซึ่งเป็นข้อเสียใหญ่ ส่วนอีกตัวเขียนด้วย {Java,Type}Script และด้วยลักษณะ asynchronous ของสตรีมใน Node.js แม้แต่คำสั่งง่าย ๆ อย่าง yes ก็พัง
    จนถึงตอนนี้ผมชอบ WezTerm มาก มันค่อนข้างเร็ว ปรับแต่งได้สูง และมีธีม OneDark(base16) ที่ผมเคยตั้งไว้ใน iTerm2 มาให้เป็นค่าเริ่มต้น
    ความไม่สะดวกเดียวในตอนแรกคือผมต้องเพิ่มการตั้งค่า cmd-left และ cmd-right เองใน config Lua ซึ่งน่าจะดีถ้ามีอยู่ในค่าเริ่มต้น

    • หมายถึงตัวที่ต้องมีบัญชี/ล็อกอินคือ Warp และตัวที่เขียนด้วย {Java,Type}Script คือ Tabby หรือ extraterm ใช่ไหม?
  • Wez ก็กำลังเขียนหนังสือ programming ระบบด้วย Rust อยู่ด้วย
    https://leanpub.com/sysprog

  • เป็นบทความที่ดีจนผมอาจลองใช้ WezTerm ดู แต่เพิ่งย้ายมา Kitty เมื่อไม่นานมานี้ เลยไม่อยากเปลี่ยนบ่อยเกินไป
    อย่างไรก็ตาม ต้องแก้ความเข้าใจเกี่ยวกับ Kitty หน่อย Kitty ไม่ได้ใช้ YAML หรือ TOML แต่ใช้ DSL สำหรับตั้งค่าแบบเรียบง่ายของตัวเอง และนอกเหนือจากนั้นก็สามารถ สคริปต์ได้เต็มรูปแบบด้วย Python

    • ผมก็คล้ายกัน เลยแค่บุ๊กมาร์กไว้ก่อน