¿Qué es una cerca de cuerda o cerca de comentarios?

9

La cadena de documentación de modify-syntax-entrydice lo siguiente:

(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é es una cerca y cuándo usaría una? No puedo encontrar nada en el manual de información.

Wilfred Hughes
fuente
Esta es una pregunta que Emacs debería responder. La cadena de documentación debe definir o al menos describir el término " cerca ". Por favor considerar la presentación de un error doc: M-x report-emacs-bug.
Dibujó
Normalmente, un delimitador de cadena o comentario puede especificar qué carácter termina una cadena. Por ejemplo, a "solo puede ser terminado por otro ". Sin embargo, cuando syntax-propertizese utiliza una función personalizada para reconocer una cadena, esto no es posible. En su lugar, puede marcar los puntos finales de cadenas y comentarios utilizando |y !, respectivamente. (La documentación dice que estas clases de sintaxis deben usarse principalmente cuando se usa la syntax-tablepropiedad de texto, que es lo que establece una syntax-propertizefunción personalizada .)
Lindydancer

Respuestas:

8

Están documentados en el manual, pero no utiliza la palabra "valla". Los caracteres !y |se enumeran como "delimitadores de comentarios genéricos" y "delimitadores de cadena genéricos" en la referencia de clase de sintaxis .

Estos personajes fueron introducidos en Emacs 20.1. Citando el archivo de NOTICIAS:

Hay dos nuevos códigos de sintaxis, !y |(valores numéricos 14 y 15). Un personaje con un código !inicia un comentario que termina solo con otro personaje con el mismo código (a menos que se cite). Un carácter con un código |comienza una cadena que termina solo con otro carácter con el mismo código (a menos que se indique).

Estos códigos están destinados principalmente para su uso como valores de la propiedad de texto 'syntax-table'.

No puedo encontrar ningún uso !en los modos estándar de Emacs. Hay varios usos de |. El caso de uso previsto son los idiomas que tienen literales que usan delimitadores distintos de los delimitadores de cadena habituales, generalmente establecidos a través de superposiciones agregadas por el bloqueo de fuente en función del contexto. Por ejemplo, en perl, se puede escribir una coincidencia de expresión regular /REGEXP/, m/REGEXP/o m~REGEXP~o m[REGEXP]o cualquier número de variaciones. Una cadena literal se puede escribir 'STRING', sino también q'STRING', q~STRING~, q[STRING], etc. Cuando el bloqueo de fuente reconoce este tipo de construcciones, que establece los caracteres de comillas ( // /o '/ 'o ~/ ~o [/]en los ejemplos que di) a la sintaxis genérica delimitador de cadena. Incluso si está presente un delimitador de cadena habitual (por ejemplo q[foo"bar]), ese delimitador se considerará una parte ordinaria de la cadena, no terminará la cadena.

Admito que no veo un beneficio definitivo; por ejemplo, el modo CPerl hace algunas cosas muy elegantes y no utiliza esta función.

Gilles 'SO- deja de ser malvado'
fuente
2
El modo Ruby se usa !para resaltar =begin... =endbloques.
Lindydancer
5

Tomado de la sintaxis.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 */
  };

Suponiendo que los códigos de sintaxis y las clases de sintaxis de expresiones regulares se refieren a la misma cosa, no tengo uso de manchado |en cc-awk.elque utiliza "\\s|"para resaltar delimitadores de cadenas desequilibradas.

wasamasa
fuente
2
Se usan en algunos lugares, por ejemplo python-syntax-stringify, ruby-syntax-propertize-percent-literaly en otros . Sin embargo, no veo cómo difiere de Sstringaquí.
Wilfred Hughes