Vim dan Neovim itu editor modal. Jadi alih-alih pakai mouse untuk semua hal, kamu bakal mengombinasikan mode, motion, operator, dan text object buat edit teks dengan cepat.

Cheatsheet ini didesain buat kerjaan development sehari-hari — panduan praktis yang bisa kamu bookmark dan buka lagi kapan saja.


Konsep Utama

Perintah Vim biasanya dibangun dengan pola seperti ini:

operator + motion

Contohnya:

dw      " hapus kata (delete word)
d$      " hapus sampai akhir baris
ciw     " ubah kata tempat kursor berada (change inside word)
yap     " salin satu paragraf (yank around paragraph)

Kamu juga bisa menambahkan jumlah (count):

3w      " maju 3 kata
d3w     " hapus 3 kata
5j      " turun 5 baris

Mindset paling penting:

Jangan dihafal semuanya sekaligus. Pelajari motion dulu, lalu operator, baru kemudian text object.


Mode

ModeArtiCara MasukCara Keluar
NormalNavigasi dan jalankan perintahEsc-
InsertKetik teksi, a, oEsc
VisualPilih/blok teksvEsc
Visual LinePilih seluruh barisVEsc
Visual BlockPilih kolom/blok vertikalCtrl-vEsc
Command-lineJalankan perintah Ex:Enter / Esc
ReplaceTimpa teks yang adaREsc
Terminal NormalKontrol buffer terminalCtrl-\\ Ctrl-n-

TombolAksi
hGeser ke kiri
jGeser ke bawah
kGeser ke atas
lGeser ke kanan
gjGeser ke bawah berdasarkan baris visual (saat line wrap aktif)
gkGeser ke atas berdasarkan baris visual (saat line wrap aktif)

Gunakan count:

10j     " turun 10 baris
5l      " geser ke kanan 5 karakter

TombolAksi
wLompat ke awal kata berikutnya
WLompat ke awal WORD berikutnya (dipisahkan oleh spasi)
eLompat ke akhir kata berikutnya
ELompat ke akhir WORD berikutnya
bLompat mundur ke awal kata
BLompat mundur ke awal WORD
geLompat mundur ke akhir kata sebelumnya
gELompat mundur ke akhir WORD sebelumnya

Perbedaan antara word dan WORD:

hello.world example
  • w menganggap tanda baca (seperti titik) sebagai pemisah kata.
  • W hanya menganggap spasi sebagai pemisah kata.

TombolAksi
0Lompat ke awal baris (kolom pertama)
^Lompat ke karakter pertama yang bukan spasi
$Lompat ke akhir baris
g_Lompat ke karakter terakhir yang bukan spasi
+Lompat ke awal baris berikutnya yang bukan spasi
-Lompat ke awal baris sebelumnya yang bukan spasi
ggLompat ke awal file
GLompat ke akhir file
42GLompat ke baris nomor 42
:42Lompat ke baris nomor 42

TombolAksi
Ctrl-dTurun setengah halaman
Ctrl-uNaik setengah halaman
Ctrl-fTurun satu halaman penuh
Ctrl-bNaik satu halaman penuh
ztPosisikan baris aktif di paling atas layar
zzPosisikan baris aktif di tengah layar
zbPosisikan baris aktif di paling bawah layar
HLompat ke baris paling atas layar (High)
MLompat ke baris tengah layar (Middle)
LLompat ke baris paling bawah layar (Low)

Pencarian dan Navigasi Hasil

TombolAksi
/teksCari teks ke arah depan
?teksCari teks ke arah belakang
nLompat ke hasil pencarian berikutnya
NLompat ke hasil pencarian sebelumnya
*Cari kata di bawah kursor ke arah depan
#Cari kata di bawah kursor ke arah belakang
g*Cari kata parsial di bawah kursor ke arah depan
g#Cari kata parsial di bawah kursor ke arah belakang

Opsi pencarian yang berguna:

:set ignorecase      " cari tanpa sensitif huruf besar/kecil
:set smartcase       " jadi sensitif kalau kamu ngetik huruf kapital
:set hlsearch        " aktifkan highlight hasil pencarian
:set nohlsearch      " matikan highlight hasil pencarian
:noh                 " hapus highlight pencarian aktif saat ini

Pencarian Karakter: f, F, t, T

Pencarian karakter ini berguna banget buat navigasi cepat dalam satu baris.

TombolAksi
f<char>Lompat maju ke karakter yang dituju
F<char>Lompat mundur ke karakter yang dituju
t<char>Lompat maju sampai sebelum karakter yang dituju (till)
T<char>Lompat mundur sampai setelah karakter yang dituju
;Ulangi pencarian f, F, t, atau T sebelumnya
,Ulangi pencarian sebelumnya tapi dengan arah berlawanan

