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


10

Küçük modda çeşitli yüzlere sahip kodu vurgulamak istiyorum.

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

piton-sözdizimi-vurgulamak

Kaçırdığım bir şey comment karakter sahip olan #içinde font-lock-comment-face. Fikir, düz metin olarak vurgulanan bir taslağa "ait" yorumlara sahip olmaktır, bu nedenle okunması daha kolaydır. Her zamankinden daha az belirgin yüzleriyle düzenli yorumlar yaparken.

İş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 ki, font-lock-syntactic-face-functionkarmaşık bir veri yapısı almak state, farklı nokta durumuna sahip olmak ve bir yüz döndürmek dışında üzerinde çalıştığı arayüz hakkında hiçbir fikrim yok .

Birisi bu arayüzü açıklayabilir mi? Belki daha iyisi var mı?

Yanıtlar:


6

font-lock-syntactic-face-functionFont Kilidinden, daha özel olarak Syntactic Font Kilidi aşamasından (vurgu mayın) düzenli bir değişkendir :

Bu değişken nil değilse, belirli bir sözdizimsel öğe (dize veya yorum) için hangi yüzün kullanılacağını belirleyen bir işlev olmalıdır. Değer normalde font-lock-default'larda başka bir vars öğesi aracılığıyla ayarlanır.

İşlev bir argümanla çağrılır, noktadaki ayrıştırma durumu döndürülür parse-partial-sexpve bir yüz döndürmelidir . Varsayılan değer, yorumlar için font-lock-comment-face ve dizeler için font-lock-string-face döndürür (bkz. Yazı Tipi Kilidi Yüzleri).

parse-partial-sexpsırayla Emacs'ın mevcut sözdizimsel durumunu tanımlayan bir liste döndürür; bu, sözdizimi tablosunun geçerli arabelleğe uygulanmasının sonucudur. Liste oldukça karmaşık, bu yüzden buraya yedekleyeceğim; tam dokümanı parse-partial-sexp. Bu işlevin amacı, sözdizimsel bir öğeye uygulanan yüzü belirli kurallar altında değiştirmektir. İşlevinizin başlangıcı bunu gösterir: Geçerli dize bir docstring ise bunun için farklı bir yüz kullanın.

Ancak, yüz daima geçerli olduğu bütün sözdizimsel eleman, tüm dizeyi veya yorum yani. Bu işlevle tek tek parçaları vurgulayamazsınız ve kodunuzda olduğu stategibi yalnızca bu amaç için verilenlere bakmalısınız (python-info-docstring-p state). Do not bu yerde noktasını kullanın; pointFont kilitlemenin bu aşamasında değerinin doğru tanımlanıp tanımlanmadığından bile emin değilim .


Parçaları bir araya getirerek, amacınız için yanlış işlevi kullanıyorsunuz, bu yüzden onu çalıştıramazsınız.

İstediğiniz vurgulamayı uygulamaya çalışmadım, ama bence çok kazdınız, amacınız için çok derin. Bazı şeyleri doğru anlarsam, bir yorumda ana hatlarını vurgulamak istersiniz.

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

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

outline-facebaşlığa uygulamak istediğiniz yüz nerede , bu yerdeki tönceki yazı tipi kilitlemelerini geçersiz kılmak anlamına gelir ve bir yorumda bir konum alan ve ilk anahattı arayan my/find-outline-in-commentbir eşleştirme işlevidir (doktora bakın font-lock-defaults). arasında (point)ve bu pozisyon, anahat sahayı dönen maç verilerinde vurgulanır için.

Anahattı bulmak için yorumları ( font-lock-comment-facesözdizimsel durumunu veya kullanarak) ileriye doğru tarayacaksınız ve daha sonra looking-atyorumun anahattı olup olmadığını kontrol etmek için kullanacaksınız.


1

Şu şekilde tanımlamayı düşünün font-lock-syntactic-face-function:

(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, "# *" ile başlayan bir bölümü yorum yüzü olmadan bırakarak python-mode.el ile test edilmiştir:

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

Mod ile yönetilirken:

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

Bunun yerine, nilgeçerli herhangi bir yüz çalışmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.