Cài đặt và cấu hình trình soạn thảo Vim/ Vi trên Linux

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.

  1. 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.
  2. 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.

Vim Editor Help

Khởi chạy Vi Editor

Để khởi chạy vi, gõ vi trong dòng lệnh của bạn.

# vi
Start Vi Editor

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ệnhvi 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).

Vi Insert Mode

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
vi Editor Options
  • 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.

Search String in Vi

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.

Vi Search String in File

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ừ "“” 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 exs 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”),  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.

Replace String in Vi
  • 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-eCtrl-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
Edit Multiple Files

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>:
    1. 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ỉ.
    2. 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.