Was ist ein Fadenzaun oder Kommentarzaun?

9

Die Dokumentzeichenfolge für modify-syntax-entrylautet wie folgt:

(modify-syntax-entry CHAR NEWENTRY &optional SYNTAX-TABLE)
...
The first character of NEWENTRY should be one of the following:
...
  /           character-quote.      @   inherit from parent table.
  |           generic string fence. !   generic comment fence.

Was ist ein Zaun und wann würde ich einen verwenden? Ich kann nichts im Info-Handbuch finden.

Wilfred Hughes
quelle
Diese Frage sollte Emacs selbst beantworten. Die Dokumentzeichenfolge sollte den Begriff " Zaun " definieren oder zumindest beschreiben . Bitte erwägen Sie, einen Dokumentfehler einzureichen : M-x report-emacs-bug.
Drew
Normalerweise kann ein Zeichenfolgen- oder Kommentarbegrenzer angeben, welches Zeichen eine Zeichenfolge beendet. ZB "kann a nur von einem anderen beendet werden ". Wenn jedoch eine benutzerdefinierte syntax-propertizeFunktion zum Erkennen einer Zeichenfolge verwendet wird, ist dies nicht möglich. Stattdessen können Sie die Endpunkte von Zeichenfolgen und Kommentaren mit |bzw. markieren !. (Die Dokumentation besagt, dass diese Syntaxklassen hauptsächlich verwendet werden sollten, wenn die syntax-tablesyntax-propertize
Texteigenschaft verwendet wird

Antworten:

8

Sie sind im Handbuch dokumentiert, es wird jedoch nicht das Wort „Zaun“ verwendet. Die Zeichen !und |werden als „generische Kommentarbegrenzer“ und „generische String - Trennzeichen“ in der angegebenen Syntax Klassenreferenz .

Diese Zeichen wurden in Emacs 20.1 eingeführt. Zitieren der NEWS-Datei:

Es gibt zwei neue Syntaxcodes !und |(numerische Werte 14 und 15). Ein Zeichen mit einem Code !startet einen Kommentar, der nur von einem anderen Zeichen mit demselben Code beendet wird (sofern nicht anders angegeben). Ein Zeichen mit einem Code |beginnt eine Zeichenfolge, die nur von einem anderen Zeichen mit demselben Code beendet wird (sofern nicht anders angegeben).

Diese Codes sind hauptsächlich zur Verwendung als Werte der Texteigenschaft "Syntaxtabelle" gedacht.

Ich kann !in den Standard-Emacs-Modi keine Verwendung finden . Es gibt verschiedene Verwendungszwecke von |. Der beabsichtigte Anwendungsfall sind Sprachen mit Literalen, die andere Trennzeichen als die üblichen Zeichenfolgenbegrenzer verwenden. Diese werden normalerweise über Überlagerungen festgelegt, die durch Schriftsperren basierend auf dem Kontext hinzugefügt werden. Zum Beispiel in Perl kann ein regulärer Ausdruck geschrieben werden /REGEXP/, oder m/REGEXP/oder m~REGEXP~oder m[REGEXP]oder ein beliebige Anzahl von Variationen. Eine Zeichenkette kann geschrieben werden , 'STRING'sondern auch q'STRING', q~STRING~, q[STRING]usw. Wenn Schriftsperre solche Konstrukte erkennt, setzt sie die Anführungszeichen ( // /oder '/ 'oder ~/ ~oder [/]in den Beispielen, die ich gegeben habe) zur generischen String-Trennzeichen-Syntax. Selbst wenn ein gewöhnlicher Zeichenfolgenbegrenzer vorhanden ist (z. B. q[foo"bar]), wird dieser Begrenzer als gewöhnlicher Teil der Zeichenfolge betrachtet und die Zeichenfolge nicht beendet.

Ich gebe zu, dass ich keinen definitiven Vorteil sehe - zum Beispiel macht der CPerl-Modus einige sehr ausgefallene Dinge und nutzt diese Funktion nicht.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Ruby-Modus !zum Hervorheben von =begin... =endBlöcken.
Lindydancer
5

Entnommen aus syntax.h:

/* A syntax table is a chartable whose elements are cons cells
   (CODE+FLAGS . MATCHING-CHAR).  MATCHING-CHAR can be nil if the char
   is not a kind of parenthesis.

   The low 8 bits of CODE+FLAGS is a code, as follows:  */

enum syntaxcode
  {
    Swhitespace, /* for a whitespace character */
    Spunct,      /* for random punctuation characters */
    Sword,       /* for a word constituent */
    Ssymbol,     /* symbol constituent but not word constituent */
    Sopen,       /* for a beginning delimiter */
    Sclose,      /* for an ending delimiter */
    Squote,      /* for a prefix character like Lisp ' */
    Sstring,     /* for a string-grouping character like Lisp " */
    Smath,       /* for delimiters like $ in Tex.  */
    Sescape,     /* for a character that begins a C-style escape */
    Scharquote,  /* for a character that quotes the following character */
    Scomment,    /* for a comment-starting character */
    Sendcomment, /* for a comment-ending character */
    Sinherit,    /* use the standard syntax table for this character */
    Scomment_fence, /* Starts/ends comment which is delimited on the
                       other side by any char with the same syntaxcode.  */
    Sstring_fence,  /* Starts/ends string which is delimited on the
                       other side by any char with the same syntaxcode.  */
    Smax         /* Upper bound on codes that are meaningful */
  };

Unter der Annahme, dass sich die Syntaxcodes und die Regex-Syntaxklassen auf dasselbe beziehen, habe ich eine Verwendung entdeckt, |bei cc-awk.elder "\\s|"unausgeglichene Zeichenfolgenbegrenzer verwendet werden.

Wasamasa
quelle
2
Sie werden an einigen Stellen, zum Beispiel verwendet python-syntax-stringify, ruby-syntax-propertize-percent-literalund andere . Ich sehe jedoch nicht, wie es sich von Sstringhier unterscheidet .
Wilfred Hughes