Học bằng cách đọc theo thứ tự

Cơ bản về trình soạn thảo văn bản vi

Học cách khởi động vi, chuyển giữa normal mode và insert mode, quay lại bằng Esc, và lưu bằng :wq hoặc bỏ bằng :q! — thực hành ngay trên terminal trong trình duyệt.

Khởi động vi và các chế độ của nó

vi là một trình soạn thảo văn bản có trên hầu hết mọi server Linux.

Trong khóa học này bạn sẽ học những thao tác vi tối thiểu hoạt động trên mọi server.

vi có hai chế độ.

Ngay sau khi khởi động bạn ở normal mode, nơi các phím đóng vai trò di chuyển hoặc lệnh và bạn không gõ được văn bản.

Nhấn i chuyển sang insert mode, nơi bạn có thể gõ ký tự.

Nhấn Esc đưa bạn về normal mode.

Hai chế độ của vi
normal modedi chuyển / lệnh(:wq v.v.)insert modebạn có thể gõ văn bảnchuyển bằng iquay lại bằng Esc
Ngay sau khi khởi động bạn ở normal mode. i vào insert mode, và Esc quay về normal mode.
vi memo.txt   # mở memo.txt (khởi động ở normal mode)
# nhấn i        -> insert mode (bạn có thể gõ)
# gõ văn bản
# nhấn Esc      -> quay về normal mode

Bị kẹt? Esc rồi :q! đưa bạn ra ngoài

Nếu bạn lỡ tay và màn hình có vẻ bị kẹt, hãy nhấn Esc vài lần rồi :q! để thoát và làm lại.

Cách này luôn đưa bạn an toàn về trạng thái ban đầu.

① Mở note.txt bằng vi note.txt (nó khởi động ở normal mode).

② Nhấn i để chuyển sang insert mode và gõ hello vi.

③ Nhấn Esc để quay về normal mode, rồi gõ :wq và nhấn Enter để lưu và thoát.

④ Quay lại terminal, chạy cat note.txt và xác nhận những gì bạn gõ đã được lưu. (Chạy đúng thì phần giải thích sẽ hiện ra.)

Linux console
0 / 2 đã hoàn thành
Loading Linux Terminal...

Lưu và bỏ — :wq và :q!

: ở normal mode mở một dòng lệnh nơi bạn có thể nhập các lệnh liên quan đến thoát.

:wq nghĩa là write and quit — tức là lưu và đóng.

:w chỉ lưu mà không thoát, và :q thoát khi không có thay đổi.

:q! bỏ các thay đổi và buộc thoát, quay về trạng thái trước khi chỉnh sửa.

Phím / LệnhChế độHành động
vi fileMở một tệp (khởi động ở normal)
iNormalVào insert mode
EscInsertQuay về normal
:wNormalLưu (mà không thoát)
:qNormalThoát (khi không có thay đổi)
:wqNormalLưu và thoát
:q!NormalBỏ thay đổi và thoát
:wq lưu, :q! bỏ
:wqlưu và thoát(giữ nội dung):q!bỏ và thoát(về trước khi sửa)
:wq lưu thay đổi rồi thoát; :q! vứt bỏ thay đổi rồi thoát.

:q! không giữ thay đổi nào

:q! thoát vứt bỏ mọi thay đổi của phiên chỉnh sửa đó.

Nó tiện khi bạn gõ nhầm và muốn làm lại, nhưng khi bạn có nội dung cần giữ, hãy dùng :wq.

vi draft.txt   # mở
# i để chèn -> gõ văn bản -> Esc
# gõ :q!     -> bỏ thay đổi và thoát (draft.txt vẫn rỗng)
cat draft.txt  # không có gì được ghi

① Mở scratch.txt bằng vi scratch.txt.

② Chuyển sang insert mode bằng i, gõ temporary, rồi nhấn Esc.

③ Gõ :q! và nhấn Enter để bỏ các thay đổi và thoát.

