Qu'est-ce qu'une clôture à cordes ou une clôture à commentaires?


9

La docstring pour modify-syntax-entrydit ce qui suit:

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

Qu'est-ce qu'une clôture et quand devrais-je en utiliser une? Je ne trouve rien dans le manuel d'informations.


C'est une question à laquelle Emacs devrait répondre. La chaîne doc doit définir ou au moins décrire le terme " barrière ". S'il vous plaît envisager de déposer un bug de doc: M-x report-emacs-bug.
Drew

Normalement, un délimiteur de chaîne ou de commentaire peut spécifier le caractère qui termine une chaîne. Par exemple, un "ne peut être résilié que par un autre ". Cependant, lorsqu'une syntax-propertizefonction personnalisée est utilisée pour reconnaître une chaîne, cela n'est pas possible. Au lieu de cela, vous pouvez marquer les points finaux des chaînes et des commentaires à l'aide de |et !, respectivement. (La documentation indique que ces classes de syntaxe doivent principalement être utilisées lors de l'utilisation de la syntax-tablepropriété text, ce que syntax-propertizedéfinit une fonction personnalisée .)
Lindydancer

Réponses:


8

Ils sont documentés dans le manuel, mais il n'utilise pas le mot «clôture». Les caractères !et |sont répertoriés comme «délimiteurs de commentaires génériques» et «délimiteurs de chaînes génériques» dans la référence de classe de syntaxe .

Ces personnages ont été introduits dans Emacs 20.1. Citant le fichier NEWS:

Il existe deux nouveaux codes de syntaxe !et |(valeurs numériques 14 et 15). Un caractère avec un code !commence un commentaire qui se termine uniquement par un autre caractère avec le même code (sauf si cité). Un caractère avec un code |commence une chaîne qui se termine uniquement par un autre caractère avec le même code (sauf si cité).

Ces codes sont principalement destinés à être utilisés comme valeurs de la propriété de texte `syntax-table '.

Je ne trouve aucune utilisation de !dans les modes Emacs standard. Il existe plusieurs utilisations de |. Le cas d'utilisation prévu est les langues qui ont des littéraux qui utilisent des délimiteurs autres que les délimiteurs de chaîne habituels, généralement définis via des superpositions ajoutées par un verrouillage de police en fonction du contexte. Par exemple, en perl, une correspondance d'expression régulière peut être écrite /REGEXP/, ou m/REGEXP/ou m~REGEXP~ou m[REGEXP]ou n'importe quel nombre de variations. Une chaîne peut être écrit 'STRING'mais aussi q'STRING', q~STRING~, q[STRING], etc. Lorsque le verrouillage de la police reconnaît de telles constructions, il définit les guillemets ( // /ou '/ 'ou ~/ ~ou [/]dans les exemples que j'ai donnés) à la syntaxe générique du délimiteur de chaîne. Même si un délimiteur de chaîne habituel est présent (par exemple q[foo"bar]), ce délimiteur sera considéré comme une partie ordinaire de la chaîne, il ne terminera pas la chaîne.

J'avoue que je ne vois aucun avantage définitif - par exemple, le mode CPerl fait des choses très sophistiquées et n'utilise pas cette fonction.


2
Utilisation du mode Ruby !pour mettre en évidence =begin... les =endblocs.
Lindydancer

5

Tiré de 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 */
  };

En supposant que les codes de syntaxe et les classes de syntaxe regex se réfèrent à la même chose, j'ai repéré une utilisation |dans cc-awk.ellaquelle des utilisations "\\s|"pour mettre en évidence des délimiteurs de chaîne asymétriques.


2
Ils sont utilisés dans quelques endroits, par exemple python-syntax-stringify, ruby-syntax-propertize-percent-literalet d' autres . SstringMais je ne vois pas en quoi cela diffère d' ici.
Wilfred Hughes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.