Contoh baris kode:

const user = { name: "Pian", age: 31 };

Lompat ke {

f{

Ini bakal mindahin kursor maju tepat di atas karakter {.

Lompat sebelum {

t{

Ini bakal mindahin kursor maju satu karakter sebelum {.

Hapus sampai sebelum {

dt{

Sebelum:

const user = { name: "Pian", age: 31 };

Sesudah:

{ name: "Pian", age: 31 };

Hapus termasuk {

df{

Ini bakal menghapus teks dari posisi kursor sampai karakter {.

Ubah teks di dalam kurung kurawal

ci{

Ini bakal menghapus isi di dalam { ... } dan langsung masuk ke mode Insert.

Hapus beserta kurung kurawal

da{

Ini bakal menghapus { ... } beserta seluruh isinya.


Operator

Operator adalah aksi yang dijalankan. Biasanya butuh motion atau text object setelahnya.

OperatorArti
dHapus / potong (delete/cut)
cUbah / hapus lalu masuk ke mode Insert (change)
ySalin (yank/copy)
vBlok teks secara visual (visual select)
>Geser indentasi ke kanan
<Geser indentasi ke kiri
=Auto-format indentasi
gqFormat teks (wrap text)
guUbah ke huruf kecil semua
gUUbah ke huruf besar semua
~Toggle huruf besar/kecil (lowercase <-> uppercase)

Kalau operator diketik dua kali, aksinya bakal diterapkan ke baris aktif saat ini:

PerintahAksi
ddHapus satu baris
ccUbah satu baris
yySalin satu baris
>>Geser indentasi baris ke kanan
<<Geser indentasi baris ke kiri
==Auto-format indentasi baris aktif
gUUUbah satu baris jadi huruf besar
guuUbah satu baris jadi huruf kecil

Contoh Kombinasi Operator + Motion

PerintahAksi
dwHapus sampai awal kata berikutnya
dWHapus sampai awal WORD berikutnya
deHapus sampai akhir kata aktif
dbHapus mundur sampai awal kata
d$Hapus sampai akhir baris
d0Hapus mundur sampai awal baris
d^Hapus mundur sampai karakter pertama yang bukan spasi
dggHapus dari kursor sampai awal file
dGHapus dari kursor sampai akhir file
cwUbah sampai awal kata berikutnya
c$Ubah sampai akhir baris
ciwUbah kata tempat kursor berada
ci"Ubah teks di dalam tanda kutip dua
ci'Ubah teks di dalam tanda kutip satu
ci(Ubah teks di dalam tanda kurung
ci{Ubah teks di dalam kurung kurawal
y$Salin sampai akhir baris
yGSalin dari kursor sampai akhir file
gUiwUbah kata aktif jadi huruf besar
guwUbah kata berikutnya jadi huruf kecil

Text Object

Text object memungkinkan kamu buat memanipulasi struktur teks yang bermakna.

operator + i/a + object
  • i berarti inside (di dalam objek saja).
  • a berarti around (termasuk karakter pembungkus atau spasi di sekitarnya).
Text ObjectArti
iwDi dalam kata (inside word)
awSeluruh kata beserta spasinya (around word)
isDi dalam kalimat (inside sentence)
asSeluruh kalimat (around sentence)
ipDi dalam paragraf (inside paragraph)
apSeluruh paragraf (around paragraph)
i"Di dalam tanda kutip dua
a"Seluruh tanda kutip dua beserta isinya
i'Di dalam tanda kutip satu
a'Seluruh tanda kutip satu beserta isinya
i`Di dalam backticks
a`Seluruh backticks beserta isinya
i( atau ibDi dalam tanda kurung
a( atau abSeluruh tanda kurung beserta isinya
i[Di dalam kurung siku
a[Seluruh kurung siku beserta isinya
i{ or iBDi dalam kurung kurawal
a{ or aBSeluruh kurung kurawal beserta isinya
itDi dalam tag HTML/XML (inside tag)
atSeluruh tag HTML/XML beserta isinya

Contoh penggunaan:

ciw     " ubah kata tempat kursor berada
daw     " hapus kata beserta spasinya
yi"     " salin isi di dalam kutip dua
da"     " hapus kutip dua beserta seluruh isinya
ci{     " ubah isi di dalam kurung kurawal
ya(     " salin seluruh kurung beserta isinya
vit     " blok visual isi di dalam tag HTML

Contoh kasus:

const message = "Hello world";

Jalankan perintah ini saat kursor di dalam kata “Hello”:

ci"

Hasilnya:

const message = "|";

Kursor kamu langsung masuk ke mode Insert di dalam tanda kutip.


Shortcut Mode Insert

TombolAksi
iMasuk mode Insert sebelum posisi kursor
IMasuk mode Insert di awal baris (karakter non-spasi pertama)
aMasuk mode Insert setelah posisi kursor (append)
AMasuk mode Insert di akhir baris
oBuka baris baru di bawah baris aktif lalu masuk mode Insert
OBuka baris baru di atas baris aktif lalu masuk mode Insert
sHapus satu karakter di kursor lalu masuk mode Insert
SHapus seluruh baris lalu masuk mode Insert
CHapus sampai akhir baris lalu masuk mode Insert
r<char>Ganti satu karakter di kursor dengan karakter baru
RMasuk mode Replace (menimpa teks)

Ketika berada di dalam mode Insert:

KombinasiAksi
Ctrl-hBackspace (hapus satu karakter ke belakang)
Ctrl-wHapus satu kata ke belakang
Ctrl-uHapus sampai awal baris
Ctrl-oJalankan satu perintah mode Normal, lalu otomatis balik ke mode Insert
Ctrl-r <register>Tempel/paste isi dari register tertentu
Ctrl-nAutocomplete kata berikutnya
Ctrl-pAutocomplete kata sebelumnya

Contoh penggunaan:

Ctrl-o zz

Saat lagi ngetik di mode Insert, perintah ini bakal memposisikan baris aktif ke tengah layar tanpa perlu keluar dari mode Insert.


Mengedit Teks

TombolAksi
xHapus karakter di bawah kursor
XHapus karakter di belakang kursor
sHapus karakter di kursor lalu masuk mode Insert
SHapus satu baris penuh lalu masuk mode Insert
r<char>Timpa satu karakter di kursor
JGabungkan baris aktif dengan baris di bawahnya
gJGabungkan baris tanpa menambahkan spasi pemisah
.Ulangi aksi perubahan terakhir
uUndo (batalkan aksi)
Ctrl-rRedo (ulangi aksi yang dibatalkan)

Contoh penggunaan:

ciwhello<Esc>   " ganti kata aktif jadi 'hello'
A;<Esc>         " tambahkan titik koma di akhir baris
J               " gabungkan baris berikutnya ke baris aktif

Copy, Cut, dan Paste

TombolAksi
ySalin (yank) dengan motion
yySalin satu baris aktif
YSalin sampai akhir baris (di kebanyakan konfigurasi; di Vim/Neovim modern defaultnya sama dengan yy kecuali diubah)
dHapus/potong (delete/cut) dengan motion
ddHapus/potong satu baris aktif
pTempel (paste) setelah kursor atau di bawah baris aktif
PTempel (paste) sebelum kursor atau di atas baris aktif
gpTempel teks lalu taruh kursor setelah teks tempelan tersebut
gPTempel teks sebelum kursor lalu taruh kursor setelah teks tempelan tersebut

Contoh penggunaan:

yy      " salin baris aktif
3yy     " salin 3 baris
dd      " hapus baris aktif
3dd     " hapus 3 baris
p       " tempel di bawah
P       " tempel di atas

Register

Register itu tempat penyimpanan sementara buat teks yang kamu salin atau hapus.

RegisterArti
"Register default (unnamed register)
0Register hasil salin (yank) terakhir
1-9Register riwayat penghapusan (delete history)
+Clipboard sistem operasi
*Clipboard seleksi sistem (di beberapa OS)
_Register lubang hitam (black hole); hapus tanpa menyimpannya ke clipboard
%Nama file aktif saat ini
.Teks terakhir yang dimasukkan
:Perintah command-line terakhir yang dijalankan

Cara pakai register:

"+y     " salin teks ke clipboard sistem OS
"+p     " tempel teks dari clipboard sistem OS
"_d     " hapus teks tanpa menimpa register default
"0p     " tempel teks hasil salinan terakhir, bukan hasil hapusan terakhir

Contoh praktis:

"+yy    " salin baris aktif ke clipboard komputer kamu
"_dd    " hapus satu baris tanpa merusak teks yang udah kamu salin sebelumnya
"0p     " tempel teks yang terakhir kamu salin (bukan teks yang terakhir kamu hapus)

Undo dan Redo

TombolAksi
uUndo
Ctrl-rRedo
UKembalikan baris aktif ke kondisi awal sebelum kursor pindah
:earlier 5mKembalikan file ke kondisi 5 menit yang lalu
:later 5mMajukan file ke kondisi 5 menit setelahnya

Aktifkan riwayat undo yang persisten di konfigurasi:

set undofile

Neovim dengan Lua:

vim.opt.undofile = true

Mode Visual

TombolAksi
vBlok teks per karakter
VBlok teks per baris
Ctrl-vBlok teks secara kolom/vertikal (block-wise)
oPindahkan kursor ke ujung blok seleksi lainnya
gvBlok ulang area seleksi visual terakhir
ySalin area yang diblok
dHapus area yang diblok
cUbah area yang diblok
>Geser indentasi area blok ke kanan
<Geser indentasi area blok ke kiri
=Auto-format indentasi area blok

Contoh penggunaan Visual Block:

Ctrl-v
j/j/k/k untuk memblok beberapa baris ke bawah
I// <Esc>

Ini bakal menambahkan komentar // di awal semua baris yang diblok secara bersamaan.

Menambahkan sesuatu di akhir baris secara masal:

Ctrl-v
blok beberapa baris
A; <Esc>

Ini bakal menambahkan karakter ; di akhir semua baris yang diblok secara bersamaan.


Indentasi

TombolAksi
>>Geser indentasi baris aktif ke kanan
<<Geser indentasi baris aktif ke kiri
>}Geser indentasi sampai paragraf berikutnya
<}Kurangi indentasi sampai paragraf berikutnya
=}Auto-format indentasi sampai paragraf berikutnya
gg=GAuto-format indentasi seluruh file dari atas sampai bawah

Di Mode Visual:

>       " geser indentasi seleksi ke kanan
<       " geser indentasi seleksi ke kiri
=       " auto-format indentasi seleksi

Komentar Code

Secara default, Vim gak punya shortcut komentar bawaan yang otomatis paham semua bahasa pemrograman. Berikut cara mengakalinya:

Cara manual bawaan Vim

I// <Esc>       " tambah // di awal baris aktif

Untuk banyak baris sekaligus:

Ctrl-v
blok baris yang mau dikomentari
I// <Esc>

Menggunakan Plugin

Kebanyakan pengguna Neovim menggunakan plugin komentar seperti numToStr/Comment.nvim atau sejenisnya.

Shortcut bawaan plugin yang umum:

PerintahAksi
gccPasang/lepas komentar pada baris aktif
gc (Mode Visual)Pasang/lepas komentar pada teks yang diblok
gc{motion}Pasang/lepas komentar berdasarkan motion

Contoh:

gcc     " komentari/uncomment baris aktif saat ini
gcip    " komentari/uncomment seluruh isi paragraf

Cari dan Ganti (Search & Replace)

Format dasar penggantian teks:

:s/teks_lama/teks_baru/

Ini bakal mengganti kecocokan pertama di baris aktif saja.

Ganti semua kecocokan di baris aktif saja:

:s/teks_lama/teks_baru/g

Ganti semua kecocokan di seluruh file:

:%s/teks_lama/teks_baru/g

Ganti dengan konfirmasi satu per satu:

:%s/teks_lama/teks_baru/gc

Ganti hanya pada baris yang diblok saja:

:'<,'>s/teks_lama/teks_baru/g

Flag yang sering digunakan:

FlagArti
gGanti semua kecocokan di setiap baris (global)
cMinta konfirmasi sebelum mengganti (confirm)
iAbaikan sensitivitas huruf kapital (ignore case)
IPaksa sensitif huruf kapital (case-sensitive)
nHitung jumlah kecocokan tanpa mengganti teksnya

Contoh kasus:

:%s/console.log/logger.info/g
:%s/\<user\>/customer/gc
:%s/foo/bar/gn

Karakter spesial saat mengganti teks:

SimbolArti
&Seluruh teks yang cocok
\1, \2Capture group hasil regex pencarian
\rMembuat baris baru (newline) pada teks pengganti
\=Menggunakan ekspresi evaluasi teks pengganti

Contoh pakai capture group:

:%s/\(first\)_\(name\)/\1Name/g

Perintah Global (:g)

Perintah global menjalankan perintah Ex pada semua baris yang cocok dengan pola pencarian.

:g/pola/perintah

Contoh:

:g/TODO/p          " cetak semua baris yang ada tulisan TODO
:g/TODO/d          " hapus semua baris yang ada tulisan TODO
:g/^$/d            " hapus semua baris kosong
:g/import/s/foo/bar/g
:v/TODO/d          " hapus semua baris yang GAK ada tulisan TODO

Contoh pola praktis:

:g/^import/normal A;      " tambahkan titik koma di akhir semua baris import
:g/console.log/d          " hapus semua baris yang berisi console.log
:g/TODO/t$                " salin semua baris TODO ke bagian paling bawah file

File dan Buffer

PerintahAksi
:e fileEdit / buka file baru
:edit fileEdit / buka file baru
:wSimpan file (write)
:w nama_fileSimpan sebagai nama file baru
:waSimpan semua buffer aktif (write all)
:qKeluar (quit)
:q!Keluar paksa tanpa menyimpan perubahan
:wqSimpan perubahan lalu keluar
:xSimpan jika ada perubahan, lalu keluar
ZZSimpan jika ada perubahan, lalu keluar (mode Normal)
ZQKeluar tanpa simpan (mode Normal)
:r fileBaca isi file lain dan masukkan ke baris aktif
:r !cmdJalankan perintah bash lalu masukkan hasilnya ke baris aktif

Contoh penggunaan:

:e src/index.ts
:w
:q
:wq
:r package.json
:r !date

Buffer

Buffer adalah file yang sedang terbuka di memori.

PerintahAksi
:ls or :buffersTampilkan daftar buffer yang terbuka
:bnext or :bnPindah ke buffer berikutnya
:bprevious or :bpPindah ke buffer sebelumnya
:buffer 3 or :b 3Pindah ke buffer nomor 3
:b nama_filePindah ke buffer berdasarkan nama filenya
:bdTutup buffer aktif (buffer delete)
:bd!Tutup paksa buffer aktif
:bufdo commandJalankan perintah ke semua buffer yang terbuka

Shortcut mapping yang direkomendasikan di config:

nnoremap <leader>bn :bnext<CR>
nnoremap <leader>bp :bprevious<CR>
nnoremap <leader>bd :bd<CR>

Di Neovim menggunakan Lua:

vim.keymap.set("n", "<leader>bn", ":bnext<CR>")
vim.keymap.set("n", "<leader>bp", ":bprevious<CR>")
vim.keymap.set("n", "<leader>bd", ":bd<CR>")

Windows / Splits

Window adalah area visual untuk melihat isi buffer.

PerintahAksi
:split or :spBagi layar secara horizontal
:vsplit or :vspBagi layar secara vertikal
Ctrl-w sBagi layar secara horizontal
Ctrl-w vBagi layar secara vertikal
Ctrl-w hPindah fokus ke split sebelah kiri
Ctrl-w jPindah fokus ke split bagian bawah
Ctrl-w kPindah fokus ke split bagian atas
Ctrl-w lPindah fokus ke split sebelah kanan
Ctrl-w wPindah fokus antar split secara bergantian
Ctrl-w qTutup split yang aktif saat ini
Ctrl-w oTutup split lainnya, sisakan split aktif (only)
Ctrl-w =Buat ukuran semua split sama rata
Ctrl-w _Maksimalkan tinggi split aktif
`Ctrl-w`
Ctrl-w +Perbesar tinggi split aktif
Ctrl-w -Perkecil tinggi split aktif
Ctrl-w >Perlebar split aktif
Ctrl-w <Persempit split aktif

Membuka file langsung di split baru:

:sp src/index.ts
:vsp src/index.ts

Tab

Di Vim, tab itu kumpulan susunan window, bukan file tab seperti pada IDE modern.

PerintahAksi
:tabnewBuka tab baru
:tabnew fileBuka file di tab baru
:tabnext or gtPindah ke tab berikutnya
:tabprevious or gTPindah ke tab sebelumnya
:tabcloseTutup tab aktif
:tabonlyTutup tab lainnya
:tabsDaftar semua tab yang terbuka

Mark

Mark membantumu menandai posisi penting agar bisa lompat ke sana lagi dengan cepat.

TombolAksi
maTandai posisi saat ini sebagai mark lokal a
`aLompat tepat ke posisi mark a
'aLompat ke awal baris mark a
mATandai posisi saat ini sebagai mark global A
`ALompat ke mark global A (bisa antar file)
:marksTampilkan semua daftar mark
`.Lompat ke lokasi perubahan terakhir
`\"Lompat ke posisi kursor terakhir saat file ditutup
`[Lompat ke awal teks yang terakhir diubah/disalin
`]Lompat ke akhir teks yang terakhir diubah/disalin

Contoh penggunaan:

ma      " simpan posisi saat ini ke mark a
G       " lompat ke baris paling bawah file
`a      " lompat balik ke posisi awal tadi secara presisi

Jumps dan List Perubahan (Change List)

TombolAksi
Ctrl-oLompat mundur di daftar riwayat lompatan (jump list)
Ctrl-iLompat maju di daftar riwayat lompatan
:jumpsTampilkan riwayat lompatan
g;Lompat mundur ke riwayat perubahan teks sebelumnya
g,Lompat maju ke riwayat perubahan teks berikutnya
:changesTampilkan riwayat perubahan teks

Berguna banget setelah kamu selesai nyari teks, cari definisi fungsi, atau pindah-pindah file.


Macro

Macro digunakan untuk merekam serangkaian aksi lalu memutarnya kembali secara otomatis.

TombolAksi
qaMulai merekam ke register a
qBerhenti merekam
@aJalankan macro dari register a
@@Jalankan ulang macro yang terakhir kali dipakai
10@aJalankan macro a sebanyak 10 kali

Contoh kasus: menambahkan titik koma ; di akhir baris berurutan.

  1. Taruh kursor di baris pertama.
  2. Rekam macro:
qaA;<Esc>jq
  1. Jalankan 10 kali ke baris berikutnya:
10@a

Penjelasan langkah perekaman:

LangkahArti
qaMulai rekam ke register a
A;Masuk ke akhir baris lalu ketik ;
<Esc>Kembali ke mode Normal
jPindah ke baris di bawahnya
qBerhenti merekam

Folds (Melipat Teks)

Folds digunakan untuk menyembunyikan/melipat bagian teks biar kode terlihat lebih rapi.

TombolAksi
zaToggle lipatan (buka/tutup lipatan)
zoBuka lipatan (open)
zcTutup lipatan (close)
zRBuka seluruh lipatan di file (open all)
zMTutup seluruh lipatan di file (close all)
zjPindah ke lipatan berikutnya
zkPindah ke lipatan sebelumnya

Mengatur metode pelipatan (fold method):

:set foldmethod=indent
:set foldmethod=syntax
:set foldmethod=marker

Contoh metode marker:

// {{{ Helper Auth
function login() {}
function logout() {}
// }}}

Quickfix dan Location List

Quickfix berguna untuk melacak error se-project, hasil pencarian grep, atau output compiler.

PerintahAksi
:copenBuka jendela quickfix list
:ccloseTutup jendela quickfix list
:cnext or :cnPindah ke item quickfix berikutnya
:cprevious or :cpPindah ke item quickfix sebelumnya
:cfirstPindah ke item quickfix pertama
:clastPindah ke item quickfix terakhir
:colderTampilkan daftar quickfix yang lebih lama
:cnewerTampilkan daftar quickfix yang lebih baru

Location list mirip quickfix tapi bersifat lokal per window:

PerintahAksi
:lopenBuka location list
:lcloseTutup location list
:lnextPindah ke item location list berikutnya
:lpreviousPindah ke item location list sebelumnya

Mencari di dalam project dengan grep bawaan:

:grep TODO **/*.ts
:copen

Kalau pakai ripgrep:

:set grepprg=rg\ --vimgrep
:grep TODO
:copen

Mode Diff (Komparasi File)

PerintahAksi
vimdiff file1 file2Buka file langsung dalam mode komparasi
:diffsplit fileBandingkan file aktif dengan file lain
]cLompat ke perbedaan berikutnya
[cLompat ke perbedaan sebelumnya
doAmbil perubahan dari split sebelah (diff obtain)
dpTerapkan perubahan aktif ke split sebelah (diff put)
:diffupdateRefresh tampilan komparasi
:diffoffMatikan mode komparasi

Pemeriksaan Ejaan (Spell Checking)

PerintahAksi
:set spellAktifkan spell check
:set nospellMatikan spell check
]sLompat ke ejaan salah berikutnya
[sLompat ke ejaan salah sebelumnya
z=Tampilkan saran ejaan
zgMasukkan kata ke kamus (good word)
zwTandai kata sebagai salah (wrong word)
zugBatalkan aksi zg

Mengatur bahasa spell check:

:set spelllang=en_us

Formatting Teks / Kode

TombolAksi
=Operator auto-indent
==Auto-indent baris aktif
gg=GAuto-indent seluruh isi file
gqFormat bungkus teks sesuai lebar batas kolom
gqapFormat bungkus teks untuk seluruh paragraf aktif

Mengatur lebar batas kolom:

:set textwidth=80

Format teks yang diblok saja:

v blok teksnya
=

Format menggunakan LSP Neovim:

:lua vim.lsp.buf.format()

Rekomendasi mapping di config:

vim.keymap.set("n", "<leader>f", function()
  vim.lsp.buf.format({ async = true })
end)

Terminal Bawaan

Membuka terminal di dalam Vim / Neovim

PerintahAksi
:terminalBuka jendela terminal baru
:termBuka jendela terminal baru
iMasuk ke mode ketik di terminal
Ctrl-\\ Ctrl-nKeluar dari mode ketik terminal (kembali ke mode Normal)
:bd!Tutup paksa buffer terminal

Membuka terminal langsung dengan split layar:

:split | terminal
:vsplit | terminal

Contoh mapping di Neovim Lua agar keluar terminal lebih gampang dengan Esc:

vim.keymap.set("t", "<Esc>", [[<C-\\><C-n>]])

Neovim LSP (Language Server Protocol)

Neovim sudah punya dukungan LSP bawaan. Walaupun konfigurasinya bisa berbeda-beda tiap user, berikut perintah umum yang sering dipakai.

AksiPerintah Lua
Lompat ke definisi fungsivim.lsp.buf.definition()
Lompat ke deklarasi fungsivim.lsp.buf.declaration()
Lompat ke implementasivim.lsp.buf.implementation()
Lompat ke definisi tipe datavim.lsp.buf.type_definition()
Tampilkan dokumentasi hovervim.lsp.buf.hover()
Bantuan parameter fungsivim.lsp.buf.signature_help()
Ubah nama variabel se-projectvim.lsp.buf.rename()
Jalankan Code Actionvim.lsp.buf.code_action()
Format kodevim.lsp.buf.format()
Lihat daftar referensi variabelvim.lsp.buf.references()

Mapping tombol yang umum dipakai:

vim.keymap.set("n", "gd", vim.lsp.buf.definition)
vim.keymap.set("n", "gD", vim.lsp.buf.declaration)
vim.keymap.set("n", "gi", vim.lsp.buf.implementation)
vim.keymap.set("n", "gr", vim.lsp.buf.references)
vim.keymap.set("n", "K", vim.lsp.buf.hover)
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename)
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action)
vim.keymap.set("n", "<leader>f", function()
  vim.lsp.buf.format({ async = true })
end)

Diagnostics Neovim (Error / Warning)

AksiPerintah Lua
Buka jendela diagnostik detailvim.diagnostic.open_float()
Lompat ke diagnostik berikutnyavim.diagnostic.goto_next()
Lompat ke diagnostik sebelumnyavim.diagnostic.goto_prev()
Kirim info diagnostik ke location listvim.diagnostic.setloclist()

Mapping tombol yang umum dipakai:

vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float)
vim.keymap.set("n", "[d", vim.diagnostic.goto_prev)
vim.keymap.set("n", "]d", vim.diagnostic.goto_next)
vim.keymap.set("n", "<leader>q", vim.diagnostic.setloclist)

Perintah Ex yang Sering Berguna

PerintahAksi
:set numberTampilkan nomor baris
:set relativenumberTampilkan nomor baris relatif
:set nonumberSembunyikan nomor baris
:set wrapAktifkan line wrap (teks otomatis melipat ke baris baru di layar)
:set nowrapMatikan line wrap
:set listTampilkan karakter tak terlihat (spasi, tab, newline)
:set nolistSembunyikan karakter tak terlihat
:set pasteAktifkan mode tempel teks (berguna untuk Vim jadul agar format rapi)
:set nopasteMatikan mode tempel teks
:syntax onAktifkan pewarnaan kode (syntax highlighting)
:filetype plugin indent onAktifkan deteksi jenis file dan aturan indentasinya
:checkhealthJalankan cek kesehatan konfigurasi Neovim
:messagesTampilkan pesan log sistem
:versionLihat informasi versi Vim/Neovim
:h topikBuka bantuan dokumentasi tentang topik tersebut
:h key-notationLihat format tombol konfigurasi di dokumentasi

Contoh membuka dokumentasi bantuan:

:h motion.txt
:h text-objects
:h registers
:h :substitute
:h vim.lsp.buf

Workflow Praktis Sehari-hari

1. Rename variabel dalam satu file

:%s/namaLama/namaBaru/gc

Pakai flag c biar kamu bisa memverifikasi perubahannya satu per satu.


2. Hapus semua log debugging (console.log)

:g/console.log/d

3. Salin teks di dalam tanda kutip

yi"

4. Ganti semua isi di dalam kurung kurawal

ci{

5. Lompat ke suatu karakter dengan cepat

f{

Lompat ke depan tepat pada posisi { di baris yang sama.

t{

Lompat ke depan tepat satu karakter sebelum {.


6. Ganti isi argumen sebuah fungsi

Contoh baris kode:

sendEmail(user, subject, body)

Taruh kursor di dalam tanda kurung fungsi tersebut, lalu jalankan:

ci(

Hasilnya:

sendEmail(|)

Kursor kamu otomatis berada di dalam tanda kurung dan langsung siap mengetik.


7. Blok teks di dalam tag HTML

<div class="card">
  Hello world
</div>

Taruh kursor di dalam teks isi tag, lalu ketik:

vit

Setelah terblok, kamu bisa melakukan:

d       " hapus area blok tersebut
c       " ubah isi area blok tersebut
y       " salin area blok tersebut

8. Perbaiki indentasi satu file penuh

gg=G

Untuk Neovim yang sudah terpasang LSP:

:lua vim.lsp.buf.format()

9. Rekam perubahan berulang menggunakan Macro

qaA;<Esc>jq
10@a

Ini bakal menambahkan karakter ; di akhir 10 baris ke bawah.


10. Hapus teks tanpa merusak isi clipboard utama

"_dd

Ini membuang baris teks ke register lubang hitam (black hole register).


Rencana Latihan 7 Hari

Hari 1: Navigasi Dasar

Latihan tombol berikut:

h j k l
w b e
0 ^ $
gg G
Ctrl-d Ctrl-u

Target: Navigasi file tanpa menyentuh tombol panah (arrow keys) atau mouse.


Hari 2: Operator Dasar

Latihan kombinasi berikut:

dw
dd
cw
ciw
yy
p
u
Ctrl-r

Target: Edit teks menggunakan rumus operator + motion.


Latihan tombol pencarian satu baris:

f{
t{
f,
t)
;
,

Target: Lompat secara instan di dalam baris kode.


Hari 4: Text Object

Latihan manipulasi blok:

ci"
ci'
ci(
ci{
dap
yiw

Target: Edit kode berdasarkan struktur logisnya, bukan karakter per karakter.


Hari 5: Buffer, Split, dan Pencarian File

Latihan manajemen file:

:e nama_file
:ls
:bn
:bp
:vsp
Ctrl-w h/j/k/l
/teks
n
N

Target: Pindah-pindah file dan mengelola split window dengan lancar.


Hari 6: Cari dan Ganti Teks

Latihan pengeditan massal:

:%s/lama/baru/gc
:g/pola_teks/d
:noh

Target: Beres-beres kode kotor atau refactoring file dengan cepat.


Hari 7: Macro dan Register

Latihan otomatisasi aksi:

qa ... q
@a
@@
"+y
"+p
"_d

Target: Otomatisasi pekerjaan edit teks yang berulang-ulang.


Tabel Rangkuman Singkat

Target AksiPerintah
Simpan:w
Keluar:q
Simpan dan keluar:wq
Keluar tanpa simpan:q!
Lompat ke awal kata berikutnyaw
Lompat mundur ke awal kata sebelumnyab
Lompat ke akhir baris$
Lompat ke awal baris0
Lompat ke karakter pertama bukan spasi^
Pergi ke bagian paling atas filegg
Pergi ke bagian paling bawah fileG
Cari teks/teks
Hasil pencarian berikutnyan
Hasil pencarian sebelumnyaN
Bersihkan highlight pencarian:noh
Lompat tepat ke {f{
Lompat sebelum {t{
Hapus satu katadw
Ubah katacw
Ubah kata aktif saat iniciw
Ubah isi di dalam tanda kutip duaci"
Ubah isi di dalam kurung kurawalci{
Hapus satu barisdd
Salin satu barisyy
Tempel di bawahp
Tempel di atasP
Undou
RedoCtrl-r
Blok visual biasav
Blok visual per barisV
Blok visual kolom (blok vertikal)Ctrl-v
Buka file:e nama_file
Lihat daftar buffer:ls
Pindah ke buffer berikutnya:bn
Pindah ke buffer sebelumnya:bp
Layar split vertikal:vsp
Layar split horizontal:sp
Pindah antar split layarCtrl-w h/j/k/l
Rekam macro ke register aqa
Stop rekaman macroq
Putar/jalankan macro a@a
Ulangi aksi pengeditan terakhir.

Catatan Penutup

Beberapa perintah yang paling sering memberikan peningkatan produktivitas yang drastis adalah:

f{      " lompat tepat ke suatu karakter
ciw     " ubah isi kata tempat kursor berada
ci"     " ubah isi teks di dalam kutip dua
ci{     " ubah isi teks di dalam kurung kurawal
.       " ulangi aksi pengeditan terakhir
:%s     " cari dan ganti teks massal
:g      " jalankan perintah Ex pada baris yang cocok
qa/@a   " rekam dan putar ulang macro otomatis

Kalau kamu masih baru belajar Vim atau Neovim, coba terapkan aturan harian sederhana ini:

Tiap kali kamu reflek mau menggerakkan mouse atau tombol panah keyboard, berhenti sejenak, lalu cari motion Vim apa yang bisa menggantikan aksi tersebut.