Làm cách nào để thêm tô sáng cú pháp phức tạp trong chế độ nhỏ?


10

Tôi muốn làm nổi bật mã với nhiều khuôn mặt khác nhau trong chế độ nhỏ.

Đây là một ảnh chụp màn hình gần với những gì tôi muốn:

python-cú pháp-highlight

Một điều mà tôi đang thiếu là có các bình luận chars #trong font-lock-comment-face. Ý tưởng là để các bình luận "thuộc về" một phác thảo được tô sáng dưới dạng văn bản thuần túy, để dễ đọc hơn. Trong khi có những bình luận thường xuyên với khuôn mặt ít nổi bật hơn bình thường của họ.

Đây là mã mà tôi đã sử dụng:

(setq-local font-lock-defaults
            '(python-font-lock-keywords
              nil nil nil nil
              (font-lock-syntactic-face-function
               . lpy-font-lock-syntactic-face-function)))

(defun lpy-font-lock-syntactic-face-function (state)
  "Return syntactic face given STATE.
Returns 'defalt face for comments that belong to an outline."
  (cond ((nth 3 state)
         (if (python-info-docstring-p state)
             font-lock-doc-face
           font-lock-string-face))
        ((save-excursion
           (while (and (> (point) (point-min))
                       (progn (move-beginning-of-line 0)
                              (eq (char-after) ?\#))))
           (forward-line 1)
           (looking-at "#\\*+ "))
         'default)
        (t
         font-lock-comment-face)))

Vấn đề là, tôi không có manh mối nào về giao diện font-lock-syntactic-face-functionhoạt động, ngoài việc nó nhận được cấu trúc dữ liệu phức tạp state, có trạng thái điểm khác nhau và trả về một khuôn mặt.

Ai đó có thể giải thích giao diện này? Có một cái tốt hơn có lẽ?

Câu trả lời:


6

font-lock-syntactic-face-functionlà một biến thông thường từ Khóa Phông chữ, cụ thể hơn là từ giai đoạn Khóa Ngữ pháp (nhấn mạnh của tôi):

Nếu biến này không phải là số không, nó sẽ là một hàm để xác định mặt nào sẽ được sử dụng cho một phần tử cú pháp nhất định (một chuỗi hoặc một nhận xét). Giá trị thường được đặt thông qua một phần tử khác trong mặc định phông chữ khóa.

Hàm được gọi với một đối số, trạng thái phân tích tại điểm được trả về bởi parse-partial-sexpvà sẽ trả về một mặt . Giá trị mặc định trả về font-lock-comment-face cho các bình luận và font-lock-string-face cho chuỗi (xem Faces for Font Lock).

parse-partial-sexplần lượt trả về một danh sách mô tả trạng thái cú pháp hiện tại của Emacs, về cơ bản là kết quả của việc áp dụng bảng cú pháp vào bộ đệm hiện tại. Danh sách này khá phức tạp, do đó tôi sẽ dành nó ở đây; bạn có thể thấy tài liệu tham khảo đầy đủ trong chuỗi của parse-partial-sexp. Mục đích của chức năng này là thay đổi khuôn mặt được áp dụng cho một yếu tố cú pháp theo các quy tắc nhất định. Phần đầu của hàm của bạn thể hiện điều này: Nếu chuỗi hiện tại là một chuỗi doc, hãy sử dụng một mặt khác cho nó.

Tuy nhiên, khuôn mặt luôn áp dụng cho toàn bộ thành phần cú pháp, tức là toàn bộ chuỗi hoặc nhận xét. Bạn không thể làm nổi bật các phần riêng lẻ với chức năng này và bạn chỉ nên xem phần được cung cấp statecho mục đích này giống như (python-info-docstring-p state)trong mã của bạn. Đừng không sử dụng điểm mà tại nơi này; Tôi thậm chí không chắc giá trị của pointđược xác định đúng ở giai đoạn khóa phông này hay không.


Đặt các mảnh lại với nhau, bạn đang sử dụng chức năng sai cho mục đích của mình, đó là lý do tại sao bạn không thể làm cho nó hoạt động.

Tôi đã không cố gắng thực hiện đánh dấu mong muốn của bạn, nhưng tôi nghĩ rằng bạn đã đào, cách quá sâu cho mục đích của bạn. Nếu tôi hiểu mọi thứ rõ ràng, bạn sẽ chỉ thích những phác thảo nổi bật trong một bình luận.

Nếu tôi đúng, thì bạn chỉ cần font-lock-keywordsmột cách đặc biệt, cụ thể là:

(my/find-outline-in-comment-p 0 'outline-face t)

nơi outline-facelà khuôn mặt mà bạn muốn áp dụng cho các dòng tiêu đề, tphương tiện để ghi đè lên bất kỳ font-khóa trước tại nơi này, và my/find-outline-in-commentlà một chức năng khớp (xem docstring của font-lock-defaults) mà có một vị trí và tìm kiếm những phác thảo đầu tiên trong một chú thích giữa (point)và vị trí đó, trả về phạm vi của phác thảo sẽ được tô sáng trong dữ liệu khớp.

Để tìm phác thảo, bạn sẽ quét về phía trước để nhận xét (sử dụng font-lock-comment-facehoặc trạng thái cú pháp) và sau đó sử dụng looking-atđể kiểm tra xem nhận xét có phác thảo không.


1

Xem xét để xác định font-lock-syntactic-face-functionnhư thế:

(setq font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state))
            MY-COMMENT-FACE
          (t  font-lock-comment-face))))

Điều này đã được thử nghiệm với python-mode.el, để lại một phần bắt đầu bằng "# *" mà không có mặt bình luận:

(setq py--font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state)
            (progn (save-excursion
                 (goto-char (nth 8 state))
                 (looking-at (concat comment-start (regexp-quote "*"))))))
           nil)
          (t font-lock-comment-face))))

Trong khi nó được quản lý với chế độ:

(font-lock-syntactic-face-function
                    . py--font-lock-syntactic-face-function)

Thay vì nil, bất kỳ khuôn mặt hợp lệ nên làm việc.

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.