④ Quay lại terminal, chạy cat scratch.txt và xác nhận không có gì được lưu vì bạn đã bỏ nó.

Linux console
0 / 2 đã hoàn thành
Loading Linux Terminal...

Làm nhiều hơn với vi — a / o và :w

i không phải cách duy nhất để vào insert mode.

a bắt đầu gõ ở bên phải con trỏ, còn o mở một dòng mới bên dưới con trỏ và bắt đầu gõ.

Chữ hoa A bắt đầu ở cuối dòng, và O mở một dòng mới bên trên con trỏ.

Tất cả đều quay về normal mode bằng Esc y như nhau.

Bạn cũng có thể dùng các lệnh lưu một cách chọn lọc.

:w chỉ lưu, mà không thoát, nên bạn có thể tiếp tục chỉnh sửa.

Với một lần chỉnh sửa dài, hãy lưu thường xuyên bằng :w và đóng bằng :wq ở cuối cho an toàn.

PhímNơi bắt đầu gõ
iBên trái con trỏ (trước nó)
aBên phải con trỏ (sau nó)
oTrên một dòng mới mở bên dưới
AỞ cuối dòng
OTrên một dòng mới mở bên trên
Các cách khác nhau để vào insert mode
igõ từ bên tráicon trỏagõ từ bên phảicon trỏomở dòng mớibên dưới và gõ
i bắt đầu từ bên trái, a từ bên phải, và o từ một dòng mới bên dưới. Tất cả quay lại bằng Esc.

① Mở practice.txt bằng vi practice.txt.

② Nhấn o để mở một dòng mới bên dưới và vào insert mode, rồi gõ first line.

③ Nhấn Esc, nhấn o lần nữa để mở một dòng mới khác, gõ second line, và nhấn Esc.

④ Gõ :w và nhấn Enter để lưu (chưa thoát), rồi gõ :q để thoát.

⑤ Tại terminal, chạy cat practice.txt và xác nhận cả hai dòng đã được lưu.

Linux console
0 / 2 đã hoàn thành
Loading Linux Terminal...

Xóa và sao chép dòng — dd / yy / p

Ở normal mode bạn có thể chỉnh sửa theo dòng mà không cần gõ ký tự.

dd xóa (cắt) toàn bộ dòng con trỏ đang ở.

x xóa một ký tự dưới con trỏ, và u hoàn tác thao tác trước (undo).

yy sao chép (yank) dòng con trỏ đang ở, và p dán nội dung đã sao chép — hoặc đã cắt bằng dd — vào dòng bên dưới con trỏ.

Một dòng cắt bằng dd cũng có thể dán bằng p, nên nó cũng dùng để di chuyển dòng.

PhímHành động
xXóa một ký tự dưới con trỏ
ddXóa một dòng (cắt)
3dd / d3dXóa nhiều dòng với số đếm (vd 3 dòng)
yySao chép một dòng (yank)
10yy / y10ySao chép nhiều dòng với số đếm (vd 10 dòng)
pDán dòng đã sao chép / đã cắt xuống dưới
uHoàn tác thao tác trước
Chỉnh sửa dòng bằng dd / yy / p
ddcắt dòng hiện tạiyysao chép dònghiện tạipdán vào dòngbên dưới
dd cắt, yy sao chép, và p dán vào dòng bên dưới. Tất cả đều gõ ở normal mode.

① Mở edit.txt bằng vi edit.txt.

② Vào insert mode bằng i, gõ one và Enter, rồi two, và nhấn Esc để chuẩn bị 2 dòng.

③ Sao chép dòng hiện tại bằng yy và dán xuống dưới bằng p, xác nhận cùng một dòng được thêm vào.

④ Sau đó xóa dòng con trỏ đang ở bằng dd.

⑤ Lưu và thoát bằng :wq, và kiểm tra kết quả bằng cat edit.txt.

Linux console
0 / 2 đã hoàn thành
Loading Linux Terminal...

