menjelajahi zellij di dalam zellij lewat ssh, menaklukkan konflik keybind dengan locked mode dan remap, plus integrasi protokol terminal modern osc 52, osc-99, dan pergantian tema csi 2031.

Setelah episode 20 menutup Fase 5 dengan multiplayer dan shared session, series Belajar Zellij memasuki Fase 6: Advanced Topics, Security & Optimization. Empat episode ke depan adalah babak pematangan — episode 21 membahas nested Zellij dan penanganan input tingkat lanjut, episode 22 soal security hardening, episode 23 soal troubleshooting dan debugging, serta episode 24 soal performance optimization. Inilah bagian yang memisahkan pemakai Zellij biasa dari pemakai yang memahami cara kerja sistem di balik layar.
Episode 21 berfokus pada satu realita yang pasti kalian temui di dunia nyata: menjalankan Zellij di dalam Zellij. Bayangkan kalian bekerja dari workstation yang sudah berjalan Zellij, lalu SSH ke server produksi yang juga berjalan Zellij. Dua lapis multiplexer sekarang berebut input yang sama — setiap keystroke, setiap klik mouse, setiap resize. Ditambah lagi, Zellij modern berinteraksi dengan fitur terminal emulator yang sering luput disadari: clipboard jarak jauh via OSC 52, notifikasi desktop via OSC-99, dan pergantian tema dark/light via CSI 2031. Menguasai lapisan ini membuat Zellij terasa menembus hingga keluar terminal.
Mengapa episode ini penting? Dua alasan. Pertama, nested Zellij adalah skenario paling umum penyebab "Zellij-nya hang" yang sebenarnya hanyalah konflik keybind — bukan bug, bukan proses mati. Kedua, pemahaman protokol terminal menentukan apakah fitur clipboard, notifikasi, dan tema otomatis bekerja atau diam-diam gagal tanpa pesan error. Mari kita bongkar satu per satu, mulai dari skenario nested itu sendiri.
Skenario nested terjadi ketika kalian menjalankan Zellij di dalam sebuah pane Zellij yang lain. Contoh paling nyata: kalian membuka session lokal, SSH ke server, lalu mengetik zellij di sana. Server yang juga memakai Zellij akan merender antarmuka penuhnya — tab-bar, pane, status-bar — di dalam pane milik Zellij lokal.
zellij attach work
ssh dev@server
zellijMasalah segera muncul: kedua level Zellij menggunakan rangkaian keybind yang sama. Ketika kalian menekan Ctrl+p, yang merespons adalah Zellij di level luar — bukan level dalam yang sedang kalian tuju. Input tidak pernah sampai ke inner Zellij, dan kalian akan merasa keyboard macet tanpa alasan yang jelas. Hal yang sama terjadi pada mouse: level luar menangkap semua event klik dan drag, sehingga inner Zellij tidak pernah menerima satu pun interaksi pointer.
Pahami mental model berikut: setiap level Zellij adalah lapisan yang menutup terminal di bawahnya. Agar satu level menerima input, level di atasnya harus bersedia melepas input itu. Ada dua strategi utama untuk mengatur "siapa yang pegang keyboard": Locked mode untuk pelepasan sementara, dan remap keybind untuk pemisahan permanen. Keduanya kita bedah sekarang.
| Strategi | Cara Kerja | Cocok Untuk |
|---|---|---|
Locked mode (Ctrl+g) | Melepas semua input ke level bawah secara sementara | Sesi sekali-sekali, masuk ke inner secara singkat |
| Remap keybind | Mengubah rangkaian keybind salah satu level | Penggunaan harian, dua level aktif terus-menerus |
| Nonaktifkan mouse level luar | Menyerahkan semua event mouse ke level dalam | Workflow yang bergantung pada mouse di dalam |
Locked mode adalah tombol darurat yang paling sering dipakai untuk nested Zellij. Tekan Ctrl+g di level luar, dan Zellij langsung mengunci dirinya: semua input — termasuk kombinasi keybind — diteruskan apa adanya ke pane di bawah. Status-bar menampilkan indikator LOCKED berwarna merah agar kalian selalu sadar sedang berada dalam mode passthrough.
Skenario kerjanya seperti ini: tekan Ctrl+g pada outer Zellij untuk mengunci, sehingga semua keystroke kini masuk ke inner Zellij dan kalian bebas memakai Ctrl+p, Ctrl+t, dan seterusnya di level dalam. Setelah selesai, keluar dari inner Zellij dengan Ctrl+q atau detach, lalu tekan Ctrl+g sekali lagi pada level luar untuk membuka kunci. Sederhana di atas kertas, tetapi ada satu jebakan yang harus kalian hindari.
Warning
Waspada jebakan Ctrl+g ganda. Selama level luar terkunci, Ctrl+g yang kalian tekan diteruskan ke level dalam dan akan mengunci level dalam juga. Jika layar tampak membeku dua lapis, jangan panik — tekan Ctrl+g sekali lagi, karena kemungkinan kalian baru saja mengunci level dalam, bukan membuka level luar.
Locked mode juga berguna di luar konteks nested. Ia adalah cara tercepat untuk menonaktifkan Zellij sejenak ketika menjalankan aplikasi di dalam pane yang haus shortcut sendiri, seperti vim dengan mouse capture atau aplikasi TUI yang memakai banyak kombinasi tombol. Ketimbang mengutak-atik konfigurasi, cukup kunci saat dibutuhkan dan buka kembali saat selesai.
Locked mode hanya pelepasan sementara. Untuk penggunaan harian, kalian butuh pemisahan permanen: salah satu level menggunakan rangkaian keybind yang berbeda agar keduanya hidup berdampingan tanpa saling menelan input. Strategi paling bersih adalah memberi konfigurasi khusus pada Zellij yang berjalan di server — level dalam — lalu menjalankannya dengan flag --config.
keybinds {
unbind "Ctrl p"
bind "Alt p" {
SwitchToMode "Pane";
}
}Dengan konfigurasi ini, Alt+p di level dalam menggantikan Ctrl+p. Karena level luar tetap memakai Ctrl+p, keduanya tidak pernah berebut tombol yang sama. Prinsip yang sama bisa diterapkan ke mode lain: Ctrl+t menjadi Alt+t, Ctrl+o menjadi Alt+o, dan seterusnya. Sesuaikan agar mudah diingat dan tidak bentrok dengan shortcut editor kalian.
zellij --config ~/.config/zellij/server.kdlTip
Simpan konfigurasi khusus untuk level dalam di repo dotfiles kalian. Ketika login ke server baru, cukup menyalin satu file lalu menjalankan zellij --config dengan keybind yang sudah kalian hafal. Konsistensi keybind antar mesin jauh lebih berharga daripada keybind "paling nyaman" yang berbeda-beda di setiap server.
Perhatikan bahwa remap tidak harus menyentuh semua mode sekaligus. Jika hanya Ctrl+p yang sering bentrok, cukup remap itu. Semakin sedikit perubahan, semakin sedikit yang harus kalian hafal ulang dan semakin kecil risiko memecah kebiasaan yang sudah terbentuk di level luar.
Zellij mendukung mouse sejak awal dan aktif secara default lewat opsi mouse_mode. Dengan mouse menyala, kalian bisa klik untuk memindahkan fokus ke pane lain, drag pada garis pemisah antar pane untuk resize, dan scroll untuk menelusuri scrollback. Ini adalah alternatif yang nyaman ketika keyboard sedang sibuk, misalnya saat menyalin teks dari output panjang.
| Aksi Mouse | Perilaku |
|---|---|
| Klik pada pane | Memindahkan fokus ke pane tersebut |
| Drag pada batas pane | Resize pane secara langsung |
| Drag dari dalam pane | Membuka mode selection dan menyalin teks |
| Scroll di atas pane | Menelusuri scrollback pane |
| Klik pada tab-bar | Berpindah tab |
Dalam skenario nested, mouse selalu ditangkap level luar lebih dulu. Ada dua cara mengatasinya: kunci level luar dengan Ctrl+g agar klik diteruskan ke level dalam, atau matikan mouse di level luar sehingga tidak ada yang merebut event:
options {
mouse_mode false
}Ketika mouse dimatikan, resize tetap bisa dilakukan via keyboard: Ctrl+n untuk masuk mode Resize lalu gunakan tanda panah, atau Alt+= dan Alt+- untuk resize cepat. Kombinasi mouse di level dalam dan keyboard di level luar adalah pembagian kerja yang paling jarang membuat bingung, karena setiap input sudah tahu tujuannya masing-masing.
Selain mengetik manual, Zellij memungkinkan kalian mengirim input ke pane secara programatik. Ini penting ketika kalian ingin meneruskan keystroke dari satu level ke level lain, atau mengotomasi urutan perintah di dalam session tanpa menyentuh keyboard. Dua mekanisme yang paling sering dipakai adalah zellij action dan pipes.
zellij action write-chars mengirim rangkaian karakter ke pane yang sedang fokus, sementara zellij action write mengirim keystroke berdasarkan keycode. Keduanya bisa ditargetkan ke session tertentu dengan --session:
zellij action --session dev write-chars "git status"
zellij action --session dev write 13Urutan di atas mengetik git status lalu menekan Enter di pane session dev — persis seperti kalian mengetiknya sendiri. Gunakan pola ini untuk menyinkronkan perintah ke banyak pane sekaligus, atau untuk meneruskan input dari level luar ke level dalam secara terkontrol tanpa harus menyerahkan keyboard penuh.
Note
Pipes adalah pasangan zellij action: pipes menyalurkan data ke dan dari pane atau plugin secara real-time, sedangkan action mengirim perintah sekali jalan. Untuk alur forward keypress yang berkelanjutan — misalnya mereplikasi input ke beberapa pane — kombinasikan write-chars dengan skrip kecil yang memantau output pane.
Hati-hati: write-chars tidak memvalidasi shell kalian. Jika kalian mengirim teks ke pane yang sedang menjalankan program lain, teks itu diterima apa adanya. Selalu pastikan target pane memang sedang menunggu input di prompt shell, dan jangan kirim perintah destruktif ke session yang sedang dipakai rekan kerja di shared session.
Zellij berdiri di antara pane dan terminal emulator. Posisi ini membuatnya mampu menerjemahkan protokol terminal modern yang tidak dimengerti multiplexer lawas. Tiga protokol yang paling berguna untuk workflow sehari-hari adalah OSC 52 (clipboard), OSC-99 (notifikasi), dan CSI 2031 (pergantian tema).
OSC 52 — clipboard jarak jauh. Saat kalian menyalin teks di dalam Zellij di server remote, teks itu sebenarnya berada di mesin remote. Agar sampai ke clipboard lokal, Zellij mengirim escape sequence ESC]52;c;isi-base64;BEL ke terminal emulator. Jika terminal mendukung OSC 52, teks langsung masuk ke clipboard lokal tanpa perlu menyalin lewat file atau SSH terpisah.
TEXT=$(printf '%s' 'Halo Zellij' | base64)
printf '\033]52;c;%s\007' "$TEXT"Sebagai alternatif, kalian bisa menetapkan perintah copy khusus per platform melalui opsi copy_command. Jika copy_command diset, Zellij memakainya untuk menyalin; jika tidak, Zellij mencoba melewati OSC 52.
copy_command "xclip -selection clipboard"OSC-99 — notifikasi desktop. Program di dalam pane bisa memicu notifikasi sistem lewat OSC-99. Zellij meneruskan sequence ini ke terminal emulator, dan terminal yang mendukung akan menampilkannya sebagai notifikasi desktop. Berguna untuk memberi sinyal "build selesai" atau "deploy berhasil" tanpa harus menatap terminal terus-menerus.
printf '\033]99;i=0:d=Deploy selesai;\a'CSI 2031 — pergantian tema dark/light. Ketika sistem operasi berpindah antara mode terang dan gelap, terminal emulator modern mengirim sequence CSI 2031. Zellij versi 0.44 mendengarkan sinyal ini dan otomatis berpindah antara theme_dark dan theme_light, sehingga tampilan workspace selalu menyatu dengan tema sistem:
options {
theme_dark "nord"
theme_light "solarized-light"
}Important
Ketiga protokol di atas hanya berfungsi jika terminal emulator kalian mendukungnya. OSC 52 butuh dukungan clipboard jarak jauh, OSC-99 butuh dukungan notifikasi, dan CSI 2031 butuh terminal yang mengirim sinyal pergantian tema. Jika fitur tidak bereaksi, periksa dokumentasi terminal kalian sebelum menyalahkan Zellij.
Ctrl+g dua kali di nested Zellij. Alih-alih membuka kunci level luar, kalian malah mengunci level dalam. Solusi: perhatikan indikator LOCKED di status-bar — jika layar masih terkunci setelah satu kali Ctrl+g, tekan sekali lagi.Ctrl+g, atau nonaktifkan mouse_mode di salah satu level.copy_command salah platform. pbcopy tidak ada di Linux dan wl-copy tidak ada di macOS. Solusi: sesuaikan dengan platform (wl-copy atau xclip untuk Linux, pbcopy untuk macOS, clip.exe untuk Windows).copy_command yang eksplisit, atau pilih terminal dengan dukungan OSC 52.Episode 21 menuntaskan lapisan input Zellij: kalian kini memahami skenario nested Zellij di mana dua multiplexer hidup berdampingan, strategi Locked mode dengan Ctrl+g untuk melepas input sementara, remap keybind untuk pemisahan permanen antar level, navigasi dan resize via mouse, pengiriman input programatik lewat zellij action, serta integrasi OSC 52, OSC-99, dan CSI 2031 yang menghubungkan Zellij dengan fitur terminal modern.
Poin yang harus kalian bawa:
Ctrl+g melepas input ke level bawah; jangan menekannya dua kali tanpa sadar.mouse_mode untuk menyerahkannya.Sekarang kalian bisa mengendalikan Zellij di mana pun — termasuk di dalam Zellij. Di episode 22 selanjutnya kita mengubah perspektif dari kenyamanan menjadi keamanan: Security & Hardening Best Practice — mengamankan session dengan Ctrl+g, mengontrol akses session berbagi, mengelola socket dan direktori cache, menjaga secrets tetap aman, membatasi plugin dan pipe yang berbahaya, hingga praktik terbaik Zellij di server produksi. Sampai jumpa di episode 22, dan pastikan workspace kalian tidak hanya canggih, tetapi juga aman.