Logo

~/saidqb cat ecosystem/tools/vim.md

Vi

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 vimtutor di 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 4j turun 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/B bisa 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 ~/.viminfo dan 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