jvinhit//lab

Search posts

Type to search across journal entries.

navigate open esc close

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
dwdelete word
ci"change inside quotes
yapyank around paragraph
d}delete to next paragraph
=ipformat 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

ModeVào bằngDùng để
NormalEscra lệnh, di chuyển, sửa text
Inserti, a, ogõ text
Visualv, V, <C-v>chọn text
Command-line:chạy lệnh
Terminal:terminalchạy shell trong Nvim

Người mới ở Insert mode quá lâu. Người dùng Vim giỏi thường:

  1. vào Insert để gõ;
  2. quay về Normal ngay;
  3. dùng command nhỏ để sửa tiếp.

Motions quan trọng

MotionÝ nghĩa
h j k ltrái, xuống, lên, phải
wđầu word kế
bđầu word trước
ecuối word
0đầu dòng vật lý
^ký tự đầu không phải whitespace
$cuối dòng
ggđầu file
Gcuố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
ddelete
cchange rồi vào Insert
yyank/copy
>indent phải
<indent trái
=auto indent
gqformat text
gulowercase
gUuppercase

Operators kết hợp với motion:

LệnhKết quả
d$xóa tới cuối dòng
cawđổi cả word
y}copy tới paragraph kế
>apindent cả paragraph
gUiwuppercase word hiện tại

Text objects

Text object là lý do nhiều người không quay lại editor cũ.

ObjectBên trongCả vùng
wordiwaw
sentenceisas
paragraphipap
quotesi"a"
single quotesi'a'
parenthesesi(a(
bracketsi[a[
bracesi{a{

Ví dụ thực chiến:

const message = 'hello from neovim';

Đặt cursor trong chuỗi:

LệnhKế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
iinsert trước cursor
aappend sau cursor
Iinsert đầu dòng
Aappend cuối dòng
omở dòng dưới
Omở dòng trên
sxóa ký tự và insert
Sxóa dòng và insert
Cđổi tới cuối dòng

Hai lệnh dùng cả ngày: ci"A.


Registers và clipboard

LệnhÝ nghĩa
yycopy dòng
ddcut dòng
ppaste sau
Ppaste trước
"0ppaste yank gần nhất
"+ycopy vào system clipboard
"+ppaste 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
qdừng ghi macro
@achạ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.

  1. Đặt cursor ở dòng đầu.
  2. qaIconst <Esc>jq.
  3. @a để áp dụng dòng kế.
  4. 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ómLệnh
Save/quit:w, :q, :wq, :q!
Movew, b, e, 0, ^, $, gg, G
Search/, n, N, *
Editi, a, o, A, ci", ci(, di{
Copy/deleteyy, dd, yap, dap, p, P
Undo/redou, <C-r>
Repeat., q, @
Visualv, 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:

  1. Đổi nội dung trong một chuỗi bằng ci".
  2. Xóa một function call trong ngoặc bằng di( hoặc da(.
  3. Copy một paragraph bằng yap, paste xuống dưới.
  4. Dùng f hoặc t để nhảy tới một ký tự trong dòng.
  5. 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.