O que é uma cerca de corda ou cerca de comentário?

9

A documentação para modify-syntax-entrydiz o seguinte:

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

O que é uma cerca e quando eu usaria uma? Não consigo encontrar nada no manual de informações.

Wilfred Hughes
fonte
Esta é uma pergunta que o próprio Emacs deve responder. A sequência de documentos deve definir ou pelo menos descrever o termo " fence ". Por favor, considere a apresentação de um bug doc: M-x report-emacs-bug.
Tirou
Normalmente, um delimitador de sequência ou comentário pode especificar qual caractere termina uma sequência. Por exemplo, um "só pode ser rescindido por outro ". No entanto, quando uma syntax-propertizefunção personalizada é usada para reconhecer uma sequência, isso não é possível. Em vez disso, você pode marcar os pontos finais de seqüências de caracteres e comentários usando |e !, respectivamente. (A documentação diz que essas classes de sintaxe principalmente deve ser usado quando se utiliza a syntax-tablepropriedade de texto, que é o que um personalizados syntax-propertizeconjuntos de funções.)
Lindydancer

Respostas:

8

Eles estão documentados no manual, mas não usam a palavra “fence”. Os caracteres !e |são listados como "delimitadores de comentários genéricos" e "delimitadores de cadeias genéricas" na referência de classe de sintaxe .

Esses caracteres foram introduzidos no Emacs 20.1. Citando o arquivo NEWS:

Existem dois novos códigos de sintaxe !e |(valores numéricos 14 e 15). Um caractere com um código !inicia um comentário que é encerrado apenas por outro caractere com o mesmo código (a menos que seja citado). Um caractere com um código |inicia uma string que é finalizada apenas por outro caractere com o mesmo código (a menos que seja citado).

Esses códigos destinam-se principalmente ao uso como valores da propriedade de texto `tabela de sintaxe '.

Não consigo encontrar nenhum uso !nos modos Emacs padrão. Existem vários usos de |. O caso de uso pretendido são idiomas que possuem literais que usam delimitadores que não sejam os delimitadores de seqüência de caracteres comuns, geralmente configurados por sobreposições adicionadas pelo bloqueio de fonte com base no contexto. Por exemplo, em perl, uma correspondência de expressão regular pode ser escrita /REGEXP/, m/REGEXP/ou m~REGEXP~ou m[REGEXP]ou qualquer número de variações. Uma string literal pode ser escrita 'STRING', mas também q'STRING', q~STRING~, q[STRING], etc. Quando o bloqueio da fonte reconhece tais construções, ele define os caracteres de aspas ( // /ou '/ 'ou ~/ ~ou [/]nos exemplos que dei) à sintaxe genérica do delimitador de string. Mesmo que um delimitador habitual de string esteja presente (por exemplo q[foo"bar]), esse delimitador será considerado uma parte comum da string, não a terminará.

Admito que não vejo um benefício definitivo - por exemplo, o modo CPerl faz algumas coisas muito sofisticadas e não usa esse recurso.

Gilles 'SO- parar de ser mau'
fonte
2
Use o modo Ruby !para destacar =begin... =endblocos.
Lindydancer
5

Retirado da sintaxe.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 */
  };

Assumindo que os códigos de sintaxe e as classes de sintaxe regex se referem à mesma coisa, eu tenho uso manchado de |em cc-awk.elque utiliza "\\s|"para destacar delimitadores de cordas desequilibradas.

wasamasa
fonte
2
Eles são usados ​​em alguns lugares, por exemplo python-syntax-stringify, ruby-syntax-propertize-percent-literale outros . Não vejo como isso difere Sstringdaqui.
Wilfred Hughes