~/saidqb cat ecosystem/tools/vim.md
Vim
Modal text editor
commit by saidqb
Editor modal yang selalu tersedia di server manapun — cheatsheet perintah yang paling sering dipakai sehari-hari.
Global
:h[elp] keyword # buka help untuk keyword tertentu
:sav[eas] file # simpan file dengan nama baru
:clo[se] # tutup pane saat ini
:ter[minal] # buka jendela terminal
K # buka man page untuk kata di bawah kursor
Tip: jalankan
vimtutordi terminal untuk belajar perintah dasar Vim.
Pergerakan Kursor
h / j / k / l # kiri / bawah / atas / kanan
gj / gk # bawah / atas, mengikuti baris yang wrap (multi-line text)
H / M / L # ke atas / tengah / bawah layar
w / W # lompat ke awal kata selanjutnya (W: kata bisa mengandung tanda baca)
e / E # lompat ke akhir kata selanjutnya (E: kata bisa mengandung tanda baca)
b / B # lompat ke awal kata sebelumnya (B: kata bisa mengandung tanda baca)
ge / gE # lompat mundur ke akhir kata (gE: kata bisa mengandung tanda baca)
% # lompat ke pasangan karakter (default: '()', '{}', '[]' — lihat :h matchpairs)
0 # lompat ke awal baris saat ini
^ # lompat ke karakter pertama (non-blank) baris saat ini
$ # lompat ke akhir baris saat ini
g_ # lompat ke karakter terakhir non-blank pada baris
gg / G # ke baris teratas / paling akhir dokumen
5gg atau 5G # pindah ke baris ke-5
gd / gD # pindah ke deklarasi lokal / global
fx / tx # lompat tepat pada karakter x / tepat sebelum karakter x
Fx / Tx # sama seperti fx/tx tapi ke arah sebelumnya
; / , # ulangi perintah f/t/F/T terakhir (maju / mundur)
} / { # lompat ke paragraf berikutnya / sebelumnya (atau blok kode)
zz / zt / zb # tempatkan kursor di tengah / atas / bawah layar
Ctrl + e / Ctrl + y # geser layar turun / naik satu baris (kursor tetap)
Ctrl + b / Ctrl + f # geser layar mundur / maju satu layar penuh
Ctrl + d / Ctrl + u # geser layar maju / mundur setengah layar
Tip: awali perintah pergerakan dengan angka untuk mengulanginya, misal
4jturun 4 baris.
Mode Insert
i / I # sisipkan sebelum kursor / di awal baris
a / A # sisipkan setelah kursor / di akhir baris
o / O # buka baris baru di bawah / di atas baris saat ini
ea # sisipkan di akhir kata
Ctrl + h # hapus karakter sebelum kursor
Ctrl + w # hapus kata sebelum kursor
Ctrl + j # mulai baris baru
Ctrl + t / Ctrl + d # indent / de-indent baris satu shiftwidth
Ctrl + n / Ctrl + p # auto-complete kata berikutnya / sebelumnya
Ctrl + r x # sisipkan isi register x
Ctrl + o x # jalankan satu perintah normal mode x, lalu kembali ke insert
Esc atau Ctrl + c # keluar dari mode insert
Simpan & Keluar
:w # simpan tanpa keluar
:w !sudo tee % # simpan dengan sudo
:wq atau :x atau ZZ # simpan lalu keluar
:q # keluar (batal jika ada perubahan belum disimpan)
:q! atau ZQ # keluar, abaikan perubahan yang belum disimpan
:wqa # simpan dan keluar dari semua tab
Cari & Ganti
/pattern # cari maju dengan pola
?pattern # cari mundur dengan pola
\vpattern # pola 'magic' — karakter non-alfanumerik jadi regex tanpa perlu escape
n / N # ulangi pencarian ke arah selanjutnya / sebaliknya
:%s/old/new/g # ganti semua kemunculan di seluruh file
:%s/old/new/gc # ganti semua kemunculan dengan konfirmasi tiap match
:noh[lsearch] # hilangkan highlight hasil pencarian
Editing
r # ubah satu karakter
R # replace beberapa karakter sampai Esc ditekan
J / gJ # gabung baris di bawah ke baris saat ini (gJ: tanpa spasi)
gwip # reflow paragraf
g~ / gu / gU # toggle / lowercase / uppercase sampai motion
cc / S # hapus isi baris untuk diganti text lain
c$ atau C # hapus dari kursor sampai akhir baris
ciw # ganti (change) satu kata utuh
cw atau ce # hapus satu kata untuk diganti kata lain
s # hapus karakter, ganti dengan text
xp # tukar dua karakter (delete + paste)
u / Ctrl + r # undo / redo
U # kembalikan (undo) baris terakhir yang diubah
. # ulangi perintah sebelumnya
Visual Mode
v / V # mode visual karakter / per baris
Ctrl + v # mode visual blok
o / O # pindah ke ujung lain dari area / sudut lain blok yang ditandai
aw # tandai satu kata
ab / aB # tandai blok dengan () / {}
at # tandai blok dengan tag <>
ib / iB # tandai isi blok (inner) dengan () / {}
it # tandai isi blok (inner) dengan tag <>
Esc atau Ctrl + c # keluar dari mode visual
Tip: sebagai pengganti
b/Bbisa juga pakai(/{.
Perintah setelah menandai text:
> / < # geser text ke kanan / kiri
y # yank (salin) text yang ditandai
d # hapus text yang ditandai
~ # tukar huruf besar-kecil
u / U # ubah text jadi lowercase / uppercase
Registers
:reg[isters] # lihat isi semua register
"xy # yank ke register x
"xp # paste dari register x
"+y / "+p # yank / paste dari clipboard sistem
Register khusus: 0 yank terakhir, " unnamed (delete/yank terakhir), % nama file saat ini, # nama file alternate, */+ isi clipboard, / pola pencarian terakhir, : command-line terakhir, . text terakhir yang diinsert, - delete kecil terakhir (kurang dari satu baris), = expression register, _ black hole register.
Tip: register disimpan di
~/.viminfodan dimuat lagi saat Vim dijalankan berikutnya.
Marks & Jumps
:marks # daftar semua mark
ma # set mark A pada posisi kursor saat ini
`a # lompat ke posisi mark A
y`a # yank text sampai posisi mark A
`0 # lompat ke posisi terakhir Vim ditutup
`" # lompat ke posisi terakhir mengedit file ini
`. # lompat ke posisi perubahan terakhir di file ini
`` # lompat ke posisi sebelum jump terakhir
:ju[mps] # daftar jump list
Ctrl + i / Ctrl + o # pindah ke posisi lebih baru / lebih lama di jump list
:changes # daftar perubahan (change list)
g, / g; # pindah ke posisi lebih baru / lebih lama di change list
Ctrl + ] # lompat ke tag di bawah kursor
Tip: untuk lompat ke mark bisa pakai backtick (
`) atau apostrof (') — apostrof lompat ke karakter non-blank pertama baris tersebut.
Macros
qa # mulai rekam macro a
q # stop rekam macro
@a # jalankan macro a
@@ # ulangi macro terakhir yang dijalankan
Copy & Paste
yy / 2yy # salin satu / dua baris
yw / yiw # salin satu kata / kata di bawah kursor
yaw # salin kata di bawah kursor beserta spasi sekitarnya
y$ atau Y # salin dari posisi kursor sampai akhir baris
p / P # tempel setelah / sebelum kursor
gp / gP # tempel setelah / sebelum kursor, kursor pindah ke setelah text baru
dd / 2dd # hapus satu / dua baris
dw / diw # hapus (potong) satu kata / kata di bawah kursor
daw # hapus kata di bawah kursor beserta spasi sekitarnya
d$ atau D # hapus sampai akhir baris
x # hapus satu karakter
:3,5d # hapus baris 3 sampai 5
:.,$d # hapus dari baris saat ini sampai akhir file
:.,1d # hapus dari baris saat ini sampai awal file
:g/pattern/d # hapus semua baris yang mengandung pattern
:g!/pattern/d # hapus semua baris yang TIDAK mengandung pattern
Indent
>> / << # indent / de-indent baris satu shiftwidth
>% / <% # indent / de-indent blok () atau {} (kursor di brace)
>ib # indent isi blok ()
>at # indent blok dengan tag <>
3== # re-indent 3 baris
=% # re-indent blok () atau {} (kursor di brace)
=iB # re-indent isi blok {}
gg=G # re-indent seluruh buffer
]p # paste dengan indent menyesuaikan baris saat ini
Pencarian Multi File
:vim[grep] /pattern/ **/* # cari pola di banyak file
:cn[ext] / :cp[revious] # lompat ke temuan selanjutnya / sebelumnya
:cope[n] / :ccl[ose] # buka / tutup window quickfix berisi hasil temuan
Tabs & Split Window
:tabnew file # buka file di tab baru
Ctrl + w T # pindahkan split saat ini jadi tab sendiri
gt atau :tabn[ext] # pindah ke tab selanjutnya
gT atau :tabp[revious] # pindah ke tab sebelumnya
2gt # pindah ke tab nomor 2
:tabm[ove] 0 # pindahkan tab saat ini ke urutan ke-0
:tabc[lose] / :tabo[nly] # tutup tab saat ini / tutup semua tab kecuali yang aktif
:tabdo command # jalankan command di semua tab
:e[dit] file # edit file di buffer baru
:bn[ext] / :bp[revious] # pindah ke buffer selanjutnya / sebelumnya
:bd[elete] # hapus buffer (tutup file)
:b[uffer]# atau :b[uffer] file # pindah ke buffer tertentu berdasar nomor / nama file
:ls atau :buffers # daftar buffer yang terbuka
:sp[lit] file / :vs[plit] file # buka file di split horizontal / vertikal
Ctrl + w s / Ctrl + w v # split jendela horizontal / vertikal
Ctrl + w w # pindah antar jendela
Ctrl + w q # tutup jendela
Ctrl + w = # samakan tinggi & lebar semua jendela
Ctrl + w h/j/k/l # pindah ke jendela kiri/bawah/atas/kanan
Ctrl + w H/J/K/L # pindahkan jendela ke posisi paling kiri/bawah/atas/kanan
Diff & Fold
zf # buat fold manual sampai motion
zd / za # hapus fold / toggle fold di bawah kursor
zo / zc # buka / tutup fold di bawah kursor
zr / zm # buka semua fold satu level / tutup semua fold satu level
zi # toggle fitur folding
]c / [c # lompat ke perubahan (diff) selanjutnya / sebelumnya
do atau :diffg[et] # ambil perbedaan dari buffer lain
dp atau :diffpu[t] # kirim perbedaan ke buffer lain
:diffthis # jadikan window ini bagian dari diff
:dif[fupdate] # update perbandingan diff
:diffo[ff] # matikan mode diff untuk window ini