Tôi đang chuyển đổi bộ mã thông báo khởi động lại đầy đủ thông thường (được chuyển từ trình phân tích cú pháp ngôn ngữ gốc, ngôn ngữ không liên quan ở đây) thành một cặp nâng cao hơn. Điều này ngụ ý những điều sau đây:Cách tốt nhất để lưu nhiều cặp vị trí trong Emacs Lisp
a) nó phải nhanh, rất nhanh;
b) khi mọi bản cập nhật văn bản (có thể chèn hoặc xóa) phải tìm các mã thông báo bị hỏng và sửa chữa danh sách mã thông báo tương ứng.
Phiên bản mã thông báo gốc chỉ xây dựng danh sách mã thông báo khi duyệt qua văn bản đệm bằng cách sử dụng regexps; mọi mã thông báo trong danh sách là một vectơ gồm 4 phần tử (['TOKENTYPE "token-lexeme" linum charnum]). Linum/charnum là số đơn giản chỉ định vị trí mã thông báo trong bộ đệm tại thời điểm lexing được thực hiện. Dễ dàng pie.
Hiện tại, đến thời điểm này. Bất cứ khi nào (tốt .. không phải mọi lần, nhưng thường là đủ) người dùng thêm hoặc xóa một ký tự (hoặc một chuỗi) trình mã thông báo mới phải tìm một mã thông báo được tạo bằng cách sử dụng văn bản ở vị trí thay đổi, và, có thể, thẻ phụ thuộc cho sau này xóa/cập nhật.
Có hai vấn đề ở đây:
a) vị trí thẻ nên năng động (ví dụ: nếu người dùng thêm một số văn bản trong phần đầu của một bộ đệm -> chúng ta không nên bận tâm sửa chữa thẻ vào cuối đệm);
b) cách để truy cập mã thông báo bị hỏng (hoặc nhiều mã thông báo nói chung).
Hiện tại tôi đang cố gắng sử dụng lớp phủ cho tác vụ vì lớp phủ có giao diện đẹp phù hợp với nhu cầu của tôi: các lớp phủ tại/lớp phủ trong chức năng giúp tìm kiếm; và lớp phủ bắt đầu/kết thúc di chuyển một cách thích hợp.
Tôi có thể làm điều đó vui vẻ cho một tệp nhỏ hơn. Nhưng nó chỉ ra (và tôi phải thừa nhận rằng tôi đã được cảnh báo bởi các tài liệu) rằng giải pháp không quy mô: ngay cả một tập tin trung bình 1K LOC có thể có lớp phủ CONST * LOC, mà chỉ là quá nhiều cho Emacs.
Đó là lần thử đầu tiên của tôi và đó không phải là một thử nghiệm thành công. Tôi đang xem xét các lựa chọn thay thế như:
1) quản lý cây tìm kiếm mã thông báo viết tay bằng số đơn giản;
2) cùng một cây, nhưng sử dụng điểm đánh dấu;
3) một số cách tiếp cận hỗn hợp bao gồm cả số đơn giản và điểm đánh dấu.
Bất kỳ giải pháp thay thế nào cho các phương pháp được đề cập? Hoặc có thể có một cách tốt hơn để xử lý nhiều lớp phủ?
Related: Có 'Wisent' và' semantic' trong các emacs. Có lẽ, bạn đã kiểm tra những cái đó. Ngoài ra còn có một số hỗ trợ nổi bật, ví dụ: 'http://www.gnu.org/software/emacs/manual/html_mono/semantic.html#Highlight-Func-Mode. – Tobias
@Tobias Vâng, tất nhiên, tôi đã kiểm tra chúng. Rất nhiều lần, thậm chí đã ký các giấy tờ FSF và gửi một micropatch hoặc hai cho mã liên quan đến Java. Trình mã thông báo đặc biệt này có nghĩa là hoạt động theo cách khác (hy vọng, cấp trên :-)) và là một thử nghiệm để thay thế chế độ khóa-phông chữ. – Vlad