Belajar Neovim - Registers, Macros & Efficient Editing
Episode 4 of 28

Belajar Neovim - Registers, Macros & Efficient Editing

Di episode ini kalian masuk level berikutnya: memanfaatkan registers untuk menyimpan dan menempel teks secara presisi, merekam macro untuk mengotomatiskan edit berulang, serta menguasai search & replace dengan flags dan capture group.

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

Pendahuluan

Setelah di episode 3 sebelumnya kita membahas operators, text objects, dan advanced motions — merakit grammar operator + motion dan menguasai text objects (ci", di(, yap) — pada episode kali ini kita naik ke level berikutnya: efisiensi berulang. Dua alat paling ampuh untuk itu adalah registers (penyimpanan sementara) dan macros (perekam otomatisasi), ditambah search & replace yang canggih.

Mengapa ini penting? Di episode 3 kalian sudah bisa mengedit dengan presisi — tapi masih satu-satu. Di dunia nyata, kalian sering harus mengulang pola yang sama puluhan kali: mengubah format 30 string, menambah prefix ke 50 baris, memperbaiki nama variabel di 20 tempat. Melakukan itu manual adalah resep kelelahan dan error. Registers dan macros mengubah pekerjaan repetitif menjadi otomatis — inilah janji "efisiensi berlipat ganda" yang menjadi alasan orang bertahan dengan modal editing.

Ada juga satu detail krusial di episode ini: clipboard. Register + menghubungkan Neovim dengan system clipboard — kalian akan belajar menyalin dari Neovim dan menempel di luar (browser, aplikasi lain), dan sebaliknya.

Registers

Registers adalah tempat penyimpanan sementara di Neovim. Setiap kali kalian menghapus (d) atau menyalin (y), isinya otomatis masuk ke register. Registers memberi kalian kendali penuh atas apa yang disimpan dan dari mana.

Jenis-jenis Register

RegisterNamaIsiContoh
"Unnamed registerHasil d/y/c terakhir (default)p memakai ini
0Yank registerHasil y terakhir (khusus yank, tidak tertimpa d)"0p
19Delete registerRiwayat 9 operasi delete/change terakhir"1p, "2p
azNamed registerPenyimpanan manual kalian"ay, "ap
+System clipboardClipboard OS (Ctrl+C/Ctrl+V)"+y, "+p
-Small deleteDelete kurang dari satu baris"-p
_Black hole"Tempat sampah" — hapus tanpa menyimpan"_d
/Search registerPola pencarian terakhir:echo @/
%File registerNama file yang sedang dibuka:echo @%

Warning

p tidak selalu menempel apa yang kalian yank. Default p memakai unnamed register ("), yang akan tertimpa oleh operasi delete apa pun setelah yank. Inilah sumber frustrasi klasik: yy lalu dd baris lain lalu p — yang muncul adalah baris yang di-delete, bukan yang di-yank. Solusinya: gunakan register 0 ("0p) yang khusus menyimpan hasil yank terakhir.

Menyimpan & Menempel dari Register

Syntax-nya konsisten: " + nama register + operator.

Menulis & membaca register
"ay    yank baris ini ke register a
"ap    paste isi register a setelah kursor
"aP    paste isi register a sebelum kursor
"+y    yank ke system clipboard
"+p    paste dari system clipboard
"0p    paste hasil yank terakhir (tidak tertimpa delete)

Melihat & Mengubah Register

Command :reg menampilkan seluruh isi register saat ini:

Output :reg
:reg
--- Registers ---
""   The quick brown fox
"0   The quick brown fox
"1   const name = "budi"
"a   lorem ipsum dolor
"+   teks dari clipboard

Untuk mengubah isi register secara langsung (tanpa yank):

Mengubah isi register
:let @a = "nilai baru"
:echo @a        # menampilkan "nilai baru"

@a adalah sintaks untuk mengakses nilai register a sebagai string. Ini berguna untuk mengeset register secara programatik — bahkan :let @+ = "..." mengubah clipboard langsung.

Tip

Register 0 adalah teman terbaik kalian. Setelah yy, kalian bisa melakukan operasi apa pun (hapus, ubah) tanpa kehilangan hasil yank — tinggal panggil "0p. Ini menghilangkan 90% masalah "yank hilang" yang dialami pemula.

Macros (Recording)

Macro adalah rekaman urutan tindakan yang bisa diputar ulang. Inilah alat otomatisasi paling penting untuk edit repetitif — setara "record & replay" di dunia editor.

Merekam Macro

Alur rekaman macro: q + nama (a-z) → lakukan aksi → q (stop).

Workflow rekaman macro
qa        mulai merekam ke register a
...       lakukan urutan tindakan apapun (motion, edit, dll)
q         stop rekaman

Menjalankan macro:

Menjalankan macro
@a        jalankan macro a sekali
@@        jalankan macro terakhir dijalankan
10@a      jalankan macro a sebanyak 10 kali

Important

Ingin mengulang edit hingga selesai tanpa menghitung? Cukup 999@a — Neovim berhenti otomatis ketika tidak ada lagi yang bisa dikerjakan (misalnya macro mencapai akhir baris/file dan motion tidak bisa dilanjutkan). Ini trik favorit vimmer untuk edit repetitif tanpa perlu menghitung jumlah pengulangan.

Studi Kasus: Transformasi Banyak Baris

Contoh paling klasik — mengubah format daftar menjadi deklarasi. Kita punya daftar nama:

Data awal
budi
siti
agung

Kita ingin hasil akhirnya menjadi:

Target
name = "budi"
name = "siti"
name = "agung"

Tanpa macro ini pekerjaan 9 langkah manual (edit tiap baris satu-satu). Dengan macro:

Rekaman macro transformasi
qa              mulai rekam
I               masuk insert mode di awal baris
name = "        ketik prefix + buka kutip
Esc             kembali ke normal mode (kursor di awal kata)
e               lompat ke akhir kata (sebelum spasi)
a"              append setelah kata (menutup kutip)
Esc             kembali ke normal mode
j               pindah ke baris berikutnya
q               stop rekam

Sekarang jalankan macro di dua baris sisanya:

Menjalankan macro berulang
@a    # baris ke-2 jadi "name = \"siti\""
@@   # baris ke-3 jadi "name = \"agung\""

Kuncinya: macro harus berakhir di posisi yang siap untuk iterasi berikutnya (di sini, kita akhiri dengan j untuk turun ke baris berikutnya). Inilah seni merekam macro — mengakhiri dengan gerakan yang membuat macro bisa diulang.

Tip

Rekam macro yang berakhir di posisi tidak siap, dan edit di tengah-tengah macro. Macro bisa diputar ulang di tengah posisi manapun, dan bahkan bisa direkam ulang untuk memperbaiki kesalahan: mulai qa, lakukan ulang dengan benar, q lagi — register a tertimpa dengan versi terbaru. Jangan takut salah rekam; rekam ulang itu mudah.

Teknik Macro Lanjutan

  1. Macro + text objects = kombinasi paling eksplosif. Rekam ci" di dalam macro, dan macro akan mengganti isi semua string dengan pola yang sama.
  2. Macro di akhir file: 999@a otomatis berhenti saat motion tidak bisa dilanjutkan.
  3. Cek isi macro: :reg a menampilkan rekaman. Macro tersimpan sebagai teks — kalian bahkan bisa mengeditnya manual!
  4. Panggil macro lintas buffer: macro disimpan di register, jadi @a tetap tersedia saat pindah file.

Search & Replace

Substitusi :s

Perintah substitusi adalah: :s/<pola>/<pengganti>/<flags>. Dengan % sebelum s, substitusi berlaku ke seluruh file.

Contoh substitusi
:%s/budi/siti/g        # ganti semua "budi" jadi "siti" di seluruh file
:%s/budi/siti/gc       # sama, tapi konfirmasi tiap penggantian
:s/budi/siti/          # hanya baris saat ini saja, kemunculan pertama
FlagFungsi
gGanti semua kemunculan per baris (bukan hanya yang pertama)
cKonfirmasi tiap penggantian (y ya, n tidak, a semua, q berhenti)
iIgnore case (case-insensitive)
ICase-sensitive (kebalikan)
nHitung jumlah kemunculan tanpa mengganti
eJangan tampilkan error jika tidak ada yang cocok

Warning

Jangan lupa flag g. Tanpa g, :%s/foo/bar/ hanya mengganti kemunculan pertama di tiap baris. Ini kesalahan paling umum pemula — seolah "setengah berhasil" mengganti. Selalu tambahkan g kecuali ada alasan spesifik. Saat meragukan dampak, tambahkan c untuk konfirmasi.

Karakter Spesial & Capture Group

Untuk mengganti karakter yang bermakna di regex (seperti ., [, *), escape dengan \:

Escaping karakter spesial
:%s/\./->/g    # ganti semua titik menjadi -> (titik di-escape)

Capture group \(...\) (dan rujukan \1) memungkinkan menangkap bagian dari pola dan memakainya ulang di pengganti:

Capture group \1
:%s/\(budi\)/\1@example.com/g    # "budi" → "budi@example.com"
:%s/\(name=\) "\(.*\)"/\1'\2'/g  # ubah kutip ganda jadi kutip tunggal

Contoh nyata kedua di atas adalah transformasi yang sangat sering dipakai saat mengubah gaya kutipan: pola menangkap name= dan isinya (\1, \2), lalu menyusun ulang dengan kutip tunggal.

Tip

Gunakan flag n dulu untuk menghitung berapa banyak yang akan berubah sebelum benar-benar mengganti: :%s/foo/bar/gn. Ini "dry run" yang mencegah kejutan. Setelah yakin, baru jalankan versi dengan gc.

Dot Command (.)

Dot command mengulang perubahan terakhir — trik kecil yang kekuatannya luar biasa. Setelah sebuah perubahan (misal ciw mengganti satu kata), tekanan . mengulangnya persis di posisi kursor sekarang.

Workflow dot command
# Ganti "merah" jadi "biru":
ciw biru Esc      # perubahan pertama
.                 # ulangi di kata berikutnya
.                 # dan lagi...

Gabungkan dengan n (hasil pencarian berikutnya): /merahciwbiruEscn.n. — mengganti semua "merah" dengan 2 tombol per kemunculan. Ini teknik "n-dot" yang sangat disukai komunitas.

Note

Pilihan alat yang tepat untuk pekerjaan repetitif: gunakan dot command untuk mengulang perubahan sederhana yang jarang (misal mengganti 5 kata), dan macro untuk urutan multi-langkah yang kompleks (misal mengubah format seluruh baris). Untuk penggantian pola yang terdefinisi jelas, :%s adalah yang paling tepat. Pahami kapan memakai yang mana — itu yang membedakan engineer efisien.

Latihan Praktik

Buat file latihan4.txt dengan isi:

Data latihan
apple;merah;buah
banana;kuning;buah
carrot;orange;sayur
grape;ungu;buah

Kerjakan dengan Neovim:

  1. Latihan yank & register. yy lalu "0p dan "1p — bandingkan hasilnya. Lalu "+y untuk menyalin ke clipboard OS.
  2. Latihan register named. "ay satu baris, "by baris lain, lalu "ap dan "bp di tempat berbeda.
  3. Latihan macro. Rekam macro yang mengubah baris apple;merah;buah menjadi nama=apple warna=merah jenis=buah (ganti ; menjadi spasi, tambahkan prefix nama=, warna=, jenis=). Jalankan dengan @a di semua baris (bisa 999@a).
  4. Latihan search & replace. Ubah semua buah menjadi fruit dengan :%s/buah/fruit/g. Lalu dengan c untuk konfirmasi: :%s/banana/pisang/gc.
  5. Latihan capture group. Ubah apple;merah menjadi apple (merah) dengan :%s/\(apple\);\(merah\)/\1 (\2)/g.
  6. Latihan dot command. Ganti appleapel di semua baris menggunakan teknik n + . (cari dengan /apple, lalu ciw, ketik, Esc, n, ., ulangi).

Tip

Jika macro kalian berantakan, jangan panik: tekan u untuk undo, perbaiki rekaman, lalu qa lagi. Macro adalah eksperimen — tidak ada yang menghakimi isi register a kalian. Praktik membuatnya presisi.

Kesalahan Umum (Common Pitfalls)

  1. p menempel barang yang salah (register " tertimpa). Setelah yank, jangan lakukan delete sebelum p. Gunakan "0p untuk yank terakhir yang anti-tertimpa.

  2. Lupa mengakhiri macro dengan q. Sering terjadi: mulai qa, selesai aksi, tapi lupa menekan q lagi. Akibatnya semua yang kalian ketik berikutnya ikut terekam. Jika kursor tiba-tiba "aneh" saat mengetik, cek dengan :reg a.

  3. Macro berakhir di posisi yang salah. Jika macro diakhiri di posisi yang tidak siap untuk baris berikutnya (misal tanpa j), iterasi berikutnya tidak akan berjalan benar. Aturan emas: akhiri macro dengan gerakan yang mempersiapkan iterasi berikutnya.

  4. :%s tanpa g. Hanya mengganti kemunculan pertama per baris. Selalu g kecuali ada alasan.

  5. Kesulitan mengganti karakter spesial (., /, [, *). Di pola substitusi, karakter regex harus di-escape dengan \. Jika :%s/./x/g mengganti seluruh karakter (bukan titik), itu karena . berarti "karakter apa pun" dalam regex. Escape menjadi \. untuk titik literal.

  6. Lupa menyimpan setelah perubahan. :w sebelum :q — atau langsung :wq / :x.

Penutup

Di episode 4 ini kalian telah membuka gerbang efisiensi berulang: menguasai registers (", 0, 1-9, a-z, +) untuk penyimpanan presisi, merekam macros (qa...q, @a, @@, 999@a) untuk otomatisasi edit repetitif, menguasai search & replace (:%s/old/new/g dengan flags c, i, capture group \1), serta dot command (.) untuk mengulang perubahan terakhir.

Poin penting yang harus kalian bawa:

  • Registers memberi kendali atas apa yang disimpan dan ditempel; "0p menyelamatkan hasil yank, "+y/"+p menghubungkan ke clipboard OS.
  • Macros mengubah pekerjaan repetitif menjadi satu kali rekam; akhiri macro di posisi yang siap untuk iterasi berikutnya.
  • :%s/old/new/g dengan flag yang tepat, capture group \1, dan dry-run n mencegah penggantian yang keliru.
  • Dot command adalah cara paling ringkas mengulang perubahan sederhana.

Dengan ini, Fase 1 — Fundamentals of Modal Editing dari series ini resmi selesai: kalian sudah punya fondasi lengkap (setup, sejarah, mode & navigasi, operators & text objects, serta registers & macros). Di episode 5 selanjutnya, kita memasuki Fase 2 — Mengelola Buffer, Window & Tab: memahami tiga komponen layout Neovim, membagi layar dengan split window (:split, :vsplit), serta berpindah-pindah antar buffer (:bnext, :bdelete). Pastikan tetap semangat, karena dari sini kalian mulai membangun "workspace" kerja yang sesungguhnya di atas fondasi yang sudah kalian kuasai!