Giới thiệu
Khi phát triển với Unreal Engine trong Neovim, việc sử dụng cú pháp nổi bật cho các macro như UCLASS
và UPROPERTY
là rất quan trọng. Để hỗ trợ điều này, tôi đã tạo một bộ phân tích cú pháp tùy chỉnh, tree-sitter-unreal-cpp. Tuy nhiên, khi tích hợp với nvim-treesitter
, tôi đã gặp phải một vấn đề lớn: cú pháp nổi bật không áp dụng. Trong bài viết này, tôi sẽ chia sẻ quá trình tìm ra nguyên nhân và cách giải quyết vấn đề này.
Vấn đề: Cú pháp hoạt động nhưng không có nổi bật
Khi tôi cấu hình nvim-treesitter
để thay thế bộ phân tích cú pháp cpp
mặc định bằng bộ phân tích tùy chỉnh của mình, cú pháp nổi bật không xuất hiện. Tôi đã kiểm tra bằng cách sử dụng lệnh :TSPlaygroundToggle
và xác nhận rằng các nút tùy chỉnh như uclass_macro
được phân tích đúng, nhưng không có nhóm nổi bật nào được phát hiện. Điều này đã khiến tôi khó khăn trong việc xác định nguyên nhân của vấn đề.
Nguyên nhân: Cách nvim-treesitter Tải Tập Tin Truy Vấn
Sau một thời gian điều tra, tôi đã phát hiện rằng nguyên nhân chính là cách nvim-treesitter
xử lý việc tải các tệp truy vấn. Mặc dù nó sẽ xây dựng và sử dụng bộ phân tích từ một URL chỉ định trong install_info
, nhưng nó không tìm kiếm các tệp truy vấn (như .scm
cho nổi bật) bên trong kho lưu trữ tùy chỉnh của bạn. Thay vào đó, nó luôn sử dụng các tệp truy vấn được đóng gói trong thư mục queries/{filetype}/
của chính nó. Điều này có nghĩa là tệp queries/highlights.scm
trong kho lưu trữ tree-sitter-unreal-cpp
của tôi đã bị bỏ qua hoàn toàn.
Giải pháp: Mở Rộng Truy Vấn Sử Dụng Thư Mục after
Giải pháp cho vấn đề này là sử dụng cơ chế thư mục after
của Neovim. Các tệp được đặt trong thư mục after
sẽ được tải sau các tệp cấu hình tiêu chuẩn. Điều này cho phép chúng ta mở rộng các truy vấn mặc định cho cpp
thay vì cố gắng thay thế chúng.
Bước 1: Tạo Tệp Truy Vấn Trong Cấu Trúc Thư Mục after
Trong kho lưu trữ bộ phân tích cú pháp tùy chỉnh của bạn, hãy tạo một tệp tại đường dẫn after/queries/cpp/highlights.scm
. Trong tệp này, bạn chỉ nên bao gồm các định nghĩa nổi bật cho cú pháp mới mà bạn muốn thêm, chẳng hạn như các macro của Unreal Engine.
;; mở rộng
; Các macro của Unreal Engine
(uclass_macro "UCLASS" @attribute)
(uproperty_macro "UPROPERTY" @attribute)
; ... các định nghĩa cụ thể khác của UE
Bước 2: Tải Kho Lưu Trữ Bộ Phân Tích Như Một Plugin
Để Neovim nhận biết thư mục after
mới này, bạn cần tải kho lưu trữ tree-sitter-unreal-cpp
như một plugin độc lập trong lazy.nvim
.
return {
{
"taku25/tree-sitter-unreal-cpp",
},
{
"nvim-treesitter/nvim-treesitter",
config = function(_,opts)
local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
parser_config.cpp = {
install_info = {
url = "https://github.com/taku25/tree-sitter-unreal-cpp",
files = {"src/parser.c", "src/scanner.c"},
branch = "master",
},
filetype = "cpp",
}
require("nvim-treesitter.configs").setup(opts)
end,
},
}
Với thiết lập này, nvim-treesitter
sẽ tải các nổi bật chuẩn của C++ trước, sau đó tải tệp after/queries/cpp/highlights.scm
của plugin của chúng ta, đạt được kết quả nổi bật mong muốn.
Thực hành tốt nhất
- Luôn kiểm tra kỹ cấu hình của bạn sau khi thực hiện bất kỳ thay đổi nào để đảm bảo rằng mọi thứ hoạt động đúng.
- Sử dụng các công cụ như
:TSCaptureUnderCursor
để xác minh các nhóm nổi bật.
Cạm bẫy thường gặp
- Không đảm bảo rằng đường dẫn đến tệp
highlights.scm
đã được cấu hình đúng. - Bỏ qua việc tải plugin của bạn như một phần của cấu hình Neovim.
Mẹo Hiệu Suất
- Đảm bảo rằng các tệp truy vấn của bạn được tối ưu hóa để không làm chậm quá trình phân tích cú pháp.
- Sử dụng các lệnh để kiểm tra hiệu suất của bộ phân tích cú pháp.
Kết luận
Nếu bạn gặp vấn đề khi nổi bật không áp dụng cho bộ phân tích cú pháp tree-sitter tùy chỉnh của mình, nguyên nhân thường là do cách nvim-treesitter
xử lý việc tải truy vấn. Giải pháp là đặt các truy vấn mở rộng của bạn vào thư mục after/queries/{filetype}/
và tải kho lưu trữ bộ phân tích của bạn như một plugin trong Neovim. Hy vọng bài viết này sẽ hữu ích cho các nhà phát triển gặp phải vấn đề tương tự.
Câu hỏi thường gặp
- Tại sao tệp
highlights.scm
của tôi lại bị bỏ qua?- Điều này thường là do
nvim-treesitter
không tìm kiếm trong kho lưu trữ tùy chỉnh, bạn cần sử dụng thư mụcafter
để mở rộng các truy vấn.
- Điều này thường là do
- Làm thế nào để xác minh rằng cú pháp nổi bật hoạt động?
- Sử dụng lệnh
:TSCaptureUnderCursor
để kiểm tra các nhóm nổi bật đang hoạt động.
- Sử dụng lệnh
Ghi chú quan trọng
- Đảm bảo rằng bạn đã cài đặt các phiên bản mới nhất của
nvim-treesitter
và các plugin liên quan để tránh các vấn đề tương tự.
Bạn đã bao giờ gặp phải vấn đề tương tự với hành vi của nvim-treesitter
chưa? Nếu bạn biết một cách tiếp cận tốt hơn, hãy chia sẻ nó trong phần bình luận!