Thêm một số đếm ở phía trước cho phép bạn thao tác trên nhiều dòng cùng lúc.

3dd (hoặc d3d) xóa 3 dòng, và 10yy (hoặc y10y) sao chép 10 dòng.

Nếu bạn dán bằng p sau khi xóa hoặc sao chép, bạn có thể di chuyển hoặc nhân đôi nhiều dòng trong một thao tác.

Thao tác trên nhiều dòng với một số đếm
3dd / d3dxóa 3 dòng cùng lúc10yy / y10ysao chép 10 dòngcùng lúcpdán các dòng đãsao chép cùng lúc
Thêm một số đếm ở phía trước: 3dd xóa 3 dòng, 10yy sao chép 10 dòng. Dán chúng cùng lúc bằng p.

① Mở block.txt bằng vi block.txt.

② Vào insert mode bằng i, gõ one và Enter, và tương tự gõ two đến five mỗi dòng một từ cho đủ 5 dòng, rồi nhấn Esc.

③ Gõ :1 và nhấn Enter để di chuyển tới dòng 1, cắt 3 dòng đầu bằng 3dd (hoặc d3d), rồi dán 3 dòng đó bên dưới con trỏ bằng p và xác nhận bạn có thể di chuyển dòng.

④ Sao chép 2 dòng bằng 2yy (hoặc y2y) và dán chúng xuống dưới bằng p.

⑤ Lưu và thoát bằng :wq, và kiểm tra kết quả bằng cat block.txt.

Linux console
0 / 2 đã hoàn thành
Loading Linux Terminal...

Di chuyển con trỏ và tìm kiếm — gg / G và / ?

Trong một tệp dài, nhảy một lần đưa bạn tới đích nhanh hơn di chuyển từng dòng.

gg đưa con trỏ tới dòng đầu của tệp, và G tới dòng cuối.

Ngay cả nơi gg không hoạt động, 1G di chuyển tới dòng đầu.

Để tìm văn bản, hãy dùng tìm kiếm.

/word và Enter tìm xuôi (xuống dưới) cho word từ con trỏ.

?word tìm ngược (lên trên), n di chuyển tới kết quả khớp tiếp theo cùng hướng, và N tới một kết quả khớp theo hướng ngược lại.

Tất cả đều gõ ở normal mode; không cần Esc.

PhímHành động
gg / 1GDi chuyển tới dòng đầu
GDi chuyển tới dòng cuối
/wordTìm xuống dưới (xuôi) cho word
?wordTìm lên trên (ngược) cho word
n / NTới kết quả tiếp theo / kết quả trước
Di chuyển bằng gg / G và tìm kiếm bằng / ?
gg / 1Gdi chuyển tớidòng đầuGdi chuyển tớidòng cuối/word ntìm xuống dưới,tiếp theo?word Ntìm lên trên,hướng ngược
gg/G nhảy tới dòng đầu/cuối; /word tìm xuống dưới và ?word lên trên, với n/N di chuyển tới kết quả tiếp theo/trước.

① Chuẩn bị một tệp có nhiều dòng bằng ls -l /bin > nav.txt.

② Mở nó bằng vi nav.txt, di chuyển tới dòng cuối bằng G, và tới dòng đầu bằng gg (hoặc 1G).

③ Gõ /sh và nhấn Enter để tìm xuống dưới các dòng chứa sh, rồi di chuyển tới kết quả tiếp theo bằng n và kết quả trước bằng N.

④ Gõ ?ls và nhấn Enter để lần này tìm lên trên cho ls.

⑤ Vì bạn không thay đổi gì, hãy thoát bằng :q và quay lại terminal.

Linux console
0 / 2 đã hoàn thành
Loading Linux Terminal...
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Để gõ được văn bản trong vi, bạn nhấn gì ở normal mode?

Câu 2Bạn nhấn gì để quay từ insert mode về normal mode?

Câu 3Điều gì xảy ra khi bạn chạy :q!?