Neden büyük modlar sadece yüzleri denetlemiyor?


10

Büyük bir mod yazarken 'dizede nokta var mı?' 'Bir yorumda nokta var mı?'.

Çoğu büyük mod programlama dilini ayrıştırmaya çalışıyor gibi görünmektedir. Örneğin:

  • python-syntax-content aramalar syntax-ppss
  • haskell-fill-paragraphçağrılar syntax-ppssvere-search-forward
  • c-in-comment-line-prefix-p noktayı hareket ettirir ve çağırır looking-at
  • sp-point-in-commentçağrılar syntax-ppssdeğil, aynı zamanda kontrol eder bir açıklama delimeter üzerinde ise

Ancak, bu bazı durumlarda işe yaramaz. Kuruluş kipi arabelleklerinde, kaynak bloklardaki yorumlar bu yaklaşımlarla doğru algılanmaz.

Ayrıca arabellek vurgulanmış yorumları gösterdiği için anlamsız görünüyor .

Bunun yerine, yüzleri kolayca inceleyebilirsiniz:

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

Neden büyük modlar bunu yapmıyor? Arabellek zaten fontified, bu yüzden bu daha hızlı, daha sağlam ve daha az kod gerektirir beklenir.


1
Bu soruyu beğendim. Ancak, kullanmazsanız ne olur font-lock-mode? (
Gerektiğini

Yanıtlar:


12

Sorun, daha sağlam olmamasıdır.

İlk olarak, ana modlar tam olarak bir yorum veya dize ne olduğuna karar vermekten sorumlu olanlardır. Bunları yazı tipi kilitleme amacıyla başarılı bir şekilde tanımlayabildikleri takdirde, bunu başka amaçlar için de yapabilmelidirler.

İkincisi, noktanın içerideki bağlamı belirlemek için sözdizimini okumak, doğru yapılırsa bunu yapmanın daha sağlam yoludur. Bunun başarısız olduğu durumlar bulduysanız, ana mod yazarına bir hata raporu göndermeye değer.


Yüzleri incelemenin daha az sağlam olmasının nedeni, bazı durumlarda başarısız olabilmesidir.

  1. Yeni başlayanlar için, kullanıcı devre dışı bırakılmış olabilir font-lock-mode(belki de büyük bir arabellek olabilir), ancak font-lock-modeetkin olsa bile , yüzler biraz kararsız olabilir.

  2. Ayrıca, kullanıcı bazı ekler font-lock-keywords( TODOyorumlarda vurgulamak gibi ) küçük bir mod olabilir . Veya yazı tipi kilidi arabelleği fontive ettikten sonra bazı yüzleri dinamik olarak uygulayan küçük bir mod olabilir.

Özetle, ana modun tanımladığı yüzlerin şu anda uygulanmış yüzler olduğu garantisi yoktur.


2

Sanırım asıl nedeni font kilidinin kullanılmasıdır syntax-ppss.

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.