- Pengguna lama iTerm 2 mencoba lagi WezTerm untuk konfigurasi berbasis teks dan berbagi dotfiles, lalu menyesuaikan tampilan, keybinding, multiplexing, dan workspace secara detail dengan API konfigurasi Lua
- Konfigurasi ditempatkan di
wezterm.lua dan hot reload segera setelah disimpan; log dan Lua REPL bisa langsung dilihat dari overlay debug CTRL + SHIFT + L
- Dengan konfigurasi Lua, lebih dari 1.000 skema warna bawaan, integrasi mode gelap/terang sistem, font, dekorasi jendela macOS, dan status bar bergaya powerline dapat disusun secara dinamis
- Keybinding bawaan bisa dipertahankan atau dimatikan, dan penulis mendefinisikan sendiri perpindahan kata dengan
Option + Arrow, membuka konfigurasi dengan CMD +,, serta manipulasi pane berbasis leader key dan key table
- Multiplexing bawaan dan workspaces mempertahankan status jendela, pane, dan tab per proyek seperti session tmux, serta memungkinkan pembuatan UI pemilihan proyek dan alur perpindahan dengan Lua
Alasan Mencoba Beralih dari iTerm 2 ke WezTerm
- Saya sudah memakai iTerm 2 hampir 10 tahun, tetapi menginginkan terminal yang seluruh konfigurasinya bisa dikelola sebagai teks, dimasukkan ke dotfiles, lalu dibagikan ke mesin kerja dan pribadi
- Keunggulan WezTerm adalah API yang kuat dan Lua config; pada percobaan kedua, saya bisa membuat konfigurasi terminal yang lebih enak dilihat dan fungsional
- Cakupan yang dibahas meliputi tampilan, keybinding, multiplexing, perpindahan workspace, status bar, dan pengaturan tema dinamis
- Ada juga fitur yang tidak dibahas dalam tulisan ini
- Aturan highlight hyperlink kustom
- Scrollback yang bisa dicari
- Quick copy mode
- Dukungan gambar
- Contoh konfigurasi disesuaikan dengan pengalaman penggunaan macOS; belum diuji di sistem lain, tetapi WezTerm sendiri berjalan di berbagai lingkungan
- Contoh konfigurasi final tersedia sebagai gist
Instalasi dan Struktur Dasar Konfigurasi Lua
brew install wezterm
- Alur yang digunakan adalah menaruh file konfigurasi di
$XDG_CONFIG_HOME/wezterm/wezterm.lua
- Di sebagian besar sistem, termasuk macOS, ini diartikan sebagai
~/.config/wezterm/wezterm.lua
- Menggunakan direktori, alih-alih satu file
~/.wezterm.lua, memudahkan pengelolaan konfigurasi yang dipecah ke beberapa file
local wezterm = require 'wezterm'
local config = wezterm.config_builder()
return config
- Karena konfigurasi WezTerm ditulis dengan Lua, konfigurasi dinamis yang kompleks lebih mudah dibuat dibanding YAML atau TOML
- Lua adalah bahasa pemrograman sehingga lebih sulit dipelajari daripada YAML/TOML, tetapi jika punya pengalaman dengan bahasa dinamis seperti Ruby, Python, atau JavaScript, kode contohnya akan mudah dibaca
- Untuk materi belajar Lua, bisa merujuk ke Getting Started guide
Hot Reload dan Overlay Debug
- WezTerm mendeteksi perubahan file konfigurasi dan melakukan reload otomatis, sehingga efek konfigurasi bisa langsung dilihat tanpa me-restart terminal
- Jika menyimpan konfigurasi yang berisi error, misalnya nama fungsi yang salah, popup error runtime akan langsung muncul
wezterm.config_builderZ()
- Log bisa ditinggalkan dengan
wezterm.log_info()
wezterm.log_info("hello world! my name is " .. wezterm.hostname())
- Dengan
CTRL + SHIFT + L, debug overlay dapat dibuka untuk melihat log dan Lua REPL
- Ekspresi Lua seperti
1 + 1 bisa dijalankan
- Nilai modul
wezterm seperti wezterm.home_dir juga bisa diperiksa
- Menggunakan hot reload bersama debug overlay memperpendek feedback loop saat mengubah dan memeriksa konfigurasi
Pengaturan Tampilan: Warna, Tema Sistem, Font, Gaya Jendela
-
Skema Warna dan Pengaturan Dinamis
- WezTerm menyediakan lebih dari 1.000 skema warna bawaan, yang dipilih dengan
config.color_scheme
config.color_scheme = 'Tokyo Night'
- Daftar skema warna dapat dilihat di WezTerm colorschemes
- Dengan event
window-config-reloaded dan wezterm.color.get_builtin_schemes(), pengaturan dinamis yang menerapkan skema warna acak untuk setiap jendela baru juga bisa dibuat
- Setelah menetapkan config override per jendela, hot reload mungkin tidak langsung diterapkan saat kembali ke skema warna statis
- Override bisa dihapus dengan menjalankan
window:set_config_overrides({}) di terminal debug, atau dengan menutup lalu membuka kembali jendela
-
Integrasi Mode Gelap/Terang Sistem
- Konfigurasi bisa dipisahkan ke modul
appearance.lua untuk mengganti skema warna sesuai tampilan sistem operasi
- Dari
wezterm.gui.get_appearance(), string "Dark" dicari untuk menentukan apakah sedang dalam mode gelap
- Di lingkungan tanpa
wezterm.gui, mode gelap diperlakukan sebagai default
if appearance.is_dark() then
config.color_scheme = 'Tokyo Night'
else
config.color_scheme = 'Tokyo Night Day'
end
-
Font dan Dekorasi Jendela
- Secara default, WezTerm menyertakan JetBrains Mono dan Nerd Font Symbols
- Contoh konfigurasi menggunakan Berkeley Mono 13pt
config.font = wezterm.font({ family = 'Berkeley Mono' })
config.font_size = 13
- Contoh gaya jendela macOS mencakup latar belakang semitransparan, blur, penghapusan title bar, dan pengaturan font tab bar
config.window_background_opacity = 0.9
config.macos_window_background_blur = 30
config.window_decorations = 'RESIZE'
Status Bar dan API Event WezTerm
- Dengan callback event
update-status, segmen berbentuk powerline ditambahkan ke status bar kanan
- Contoh awal menampilkan segmen hostname menggunakan warna latar dan warna depan dari skema warna saat ini serta
wezterm.hostname()
wezterm.on menghubungkan callback ke event terminal
update-status terjadi secara berkala saat update status siap dilakukan
- WezTerm memastikan hanya satu update yang berjalan pada satu waktu, dan akan menghentikan handler jika kodenya berjalan terlalu lama
- Dengan
window:effective_config().resolved_palette, palet saat ini yang sudah mencerminkan override bisa diambil
wezterm.format digunakan untuk menerapkan gaya seperti warna, bold, dan underline pada string
- Pada contoh bagian akhir, segmen status bar ditambah lagi
- Workspace saat ini
- Tanggal dan waktu
- Hostname
wezterm.color.parse, color:lighten, color:darken, dan wezterm.color.gradient digunakan untuk menghitung warna gradien berbasis tema saat ini
Keybinding: Perpindahan Kata macOS dan Membuka Konfigurasi
- WezTerm menyediakan keybinding bawaan, dan contoh ini mempertahankannya
- Untuk mematikan keybinding bawaan,
config.disable_default_key_bindings = true dapat digunakan
- Di macOS, agar
Option + LeftArrow dan Option + RightArrow berpindah per kata seperti iTerm 2 dan Terminal.app, dikirimkan ESC + b dan ESC + f
{
key = 'LeftArrow',
mods = 'OPT',
action = wezterm.action.SendString '\x1bb',
}
- WezTerm dapat dikonfigurasi agar
CMD + , membuka file konfigurasi di tab baru
- Contohnya menggunakan
nvim dan wezterm.config_file
- Jika WezTerm dijalankan dari Finder macOS, binary editor mungkin tidak ada di
PATH, sehingga eksekusi perintah bisa gagal
- Dengan
config.set_environment_variables, variabel lingkungan default dapat dilengkapi sehingga environment yang sama juga diteruskan ke perintah spawn berikutnya
config.set_environment_variables = {
PATH = '/opt/homebrew/bin:' .. os.getenv('PATH')
}
Multiplexing Bawaan dan Leader Key
- Multiplexing bawaan WezTerm adalah fitur yang bisa digunakan sebagai pengganti tmux
- Fitur bawaan ini menyediakan scrollback buffer per pane, kontrol mouse yang lebih baik, seleksi yang lebih mudah, dan umumnya performa yang lebih cepat
- Dengan
CTRL + SHIFT + P, command palette dapat dibuka dan perintah seperti “Shell: Split Horizontally” dan “Shell: Split Vertically” dapat dijalankan
- Shortcut split bawaan dibuat cukup kompleks untuk menghindari konflik, sehingga leader key bisa digunakan untuk membuat kombinasi yang lebih sederhana
config.leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1000 }
- Contohnya bergaya tmux: setelah leader, tekan
" untuk split horizontal dan % untuk split vertikal
{
key = '"',
mods = 'LEADER',
action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
}
- Saat ingin mengirim
CTRL + A itu sendiri ke terminal, kombinasi LEADER|CTRL dipetakan agar mengirim kembali CTRL + A
Perpindahan Pane, Resize, dan Key Table
- Perpindahan pane memetakan tombol arah gaya vim, yaitu
h, j, k, l, ke kombinasi leader
ActivatePaneDirection menjalankan perpindahan Down, Up, Left, Right
- Tabel Lua yang berulang dapat dipersingkat dengan fungsi
local function move_pane(key, direction)
return {
key = key,
mods = 'LEADER',
action = wezterm.action.ActivatePaneDirection(direction),
}
end
- Resize pane juga bisa dilakukan dengan mouse, tetapi contoh ini menggunakan key table untuk alur yang berfokus pada keyboard
- Key table adalah cara masuk ke mode tertentu dan memakai keybinding khusus untuk mode itu
- Mirip dengan leader key, tetapi dapat dibuat agar tidak langsung nonaktif setelah satu aksi
- Cocok untuk pekerjaan seperti resize yang membutuhkan penekanan tombol yang sama berulang kali
- Contohnya mengaktifkan key table
resize_panes dengan LEADER + r, lalu menyesuaikan ukuran pane sebanyak 3 sel dengan h/j/k/l
- Dengan
timeout_milliseconds = 1000, mode resize diatur keluar setelah 1 detik
- Pengguna Neovim dapat merujuk ke smart-splits.nvim, yang membantu perpindahan antara pane WezTerm dan pane vim
Konfigurasi Workspace per Proyek
- Saat menangani banyak proyek sekaligus, biasanya kita ingin mempertahankan status instance multiplexer, jendela, pane, dan tab yang terpisah untuk setiap proyek
- Tujuan yang mirip dengan session tmux ditangani di WezTerm dengan workspaces
- Struktur yang digunakan adalah membuat
projects.lua lalu memanggil fungsi pemilihan proyek dari konfigurasi utama
- Contoh awal mencantumkan path proyek secara manual dan menampilkan UI pilihan dengan
InputSelector
fuzzy = true mengaktifkan pencarian fuzzy
- Hasil pilihan awalnya hanya dicetak sebagai log di debug overlay
LEADER + p membuka UI pemilihan proyek, sedangkan LEADER + f menampilkan daftar workspace yang ada dengan pencarian fuzzy
action = wezterm.action.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES' }
- Ketidaknyamanan mengelola path proyek secara manual dikurangi dengan
wezterm.glob(), yang mengumpulkan subdirektori di bawah folder proyek secara otomatis
- Contohnya menggunakan subdirektori di bawah
~/Projects sebagai proyek, dan juga memasukkan direktori home ke daftar proyek
- Saat sebuah proyek dipilih,
SwitchToWorkspace dijalankan
- Jika workspace sudah ada, beralih ke sana
- Jika belum ada, membuat yang baru
- Nama workspace menggunakan segmen terakhir dari path
- Current working directory terminal baru diatur ke path proyek yang dipilih
Hal Lain yang Bisa Dicoba
- WezTerm memiliki lebih banyak fitur yang tercantum di daftar fitur
- Kemungkinan konfigurasi Lua bisa dipelajari lebih lanjut di WezTerm API docs
- Untuk konfigurasi yang dibuat secara bertahap, sebaiknya sisakan hanya bagian yang benar-benar akan dipakai, tulis ulang dengan gaya sendiri, lalu tambahkan fitur yang diperlukan
- Jika menyukai WezTerm, Anda juga bisa mendukung Wez yang mengerjakan proyek open source ini
1 komentar
Komentar Hacker News
Baru-baru ini pindah ke WezTerm dan sangat puas
Sebelumnya saya memakai kitty, dan saat beralih dari iTerm2 saya menyukai konfigurasi dan kesederhanaannya, tetapi dari sisi fitur bawaan WezTerm jauh lebih baik. Konfigurasi terminalnya juga cukup pendek hingga muat dalam satu layar editor, dan setelah itu terminalnya tidak mengganggu, jadi tidak perlu dipikirkan lagi
Faktor penentu yang membuat saya meninggalkan kitty adalah setiap kali menghadapi masalah atau mencoba mereplikasi fitur iTerm2, saya melihat jawaban maintainer yang singkat dan terkesan meremehkan
Misalnya, untuk pertanyaan “bagaimana mengatur tmux di kitty?”, seingat saya jawabannya seperti “jangan, tmux itu bodoh” lalu ditutup, jadi akhirnya saya menyerah
Tentu itu proyeknya sendiri dan dia programmer yang hebat, tetapi sedikit kerendahan hati sepertinya tidak ada salahnya
Untuk yang belum familiar, ini adalah jendela yang bisa di-toggle tampil/sembunyi dengan shortcut tertentu, dan saat tampil akan mengambang di atas semua jendela sehingga terminal bisa langsung dipakai dari mana saja. Bisa saja hidup tanpanya, tetapi saya tidak ingin sengaja melepaskan fitur ini; jadi meski fitur WezTerm lain bagus, tanpa ini bagi saya sudah gugur sejak awal
Dari luar sering terlihat seperti produk terbaik, tetapi begitu mulai dipakai secara mendalam, kita terjebak dalam pilihan orang itu dan tidak punya tempat kembali
Namun ketika mulai memakai WezTerm awal tahun ini, saya benar-benar terkejut. Saya banyak membaca tulisan Wez, dan setiap kali nadanya sempurna; rasanya benar-benar luar biasa
Bahkan UI lama
make menuconfigdi Linux saja tidak bisa dirender dengan benar, dan tidak bisa diperbaiki lewat konfigurasi karena ia tidak percaya pada konfigurasi—itu cukup simbolis. Membaca issue tracker-nya bukan hanya terasa menghina, tetapi juga membuat saya merasa harus “membela” cara penggunaan terminal acak dengan sama kerasnya, dan itu tidak sehatTidak bisa tahu pasti, tetapi bahkan seandainya saya sepakat dengannya dalam semua hal tentang terminal, saya rasa saya tetap akan lebih memilih membuat terminal sendiri daripada memakai terminalnya
Berdasarkan pengalaman saya, Wez merespons issue GitHub dengan sangat cepat, dan jika memang ada yang salah biasanya diperbaiki dalam satu atau dua hari
Selain satu-dua keluhan kecil terkait modifier key melalui SSH, fiturnya hampir sempurna untuk kebutuhan saya, dan juga cepat. Dulu saya pengguna fanatik Alacritty, tetapi membutuhkan dukungan modifier yang lebih baik di Emacs jarak jauh
Memang saya berkomentar di issue yang sudah ditutup, tetapi bagaimanapun issue itu ditutup sebagai “won’t do” dan komentar saya diabaikan. Saya tidak ingin membuka issue baru untuk hal yang sama yang sudah ditolak
https://github.com/wez/wezterm/issues/4706
Kombinasi seperti
C-S-"tidak didukung oleh protokol terminal, jadi tidak ada cara yang bagus untuk mengirimnya. Karena itu saya membuat WezTerm mengirim" c s '"sebagai gantinya dan menambahkan binding tambahan di Emacs. Berkat trik F12 ini, saya bisa mengirim kombinasi yang cukup rumit yang tidak bisa didukung protokol terminalAwalnya saya memasang WezTerm saat pindah dari Kubuntu ke Ubuntu karena ingin memakai sebagian fitur Konsole, misalnya scrollback tak terbatas dan pencarian scrollback, tanpa harus memasang Konsole
Saya tahu Konsole juga bisa dipasang di Gnome, tetapi rasanya kurang pas. WezTerm langsung terasa cocok, tetapi setelah membaca tulisan ini saya jadi sadar bahwa soal kemungkinan konfigurasi, saya baru menyentuh permukaannya saja
Satu-satunya keluhan saya adalah banyak fiturnya sulit ditemukan. Dokumentasinya benar-benar bagus dan penulisnya juga aktif serta ramah, tetapi misalnya saya pernah mencari cara memilih blok teks besar hanya dengan keyboard, mencobanya sekali, lalu berpikir “ini harus diingat!”, namun langsung lupa; sekarang saya kembali memilih dengan mouse seperti pemula total. Karena itu bukan hal yang sering saya lakukan, cara itu lebih cepat daripada meng-google lagi halaman dokumentasinya
Sebagai referensi, halaman yang dimaksud adalah https://wezfurlong.org/wezterm/copymode.html, dan meski dari namanya tampak seperti yang dicari, itu bukan https://wezfurlong.org/wezterm/quickselect.html yang merupakan fitur yang sama sekali berbeda. Fitur itu juga sangat berguna dan idenya bagus, tetapi bukan yang saya cari
https://github.com/bbkane/dotfiles/tree/master/wezterm
Dalam kondisi bawaan saja sudah berguna, tetapi kekuatan sebenarnya ada pada kemampuan menyesuaikan regex yang akan dicocokkan. Saya menambahkan satu regex untuk menemukan semua nama file pada output
eza --icons, dan\p{Co}cocok dengan ikon. Jadi setelah membuat aliaslskeeza, saya bisa langsung menekan shift+huruf QuickSelect untuk memasukkan nama file apa punSaya belum menemukan caranya, jadi saya sering tetap membuka sesi Konsole juga. Saat melakukan tail pada log real-time, dua fitur ini benar-benar kuat
Setelah mencoba Mac Terminal, iTerm2, Kitty, Warp, dan lainnya, akhirnya saya menetap di WezTerm
Konfigurasinya mudah, cepat, dan tampilannya bagus. Saya juga membuat satu tema
https://tiniri.vlad.studio/
Saya kebetulan melihat situs ini saat ingin membandingkan beberapa terminal: https://terminaltrove.com/terminals/
Kelihatannya cukup berguna bagi orang yang ingin membandingkan terminal
Saya sudah memakai WezTerm sekitar 1 tahun dan mensponsori Wez di GitHub; ini terminal yang hebat dan dia pengembang yang baik
Meski tulisan ini bilang tidak membahasnya, salah satu fitur favorit saya adalah Quick Copy dan mode salin lainnya. Saya benar-benar memakainya terus. Cukup tekan
C-S-Spacelalu ketik huruf yang ditampilkan di samping item yang ingin disalinKasus penggunaan besar saya adalah memakai sesuatu yang mirip mosh+tmux dari laptop macOS ke mesin Linux kantor. Saya selalu membiarkan sesi tetap berjalan dan bisa bekerja di mesin kantor dari Mac. Ini menyediakan sesi yang bisa disambungkan ulang, lengkap dengan pane dan tab, sehingga saya tetap bisa bekerja meski sedang tidak di meja, dan kualitasnya sangat bagus
Rasanya sulit membayangkan apa yang tidak disukai dari WezTerm
Fitur yang paling saya sukai, tapi sering terlewatkan, adalah dukungan lintas-OS yang lengkap. Kalau lingkunganmu seperti saya, yang memakai Linux, macOS, dan Windows semuanya, cukup pelajari satu WezTerm dan selesai. Sebagian besar pengaturan terminal juga saya bagikan antar-sistem operasi
Mungkin ini hanya masalah saya atau karena cara saya memakai tmux, tetapi ketika menyalin baris dalam keadaan wrap, teks yang tersalin sepertinya ikut berisi line break. Sangat mengganggu, dan saya menganggapnya karena interaksi WezTerm dengan tmux
Saya tidak punya cukup bukti untuk membuat laporan bug yang baik, dan karena WezTerm punya server multiplexing terminal sendiri, “ssh domains”, mungkin ini tidak cukup penting untuk diperbaiki. Namun saya tidak ingin memasang server multiplexing WezTerm di mana-mana, dan di tempat-tempat yang saya akses lewat SSH biasanya tmux sudah ada
Selain itu, WezTerm luar biasa
Opsi pengaturan macOS terbatas dan butuh banyak workaround; Linux juga bisa disesuaikan agar mirip macOS, tetapi saya sendiri tidak terlalu suka shortcut macOS. Akhirnya jadinya campuran yang aneh, dan setiap kali berpindah saya terus menekan tombol yang salah
Penasaran apakah ada orang yang menemukan konfigurasi yang pas
Saya tidak tahu alasannya dan tidak tahu cara mendiagnosisnya. Scrollback besar adalah satu-satunya dugaan saya, tetapi itu tidak bisa saya korbankan. Akhirnya saya pindah ke Kitty, dan walaupun Kitty punya masalahnya sendiri, setidaknya ia bekerja
Bahasa konfigurasi Lua bersinar karena membuat perubahan per lingkungan cukup mudah. Saya juga merasa ada efek samping Rust yang sering diremehkan. Tooling Rust modern sering punya dukungan lintas-platform yang sangat baik, mungkin karena lapisan abstraksi antara bahasa dan sistem operasinya bagus
Sekitar 2019, hanya dengan membandingkan repo wez dengan yang lain dari sisi GitHub Actions, issue, dan dokumentasi sudah cukup meyakinkan saya, dan sejak itu saya tidak pernah kembali. Fitur tab bahkan didukung secara default
Ini terminal pertama yang benar-benar menggantikan urxvt bagi saya dari sisi dukungan dan kecepatan. Sebelumnya saya memakai termite, sambil tetap menyimpan urxvt sebagai cadangan untuk berjaga-jaga jika termite memunculkan bug dalam situasi aneh
Alasan saya tetap bertahan di iTerm2 adalah
Edit->Selection Respects Soft BoundariesFitur ini berarti, “jika diaktifkan, garis vertikal dari karakter pipe
|akan ditafsirkan seperti pemisah pane di vim atau emacs, dan area seleksi akan wrap di titik itu”Dalam kasus saya, ini diperlukan saat memilih teks di IRC
https://github.com/wez/wezterm/issues/596
Tidak ada orang yang membutuhkan semua fitur, tetapi masing-masing punya 10 fitur niche yang mereka inginkan, dan 10 fitur itu tidak sama satu sama lain. Jadi untuk mendapatkan 10 fitur niche itu, orang akhirnya menerima bloating
Edit: Maaf, tadi saya bicara agak kasar. Saya melewatkan bagian bahwa ini dipakai di IRC
Saya adalah pengguna iTerm2 sejak pertama kali mulai memakai macOS hampir 10 tahun lalu
Namun belakangan ini saya merasa ia benar-benar melambat, dan ketika harus menunggu lebih dari 1 detik sampai terminal muncul setelah berpindah dengan
cmd-tab, saya mencapai batasnyaSaya melihat beberapa alternatif, tetapi tidak ada yang benar-benar pas. Salah satu terminal perlu akun/login agar bisa berjalan, yang merupakan kekurangan besar, dan terminal lain ditulis dengan {Java,Type}Script sehingga karena sifat asinkron stream Node.js, perintah sederhana seperti
yespun rusakSejauh ini saya sangat menyukai WezTerm. Cukup cepat, sangat bisa dikonfigurasi, dan tema yang biasa saya atur di iTerm2, OneDark(base16), sudah tersedia secara default
Satu-satunya ketidaknyamanan awal yang saya alami adalah harus menambahkan sendiri konfigurasi
cmd-leftdancmd-rightke konfigurasi Lua; rasanya akan lebih baik jika itu ada di defaultWez juga menerbitkan buku pemrograman sistem Rust
https://leanpub.com/sysprog
Tulisan yang bagus, jadi mungkin saya akan mencoba WezTerm, tetapi saya baru saja pindah ke Kitty belakangan ini, jadi tidak ingin terlalu sering gonta-ganti
Namun perlu ada koreksi terkait Kitty. Kitty tidak memakai YAML atau TOML; ia memakai DSL konfigurasi sederhana miliknya sendiri, dan selain itu bisa di-script sepenuhnya dengan Python