2014-09-18 15 views
5

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ủ?

+0

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

+0

@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

Trả lời

5

Giống như Lindydancer, tôi khuyên bạn nên sử dụng thuộc tính văn bản hơn là lớp phủ. Lớp phủ tỷ lệ như O (N^2) trong khi văn bản-thuộc tính quy mô như O (N log N), do đó, nó hoạt động tốt hơn nhiều. Tôi sẽ không sử dụng font-lock cho bất kỳ của nó, tho.

Tất nhiên, giải pháp thay thế là sửa lớp phủ: mã C có thể được thay đổi để biến nó thành O (N log N). Tôi đã biết làm thế nào để làm điều đó trong một thời bây giờ, nhưng đã không tìm thấy thời gian (và dường như không tìm thấy thời gian trong tương lai gần), vì vậy nếu ai đó quan tâm tôi sẽ rất vui khi giúp anh ta làm điều đó.

+0

Vào cuối ngày tôi không cần bản thân văn bản, tôi chỉ cần vị trí và chức năng lớp phủ liên quan đến vị trí. Nó chỉ ra rằng sử dụng các thuộc tính văn bản ở đây sẽ là một biến chứng không cần thiết ... Tôi sẽ đi với một số loại phương pháp phức tạp với lớp phủ, chẳng hạn như sử dụng một lớp phủ duy nhất cho một nhóm các thẻ. Bạn đã đề cập đến cải thiện hiệu ứng lớp phủ ... Tôi quan tâm đến việc này và xâm nhập vào mã tấn công Emacs C nói chung. Đó là, nếu không có ai vội vàng (tôi chắc chắn là không). Làm thế nào chúng ta có thể hợp tác trên cái này? – Vlad

+0

nhân tiện, bạn có biết bất kỳ điều gì về việc triển khai điểm đánh dấu không? Chúng có tiềm năng có vấn đề như lớp phủ không? – Vlad

+0

Các điểm đánh dấu có vấn đề về hiệu suất, vâng (đó là một phần lý do cho lớp phủ bị chậm, vì mỗi lớp phủ trong nội bộ sử dụng 2 điểm đánh dấu). Nếu bạn quan tâm đến hacking trên lớp phủ, sau đó đi qua để emacs-devel nói quan tâm của bạn trong việc làm về vấn đề này và chúng tôi sẽ mang nó từ đó. – Stefan

3

Một thay thế cho lớp phủ là thuộc tính văn bản, chúng được đính kèm với văn bản theo cách mà lớp phủ không có, vì vậy chúng hiệu quả hơn nhiều.

Gói có sử dụng thuộc tính văn bản nhiều là phông chữ khóa. Thông thường, nó được sử dụng để làm nổi bật bộ đệm, nhưng không có gì ngăn cản bạn khỏi sự ủng hộ heo con trên nó cho mục đích của riêng bạn. Bằng cách đó bạn sẽ nhận được toàn bộ hệ thống để phát hiện rằng người dùng đã sửa đổi nội dung của bộ đệm miễn phí.

Trong trường hợp của bạn, bạn có thể thay thế regexp trong từ khóa khóa phông chữ bằng chức năng sẽ được gọi với giới hạn tìm kiếm.Tất cả những gì bạn cần làm là quét phần ngắn tương đối, thiết lập các thuộc tính văn bản của riêng bạn và bạn đã hoàn thành. (Ngoài ra, bạn phải thông báo cho font-lock thuộc tính bạn đang thiết lập bằng cách sử dụng font-lock-extra-managed-props.)

+0

Vấn đề ở đây là tôi muốn ** tránh chế độ khóa phông chữ ** và thay thế bằng hệ thống mã hóa gia tăng sẽ làm nổi bật cú pháp theo cách chi tiết hơn (so với sử dụng khóa phông chữ regexps). Thực ra, tôi đã kiểm tra mã khóa chữ và không quá thông minh. Như tôi đã hiểu từ một nghiên cứu nhanh, nó chỉ giải cứu bộ đệm bắt đầu với điểm thay đổi (tránh vài trường hợp góc). – Vlad

+0

Không nghĩ về các thuộc tính văn bản theo cách như vậy ... Được rồi, tôi có thể đính kèm một tham chiếu mã thông báo vào một đoạn văn bản. Một vấn đề khác nảy sinh ở đây. Cách tìm mã thông báo đã xóa? I E. mã thông báo không được trỏ đến bởi bất kỳ văn bản nào? Với lớp phủ khá dễ dàng. – Vlad

+0

Bên cạnh hiệu suất, câu hỏi có sử dụng thuộc tính lớp phủ hay thuộc tính văn bản liên quan đến điều này không: Bạn có muốn liên kết thuộc tính và giá trị của chúng với ** ký tự ** trong bộ đệm hoặc vị trí đệm ** không. Nếu trước đây, các thuộc tính văn bản là một lựa chọn tự nhiên; nếu sau này, lớp phủ là. (Tiêu đề câu hỏi của bạn cho thấy rằng đó là vị trí đệm mà điều này là về, nhưng có lẽ đó là chỉ vì thực hiện đầu tiên của bạn được dựa trên lớp phủ.) – Drew

Các vấn đề liên quan