Belajar Neovim - Operators, Text Objects & Advanced Motions
Episode 3 of 28

Belajar Neovim - Operators, Text Objects & Advanced Motions

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.

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

Pendahuluan

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.

Grammar Operator + Motion

Kata Kerja dan Objek

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.

OperatorFungsiAnalogi
dDelete (hapus)"Potong"
cChange (hapus lalu masuk insert mode)"Potong dan ganti"
yYank (salin ke register)"Fotokopi"
pPut (tempel dari register)"Rekatkan"
uUndo (batalkan)"Batalkan"
Ctrl+rRedo (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).

Kombinasi Operator + Motion

Sekarang gabungkan grammar-nya:

KombinasiArti LiteralHasil
d$delete sampai akhir barisMenghapus sisa baris dari kursor
d0delete sampai awal barisMenghapus bagian awal baris dari kursor
dddelete lineMenghapus seluruh baris saat ini
dwdelete wordMenghapus satu kata ke depan
cwchange wordMenghapus satu kata lalu masuk insert mode
y3wyank 3 wordsMenyalin tiga kata
yyyank lineMenyalin satu baris
y$yank to endMenyalin sampai akhir baris
pputMenempel hasil yank/delete di bawah kursor
Pput (uppercase)Menempel di atas/posisi kursor
ddpswap linesTukar 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.

Contoh Skenario Nyata

Bayangkan baris ini dan kursor berada di awal kata quick:

Baris sebelum
The quick brown fox jumps

Berbagai operasi dengan grammar di atas:

Aksi yang DiinginkanCommandHasil
Hapus "quick "dwThe brown fox jumps
Ganti "quick" jadi "slow"cw lalu ketik slow lalu EscThe slow brown fox jumps
Hapus kata 3 dan 4d3wThe jumps
Hapus seluruh barisddbaris kosong (register berisi baris)
Salin baris lalu tempel di bawahyy lalu pbaris terduplikasi di bawahnya
Tukar dua barisddpposisi 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

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.

Inner (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.

Tabel Text Objects

CommandObjekContoh
ciwinner wordGanti satu kata tanpa menyentuh spasi
cawaround wordGanti kata + spasi di belakangnya
ci"inner double quoteGanti isi dalam "..."
ca"around double quoteGanti "..." beserta kutipnya
ci'inner single quoteIsi dalam '...'
di(inner parenHapus isi dalam ( ... )
da(around parenHapus ( ... ) beserta kurungnya
yaparound paragraphSalin satu paragraf
dipinner paragraphHapus satu paragraf
ci[inner bracketIsi dalam [ ... ]
ci{ / ci}inner bracesIsi dalam { ... }
di<inner angleIsi dalam < ... >
citinner tagIsi dalam tag HTML (<div>...</div>)
dataround tagSeluruh <div>...</div>

Perhatikan polanya: c/d/y + i/a + delimiter. Kata kerja + (inner/around) + objek. Grammar yang sama, ratusan kombinasi.

Kenapa Text Objects Mengubah Hidup

Bandingkan dua cara mengganti isi sebuah string argument:

Mengganti isi string
const user = fetch("/api/users?name=username");
  • Cara lama (modeless): klik di dalam string → select-all di dalam kutip → ketik ulang → klik lagi.
  • Cara Neovim: letakkan kursor di mana saja di dalam string → 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.

Marks & Jump List

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: Menandai Lokasi

Marks adalah "bookmark" yang kalian letakkan manual di dalam file:

CommandFungsi
maTandai posisi saat ini dengan nama a
`aLompat langsung ke posisi mark a
'aLompat ke awal baris mark a
:marksLihat daftar semua mark
d'aHapus hingga baris mark a
:delm aHapus mark a

Marks bisa berupa huruf kecil (az, berlaku per-file) atau huruf besar (AZ, berlaku global antar file). Saat mengedit file besar, kebiasaan "mark lokasi A, pindah ke B, lalu kembali" (ma ... `a) adalah lompatan super cepat.

Jump List: Jejak Navigasi Otomatis

Berbeda dengan marks yang manual, jump list otomatis mencatat setiap lompatan besar yang kalian lakukan (motion jarak jauh, pencarian, lompatan antar file):

CommandFungsi
Ctrl+oKembali ke posisi sebelumnya (out)
Ctrl+iMaju ke posisi berikutnya (in)
:jumpsLihat 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.

Motion Canggih Lainnya

CommandFungsi
giKembali 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)
gfBuka file di bawah kursor (go to file)
gFBuka 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.

Latihan Praktik

Buat file latihan3.txt dan salin baris-baris berikut:

Data latihan
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:

  1. Ganti "budi" jadi "siti" — kursor di mana saja di dalam "budi", tekan ci", ketik siti, Esc.
  2. Hapus ?filter=all — letakkan kursor di ?, tekan d$.
  3. Salin array ke register lalu tempel dua baris di bawahyypp.
  4. Ganti isi fungsi menjadi return a + b; — kursor di dalam { ... }, tekan ci{, ketik return a + b;, Esc.
  5. Latihan marksgg (atas), ma (tandai), G (bawah), lalu `a (kembali).
  6. Latihan jump list — lakukan gg10G$, lalu Ctrl+o dua kali untuk mundur, Ctrl+i untuk maju.
  7. Latihan g;/g, — lakukan 3 perubahan acak, lalu telusuri lokasinya dengan g; dan g,.
  8. Latihan 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.

Kesalahan Umum (Common Pitfalls)

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

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

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

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

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

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

Penutup

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:

  • Neovim adalah grammar: operator + count + motion, konsisten dan bisa ditebak.
  • Text objects (i vs a) adalah pembeda efisiensi terbesar — kuasai ciw, ci", ci(, ci{, yap.
  • Marks untuk posisi manual, jump list untuk jejak otomatis — keduanya saling melengkapi.
  • 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!