Neovim · Part 3 — Modal Editing Cheatsheet thực chiến
Học ngôn ngữ thao tác text của Vim: modes, operators, motions, text objects, registers, macros và bài tập luyện phản xạ.
Neovim mạnh không phải vì có nhiều plugin. Nó mạnh vì Vim có một ngôn ngữ thao tác text.
Cú pháp cốt lõi:
operator + motion
Ví dụ:
| Lệnh | Đọc như câu |
|---|---|
dw | delete word |
ci" | change inside quotes |
yap | yank around paragraph |
d} | delete to next paragraph |
=ip | format indent inside paragraph |
Khi bạn hiểu ngữ pháp này, editor bắt đầu biến thành dụng cụ phẫu thuật text.
Modes
| Mode | Vào bằng | Dùng để |
|---|---|---|
| Normal | Esc | ra lệnh, di chuyển, sửa text |
| Insert | i, a, o | gõ text |
| Visual | v, V, <C-v> | chọn text |
| Command-line | : | chạy lệnh |
| Terminal | :terminal | chạy shell trong Nvim |
Người mới ở Insert mode quá lâu. Người dùng Vim giỏi thường:
- vào Insert để gõ;
- quay về Normal ngay;
- dùng command nhỏ để sửa tiếp.
Motions quan trọng
| Motion | Ý nghĩa |
|---|---|
h j k l | trái, xuống, lên, phải |
w | đầu word kế |
b | đầu word trước |
e | cuối word |
0 | đầu dòng vật lý |
^ | ký tự đầu không phải whitespace |
$ | cuối dòng |
gg | đầu file |
G | cuối file |
{ } | paragraph trước/kế |
% | nhảy cặp ngoặc |
f<char> | tìm ký tự trong dòng |
t<char> | tới trước ký tự trong dòng |
; , | lặp/tua lại f, t |
Nếu bạn chỉ học một combo mới hôm nay, học f, t, ;, ,. Nó thay rất nhiều thao tác phím mũi tên.
Operators
| Operator | Ý nghĩa |
|---|---|
d | delete |
c | change rồi vào Insert |
y | yank/copy |
> | indent phải |
< | indent trái |
= | auto indent |
gq | format text |
gu | lowercase |
gU | uppercase |
Operators kết hợp với motion:
| Lệnh | Kết quả |
|---|---|
d$ | xóa tới cuối dòng |
caw | đổi cả word |
y} | copy tới paragraph kế |
>ap | indent cả paragraph |
gUiw | uppercase word hiện tại |
Text objects
Text object là lý do nhiều người không quay lại editor cũ.
| Object | Bên trong | Cả vùng |
|---|---|---|
| word | iw | aw |
| sentence | is | as |
| paragraph | ip | ap |
| quotes | i" | a" |
| single quotes | i' | a' |
| parentheses | i( | a( |
| brackets | i[ | a[ |
| braces | i{ | a{ |
Ví dụ thực chiến:
const message = 'hello from neovim';
Đặt cursor trong chuỗi:
| Lệnh | Kết quả |
|---|---|
ci" | đổi nội dung trong dấu nháy |
da" | xóa cả chuỗi gồm dấu nháy |
yi" | copy nội dung chuỗi |
Insert nhanh hơn
| Lệnh | Ý nghĩa |
|---|---|
i | insert trước cursor |
a | append sau cursor |
I | insert đầu dòng |
A | append cuối dòng |
o | mở dòng dưới |
O | mở dòng trên |
s | xóa ký tự và insert |
S | xóa dòng và insert |
C | đổi tới cuối dòng |
Hai lệnh dùng cả ngày: ci" và A.
Registers và clipboard
| Lệnh | Ý nghĩa |
|---|---|
yy | copy dòng |
dd | cut dòng |
p | paste sau |
P | paste trước |
"0p | paste yank gần nhất |
"+y | copy vào system clipboard |
"+p | paste từ system clipboard |
Nếu đã set:
vim.opt.clipboard = "unnamedplus"
thì yank/paste thường sẽ đi qua system clipboard. Nhưng bạn vẫn nên biết register "0: nó cứu bạn khi vừa dd làm mất nội dung vừa yank.
Repeat và macro
| Lệnh | Ý nghĩa |
|---|---|
. | lặp thay đổi gần nhất |
q{a-z} | bắt đầu ghi macro |
q | dừng ghi macro |
@a | chạy macro a |
@@ | chạy lại macro vừa chạy |
Ví dụ: thêm const vào nhiều dòng giống nhau.
- Đặt cursor ở dòng đầu.
- Gõ
qaIconst <Esc>jq. - Gõ
@ađể áp dụng dòng kế. - Gõ
5@ađể áp dụng 5 dòng.
Macro không thay multi-cursor hoàn toàn, nhưng rất mạnh khi thao tác lặp có cấu trúc.
Cheatsheet 30 lệnh nên thuộc
| Nhóm | Lệnh |
|---|---|
| Save/quit | :w, :q, :wq, :q! |
| Move | w, b, e, 0, ^, $, gg, G |
| Search | /, n, N, * |
| Edit | i, a, o, A, ci", ci(, di{ |
| Copy/delete | yy, dd, yap, dap, p, P |
| Undo/redo | u, <C-r> |
| Repeat | ., q, @ |
| Visual | v, V, <C-v> |
Bài tập
Mở một file code thật và làm các bài sau không dùng chuột:
- Đổi nội dung trong một chuỗi bằng
ci". - Xóa một function call trong ngoặc bằng
di(hoặcda(. - Copy một paragraph bằng
yap, paste xuống dưới. - Dùng
fhoặctđể nhảy tới một ký tự trong dòng. - Tạo macro đổi 5 dòng liên tiếp.
Gợi ý luyện
Đặt một timer 15 phút. Mỗi khi bạn muốn dùng chuột hoặc phím mũi tên, dừng lại hỏi: “motion nào mô tả đúng đích đến?”
Đừng cố nhanh ngay. Chậm nhưng đúng motion sẽ nhanh lên rất nhanh.
Điều cốt lõi
Vim không bắt bạn nhớ hàng trăm phím rời rạc. Nó cho bạn một ngữ pháp: operator + motion + text object. Thuộc ngữ pháp này trước, plugin sẽ phát huy sau.