什么是字符串围栏或评论围栏?


9

的docstring modify-syntax-entry表示以下内容:

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

什么是围栏,什么时候可以使用?我在信息手册中找不到任何内容。


这是Emacs本身应该回答的问题。文档字符串应定义或至少描述术语“ fence ”。请考虑提交文档错误:M-x report-emacs-bug
2015年

通常,字符串或注释定界符可以指定哪个字符终止字符串。例如a "只能被另一个终止"。但是,当使用自定义syntax-propertize函数识别字符串时,这是不可能的。相反,您可以分别使用|和标记字符串和注释的端点!。(文档说,这些语法类主要在使用syntax-tabletext属性(自定义syntax-propertize函数设置的属性)时使用。)
Lindydancer

Answers:


8

它们记录在手册中,但未使用“栅栏”一词。字符!|语法类参考中被列为“通用注释定界符”和“通用字符串定界符” 。

这些字符在Emacs 20.1中引入。引用新闻文件:

有两个新的语法代码!|(数字值14和15)。具有代码的字符!开始注释,注释仅由具有相同代码的另一个字符(除非加引号)结束。具有代码的字符以|字符串开头,该字符串仅以具有相同代码的另一个字符(除非加引号)结尾。

这些代码主要用于用作“语法表”文本属性的值。

!在标准Emacs模式下找不到任何用途。有几种用途|。预期的用例是语言,其文字使用的分隔符不是通常的字符串分隔符,通常使用基于上下文的字体锁定添加的覆盖来设置。例如,在perl中,可以编写正则表达式匹配项/REGEXP/,或,m/REGEXP/或,m~REGEXP~或,m[REGEXP]或任意数量的变体。一个字符串可以写成'STRING'而且q'STRING'q~STRING~q[STRING]等。当字体锁识别这样的构建体,它设置引号字符(// /'/ '~/ ~[/]在我给出的示例中)使用通用字符串定界符语法。即使存在惯用的字符串定界符(例如q[foo"bar]),该定界符也将被视为字符串的普通部分,它不会终止字符串。

我承认我没有看到明确的好处-例如CPerl模式做一些非常有趣的事情,并且不使用此功能。


2
Ruby模式用于!突出显示=begin... =end块。
Lindydancer

5

来自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 */
  };

假设语法规范和正则表达式语法类指的是同样的事情,我已经有斑点的使用|cc-awk.el,它使用"\\s|"了高亮不平衡字符串分隔符。


2
他们在一些地方,如使用python-syntax-stringifyruby-syntax-propertize-percent-literal他人。我看不出与Sstring这里有什么不同。
Wilfred Hughes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.