文字列フェンスまたはコメントフェンスとは何ですか?


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自体が答えるべき質問です。doc文字列は「フェンス」という用語を定義するか、少なくとも説明する必要があります。ドキュメントバグの提出を検討してください:M-x report-emacs-bug
2015年

通常、文字列またはコメント区切り文字は、文字列を終了する文字を指定できます。たとえば、a "は別のによってのみ終了でき"ます。ただし、カスタムsyntax-propertize関数を使用して文字列を認識する場合、これは不可能です。代わりに、それぞれ|とを使用して!、文字列とコメントのエンドポイントをマークできます。(ドキュメントでは、これらの構文クラスは主にsyntax-table、カスタムsyntax-propertize関数が設定するtextプロパティを使用するときに使用する必要があると述べています。)
Lindydancer

回答:


8

それらはマニュアルに記載されていますが、「フェンス」という言葉は使用していません。文字!|は、構文クラスリファレンスで「汎用コメント区切り文字」および「汎用文字列区切り文字」としてリストされています

これらの文字はEmacs 20.1で導入されました。NEWSファイルの引用:

2つの新しい構文コード、!および|(数値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 2015年

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

構文コードと正規表現構文クラスが同じものを参照していると仮定すると、不均衡な文字列区切り文字を強調表示するために使用する|inの使用を発見しました。cc-awk.el"\\s|"


2
彼らはいくつかの場所、例えばで使用されpython-syntax-stringifyruby-syntax-propertize-percent-literalそして他のものSstringこことどう違うのかわかりません。
Wilfred Hughes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.