0
0
Lập trình
Admin Team
Admin Teamtechmely

Khắc Phục Vấn Đề Nổi Bật Cú Pháp Tùy Chỉnh Trong nvim-treesitter

Đăng vào 6 ngày trước

• 4 phút đọc

Chủ đề:

#neo#ue

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ư UCLASSUPROPERTY 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.

Copy
;; 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.

Copy
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

  1. 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ục after để mở rộng các truy vấn.
  2. 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.

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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào