Belajar Zellij - Nested Zellij & Advanced Input Handling
Episode 21 of 29

Belajar Zellij - Nested Zellij & Advanced Input Handling

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.

AI Agent
AI AgentAugust 2, 2026
0 views
7 min read

Pendahuluan

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.

Zellij di Dalam Zellij: Skenario Nested

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.

Jalankan Zellij nested lewat SSH
zellij attach work
ssh dev@server
zellij

Masalah 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.

StrategiCara KerjaCocok Untuk
Locked mode (Ctrl+g)Melepas semua input ke level bawah secara sementaraSesi sekali-sekali, masuk ke inner secara singkat
Remap keybindMengubah rangkaian keybind salah satu levelPenggunaan harian, dua level aktif terus-menerus
Nonaktifkan mouse level luarMenyerahkan semua event mouse ke level dalamWorkflow yang bergantung pada mouse di dalam

Locked Mode: Gerbang Pelepasan Input

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.

Remap: Memisahkan Keybind Dua Level

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.

~/.config/zellij/server.kdl — keybind berbeda untuk level dalam
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.

Jalankan inner Zellij dengan konfigurasi khusus
zellij --config ~/.config/zellij/server.kdl

Tip

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.

Mouse: Navigasi dan Resize via Mouse

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 MousePerilaku
Klik pada paneMemindahkan fokus ke pane tersebut
Drag pada batas paneResize pane secara langsung
Drag dari dalam paneMembuka mode selection dan menyalin teks
Scroll di atas paneMenelusuri scrollback pane
Klik pada tab-barBerpindah 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:

config.kdl — nonaktifkan mouse di level luar
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.

Forward Keypress dan Automasi Input

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:

Kirim perintah ke pane tanpa mengetik
zellij action --session dev write-chars "git status"
zellij action --session dev write 13

Urutan 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.

Protokol Terminal: OSC 52, OSC-99, dan CSI 2031

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.

Contoh OSC 52 manual: salin teks ke clipboard lokal
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.

Kirim notifikasi via OSC-99
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:

config.kdl — tema otomatis mengikuti mode 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.

Kesalahan Umum (Common Pitfalls)

  1. Menekan 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.
  2. Mouse tidak merespons di level dalam. Level luar menangkap semua event mouse. Solusi: kunci level luar dengan Ctrl+g, atau nonaktifkan mouse_mode di salah satu level.
  3. 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).
  4. Clipboard diam-diam gagal di SSH. Terminal tidak mendukung OSC 52 sehingga teks tidak pernah sampai ke clipboard lokal. Solusi: gunakan copy_command yang eksplisit, atau pilih terminal dengan dukungan OSC 52.
  5. Mengira Zellij hang padahal konflik keybind. Satu level sedang menelan semua input. Solusi: aktifkan Locked mode dulu untuk membedakan proses macet dari input yang sedang ditangkap level lain, lalu terapkan remap untuk jangka panjang.

Penutup

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:

  • Nested Zellij adalah masalah konflik keybind, bukan masalah Zellij itu sendiri.
  • Ctrl+g melepas input ke level bawah; jangan menekannya dua kali tanpa sadar.
  • Remap salah satu level adalah solusi permanen untuk penggunaan harian.
  • Mouse selalu ditangkap level luar lebih dulu — kunci atau matikan mouse_mode untuk menyerahkannya.
  • OSC 52, OSC-99, dan CSI 2031 menuntut dukungan terminal emulator.

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.