Setelah menguasai editing teks dalam satu file, saatnya mengelola banyak file sekaligus: pahami perbedaan buffer, window, dan tab, kuasai split window, navigasi antar buffer, hingga workflow editing multi-file ala engineer profesional.

Setelah di episode 4 sebelumnya kita membahas cara menyalin dan menempel secara efisien dengan registers, merekam langkah editing berulang dengan macros, serta melakukan search & replace canggih — kalian sekarang sudah memiliki "senjata editing" yang lengkap untuk mengolah teks dalam satu file. Namun ada satu batasan besar yang akan segera kalian rasakan di dunia nyata: kode tidak pernah hidup dalam satu file saja.
Bayangkan kalian sedang men-debug sebuah bug di production. Kalian perlu membaca main.go, melirik fungsi di utils.go, membandingkan implementasi dengan test di main_test.go, sambil mencari tahu di mana konstanta dikonfigurasi. Di editor biasa, membuka lima file artinya lima tab yang penuh sesak — dan berpindah antar tab itu sendiri sudah memakan waktu. Di Neovim, pertanyaan yang tepat bukan "bagaimana cara membuka banyak file", melainkan "bagaimana saya mengatur ruang kerja saya dengan benar".
Pada episode kali ini kita akan membedah tiga komponen layout yang menjadi fondasi seluruh pengalaman multi-file Neovim: buffer, window, dan tab. Kita akan belajar mengelola split window, berpindah antar buffer dengan cepat, dan menyusun workflow yang membuat kalian berpindah antar file secepat pikiran — tanpa pernah menyentuh mouse. Inilah gerbang masuk ke FASE 2 series ini, di mana kita mulai beralih dari sekadar "menggunakan" Neovim menuju "membangun" Neovim.
Sebelum masuk ke perintah-perintahnya, kita harus benar-benar paham perbedaan tiga istilah ini. Kebanyakan pengguna baru terjebak karena mereka mengira buffer, window, dan tab adalah hal yang sama — padahal ketiganya memainkan peran yang sangat berbeda.
Pikirkan tiga analogi berikut:
auth, satu tab lagi untuk modul payment.| Konsep | Analogi | Definisi Singkat | Siklus Hidup |
|---|---|---|---|
| Buffer | Dokumen | File yang dimuat ke memori | Tetap hidup walau tidak terlihat |
| Window | Kaca pembesar | Viewport untuk melihat buffer | Mati saat ditutup, buffer tetap ada |
| Tab | Meja kerja | Wadah satu atau lebih window | Mati saat ditutup, buffer tetap ada |
Note
Konsekuensi paling penting dari model ini: buffer lebih panjang umur daripada window dan tab. Menutup sebuah window atau tab tidak akan menutup buffer-nya. Sebaliknya, buffer bisa tetap "hidden" di memori selama Neovim masih berjalan — dan ini justru menjadi kekuatan Neovim, karena berpindah antar buffer jauh lebih cepat daripada membuka file dari disk.
Ada satu konsep lagi yang perlu diluruskan sejak awal: buffer bukanlah file di disk. Buffer adalah isi file yang sedang dimuat di memori. Perubahan yang kalian buat di buffer baru benar-benar ditulis ke disk saat kalian menjalankan :write. Ini penting untuk dipahami saat kita membahas :bdelete nanti — menghapus buffer tidak menghapus file di disk.
Buffer di Neovim dinomori secara berurutan. Untuk melihat semua buffer yang sedang dimuat, gunakan :ls atau :buffers:
:lsOutput yang dihasilkan akan terlihat seperti ini:
1 %a "main.go" line 12
2 h "utils.go" line 1
3 #h "config.go" line 0
4 u "lsp.log" line 0
5 - "README.md" line 0Mari bedah kolom-kolom penanda di sebelah kiri:
| Penanda | Arti |
|---|---|
% | Buffer yang sedang aktif (tampil di window) |
# | Buffer alternatif (yang terakhir dikunjungi) |
a | Buffer aktif (ditampilkan di salah satu window) |
h | Buffer hidden (tersimpan di memori, tidak terlihat) |
u | Buffer unlisted (tidak muncul di daftar biasa, contoh: help) |
- | Buffer belum dimuat penuh (baru direferensikan) |
+ | Buffer memiliki perubahan yang belum disimpan (modified) |
Inilah inti produktivitas multi-file: berpindah buffer tanpa menutup layout window yang sudah susah payah kalian atur.
| Command | Fungsi |
|---|---|
:bnext / :bn | Pindah ke buffer berikutnya |
:bprevious / :bp | Pindah ke buffer sebelumnya |
:buffer <nomor> / :b <nomor> | Pindah langsung ke buffer dengan nomor tertentu |
:b <nama> | Pindah ke buffer berdasarkan nama (autocomplete dengan Tab) |
:b# | Pindah ke buffer alternatif (buffer terakhir yang dikunjungi) |
Tip
Kombinasi yang paling sering digunakan engineer adalah :b <nama> dengan autocomplete. Bayangkan kalian memiliki main.go, main_test.go, dan utils.go. Cukup ketik :b main lalu tekan Tab untuk melengkapi — jauh lebih cepat daripada mengingat nomor buffer. Untuk lompat bolak-balik antara dua file yang sedang kalian bandingkan, :b# (atau Ctrl+^ / Ctrl+6) adalah senjata rahasia: satu ketukan untuk berpindah, satu ketukan lagi untuk kembali.
Kesalahan paling umum di episode ini: menutup buffer dengan :q. Ingat lagi model tadi — :q menutup window, bukan buffer. Buffer yang ditampilkan di window itu tetap hidup di memori sebagai buffer hidden.
Untuk benar-benar menghapus buffer dari memori, gunakan :bdelete (atau singkatnya :bd):
| Command | Fungsi |
|---|---|
:bdelete | Hapus buffer aktif dari memori |
:bd 2 | Hapus buffer nomor 2 |
:bd main.go | Hapus buffer berdasarkan nama |
:bd! | Paksa hapus buffer yang masih punya perubahan belum tersimpan |
:bdelete a b c | Hapus beberapa buffer sekaligus |
Warning
Saat kalian menjalankan :bd pada buffer yang memiliki perubahan belum tersimpan, Neovim akan menolak dan menampilkan pesan E89: No write since last change. Jangan terburu-buru menjalankan :bd! — itu akan membuang semua perubahan kalian. Selalu simpan dengan :w dulu, kecuali kalian memang sengaja membuang perubahan tersebut.
Sekarang kita masuk ke salah satu fitur yang paling membuat Neovim terasa "luas": membelah layar menjadi beberapa window.
| Command / Shortcut | Arah Split |
|---|---|
:split / :sp | Membelah layar secara horizontal (atas-bawah) |
:vsplit / :vs | Membelah layar secara vertikal (kiri-kanan) |
Ctrl+w s | Split horizontal tanpa prompt |
Ctrl+w v | Split vertikal tanpa prompt |
:new / :vnew | Split horizontal/vertikal dengan buffer kosong |
Kalian juga bisa menentukan file yang langsung dibuka di split: :vs utils.go akan membelah layar secara vertikal dan membuka utils.go di window baru.
Note
"Horizontal" dan "vertikal" di sini mengacu pada letak garis pembatasnya, bukan arah penambahan. :split menambah window di bawah dan garis pembatasnya horizontal. :vsplit menambah window di samping dan garis pembatasnya vertikal. Banyak pemula kebalik, jadi ingat: v = garis vertikal.
Setelah layar terbelah, kalian butuh cara untuk melompat antar window tanpa mouse. Ini adalah kunci: Ctrl+w diikuti tombol arah.
| Shortcut | Fungsi |
|---|---|
Ctrl+w h | Pindah ke window di kiri |
Ctrl+w j | Pindah ke window di bawah |
Ctrl+w k | Pindah ke window di atas |
Ctrl+w l | Pindah ke window di kanan |
Ctrl+w w | Pindah ke window berikutnya secara berurutan (cycle) |
Ctrl+w p | Kembali ke window terakhir yang aktif |
Ctrl+w H / J / K / L | Pindahkan posisi window aktif ke sisi tersebut |
Tip
Pola pikir yang benar: Ctrl+w h/j/k/l bersifat pasti (deterministik) — tombolnya mengikuti arah visual, persis seperti navigasi h/j/k/l di modal editing. Setelah kalian terbiasa, coba tambahkan Ctrl+w w untuk menelusuri semua window secara berurutan saat jumlah window banyak dan letaknya tidak beraturan.
Layout split jarang langsung pas. Saat satu file membutuhkan ruang lebih, kalian bisa menyesuaikan ukuran window:
| Shortcut | Fungsi |
|---|---|
Ctrl+w = | Samakan ukuran semua window secara proporsional |
Ctrl+w < | Kecilkan lebar window aktif |
Ctrl+w > | Besarkan lebar window aktif |
Ctrl+w - | Kecilkan tinggi window aktif |
Ctrl+w + | Besarkan tinggi window aktif |
Ctrl+w _ | Maksimalkan tinggi window aktif |
| `Ctrl+w | ` |
5 Ctrl+w > | Besarkan lebar sebanyak 5 kolom sekaligus |
Important
Hukum yang wajib diingat: Ctrl+w = adalah tombol penyelamat. Ketika layout split sudah tidak beraturan dan kalian merasa tersesat, satu tekan Ctrl+w = akan merapikan semua window ke ukuran yang seimbang. Ini analog dengan terraform plan yang memulihkan kondisi ke keadaan yang bisa diprediksi.
| Command / Shortcut | Fungsi |
|---|---|
:q | Tutup window aktif (buffer tetap hidup di memori) |
Ctrl+w c | Tutup window aktif |
:only / Ctrl+w o | Tutup semua window lain, sisakan window aktif |
:close / Ctrl+w q | Tutup window aktif (jika bukan window terakhir) |
Caution
Di window terakhir, :q tidak menutup window melainkan keluar dari Neovim secara keseluruhan — dan jika ada buffer modified, Neovim akan menolak keluar dan menampilkan E37: No write since last change. Jadi jangan bingung: kalau kalian hanya ingin "menutup window terakhir tapi tetap di Neovim", itu tidak mungkin — window terakhir adalah layar utama Neovim. Pilihan kalian adalah menutup buffer dengan :bd agar file yang kalian lihat berpindah ke buffer lain, atau membiarkan window itu tetap terbuka.
Tab di Neovim berbeda maknanya dengan tab di browser. Di browser, tab berisi satu halaman. Di Neovim, tab berisi satu layout lengkap yang bisa menampung banyak window.
| Command / Shortcut | Fungsi |
|---|---|
:tabnew / :tabe <file> | Buat tab baru (opsional langsung membuka file) |
gt / :tabnext | Pindah ke tab berikutnya |
gT / :tabprevious | Pindah ke tab sebelumnya |
:tabs | Daftar semua tab beserta window-nya |
:tabclose | Tutup tab aktif |
:tab split | Buka buffer aktif di tab baru |
:tab ball | Buka semua buffer dalam tab terpisah |
Note
Best practice dari sebagian besar Neovim power user: jangan terlalu banyak memakai tab. Workflow utama yang disarankan adalah buffer + window, karena buffer lebih ringan dan berpindah antar buffer (:b ...) jauh lebih cepat daripada berpindah antar tab. Tab baru sebaiknya dipakai untuk konteks kerja yang benar-benar terpisah — misalnya satu tab untuk feature A dan satu tab untuk feature B, atau satu tab untuk kode dan satu tab untuk terminal. Gunakan tab seperti meja kerja terpisah, bukan seperti daftar dokumen terbuka.
Sekarang mari kita rangkai semua perintah di atas menjadi satu skenario nyata. Anggap kalian sedang disuruh memahami alur sebuah handler HTTP di main.go yang memanggil fungsi dari utils.go, dan kalian ingin membuka test-nya sebagai pembanding.
" 1. Buka file utama
:e main.go
" 2. Belah layar vertikal dan buka utils.go di window kanan
:vsplit utils.go
" 3. Pindah kembali ke window kiri (main.go)
Ctrl-w h
" 4. Buka test file di window kiri bawah
:split main_test.go
" 5. Samakan ukuran semua window agar proporsional
Ctrl-w =
" 6. Lompat bolak-balik antara buffer alternatif
Ctrl-w h
:b#Setelah menguasai alur di atas, perhatikan bahwa kalian tidak pernah menyentuh mouse, tidak pernah menutup layout, dan bisa melompat antar empat sumber kode hanya dengan beberapa ketukan. Inilah perbedaan antara "membaca kode" dan "menavigasi kode" — dan justru keterampilan inilah yang paling sering diuji saat engineer senior mengerjakan debugging mendalam.
Berikut kesalahan yang paling sering saya lihat — termasuk yang pernah saya alami sendiri saat awal belajar:
:q menutup buffer. :q menutup window. Kalau kalian ingin file "hilang dari daftar", gunakan :bd. Kalau kalian ingin buffer tetap ada tapi tidak terlihat, :q sudah cukup — buffer akan menjadi hidden dan bisa dipanggil lagi kapan saja.:bd menghapus file di disk. Sama sekali tidak. :bd hanya membuang buffer dari memori. File di disk tidak tersentuh selama kalian tidak menulis perubahan.:bd! secara gegabah. Ini membuang semua perubahan kalian tanpa konfirmasi. Biasakan :w dulu sebelum :bd.main.go terbuka lalu menjalankan :e main.go lagi, kalian akan mendapat buffer duplikat. Gunakan :b main untuk berpindah ke buffer yang sudah ada, atau :set hidden agar berpindah buffer yang belum disimpan tidak memicu error.:b untuk berpindah, daripada memaksa banyak window berdampingan.Ctrl+w =. Layout yang tidak seimbang membuat kalian kehilangan fokus. Satu ketukan merapikan semuanya.Tip
Latihan yang sangat efektif: buka sebuah project open source favorit kalian (misalnya codebase Neovim sendiri atau library yang sering kalian pakai), lalu telusuri satu fitur dari halaman depan sampai ke implementasinya hanya dengan :b, :vsplit, dan Ctrl+w. Ulangi sampai perpindahan itu terasa seperti refleks, bukan keputusan sadar.
Di episode 5 ini kita telah membedah tiga komponen layout Neovim yang selama ini sering tertukar: buffer sebagai dokumen di memori, window sebagai viewport untuk melihat dokumen, dan tab sebagai meja kerja yang menampung beberapa window. Kalian juga sudah belajar membelah layar dengan :split dan :vsplit, menavigasi antar window dengan Ctrl+w h/j/k/l, menyeimbangkan ukuran window dengan Ctrl+w =, serta mengelola buffer dengan :bnext, :b, dan :bdelete.
Poin terpenting yang harus kalian bawa:
:q menutup window; :bd menghapus buffer dari memori.Ctrl+w = adalah tombol penyelamat untuk merapikan layout.Sekarang kalian sudah bisa mengelola ruang kerja multi-file dengan percaya diri. Namun, semakin banyak buffer yang kalian buka, semakin kalian merasakan kebutuhan untuk mempersonalisasi Neovim — shortcut kustom, opsi yang sesuai selera, hingga perintah otomatis. Di episode 6 selanjutnya, kita akan memasuki jantung konfigurasi Neovim modern: migrasi dari Vimscript ke Lua configuration dengan init.lua. Kita akan membedah struktur direktori ~/.config/nvim/, dasar bahasa Lua, dan Neovim Lua API yang akan menjadi bekal kalian membangun config sendiri dari nol. Pastikan tetap semangat!