Mặc dù plugin chắc chắn là một trong những điểm mạnh nhất của Vim, nhưng một số chức năng khác khiến nó trở thành một trong những trình soạn thảo văn bản/IDE mạnh mẽ và giàu tính năng nhất hiện có cho người dùng Linux. Một trong những chức năng này là khả năng thực hiện các thay đổi cài đặt cụ thể cho tệp. Có thể truy cập khả năng này bằng tính năng Modeline của trình soạn thảo.
Trong bài viết này, chúng tôi sẽ thảo luận về cách bạn có thể sử dụng tính năng Modeline của Vim bằng các ví dụ dễ hiểu.
Nhưng trước khi bắt đầu thực hiện, cần lưu ý rằng tất cả các ví dụ, lệnh và hướng dẫn được đề cập trong hướng dẫn này đều đã được thử nghiệm trên Ubuntu 16.04 - Ubuntu 22.04.
Vì vậy, những gì bạn có thể làm là đặt dòng sau vào đầu hoặc cuối tệp đang đề cập:
Có khả năng cao là nếu bạn thử thực hiện bài tập đã đề cập ở trên để kiểm tra trường hợp sử dụng trên máy Linux của mình, mọi thứ sẽ không hoạt động như mong đợi. Nếu đúng như vậy, đừng lo lắng, vì trong một số trường hợp, tính năng Modeline cần được kích hoạt trước (tính năng này bị vô hiệu hóa theo mặc định trên các hệ thống như Debian, Ubuntu, Gentoo và OSXvì lý do bảo mật).
Để bật tính năng này, hãy mở tệp .vimrc (nằm trong thư mục gốc của bạn), sau đó thêm dòng sau vào đó:
Bây giờ, bất cứ khi nào bạn nhập một tab và lưu tệp (nơi lệnh expandtab modeline được nhập), tab sẽ tự động chuyển thành khoảng trắng.
Hãy xem xét một trường hợp sử dụng khác. Giả sử không gian tab mặc định trong Vim được đặt thành 4, nhưng đối với một tệp cụ thể, bạn muốn tăng lên 8. Đối với điều này, bạn cần thêm dòng sau vào đầu hoặc cuối tệp:
Bây giờ hãy thử nhập một tab và bạn sẽ thấy số khoảng trống mà nó bao phủ sẽ là 8.
Bạn có thể đã nhận thấy tôi nói rằng các lệnh modeline này cần được nhập ở đâu đó gần đầu hoặc cuối tệp. Nếu bạn đang tự hỏi tại sao lại như vậy, thì lý do là tính năng này được thiết kế theo cách này. Các dòng sau (trích từ tài liệu chính thức của Vim) sẽ làm rõ hơn điều này:
"Modeline không thể ở bất kỳ đâu trong tệp: nó phải ở trong vài dòng đầu tiên hoặc cuối cùng. Vị trí chính xác mà vim kiểm tra modeline được kiểm soát bởi biến
Và đây là nội dung của lệnh :help modelines (được tham chiếu trong các dòng trên):
Hãy thử đặt lệnh modeline vượt quá phạm vi 5 dòng mặc định (từ dưới lên hoặc từ trên xuống) và bạn sẽ thấy rằng khoảng cách tab sẽ trở lại mặc định của Vim - trong trường hợp của tôi là 4 khoảng cách.
Tuy nhiên, bạn có thể thay đổi hành vi này nếu muốn bằng cách sử dụng lệnh sau trong tệp .vimrc của mình.
Ví dụ, tôi đã tăng giá trị từ 5 lên 10.
Điều này có nghĩa là bây giờ tôi có thể đặt lệnh modeline ở bất kỳ đâu giữa 10 dòng đầu tiên hoặc cuối cùng của tệp.
Tiếp tục, tại bất kỳ thời điểm nào, khi chỉnh sửa tệp, bạn có thể nhập lệnh sau (với trình soạn thảo Vim ở chế độ lệnh) để xem các cài đặt liên quan đến modeline hiện tại cũng như vị trí cuối cùng của chúng set.
Ví dụ, trong trường hợp của tôi, lệnh trên tạo ra kết quả đầu ra sau:
Sau đây là một số điểm quan trọng bạn cần biết về tính năng Modeline của Vim:
Bạn đã từng sử dụng tính năng Modeline chưa? Trải nghiệm của bạn thế nào? Hãy chia sẻ với chúng tôi (và toàn bộ cộng đồng HowtoForge) trong phần bình luận bên dưới.
Trong bài viết này, chúng tôi sẽ thảo luận về cách bạn có thể sử dụng tính năng Modeline của Vim bằng các ví dụ dễ hiểu.
Nhưng trước khi bắt đầu thực hiện, cần lưu ý rằng tất cả các ví dụ, lệnh và hướng dẫn được đề cập trong hướng dẫn này đều đã được thử nghiệm trên Ubuntu 16.04 - Ubuntu 22.04.
VIM Modeline
Cách sử dụng
Như chúng tôi đã đề cập, tính năng Modeline của Vim cho phép bạn thực hiện các thay đổi cụ thể cho từng tệp. Ví dụ, giả sử bạn muốn thay thế tất cả các tab được sử dụng trong một tệp cụ thể của dự án bằng khoảng trắng và đảm bảo rằng tất cả các tệp khác không bị ảnh hưởng bởi thay đổi này. Đây là trường hợp sử dụng lý tưởng mà Modeline giúp bạn thực hiện những gì bạn muốn.Vì vậy, những gì bạn có thể làm là đặt dòng sau vào đầu hoặc cuối tệp đang đề cập:
Mã:
# vim: set expandtab:
Để bật tính năng này, hãy mở tệp .vimrc (nằm trong thư mục gốc của bạn), sau đó thêm dòng sau vào đó:
Mã:
set modeline
Hãy xem xét một trường hợp sử dụng khác. Giả sử không gian tab mặc định trong Vim được đặt thành 4, nhưng đối với một tệp cụ thể, bạn muốn tăng lên 8. Đối với điều này, bạn cần thêm dòng sau vào đầu hoặc cuối tệp:
Mã:
// vim: noai:ts=8:
Bạn có thể đã nhận thấy tôi nói rằng các lệnh modeline này cần được nhập ở đâu đó gần đầu hoặc cuối tệp. Nếu bạn đang tự hỏi tại sao lại như vậy, thì lý do là tính năng này được thiết kế theo cách này. Các dòng sau (trích từ tài liệu chính thức của Vim) sẽ làm rõ hơn điều này:
"Modeline không thể ở bất kỳ đâu trong tệp: nó phải ở trong vài dòng đầu tiên hoặc cuối cùng. Vị trí chính xác mà vim kiểm tra modeline được kiểm soát bởi biến
modelines
; xem:help modelines. Theo mặc định, nó được đặt thành 5 dòng."Và đây là nội dung của lệnh :help modelines (được tham chiếu trong các dòng trên):
Mã:
Nếu 'modeline' nằm trên 'modelines' thì sẽ cung cấp số dòng được kiểm tra cho các lệnh set. Nếu 'modeline' tắt hoặc 'modelines' bằng không thì không có dòng nào được chọn.
Tuy nhiên, bạn có thể thay đổi hành vi này nếu muốn bằng cách sử dụng lệnh sau trong tệp .vimrc của mình.
Mã:
set modelines=[new-value]
Mã:
set modelines=10
Tiếp tục, tại bất kỳ thời điểm nào, khi chỉnh sửa tệp, bạn có thể nhập lệnh sau (với trình soạn thảo Vim ở chế độ lệnh) để xem các cài đặt liên quan đến modeline hiện tại cũng như vị trí cuối cùng của chúng set.
Mã:
:verbose set modeline? modelines?
Mã:
modeline
Last set from ~/.vimrc
modelines=10
Last set from ~/.vimrc
- Tính năng này được bật theo mặc định cho Vim chạy ở chế độ không tương thích (không tương thích với Vi), nhưng một số bản phân phối Vim đáng chú ý vô hiệu hóa tùy chọn này trong vimrc hệ thống vì lý do bảo mật.
- Tính năng này bị vô hiệu hóatheo mặc định khi chỉnh sửa dưới dạng root (nếu bạn đã mở tệp bằng 'sudo' thì không có vấn đề gì - tính năng này hoạt động).
- Với '
set'
, modeline kết thúc bằng dấu hai chấm đầu tiên không theo sau dấu gạch chéo ngược. Và không có 'set'
, không có văn bản nào có thể theo sau các tùy chọn. Ví dụ:/* vim: noai:ts=4:sw=4 */ là một modeline không hợp lệ.
Mối quan ngại về bảo mật
Thật đáng buồn, tính năng Modeline của Vim có thể bị sử dụng để xâm phạm bảo mật. Trên thực tế, nhiều sự cố liên quan đến Modeline liên quan đến bảo mật đã được báo cáo trong quá khứ, bao gồm tiêm lệnh shell,thực thi lệnh tùy ý, truy cập trái phép, v.v. Đồng ý, hầu hết những lỗi này đều đã cũ và đã được sửa, nhưng điều này cho thấy tính năng Modeline có thể bị tin tặc sử dụng sai mục đích.Kết luận
Modeline có thể là một tính năng nâng cao của trình soạn thảo Vim, nhưng không quá khó để hiểu. Chắc chắn là có một chút đường cong học tập liên quan, nhưng điều đó không đáng để yêu cầu nhiều vì tính năng này hữu ích như thế nào. Tất nhiên, vẫn có những lo ngại về bảo mật, nghĩa là bạn nên cân nhắc các lựa chọn của mình trước khi bật và sử dụng tính năng này.Bạn đã từng sử dụng tính năng Modeline chưa? Trải nghiệm của bạn thế nào? Hãy chia sẻ với chúng tôi (và toàn bộ cộng đồng HowtoForge) trong phần bình luận bên dưới.