Hoe voorkom je dat lettertype-lock lui is?

Gerelateerd aan deze vraag .

Dit is mijn huidige instelling voor lettertypevergrendeling voor python-modus :

(require 'org)
(defconst lpy-font-lock-keywords
  '(("^#\\(\\* .*\\)$" 1 'org-level-1 prepend)
    ("^#\\(\\*\\* .*\\)$" 1 'org-level-2 prepend)
    ("^#\\(\\*\\*\\* .*\\)$" 1 'org-level-3 prepend)
    ("^#\\(\\*\\*\\*\\* .*\\)$" 1 'org-level-4 prepend)
    ("^#\\(\\*\\*\\*\\*\\* .*\\)$" 1 'org-level-5 prepend)
    (lpy-outline-comment-highlight 1 'default prepend)
    ("`\\([^\n']+\\)'" 1 font-lock-constant-face prepend)))

(font-lock-add-keywords 'python-mode lpy-font-lock-keywords)
(defun lpy-outline-comment-highlight (limit)
  (when (re-search-forward "^#\\(?:[^*]\\|$\\)" limit t)
    (let* ((pt (point))
           (success (save-excursion
                      (and (re-search-backward "^#\\*" nil t)
                           (null (re-search-forward "^[^#]" pt t))))))
      (when success
        (set-match-data (list (line-beginning-position) (line-end-position)
                              (point) (line-end-position)))
        (end-of-line)
        t))))

De code lijkt te doen wat ik wil (hebben commentaar-instanties, maar niet starters, in standaard gezicht voor opmerkingen die bij contouren horen), maar alleen voor kleine buffers of plaatsen die ik wijzig.

Voor grotere buffers (groter dan één scherm) is font-lock lui en pas de vereiste gezichten niet toe. Als ik de tekst echter wijzig rond die regio, zal het correct worden gemarkeerd.

font-lock-lazy

In de bovenstaande afbeelding wordt font-lock lui in de "Multidimensionale indexeringsomtrek". Dus ik heb daar een punt verplaatst en een spatie ingevoerd - het hoogtepunt werd correct.

Hoe forceer ik font-lock om elke regel op het scherm te markeren?

1
Ja, maar deze regels lijken een enkele regel voor mij.
toegevoegd de auteur Bert Huijben, de bron
Heb je gekeken naar het (elisp) lettertype Lock Multiline knooppunt van de handleiding?
toegevoegd de auteur sds, de bron

2 antwoord

[Inderdaad, uw regels zijn "één regel", dus het behoort niet tot de problemen die worden beschreven in (elisp) Font Lock Multiline . Het heeft echt niets te maken met "luiheid". ]

Het probleem is vrij eenvoudig: in je lpy-outline-comment-highlight -functie, als je een overeenkomst vindt maar je besluit dat success nul is, dan krijg je nihil terug, wat vertel font-lock om verder te kijken.

IOW u moet uw wanneer vervangen door een lus.

Oplossing:

(defun lpy-outline-comment-highlight (limit)
  (catch 'done
    (while (re-search-forward "^#\\(?:[^*\n]\\)" limit t)
      (let* ((pt (point))
             (success (save-excursion
                        (and (re-search-backward "^#\\*" nil t)
                             (null (re-search-forward "^[^#]" pt t))))))
        (when success
          (set-match-data (list (line-beginning-position) (line-end-position)
                                (point) (line-end-position)))
          (end-of-line)
          (throw 'done t))))))
3
toegevoegd

U kunt font-lock-extend-region-functions gebruiken. Het bevat een lijst met functies die de regio rehighlighted uitbreiden. U kunt hier uw eigen functie aan toevoegen die de regio uitbreidt met de volledige opmerking, waardoor uw zoekwoorden correct moeten worden toegepast.

2
toegevoegd
Ik begrijp niet waarom ik iets anders zou moeten gebruiken. Mijn indruk was dat font-lock keer op keer lpy-outline-comment-highlight moest oproepen totdat het hele scherm is verwerkt.
toegevoegd de auteur Bert Huijben, de bron
Alsjeblieft. Het lukte me niet om veel praktische informatie over complexe lettertypeveiligheid te vinden. De infopagina's geven geen voorbeelden en voorbeelden op de wiki zijn triviaal.
toegevoegd de auteur Bert Huijben, de bron
Nou, dat doet het niet. Als je een regio kiest die hij geschikt acht en die benadrukt. Als die regio in het midden van een van je speciale opmerkingen begint, werkt je functie niet. Verbinden met het scherm is ook niet wat je wilt - als het scherm begint in het midden van je reactie, werkt het nog steeds niet. (Als je wilt, kan ik je een onuitgegeven tool sturen die het refontificatiegebied visualiseert. Ik heb het in soortgelijke situaties gebruikt.)
toegevoegd de auteur Daniel McPherson, de bron
@ abo-abo, ik heb je zojuist een e-mail gestuurd. De beste bron voor lettertypevaste informatie is andere pakketten en de variabele documentatie van de variabelen voor lettertypen blokkeren. Het is erg gecondenseerd, maar bevat meestal de juiste formatie. Wat het nodig had, is een kookboek met welke hulpmiddelen beschikbaar zijn en hoe u de juiste moet kiezen.
toegevoegd de auteur Daniel McPherson, de bron