Chúng ta sẽ tìm hiểu về các hoạt động cơ bản như cài đặt, chỉnh sửa trong vi editor và hiểu các chế độ trong vi để chuẩn bị cho kỳ thi chứng chỉ LFCS.
Các hoạt động cơ bản trong Vi Editor
Vi là trình chỉnh sửa văn bản toàn màn hình đầu tiên được viết cho Unix. Mặc dù nó đã được thiết kế để nhỏ gọn và đơn giản, nó có thể gây khó khăn đối với những người chỉ quen dùng trình chỉnh sửa văn bản GUI, như NotePad++ hoặc gedit, để kể một số ví dụ.
Để sử dụng Vi, chúng ta phải hiểu rõ về 3 chế độ hoạt động của chương trình mạnh mẽ này, để sau này có thể học về các thao tác chỉnh sửa văn bản mạnh mẽ của nó.
Lưu ý rằng hầu hết các bản phân phối Linux hiện đại đều đi kèm với một phiên bản vi gọi là vim (“Vi cải tiến”), hỗ trợ nhiều tính năng hơn so với vi gốc. Do đó, trong hướng dẫn này, chúng ta sẽ sử dụng vi và vim trong các trường hợp giao đổi.
Nếu bản phân phối của bạn không có Vim được cài đặt, bạn có thể cài đặt như sau.
$ sudo apt install vim [On Debian, Ubuntu and Mint]
$ sudo yum install vim [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
$ sudo emerge -a sys-apps/vim [On Gentoo Linux]
$ sudo apk add vim [On Alpine Linux]
$ sudo pacman -S vim [On Arch Linux]
$ sudo zypper install vim [On OpenSUSE]
Tại sao tôi nên muốn học Vi?
Có ít nhất 2 lý do tốt để học trình chỉnh sửa vi.
- vi luôn luôn có sẵn (bất kể bạn đang sử dụng bản phân phối nào) vì nó yêu cầu theo tiêu chuẩn POSIX.
- vi không tốn một lượng tài nguyên hệ thống đáng kể và cho phép chúng ta thực hiện bất kỳ công việc nào mà không cần đưa ngón tay ra khỏi bàn phím.
Ngoài ra, vi có một hướng dẫn tích hợp rất đầy đủ, có thể được khởi chạy bằng lệnh :help
ngay sau khi khởi động chương trình. Hướng dẫn tích hợp này chứa nhiều thông tin hơn so với trang man của vi/m.
Khởi chạy Vi Editor
Để khởi chạy vi, gõ vi trong dòng lệnh của bạn.
# vi
Sau đó nhấn i
để vào chế độ chèn, và bạn có thể bắt đầu gõ.
Một cách khác để khởi chạy vi/m là.
# vi filename
Điều này sẽ mở một vùng đệm mới (sau này sẽ giải thích thêm về vùng đệm) với tên là "filename", bạn có thể lưu lại lần sau.
Hiểu các chế độ trong Vi
Trình chỉnh sửa Vi có nhiều chế độ, mỗi chế độ đóng vai trò riêng biệt và cho phép người dùng thực hiện các hành động cụ thể.
Dưới đây là các chế độ chính mà bạn nên biết:
Chế độ Command-Line của Vi
Trong chế độ lệnh, vi cho phép người dùng điều hướng qua lại trong tệp và nhập lệnh vi dưới dạng các kết hợp gọn gàng và phân biệt chữ hoa chữ thường của một hoặc nhiều chữ cái. Hầu hết các lệnh này có thể được tiếp đầu ngay trước một số để lặp lại lệnh đó một số lần.
Ví dụ, yy (hoặc Y) sao chép toàn bộ dòng hiện tại, trong khi 3yy (hoặc 3Y) sao chép cả dòng hiện tại cùng với hai dòng kế tiếp (tổng cộng 3 dòng).
Chúng ta luôn có thể bắt đầu chế độ lệnh (bất kể chế độ đang làm việc) bằng cách nhấn phím Esc. Sự thật là trong chế độ lệnh, các phím của bàn phím được nhập vào như các lệnh thay vì làm văn bản, điều này dễ gây nhầm lẫn đối với người mới học.
Chế độ Ex của Vi
Trong chế độ ex, chúng ta có thể thao tác với các tệp (bao gồm lưu tệp hiện tại và chạy các chương trình bên ngoài). Để vào chế độ này, chúng ta phải nhập một dấu hai chấm (:
) từ chế độ lệnh, theo sau là tên lệnh chế độ ex cần sử dụng. Sau đó, vi sẽ tự động quay lại chế độ lệnh.
Chế độ Chèn của Vi
Trong chế độ chèn (thường dùng chữ cái i
), chúng ta chỉ cần nhập văn bản. Hầu hết các phím nhấn sẽ hiển thị văn bản trên màn hình (một ngoại lệ quan trọng là phím Esc, nó thoát khỏi chế độ chèn và quay lại chế độ lệnh).
Sử dụng Lệnh Vi
Bảng sau đây cho thấy danh sách các lệnh vi thông dụng. Các lệnh chỉnh sửa tệp có thể được áp dụng bằng cách thêm dấu chấm than vào cuối lệnh (ví dụ: :q!
để thoát mà không lưu).
Phím lệnh |
Mô tả |
h hoặc mũi tên trái |
Di chuyển một ký tự sang trái |
j hoặc mũi tên xuống |
Di chuyển xuống một dòng |
k hoặc mũi tên lên |
Di chuyển lên một dòng |
l (chữ thường L) hoặc mũi tên phải |
Di chuyển một ký tự sang phải |
H |
Di chuyển đến đầu màn hình |
L |
Di chuyển đến cuối màn hình |
G |
Di chuyển đến cuối tệp |
w |
Di chuyển một từ sang phải |
b |
Di chuyển một từ sang trái |
0 (số 0) |
Đi đến đầu dòng hiện tại |
^ |
Đi đến ký tự đầu tiên không phải khoảng trắng trong dòng hiện tại |
$ |
Đi đến cuối dòng hiện tại |
Ctrl-B |
Quay lại một màn hình |
Ctrl-F |
Di chuyển tới phía trước một màn hình |
i |
Chèn tại vị trí con trỏ hiện tại |
I (I hoa) |
Chèn vào đầu dòng hiện tại |
J (J hoa) |
Gộp dòng hiện tại với dòng kế tiếp (di chuyển xuống dòng kế tiếp) |
a |
Chèn sau vị trí con trỏ hiện tại |
o (chữ thường O) |
Tạo ra một dòng trống sau dòng hiện tại |
O (O hoa) |
Tạo ra một dòng trống trước dòng hiện tại |
r |
Thay thế ký tự tại vị trí con trỏ hiện tại |
R |
Ghi đè lên vị trí con trỏ hiện tại |
x |
Xóa ký tự tại vị trí con trỏ hiện tại |
X |
Xóa ký tự ngay trước (bên trái) vị trí con trỏ hiện tại |
dd |
Cắt (để dán sau này) toàn bộ dòng hiện tại |
D |
Cắt từ vị trí con trỏ hiện tại đến cuối dòng (lệnh này tương đương với d$) |
yX |
Cho một lệnh di chuyển X, sao chép (copy) số ký tự, từ hoặc dòng phù hợp từ vị trí con trỏ hiện tại |
yy hoặc Y |
Sao chép (copy) toàn bộ dòng hiện tại |
p |
Dán ngay sau (dòng mới) vị trí con trỏ hiện tại |
P |
Dán ngay trước (dòng trước) vị trí con trỏ hiện tại |
. (dấu chấm) |
Lặp lại lệnh trước đó |
u |
Hoàn tác lệnh cuối cùng |
U |
Hoàn tác lệnh cuối cùng trong dòng cuối. Điều này sẽ hoạt động miễn là con trỏ vẫn ở trên dòng. |
n |
Tìm kiếm phần khớp tiếp theo trong tìm kiếm |
N |
Tìm kiếm phần khớp trước đó trong tìm kiếm |
:n |
Tệp tiếp theo; khi chỉ định nhiều tệp để chỉnh sửa, lệnh này tải tệp tiếp theo. |
:e file |
Tải tệp vào chỗ của tệp hiện tại. |
:r file |
Chèn nội dung của tệp vào sau (dòng tiếp theo) vị trí con trỏ hiện tại |
:q |
Thoát không lưu thay đổi. |
:w file |
Lưu bộ đệm hiện tại vào tệp. Để thêm vào tệp hiện có, sử dụng :w >> file. |
:wq |
Ghi nội dung của tệp hiện tại và thoát. Tương đương với x! và ZZ |
:r! command |
Thực thi lệnh và chèn đầu ra sau (dòng tiếp theo) vị trí con trỏ hiện tại. |
Tùy chọn Vi
Các tùy chọn sau có thể hữu ích khi chạy vim (chúng ta cần thêm chúng vào tệp ~/.vimrc của mình).
# echo set number >> ~/.vimrc
# echo syntax on >> ~/.vimrc
# echo set tabstop=4 >> ~/.vimrc
# echo set autoindent >> ~/.vimrc
- set number hiển thị các số dòng khi vi mở một tệp hiện có hoặc tạo mới.
- syntax on bật viền cú pháp (cho nhiều phần mở rộng tệp) để làm cho tệp mã và cấu hình dễ đọc hơn.
- set tabstop=4 đặt kích thước tab thành 4 khoảng trắng (giá trị mặc định là 8).
- set autoindent đưa sang lề thụt trước đó cho dòng tiếp theo.
Tìm kiếm và thay thế văn bản trong Vi
vi có khả năng di chuyển con trỏ đến vị trí cụ thể (trên một dòng duy nhất hoặc trên toàn bộ tệp) dựa trên tìm kiếm. Nó cũng có thể thực hiện việc thay thế văn bản với hoặc không có xác nhận từ người dùng.
Tìm trong một dòng
Lệnh f
tìm kiếm trên một dòng và di chuyển con trỏ đến sự xuất hiện tiếp theo của một ký tự cụ thể trong dòng hiện tại.
Ví dụ, lệnh fh
sẽ di chuyển con trỏ đến vị trí xuất hiện tiếp theo của ký tự h
trong dòng hiện tại. Lưu ý rằng chữ f
và ký tự bạn đang tìm kiếm sẽ không xuất hiện bất kỳ đâu trên màn hình của bạn, nhưng ký tự sẽ được tô sáng sau khi bạn nhấn Enter.
Ví dụ, đây là điều mà tôi nhận được sau khi nhấn f4
ở chế độ lệnh.
Tìm kiếm trên toàn bộ tệp
Sử dụng lệnh /
, tiếp theo là từ hoặc cụm từ cần tìm kiếm. Một tìm kiếm có thể được lặp lại bằng cách sử dụng chuỗi tìm kiếm trước đó với lệnh n
, hoặc tìm kiếm tiếp theo (sử dụng lệnh N
). Đây là kết quả của việc gõ /Jane
ở chế độ lệnh.
Tìm kiếm và thay thế văn bản
Vi sử dụng một lệnh (tương tự sed) để thực hiện các hoạt động thay thế trên một dải dòng hoặc toàn bộ tệp.
Để thay đổi từ "“cũ
” thành "“mới
” cho cả tệp, chúng ta cần nhập lệnh sau.
:%s/old/young/g
Lưu ý: Dấu hai chấm (:
) bắt đầu lệnh ex, s
trong trường hợp này (để thực hiện thay thế), %
là một lựa chọn nhanh chóng có nghĩa từ dòng đầu tiên đến dòng cuối cùng (phạm vi cũng có thể được chỉ định là n
,m
đại diện cho “từ dòng n đến dòng m”), cũ là mẫu tìm kiếm, trong khi mới là văn bản thay thế và g
cho biết rằng việc thay thế nên được thực hiện trên mọi sự xuất hiện của chuỗi tìm kiếm trong tệp.
Thêm vào đó, có thể thêm c
tại cuối lệnh để yêu cầu xác nhận trước khi thực hiện thay thế nào đó.
:%s/old/young/gc
Trước khi thay thế văn bản gốc bằng văn bản mới, vi/m sẽ hiển thị thông báo như sau.
- y: thực hiện thay thế (có)
- n: bỏ qua sự xuất hiện này và qua xuống xuất hiện kế tiếp (không)
- a: thực hiện thay thế trong sự xuất hiện hiện tại và tất cả các trường hợp sau đó của mẫu.
- q hoặc Esc: thoát khỏi việc thay thế.
- l (L thường): thực hiện thay thế này và thoát (cuối cùng).
- Ctrl-e, Ctrl-y: Di chuyển xuống và lên, lần lượt, để xem nội dung của việc thay thế đề xuất.
Sửa nhiều tệp trong Vi
Hãy gõ vim file1 file2 file3 trong dòng lệnh của chúng ta.
# vim file1 file2 file3
Đầu tiên, vim sẽ mở file1. Để chuyển sang tệp tiếp theo (file2), chúng ta cần sử dụng lệnh :n
. Khi chúng ta muốn quay lại tệp trước, :N
thực hiện công việc.
Để chuyển từ file1 sang file3.
a). Lệnh :buffers
sẽ hiển thị danh sách các tệp đang được chỉnh sửa.
:buffers
b). Lệnh :buffer 3
(không có s
ở cuối) sẽ mở file3 để chỉnh sửa.
Trong trường hợp trên, dấu thăng (#) cho biết rằng tệp đang mở nhưng ở phía sau, trong khi %a đánh dấu tệp đang được chỉnh sửa. Ngược lại, khoảng trống sau số tệp (3 trong ví dụ trên) cho biết rằng tệp chưa được mở.
Bộ nhớ tạm thời trong Vi
Để sao chép một số dòng liên tiếp (ví dụ như 4) vào bộ nhớ tạm thời được đặt tên là a (không liên quan đến tệp) và đặt những dòng đó ở một phần khác trong tệp sau này trong phần vi hiện tại, chúng ta cần…
- Nhấn phím
ESC
để chắc chắn chúng ta đang ở chế độ Vi lệnh.
- Đặt con trỏ vào dòng đầu tiên của văn bản chúng ta muốn sao chép.
- Gõ “a4yy” để sao chép dòng hiện tại cùng với 3 dòng tiếp theo vào một bộ nhớ tạm thời có tên a. Chúng ta có thể tiếp tục chỉnh sửa tệp của mình – chúng ta không cần chèn các dòng sao chép ngay lập tức.
- Khi chúng ta đến địa điểm cho các dòng đã sao chép, sử dụng “a trước lệnh p hoặc P để chèn các dòng đã sao chép vào bộ nhớ có tên a>:
- Gõ “ap để chèn các dòng đã sao chép vào bộ nhớ sau dòng hiện tại mà con trỏ đang nghỉ.
- Gõ “aP để chèn các dòng đã sao chép vào bộ nhớ a trước dòng hiện tại.
Nếu chúng ta muốn, chúng ta có thể lặp lại các bước trên để chèn nội dung của bộ nhớ vào nhiều vị trí trong tệp của chúng ta. Bộ nhớ tạm thời như trong phần này bị xóa bỏ khi cửa sổ hiện tại được đóng.
Tóm tắt
Như chúng ta đã thấy, vi/m là trình chỉnh sửa văn bản mạnh mẽ và linh hoạt cho CLI. Đừng ngại chia sẻ các mẹo và nhận xét của riêng bạn dưới đây.