Tại sao các chế độ chính không chỉ kiểm tra khuôn mặt?


10

Khi viết một chế độ chính, thường hữu ích khi biết 'là điểm trong một chuỗi?' "Là điểm trong một nhận xét?".

Hầu hết các chế độ chính dường như cố gắng phân tích ngôn ngữ lập trình. Ví dụ:

  • python-syntax-content các cuộc gọi syntax-ppss
  • haskell-fill-paragraphcác cuộc gọi syntax-ppssre-search-forward
  • c-in-comment-line-prefix-p di chuyển điểm xung quanh và gọi looking-at
  • sp-point-in-commentcác cuộc gọi syntax-ppssnhưng cũng kiểm tra xem nó có trên một bình luận

Tuy nhiên, điều này không hoạt động trong một số trường hợp. Trong bộ đệm chế độ org, các nhận xét trong các khối nguồn không được phát hiện chính xác bởi các phương pháp này.

Nó cũng có vẻ vô nghĩa, vì bộ đệm đã hiển thị các bình luận được tô sáng .

Thay vào đó, bạn có thể chỉ cần kiểm tra các khuôn mặt tại điểm:

(defun wh--get-faces (pos)
  "Get all the font faces at POS."
  (remq nil
        (list
         (get-char-property pos 'read-face-name)
         (get-char-property pos 'face)
         (plist-get (text-properties-at pos) 'face))))

(defun wh-string-p (pos)
  "Return non-nil if POS is inside a string."
  (memq 'font-lock-string-face (wh--get-faces pos)))

Tại sao các chế độ chính không làm điều này? Bộ đệm đã được phông chữ, vì vậy tôi hy vọng nó sẽ nhanh hơn, mạnh hơn và yêu cầu ít mã hơn.


1
Tôi thích câu hỏi này. Tuy nhiên, nếu bạn không sử dụng font-lock-modethì sao? (Không phải tôi nghĩ bạn nên làm.)
mbork

Câu trả lời:


12

Vấn đề là nó không mạnh mẽ hơn.

Thứ nhất, các chế độ chính chính là các chế độ chịu trách nhiệm quyết định bình luận hoặc chuỗi. Nếu họ có thể xác định thành công chúng cho mục đích khóa phông chữ, họ sẽ có thể làm tương tự cho các mục đích khác.

Thứ hai, đọc cú pháp để xác định bối cảnh mà điểm nằm bên trong là cách thực hiện mạnh mẽ hơn nếu nó được thực hiện đúng. Nếu bạn đã tìm thấy các trường hợp không thành công, thì đáng để gửi báo cáo lỗi cho tác giả chế độ chính.


Lý do tại sao kiểm tra khuôn mặt kém mạnh mẽ là bởi vì nó có thể thất bại trong một số tình huống.

  1. Để bắt đầu, người dùng có thể đã bị vô hiệu hóa font-lock-mode(có thể đó là một bộ đệm lớn), nhưng ngay cả khi font-lock-modeđã bật, khuôn mặt vẫn không ổn định.

  2. Ngoài ra, người dùng có thể có một chế độ nhỏ có thêm một số font-lock-keywords(như làm nổi bật TODOtrong các bình luận). Hoặc có thể có một chế độ nhỏ áp dụng động một số khuôn mặt sau khi khóa phông chữ đã phông chữ bộ đệm.

Tóm lại, chế độ chính không đảm bảo rằng các mặt được xác định bởi nó là các mặt hiện đang được áp dụng.


2

Tôi đoán lý do chính là vì sử dụng khóa phông chữ syntax-ppss.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.