otomasi Zellij dari luar session: CLI actions non-interaktif untuk new-pane, write-chars, go-to-tab, dan resize; pipes 0.40 untuk mengalirkan input/output antar pane; plus skrip automation & CI 0.44.

Di episode-episode sebelumnya, kalian mengendalikan Zellij lewat dua jalur: interaktif (keybinding di dalam mode) dan deklaratif (layout KDL). Keduanya hebat untuk manusia yang sedang duduk di depan terminal. Namun ada satu jenis kendali yang belum kita bahas: bagaimana jika yang ingin mengendalikan Zellij bukan jari kalian, melainkan sebuah skrip, satu proses lain, atau bahkan pipeline CI yang tidak memiliki terminal sama sekali?
Episode 13 membuka Fase 4 series Belajar Zellij — fase automasi dan plugin. Kalian akan belajar tiga pilar: (1) CLI actions, perintah non-interaktif zellij action yang bisa membuat pane, menulis karakter, berpindah tab, dan resize dari luar session; (2) pipes, saluran input/output yang diperkenalkan di versi 0.40 untuk mengalirkan data antara proses dan pane secara real-time; dan (3) CLI automation yang disempurnakan di versi 0.44, berupa skrip untuk bootstrap workspace serta integrasi dengan task runner dan CI.
Mengapa ini penting? Produktivitas terminal sejati adalah soal menghilangkan pengulangan. Setup workspace yang biasanya kalian lakukan manual — buka session, buat tab editor, split pane, jalankan dev server, buka tab log — adalah kandidat sempurna untuk diubah menjadi satu perintah yang bisa dijalankan kapan pun, oleh siapa pun, bahkan oleh mesin. Dengan automasi, workspace kalian menjadi reproduksibel: mulai dari nol selalu menghasilkan struktur yang sama, tanpa mengandalkan ingatan atau kebiasaan.
Bayangkan skenario nyata. Setiap pagi kalian membuka session, menebak nama tab, membagi pane, menunggu dev server menyala, baru mulai mengetik kode. Sekarang bayangkan versi terotomasinya: satu perintah npm run workspace, dan workspace lengkap langsung berdiri — server menyala, watcher test berjalan, log mengalir di tab sendiri, dan kalian tinggal mengetik. Itulah yang akan kita bangun, sedikit demi sedikit, di episode ini. Mari mulai dari fondasinya: CLI actions.
Konsep inti yang harus kalian pegang: setiap aksi yang kalian picu lewat keybinding sebenarnya adalah sebuah action di dalam protokol Zellij. Keybinding hanyalah salah satu pemicunya — pemicu yang lain adalah baris perintah zellij action. Ketika kalian menjalankannya, Zellij membuat sebuah cli client kecil yang terhubung ke server session tertentu, mengirim action, lalu keluar. Tidak ada UI yang tampil; pekerjaan terjadi diam-diam di dalam session.
Sintaksnya sederhana:
zellij -s <nama-session> action <ACTION> [argumen...]
zellij action <ACTION> [argumen...]Flag -s memilih session target. Jika hanya ada satu session yang berjalan, -s boleh dihilangkan. Jika ada lebih dari satu, kalian wajib menyebutkan namanya — jika tidak, permintaan kalian ditolak. Gunakan zellij list-sessions untuk melihat session yang sedang hidup. Berikut aksi yang paling sering dipakai dalam automasi:
| Aksi | Contoh Perintah | Padanan Keybinding |
|---|---|---|
| Membuat pane baru | zellij action new-pane | Ctrl+p lalu n |
| Menulis teks ke pane | zellij action write-chars "ls -la\n" | mengetik langsung |
| Menulis byte mentah | zellij action write 27 | menekan Esc |
| Pindah ke tab bernama | zellij action go-to-tab-name tools | Ctrl+t lalu jump |
| Pindah fokus pane | zellij action move-focus right | Alt+l |
| Resize pane | zellij action resize down | Ctrl+n lalu j |
| Menutup pane | zellij action close-pane | Ctrl+p lalu x |
Perhatikan write 27 — 27 adalah kode desimal untuk karakter ESC. Ini sangat berguna untuk keluar dari mode aplikasi dari luar, misalnya menutup dialog editor yang sedang menangkap input, tanpa harus menyentuh terminal.
zellij -s dev action write 27
zellij -s dev action write-chars "git status\n"
zellij -s dev action go-to-tab-name codePerhatikan bahwa seluruh perintah di atas bisa dijalankan bahkan ketika kalian sedang tidak ter-attach ke session — zellij action terhubung ke server lewat soket IPC, bukan lewat terminal yang kalian lihat. Ini berarti kalian bisa memicu aksi dari pane lain di session yang sama, dari window terminal yang berbeda, atau dari sesi SSH yang terpisah. Implikasinya besar: sebuah skrip di latar belakang bisa mengatur workspace kalian bahkan sebelum kalian duduk di depan komputer.
Tip
Bungkus aksi yang sering dipakai ke dalam shell function. Misalnya di ~/.zshrc, definisikan zpane() { zellij -s "${1:-dev}" action new-pane; }. Dengan begitu kalian punya "keybinding" Zellij yang bisa dipanggil dari mana saja — termasuk dari editor, task runner, atau baris perintah biasa.
Important
write-chars menuliskan karakter mentah ke pane. Jika pane sedang berada dalam mode scroll/search Zellij, atau aplikasi di dalamnya sedang menangkap input (misalnya editor dalam mode visual), karakter tidak akan dieksekusi oleh shell. Pastikan pane dalam kondisi menerima input sebelum mengirim teks.
CLI actions bersifat "tembak lalu lupa": setiap perintah mengirim satu aksi, lalu selesai. Untuk aliran data yang berkelanjutan, Zellij menyediakan pipes (sejak 0.40). Pipe menghubungkan input standar (stdin) sebuah proses dengan pane di dalam session, atau sebaliknya. Ini mengubah Zellij menjadi semacam soket terminal: kalian bisa menyalurkan apa pun dari proses luar ke dalam pane secara streaming.
Secara mental model, bandingkan tiga cara mengirim input yang sudah kalian kenal. write-chars adalah "kirim satu teks sekali jalan" — tepat untuk perintah diskret seperti git status. Input pipe adalah "hubungkan aliran data" — tepat ketika sumbernya adalah proses lain yang menghasilkan output terus-menerus. Dan keybinding adalah "kirim satu aksi" — tepat ketika yang kalian butuhkan adalah perintah Zellij, bukan perintah shell. Memilih alat yang tepat untuk tiap jenis aliran adalah inti dari automasi yang bersih.
Input pipe paling sederhana: kirim string sebagai input ke pane yang sedang fokus.
zellij pipe -s "git status"
echo "bun install" | zellij pipe -s
cat perintah.txt | zellij pipe -sDua bentuk di atas menyalurkan input lewat dua jalur: payload langsung sebagai argumen, atau membaca dari stdin proses lain. Perbedaannya dengan write-chars adalah skala dan kontinuitas: pipe bisa mengalirkan file yang besar atau log yang tidak pernah berhenti, bukan hanya satu baris. Contoh nyata — mengalirkan log server langsung ke pane yang sedang fokus:
tail -f /var/log/nginx/error.log | zellij pipe -sKarena pipe menargetkan pane yang sedang fokus, pastikan kalian sudah memindahkan fokus ke pane tujuan terlebih dahulu — kombinasi yang sempurna dengan zellij action move-focus.
Pipes tidak hanya masuk — mereka juga keluar. Output pipe membaca output dari pane secara real-time dan menuliskannya ke stdout proses kalian:
zellij pipe -o | grep -i "error"
zellij pipe -o | tee /tmp/pane-output.logIni membuka kemungkinan menarik: pane menjalankan aplikasi yang lama (dev server, worker), dan proses luar memantau output-nya tanpa harus menatap layar. Kalian bisa menyalurkan output ke grep, jq, awk, atau alat monitoring lain — Zellij berubah menjadi sumber data, bukan sekadar layar.
Untuk automasi penuh, pipes juga bisa membuat session baru:
zellij pipe --new-session -S ci-worker
echo "make build" | zellij pipe -s -S ci-workerPerintah pertama membuat session bernama ci-worker yang berdiri sendiri (detached), dan perintah kedua mengalirkan perintah build ke dalamnya. Session yang dibuat lewat pipe ini tidak membutuhkan kalian untuk attach — ia hidup di dalam server Zellij sampai di-kill.
Note
Output pipe bersifat blokir dan streaming: proses zellij pipe -o akan terus berjalan selama pane masih hidup dan menghasilkan output. Jangan jalankan tanpa redirect atau tanpa penghenti — kombinasikan dengan timeout 10 zellij pipe -o jika kalian hanya ingin membaca sepotong output.
Sekarang saatnya merangkai semuanya. Tujuan kita: satu skrip yang membangun seluruh workspace development — tab editor dengan dev server, tab test dengan watcher, dan tab log — lalu meng-attach kalian ke sana.
#!/usr/bin/env bash
set -euo pipefail
SESSION="${1:-dev}"
zellij list-sessions 2>/dev/null | grep -q "^${SESSION}" && zellij kill-session "$SESSION"
zellij run -s "$SESSION" -- bash -c "exec \$SHELL"
sleep 0.3
zellij -s "$SESSION" action rename-tab code
zellij -s "$SESSION" action new-pane
zellij -s "$SESSION" action write-chars "bun run dev\n"
zellij -s "$SESSION" action move-focus left
zellij -s "$SESSION" action new-pane
zellij -s "$SESSION" action write-chars "bun run test -- --watch\n"
zellij -s "$SESSION" action new-tab
zellij -s "$SESSION" action rename-tab logs
zellij -s "$SESSION" action write-chars "tail -f /tmp/dev.log\n"
zellij attach "$SESSION"Mari bedah alurnya. Skrip membersihkan session lama jika masih ada, lalu zellij run -s membuat session baru secara terpisah dan menjalankan shell di dalamnya. Jeda sleep 0.3 memberi waktu server Zellij dan shell untuk siap sebelum aksi dikirim — ini kunci penting dalam automasi: aksi-aksi Zellij tidak menunggu satu sama lain secara eksplisit, jadi timing adalah tanggung jawab kalian. Setelah itu, satu demi satu aksi membangun struktur: rename tab pertama menjadi code, buat pane kedua untuk dev server, kembali ke pane kiri untuk pane test, lalu tab baru logs untuk tailing.
Perhatikan juga bahwa \n di akhir write-chars adalah bagian penting — itulah yang menekan Enter setelah perintah. Tanpa \n, shell hanya akan mengetik tanpa mengeksekusi. Jika kalian butuh jeda antar aksi yang lebih panjang (misalnya menunggu dev server benar-benar naik sebelum membuka tab berikutnya), tambahkan sleep tambahan di antara baris-baris aksi.
Satu hal yang perlu kalian putuskan sejak awal: strategi nama session. Skrip ini menerima nama session sebagai argumen pertama (${1:-dev}), jadi kalian bisa menjalankan beberapa workspace sekaligus — ./scripts/zellij-dev.sh frontend dan ./scripts/zellij-dev.sh api berjalan berdampingan tanpa saling mengganggu. Kebiasaan memberi nama session yang jelas juga membuat navigasi antar session jauh lebih mudah, karena nama itulah yang dipakai zellij attach, zellij action, dan pipes untuk menemukan targetnya.
Skrip di atas adalah bagian dari toolchain kalian — jadi layak untuk diintegrasikan ke task runner. Berikut tiga cara umum:
workspace:
bash scripts/zellij-dev.sh
attach:
zellij attach devKetiganya mengarah ke skrip yang sama; yang berubah hanyalah pintu masuknya. Pilih yang paling natural di project kalian — "workspace" kini menjadi satu perintah yang mendokumentasikan diri sendiri dan bisa dijalankan oleh anggota tim mana pun tanpa perlu tahu seluk-beluk setup manual.
Di pipeline CI, Zellij paling berguna untuk smoke test layout dan skrip automasi: pastikan layout KDL kalian tidak rusak dan perintah bootstrap berjalan tanpa galat. Karena CI berjalan headless, kalian perlu menyediakan pseudo-terminal (PTY) agar Zellij bisa mulai — utilitas script di Linux menyediakannya:
name: Zellij Smoke Test
on:
push:
branches: [main]
jobs:
smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Zellij
run: curl -sSfL https://install.zellij.dev | bash
- name: Smoke test layout
run: |
script -qec "zellij -s smoke -l layouts/dev.kdl" /dev/null &
sleep 1
zellij -s smoke action write-chars "echo ready\n"
zellij -s smoke action go-to-tab-name logs
zellij kill-session smokePola yang sama berlaku untuk server remote. Dari pipeline, kalian bisa SSH ke server yang menjalankan session Zellij dan mengirim aksi dari jauh:
ssh deploy@server "zellij -s prod action go-to-tab-name deploy"
ssh deploy@server "zellij -s prod action write-chars \"docker compose up -d\\n\""Dengan kombinasi SSH (episode 0) dan CLI actions (episode ini), pipeline CI kalian bisa mengelola workspace terminal di mesin mana pun. Jarak bukan lagi alasan untuk mengotori session produksi secara manual.
Warning
Zellij adalah aplikasi terminal; tanpa PTY ia menolak untuk memulai. Di CI, selalu bungkus pemanggilan Zellij dengan script -qec (Linux) atau padanan PowerShell di Windows. Jangan lupa zellij kill-session di akhir agar job tidak menggantung menunggu session yang tidak pernah ditutup.
zellij action tanpa -s ditolak atau mengarah ke session yang salah. Selalu cek zellij list-sessions dan sebutkan nama secara eksplisit di skrip.write-chars yang dikirim terlalu cepat setelah new-pane bisa tersimpan di buffer atau masuk ke tempat yang salah. Beri jeda sleep setelah membuat pane atau tab sebelum menulis.\n di akhir perintah. Tanpa karakter newline, shell tidak mengeksekusi apa yang kalian tulis — perintah hanya diketik dan menunggu, seperti menekan tombol tanpa Enter.zellij pipe -o bersifat streaming dan memblokir terminal kalian. Gunakan timeout, redirect ke file, atau pipa ke grep yang berhenti lebih awal.kill-session terlebih dahulu atau gunakan nama session yang unik per task.Episode ini mengubah cara kalian melihat Zellij: dari aplikasi yang dioperasikan dengan tangan menjadi sistem yang diprogram. Kalian kini punya tiga alat yang saling melengkapi — CLI actions untuk aksi diskret, pipes untuk aliran data kontinu, dan skrip automasi yang merangkai keduanya menjadi workspace yang reproduksibel.
Poin yang harus kalian bawa:
zellij action mengirim aksi non-interaktif ke session: new-pane, write-chars, go-to-tab-name, move-focus, resize.zellij pipe -s untuk input, zellij pipe -o untuk output, zellij pipe --new-session untuk session baru.sleep dengan bijak di antara aksi.script -qec dan selalu tutup session setelah selesai.Di episode 14, kita berbelok dari automasi ke navigasi: filepicker dan strider, plugin file explorer bawaan Zellij yang membuat kalian menjelajah, memilih, dan membuka file tanpa pernah meninggalkan session. Sampai jumpa di episode 14.