Küçük bir modda karmaşık sözdizimi vurgulama nasıl eklenir?

Küçük modda çeşitli yüzlerle kod vurgulamak istiyorum.

İşte istediğim şeye yakın bir ekran görüntüsü:

python-syntax-highlight

Kaybettiğim bir şey yorum chars # içeriyor font-lock-comment-yüz . Fikir, "ait" olan yorumlara sahip olmaktır. Düz metin olarak vurgulanan bir taslak için, okunması daha kolay. Süre Her zamanki daha az belirgin yüzleri ile düzenli yorumlar.

İşte kullandığım kod:

(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)))

Mesele şu, üzerinde hangi arayüzün olduğuna dair hiçbir fikrim yok. font-lock-syntactic-face-function çalışır; karmaşık veri yapısı durumu , farklı nokta durumu vardır ve döndürür bir yüz.

Birisi bu arayüzü açıklayabilir mi? Belki daha iyi bir tane var mı?

9

2 cevap

font-lock-syntactic-face-function is a regular variable from Font Lock, more specifically from the Syntactic Font Lock phase (emphasis mine):

Bu değişken sıfır değilse, belirli bir sözdizim öğesi için hangi yüzün kullanılacağını belirlemek için bir işlev olmalıdır (bir dize veya yorum). Değer normalde font-lock-defaults'larda başka bir varis elemanı ile ayarlanır.

     

Bu işlev bir argümanla, tarafından döndürülen noktada parse durumu ile çağrılır ve bir yüze geri dönmelidir . Varsayılan değer, yorumlar için font-lock-comment-face ve dizeler için font-lock-string-face değerini döndürür (bkz. Yazı Tipi Kilidi için Yüzler).

parse-partial-sexp in turn returns a list which describes Emacs' current syntactic state, which is essentially the result of the application of the syntax table to the current buffer. The list is rather complex, hence I'll spare it here; you can see the complete reference in the docstring of parse-partial-sexp. The purpose of this function is to change the face applied to a syntactic element under certain rules. The beginning of your function demonstrates this: If the current string is a docstring, use a different face for it.

Ancak, yüz her zaman bütün sözdizimsel öğeye, yani tüm dizeye veya yoruma uygulanır. Bu işlevle tek tek bölümleri vurgulayamazsınız ve yalnızca bu amaçla state 'e bakmalısınız — (python-info-docstring-p state) gibi senin kodunda. Bu yerde kullanmayın kullanın; Yazı tipi kilitlemenin bu aşamasında point değerinin uygun şekilde tanımlanıp tanımlanmadığından emin değilim.


Parçaları bir araya getirmek, amacınız için yanlış bir işlev kullanıyorsunuz, işte bu yüzden işe yaramazsınız.

İstediğiniz vurgulamayı yapmaya çalışmıyorum, ama amacınız için çok derin bir yol kazandığınızı düşünüyorum. Bir şeyleri doğru anlıyorsam, yorumda ana hatları vurgulamak istersiniz.

Haklıysam, özel bir şekilde font-lock-keywords 'e ihtiyacınız var:

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

anahat yüzü , başlığa uygulamak istediğiniz yüzdeyse t , buradaki herhangi bir önceki yazı tipi kilitlemeyi geçersiz kılmak anlamına gelir ve /Yorumda bul-anahattır bir eşleme işlevi ( font-lock-defaults belgesine bakın) olup, bir konum alır ve arasındaki bir yorumda ilk taslağı arar (nokta) ve bu konum, eşleşme verilerinin vurgulandığı anahatın uzantılarını döndürür.

Ana hatları bulmak için yorumlar için ( font-lock-comment-face veya sözdizimsel durumu kullanarak) tarama yaparsınız ve ardından look-at komutunu kullanırsınız. yorum bir anahat var.

6
katma

font-lock-syntactic-face-function öğesini şöyle tanımlamayı düşünün:

(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))))

Bu, python-mode.el ile test edildi ve yorumda bulunmadan "# *" ile başlayan bir bölüm bırakıldı:

(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))))

Modu ile birlikte verilirken:

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

nil yerine, geçerli herhangi bir yüz çalışması gerekir.

0
katma