Ich versuche, der Pod-Dokumentation für Perl-Skripte eine Kommentarfunktion hinzuzufügen, und ich möchte Pod-Kommentare mit einem besonderen Gesicht hervorheben. Ein einfacher Prototyp eines Perl-Skripts könnte sein:
#! /usr/bin/env perl
use strict;
use warnings;
print "Hello\n"; # a Perl comment /* hello */
__END__
=head1 SYNOPSIS
my_program <arg1> [OPTIONS]
/* this is a Pod comment */
Wie wir sehen, wird ein Pod-Kommentar /* */
wie in der Programmiersprache C angezeigt . Nur der Teil unter der Zeile __END__
ist jedoch die Pod-Dokumentation. Der Teil über dieser Zeile ist regulärer Perl-Code. Wenn ich nun versuche, dem Pod-Kommentar eine Syntaxhervorhebung hinzuzufügen, indem ich zum Beispiel (aufgerufen von cperl-mode-hook
):
(font-lock-add-keywords nil '(("\\(/\\*.*?\\*/\\)" 1 'font-lock-warning-face t)))
Ich erhalte Folgendes cperl-mode
als Hauptmodus:
Pod-Kommentare werden daher auch in einem regulären Perl-Kommentar hervorgehoben (ein Perl-Kommentar beginnt mit einem #
Zeichen), was nicht erwünscht ist (Pod-Kommentare sollten nur in Pod-Abschnitten hervorgehoben werden, nicht im regulären Perl-Code).
Der Einfachheit halber können wir für diese Frage davon ausgehen, dass die Pod-Dokumentation auf das Ende des Dokuments beschränkt ist, beginnend mit den Zeilen nach dem __END__
Tag. Ist es möglich, die Position des aktuellen Kommentars zu überprüfen und diese mit der Position der __END__
Zeile in Beziehung zu setzen und anhand dieser Informationen zu bestimmen, ob wir uns in einem Pod-Block befinden oder nicht (und dann nur dann eine Syntaxhervorhebung hinzuzufügen, wenn wir uns in einem Pod-Block befinden)? beim Ausführen des Schriftsperrcodes?
mmm-mode
aber ich denke, dies könnte die Lösung für Sie sein.pod-mode
Hauptmodus gibt, der für die Pod-Kommentarbereiche geeignet wäre, ist ermmm-mode
möglicherweise anwendbar. Ich bin mir nicht sicher, ob das der Fall ist. Wahrscheinlich benötigen Sie hier nur eine zusätzliche Font-Lock-Konfiguration.Antworten:
Aktualisierte Lösung
Es gibt eine eingebaute Möglichkeit, dies mit der Schriftsperre zu tun (danke sanityinc).
Diese Antwort enthält alle Details zur Funktionsweise dieser Art von Font-Lock-Schlüsselwörtern: https://stackoverflow.com/a/14675550
Das Ergebnis ist das gleiche wie bei der ursprünglichen Lösung.
Hier ist es in Aktion:
Originelle Lösung mit Jit-Lock-Funktionen (nicht ideal)
Ich glaube, Sie müssen die Schriftart manuell in einer Funktion ausführen, die dem hinzugefügt wurde
jit-lock-functions
.jit-lock-functions
sind die Funktionen, die tatsächlich die Schriftart und den Bereich ausführen, die mit den Parametern BEG und END aufgerufen werden, um den Bereich zu kennzeichnen, auf den die Texteigenschaften angewendet werden sollen.In diesem Szenario erkennt Ihre Funktion zunächst, ob sich der zu färbende Bereich nach dem
__END__
in Ihrem Puffer befindet, und suchen Sie in diesem Fall manuell nach / * Kommentaren * / und wenden Sie Texteigenschaften auf diese an.Hier ist eine Implementierung:
Für Ihr Szenario möchten Sie möglicherweise die Jit-Lock-Funktion in einem Perl-Mode-Hook hinzufügen
Beachten Sie auch, dass diese Funktion nicht "intelligent" ist, sondern nur irgendwo im Puffer nach END sucht. Wenn sie also in einer Zeichenfolge oder einem Perl-Kommentar vorkommt, wo sie keine Wirkung haben sollte, wird dies tatsächlich der Fall sein. Sie können die Funktion erweitern, um bei Bedarf den Kontext zu untersuchen, in dem END auftritt.
quelle
jit-lock-function
. Das ist ein internes Implementierungsdetail vonfont-lock
. Es sollte einen einfachenfont-lock
Weg geben, dies zu erreichen.