Tổng hợp lệnh vi trong Linux | 3 chế độ của Vim và chế độ Visual

Mở vi rồi mà gõ chữ không vào, hoặc không biết cách thoát nên đành đóng luôn cửa sổ — người mới làm quen với server ai cũng từng gặp một lần. Lệnh vi trong Linux tách riêng chế độ lệnh và chế độ chèn, nên một khi biết mình đang ở chế độ nào, phần còn lại chỉ cần vài phím. Bài viết này tổng hợp ba chế độ và các lệnh của từng chế độ thành bảng, đồng thời cho bạn tự gõ vi trên server ảo ngay trong trình duyệt.
Trên AlmaLinux 9.8, cả vi và vim đều là gói vim 8.2; các màn hình và thông báo trong bài này đều lấy từ vim. Nếu chưa cài, hãy cài bằng [dnf -y install vim-enhanced].
✅ Ba chế độ của vi
Trong vi, cùng một phím làm những việc khác nhau tùy theo chế độ. Khi mở tệp, vi bắt đầu ở chế độ lệnh; nhấn i để vào chế độ chèn và gõ chữ, nhấn Esc để quay lại, rồi nhấn dấu hai chấm [:] để vào chế độ dòng cuối, lưu và thoát.
| Chế độ | Phím để vào | Chức năng |
|---|---|---|
| Chế độ lệnh (Normal mode) | Mặc định khi mở vi · Esc từ chế độ khác | Di chuyển con trỏ, xóa, sao chép, dán, hoàn tác |
| Chế độ chèn (Insert mode) | i a I A o O | Nhập chữ. Cuối màn hình hiện [-- INSERT --] |
| Chế độ dòng cuối (Last-line mode) | : | Lưu · thoát · thay thế · thiết lập số dòng. Cuối màn hình hiện dấu : |
| Chế độ Visual | v V Ctrl-v | Chọn vùng rồi xóa · sao chép · nhập hàng loạt |
Có ba cách mở tệp từ console.
| Lệnh | Mô tả |
|---|---|
| vi tên_tệp | Mở tệp và bắt đầu ở chế độ lệnh. Nếu tệp chưa có thì tạo mới và hiện [New] |
| vi +20 tên_tệp | Mở tệp với con trỏ đặt ở dòng 20 |
| view tên_tệp= vi -R | Mở ở chế độ chỉ đọc. Sửa thì hiện cảnh báo [W10], lưu thì báo [E45] |
Gõ [vi httpd.conf] trên server ảo bên dưới thì vi sẽ mở ra, và menu bên trái chuyển thành các lệnh bên trong vi. Bấm vào chip thì phím đó được nhập vào màn hình, hoặc bạn cũng có thể gõ trực tiếp bằng bàn phím.
✅ Tổng hợp lệnh vi trong Linux
🔲 Di chuyển con trỏ
| Phím | Mô tả |
|---|---|
| h j k l← ↓ ↑ → | Di chuyển từng ký tự. Phím mũi tên cũng được |
| 0 · ^ | Đầu dòng (0) · ký tự đầu tiên không phải khoảng trắng của dòng (^) |
| $ | Cuối dòng |
| w · b · e | Đầu từ tiếp theo · đầu từ phía trước · cuối từ tiếp theo |
| gg · G | Dòng đầu tiên · dòng cuối cùng của tệp |
| 20Ggiống :20 | Đến dòng 20. Đổi số để đến dòng mong muốn |
| H · M · L | Dòng trên cùng · ở giữa · dưới cùng của màn hình |
| Ctrl-f · Ctrl-b | Xuống · lên một màn hình |
| Ctrl-d · Ctrl-u | Xuống · lên nửa màn hình |
🔲 Vào chế độ chèn
Dù vào bằng phím nào, gõ xong thì nhấn Esc. cw·cc·C·s vừa xóa vừa đưa thẳng vào chế độ chèn, nên khi sửa một từ hay một dòng sẽ nhanh hơn nhấn x và i riêng lẻ.
| Phím | Mô tả |
|---|---|
| i · a | Bắt đầu nhập trước con trỏ (i) · sau con trỏ (a) |
| I · A | Bắt đầu nhập ở đầu dòng (I) · cuối dòng (A) |
| o · O | Tạo dòng trống bên dưới (o) · bên trên (O) rồi bắt đầu nhập |
| cw | Xóa từ con trỏ đến cuối từ rồi bắt đầu nhập |
| cc | Xóa cả dòng rồi bắt đầu nhập |
| C | Xóa từ con trỏ đến cuối dòng rồi bắt đầu nhập |
| s | Xóa một ký tự rồi bắt đầu nhập |
| Esc | Kết thúc nhập và về chế độ lệnh |
🔲 Xóa · sửa
Thêm phím di chuyển sau d thì vùng đó sẽ bị xóa: dw là một từ, dd là một dòng, dG là đến cuối tệp, và thêm số phía trước thì lặp lại đúng số lần đó.
| Phím | Mô tả |
|---|---|
| x · X | Xóa ký tự tại con trỏ (x) · ký tự trước con trỏ (X). 3x xóa ba ký tự |
| dw | Xóa từ con trỏ đến cuối từ |
| dd | Xóa dòng. 3dd xóa ba dòng |
| D= d$ | Xóa từ con trỏ đến cuối dòng |
| d0 | Xóa từ đầu dòng đến trước con trỏ |
| dG | Xóa từ dòng hiện tại đến cuối tệp |
| :6d · :6,10d | Xóa dòng 6 · xóa các dòng 6–10 |
| J | Nối dòng bên dưới vào cuối dòng hiện tại |
| r | Thay ký tự tại con trỏ bằng ký tự gõ tiếp theo |
| ~ | Đổi chữ hoa · chữ thường |
| >> · << | Thụt lề · bỏ thụt lề dòng |
🔲 Sao chép · dán · hoàn tác
Nội dung đã xóa cũng dán được bằng p như nội dung đã sao chép, nên nhấn dd rồi p liên tiếp thì dòng sẽ dời xuống dưới. u lùi lại qua nhiều bước, còn Ctrl-r thực hiện lại thao tác vừa hoàn tác.
| Phím | Mô tả |
|---|---|
| yy | Sao chép dòng. 3yy sao chép ba dòng |
| yw | Sao chép từ con trỏ đến cuối từ |
| p · P | Dán nội dung đã sao chép bên dưới (p) · bên trên (P). Nếu sao chép theo ký tự thì dán sau · trước con trỏ |
| :1 co 7giống :1 t 7 | Sao chép dòng 1 xuống dưới dòng 7 |
| :1,7 co 8 | Sao chép các dòng 1–7 xuống dưới dòng 8 |
| :1 m 8 | Chuyển dòng 1 xuống dưới dòng 8 |
| u | Hoàn tác. Nhấn nhiều lần để tiếp tục lùi lại |
| Ctrl-r | Làm lại thao tác đã hoàn tác |
| . | Lặp lại thay đổi gần nhất |
🔲 Tìm kiếm · thay thế
Thay thế được thực hiện ở chế độ dòng cuối. Không chỉ định phạm vi thì chỉ áp dụng cho dòng hiện tại, thêm [%] thì áp dụng cho toàn bộ tệp, và nếu cuối lệnh không có g thì mỗi dòng chỉ thay chỗ khớp đầu tiên.
| Phím | Mô tả |
|---|---|
| /chuỗi | Tìm xuống phía dưới con trỏ. Đến cuối tệp thì tìm tiếp từ đầu: [search hit BOTTOM, continuing at TOP] |
| ?chuỗi | Tìm lên phía trên con trỏ |
| n · N | Kết quả tiếp theo cùng hướng (n) · ngược hướng (N) |
| * | Tìm xuống phía dưới những chỗ trùng với từ tại con trỏ |
| :s/old/new/ | Đổi old đầu tiên trong dòng hiện tại thành new |
| :s/old/new/g | Đổi mọi old trong dòng hiện tại thành new |
| :%s/old/new/g | Đổi mọi old trong toàn bộ tệp thành new |
| :10,20s/old/new/g | Đổi mọi old trong các dòng 10–20 thành new |
| :%s/old/new/gc | Hỏi từng chỗ trước khi đổi (y đổi · n bỏ qua · a tất cả · q dừng) |
🔲 Lưu · thoát · số dòng
| Phím | Mô tả |
|---|---|
| :w | Lưu. Xong thì hiện [36L, 1094B written] |
| :w tên_tệp | Lưu với tên khác. Tệp gốc giữ nguyên |
| :wq= :x = ZZ | Lưu và thoát |
| :q | Thoát. Nếu đã sửa mà chưa lưu thì báo [E37: No write since last change] |
| :q! | Thoát mà không lưu |
| :set nu · :set nonu | Hiện · ẩn số dòng |
✅ Chú thích hàng loạt theo cột bằng chế độ Visual Block của Vim
Khi cần chèn cùng một ký tự vào đầu nhiều dòng, thay vì nhấn i ở từng dòng, hãy dùng chế độ Visual Block. Trong chế độ lệnh, v chọn vùng theo ký tự, Shift-v theo dòng và Ctrl-v theo cột.
Đây là trình tự chú thích nguyên một khối trong tệp cấu hình. Đặt con trỏ ở ký tự đầu tiên của dòng đầu, nhấn Ctrl-v rồi nhấn j để đi xuống chọn các dòng, sau đó nhấn I, gõ # và nhấn Esc.



Bỏ chú thích cũng làm tương tự: đặt con trỏ lên dấu # của dòng đầu, dùng Ctrl-v chọn xuống đến dòng cuối rồi nhấn x, cột đã chọn sẽ bị xóa cùng lúc. Bạn có thể làm thử y như vậy với vhost.conf trong trình mô phỏng ở trên.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.