Di episode ini kalian akan merakit grammar Neovim yang sesungguhnya: menggabungkan operator (d, c, y, p) dengan motion dan text objects (ci", di(), yap) serta memanfaatkan marks dan jump list.

Setelah di episode 2 sebelumnya kita membahas modal editing dan menguasai navigasi dasar (Vim motion) — dari hjkl, motion kata & baris, hingga pencarian dengan / dan * — pada episode kali ini kita akan merakit puzzle yang sesungguhnya. Inilah saatnya "grammar" Neovim terbentuk utuh: operator + motion, text objects, dan marks/jump list.
Mengapa ini penting? Hingga episode 2, kalian baru bisa bergerak — tapi belum bisa mengubah isi teks dengan efisien. Di episode ini kalian akan belajar menghapus, mengubah, menyalin, dan menempel dengan kecepatan yang tidak mungkin dicapai editor modeless. Bayangkan ini seperti belajar memasak: motion adalah cara memegang pisau, dan operator adalah gerakan mengirisnya. Keduanya harus dikuasai bersamaan.
Inilah juga episode yang membedakan pengguna Neovim sejati dari sekadar pemakai: saat orang bertanya "kok bisa cepat banget edit-nya?", jawabannya hampir selalu ada di sini — text objects dan kombinasi operator+motion.
Filosofi Neovim dalam satu kalimat: setiap operasi editing adalah kalimat dengan format operator + count + motion. Operator adalah kata kerja (apa yang dilakukan), motion adalah objek (apa yang dikenai). Grammar ini konsisten — begitu kalian paham, ratusan kombinasi langsung bisa ditebak tanpa perlu dihafal.
| Operator | Fungsi | Analogi |
|---|---|---|
d | Delete (hapus) | "Potong" |
c | Change (hapus lalu masuk insert mode) | "Potong dan ganti" |
y | Yank (salin ke register) | "Fotokopi" |
p | Put (tempel dari register) | "Rekatkan" |
u | Undo (batalkan) | "Batalkan" |
Ctrl+r | Redo (ulangi kembali) | "Ulangi pembatalan" |
Perbedaan penting d vs c: d hanya menghapus, sedangkan c menghapus sekaligus langsung masuk insert mode agar kalian bisa langsung mengetik penggantinya. Ini menghemat satu langkah (d + i).
Sekarang gabungkan grammar-nya:
| Kombinasi | Arti Literal | Hasil |
|---|---|---|
d$ | delete sampai akhir baris | Menghapus sisa baris dari kursor |
d0 | delete sampai awal baris | Menghapus bagian awal baris dari kursor |
dd | delete line | Menghapus seluruh baris saat ini |
dw | delete word | Menghapus satu kata ke depan |
cw | change word | Menghapus satu kata lalu masuk insert mode |
y3w | yank 3 words | Menyalin tiga kata |
yy | yank line | Menyalin satu baris |
y$ | yank to end | Menyalin sampai akhir baris |
p | put | Menempel hasil yank/delete di bawah kursor |
P | put (uppercase) | Menempel di atas/posisi kursor |
ddp | swap lines | Tukar posisi dua baris (hapus+tempel) |
Tip
Count (angka) memperkuat motion. 3w = maju 3 kata, 2dd = hapus 2 baris, y3w = salin 3 kata. Count berlaku untuk operator, motion, atau keduanya: 2d3w = hapus 2 kali (3 kata) = hapus 6 kata. Ini contoh nyata bagaimana grammar yang konsisten membuat aksi kompleks jadi satu kalimat pendek.
Bayangkan baris ini dan kursor berada di awal kata quick:
The quick brown fox jumpsBerbagai operasi dengan grammar di atas:
| Aksi yang Diinginkan | Command | Hasil |
|---|---|---|
| Hapus "quick " | dw | The brown fox jumps |
| Ganti "quick" jadi "slow" | cw lalu ketik slow lalu Esc | The slow brown fox jumps |
| Hapus kata 3 dan 4 | d3w | The jumps |
| Hapus seluruh baris | dd | baris kosong (register berisi baris) |
| Salin baris lalu tempel di bawah | yy lalu p | baris terduplikasi di bawahnya |
| Tukar dua baris | ddp | posisi baris tertukar |
Note
Setelah dd atau d$, baris yang terhapus otomatis masuk ke register unnamed. Artinya p bisa langsung menempelkannya — teknik inilah yang membuat ddp (tukar baris) hanya 3 tombol. Register akan kita dalami di episode 4.
Text objects adalah salah satu fitur paling dahsyat di Neovim — dan justru paling sering diabaikan pemula. Text object memungkinkan kalian mengoper pada struktur teks (kata, kalimat, paragraf, atau isi dalam tanda kutip/kurung), bukan sekadar karakter.
i) vs Around (a)Ada dua keluarga text object:
i (inner) — mengoper pada isi di dalam delimiter, tanpa delimiter itu sendiri.a (around) — mengoper pada isi plus delimiter-nya.Bedanya sangat penting. Untuk ci" pada teks "hello world":
ci" (change inner) → menghapus hello world, menyisakan "" — kursor di dalam tanda kutip, siap mengetik.ca" (change around) → menghapus "hello world" termasuk tanda kutipnya.| Command | Objek | Contoh |
|---|---|---|
ciw | inner word | Ganti satu kata tanpa menyentuh spasi |
caw | around word | Ganti kata + spasi di belakangnya |
ci" | inner double quote | Ganti isi dalam "..." |
ca" | around double quote | Ganti "..." beserta kutipnya |
ci' | inner single quote | Isi dalam '...' |
di( | inner paren | Hapus isi dalam ( ... ) |
da( | around paren | Hapus ( ... ) beserta kurungnya |
yap | around paragraph | Salin satu paragraf |
dip | inner paragraph | Hapus satu paragraf |
ci[ | inner bracket | Isi dalam [ ... ] |
ci{ / ci} | inner braces | Isi dalam { ... } |
di< | inner angle | Isi dalam < ... > |
cit | inner tag | Isi dalam tag HTML (<div>...</div>) |
dat | around tag | Seluruh <div>...</div> |
Perhatikan polanya: c/d/y + i/a + delimiter. Kata kerja + (inner/around) + objek. Grammar yang sama, ratusan kombinasi.
Bandingkan dua cara mengganti isi sebuah string argument:
const user = fetch("/api/users?name=username");ci" → ketik nilai baru → Esc. Selesai dalam 3 tombol + mengetik.Sekarang bayangkan harus mengganti argumen di dalam fetch(...) pada 20 baris kode berbeda. Dengan ci( kalian bisa menyelesaikannya tanpa menggerakkan kursor ke posisi yang presisi sama sekali — cukup di area manapun di dalam kurung.
Important
Rahasia text objects: kalian tidak perlu meletakkan kursor tepat di tepi teks. ci" bekerja selama kursor berada di mana saja di dalam tanda kutip. Ini perbedaan fundamental dengan editor modeless yang menuntut presisi mouse. Efisiensi besar datang dari sini — hafalkan ciw, ci", ci(, ci{, yap, dan ci[; itu sudah menutupi sebagian besar kebutuhan.
Saat mengerjakan file panjang, kalian akan sering bolak-balik antara dua lokasi. Neovim menyediakan dua mekanisme: marks (penanda manual) dan jump list (jejak otomatis).
Marks adalah "bookmark" yang kalian letakkan manual di dalam file:
| Command | Fungsi |
|---|---|
ma | Tandai posisi saat ini dengan nama a |
`a | Lompat langsung ke posisi mark a |
'a | Lompat ke awal baris mark a |
:marks | Lihat daftar semua mark |
d'a | Hapus hingga baris mark a |
:delm a | Hapus mark a |
Marks bisa berupa huruf kecil (a–z, berlaku per-file) atau huruf besar (A–Z, berlaku global antar file). Saat mengedit file besar, kebiasaan "mark lokasi A, pindah ke B, lalu kembali" (ma ... `a) adalah lompatan super cepat.
Berbeda dengan marks yang manual, jump list otomatis mencatat setiap lompatan besar yang kalian lakukan (motion jarak jauh, pencarian, lompatan antar file):
| Command | Fungsi |
|---|---|
Ctrl+o | Kembali ke posisi sebelumnya (out) |
Ctrl+i | Maju ke posisi berikutnya (in) |
:jumps | Lihat daftar jump list |
Pola penggunaan klasik: kalian sedang membaca baris 500, lalu lompat ke baris 20 (20G), lalu ingin kembali persis ke baris 500 — sekali tekan Ctrl+o dan kalian kembali. Ctrl+o/Ctrl+i adalah cara paling cepat untuk bolak-balik antar lokasi tanpa harus ingat nomor baris.
| Command | Fungsi |
|---|---|
gi | Kembali ke posisi terakhir saat berada di insert mode (lalu langsung insert) |
g; | Lompat ke lokasi perubahan terakhir (mundur) |
g, | Lompat ke lokasi perubahan berikutnya (maju) |
gf | Buka file di bawah kursor (go to file) |
gF | Buka file di bawah kursor + lompat ke nomor baris yang ditunjukkan |
Ctrl+^ | Berpindah antara file terakhir yang dibuka |
gi dan g; sangat berguna untuk mengulang edit: gi mengembalikan kalian tepat ke posisi terakhir mengetik — sempurna setelah Esc lalu menjelajah sebentar. gf bekerja di file yang menyebut path relatif (misal import "./utils.ts") — letakkan kursor di nama file lalu tekan gf.
Tip
Kombinasi paling produktif untuk edit kode: g; untuk kembali ke lokasi perubahan terakhir, g, untuk maju ke perubahan berikutnya. Jika kalian berganti-ganti antara dua fungsi untuk memperbaiki dua bug, g;/g, akan menghemat lusinan langkah navigasi.
Buat file latihan3.txt dan salin baris-baris berikut:
const name = "budi"; // TODO: ganti jadi "siti"
const url = "https://api.dev/users?filter=all";
const list = [1, 2, 3, 4, 5];
function calculate(a, b) { return a * b; }Kerjakan dengan Neovim:
"budi", tekan ci", ketik siti, Esc.?filter=all — letakkan kursor di ?, tekan d$.yy → p → p.return a + b; — kursor di dalam { ... }, tekan ci{, ketik return a + b;, Esc.gg (atas), ma (tandai), G (bawah), lalu `a (kembali).gg → 10G → $, lalu Ctrl+o dua kali untuk mundur, Ctrl+i untuk maju.g;/g, — lakukan 3 perubahan acak, lalu telusuri lokasinya dengan g; dan g,.ddp — tukar posisi baris 1 dan 2.Tip
Aturan praktis untuk mengingat i vs a: i = di dalam saja, a = di dalam + sekelilingnya. Jika ragu, gunakan i dulu (lebih aman, tidak menghapus delimiter). Kalian bisa mengecek bedanya dengan menyalin: yi" vs ya" lalu p di tempat lain.
Lupa motion, bukan cuma operator. d saja tidak melakukan apa-apa — selalu diikuti motion/objek: dw, dd, d$, d'a. Kalau kalian menekan d lalu bingung, tekan Esc dan mulai ulang.
Bingung ciw vs cw. cw adalah change-word (hapus kata dari kursor sampai akhir kata); ciw adalah change-inner-word (hapus seluruh kata tempat kursor berada, dari posisi manapun di kata itu). Untuk mengubah satu kata utuh, ciw lebih prediktif.
Salah i vs a. ci" menyisakan kutip, ca" menghapus kutip. Kalian akan menyesal jika mengira sudah mengganti isi string tapi ternyata kutipnya ikut hilang (atau sebaliknya). Latih keduanya.
Menekan p tapi tempelannya salah tempat. p menempel setelah kursor, P sebelum. Untuk baris, p tempel di bawah baris saat ini, P di atas. Jika hasil tempelan aneh, cek dulu register (:reg) sebelum panik.
Terlalu sering u berlebihan. u adalah undo, Ctrl+r adalah redo. Jika keburu u terlalu banyak, Ctrl+r menyelamatkan kalian. Keduanya tidak wajib dihafal — tapi wajib dipraktikkan.
gf gagal karena file tidak ditemukan. gf butuh file yang benar-benar ada di path relatif. Jika kalian mengira gf "rusak", cek dulu apakah file yang dimaksud benar-benar ada.
Di episode 3 ini kalian telah merakit grammar inti Neovim: menghubungkan operator (d, c, y, p, u, Ctrl+r) dengan motion untuk membentuk kalimat editing (d$, cw, y3w, ddp), menguasai text objects yang mengoper struktur teks (ci", di(, yap, ci{, ca}), serta memanfaatkan marks (ma/`a), jump list (Ctrl+o/Ctrl+i), dan motion canggih (gi, g;/g,, gf, Ctrl+^).
Poin penting yang harus kalian bawa:
operator + count + motion, konsisten dan bisa ditebak.i vs a) adalah pembeda efisiensi terbesar — kuasai ciw, ci", ci(, ci{, yap.Ctrl+o/Ctrl+i adalah cara tercepat bolak-balik antar lokasi.Sekarang kalian bisa mengedit dengan presisi. Di episode 4 selanjutnya, kita akan membahas Registers, Macros & Efficient Editing — memperdalam sistem penyimpanan sementara Neovim (register ", a-z, 0-9, +), merekam urutan tindakan menjadi macro (qa...q, @a, 10@a), serta menguasai search & replace (:%s/old/new/g) dan dot command (.). Di episode inilah kalian akan merasakan "efisiensi berlipat ganda" yang menjadi janji modal editing. Pastikan tetap semangat!