รั้วสตริงหรือรั้วความคิดเห็นคืออะไร?


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 ควรกำหนดหรืออย่างน้อยก็อธิบายคำว่า " fence " M-x report-emacs-bugโปรดพิจารณายื่นข้อผิดพลาดเอกสาร:
Drew

โดยปกติแล้วสตริงหรือตัวคั่นความคิดเห็นสามารถระบุอักขระที่จะยกเลิกสตริง เช่น a "สามารถถูกยกเลิกได้โดยผู้อื่น"เท่านั้น อย่างไรก็ตามเมื่อใช้syntax-propertizeฟังก์ชั่นที่กำหนดเองเพื่อรับรู้สตริงจะไม่สามารถทำได้ แต่คุณสามารถทำเครื่องหมายจุดสิ้นสุดของสตริงและความคิดเห็นโดยใช้|และ!ตามลำดับ (เอกสารบอกว่าควรใช้คลาสไวยากรณ์เหล่านี้เป็นหลักเมื่อใช้syntax-tableคุณสมบัติข้อความซึ่งเป็นsyntax-propertizeชุดฟังก์ชันที่กำหนดเอง)
Lindydancer

คำตอบ:


8

มีการบันทึกไว้ในคู่มือ แต่ไม่ได้ใช้คำว่า "รั้ว" ตัวละคร!และ|มีการระบุไว้ว่า“ตัวคั่นความคิดเห็นทั่วไป” และ“ตัวคั่นสตริงทั่วไป” ในการอ้างอิงระดับไวยากรณ์

ตัวละครเหล่านี้ถูกนำมาใช้ใน Emacs 20.1 การอ้างถึงไฟล์ NEWS:

มีไวยากรณ์ใหม่สองรหัส!และ|(ค่าตัวเลข 14 และ 15) อักขระที่มีรหัส!เริ่มต้นความคิดเห็นซึ่งสิ้นสุดโดยตัวละครอื่นที่มีรหัสเดียวกันเท่านั้น (เว้นแต่จะยกมา) อักขระที่มีรหัส|เริ่มต้นสตริงซึ่งสิ้นสุดด้วยอักขระอื่นที่มีรหัสเดียวกันเท่านั้น (เว้นแต่จะยกมา)

รหัสเหล่านี้ส่วนใหญ่มีไว้สำหรับใช้เป็นค่าของคุณสมบัติข้อความ `ตารางไวยากรณ์ '

ฉันไม่พบการใช้งาน!ในโหมด Emacs มาตรฐานใด ๆ มีประโยชน์หลาย|อย่าง กรณีการใช้งานที่ตั้งใจคือภาษาที่มีตัวอักษรที่ใช้ตัวคั่นอื่นนอกเหนือจากตัวคั่นสตริงปกติมักจะตั้งค่าผ่านการซ้อนทับเพิ่มโดยการล็อคแบบอักษรตามบริบท ตัวอย่างเช่นใน Perl การจับคู่นิพจน์ทั่วไปสามารถเขียน/REGEXP/ได้หรือm/REGEXP/หรือm~REGEXP~หรือm[REGEXP]หรือรูปแบบจำนวนเท่าใดก็ได้ สตริงตัวอักษรสามารถเขียนได้'STRING'แต่ยังq'STRING', q~STRING~, q[STRING]ฯลฯ เมื่อล็อคตัวอักษรตระหนักถึงโครงสร้างดังกล่าวจะกำหนดตัวอักษรคำพูด ( // /หรือ'/ 'หรือ~/ ~หรือ[/]ในตัวอย่างที่ฉันให้) กับไวยากรณ์ตัวคั่นสตริง แม้ว่าตัวคั่นสตริงที่เป็นนิสัยจะมีอยู่ (เช่นq[foo"bar]) ตัวคั่นนั้นจะถูกพิจารณาว่าเป็นส่วนธรรมดาของสตริง แต่มันจะไม่ยุติสตริง

ฉันยอมรับว่าฉันไม่เห็นประโยชน์ที่ชัดเจน - ตัวอย่างเช่นโหมด CPerl ทำสิ่งที่แฟนซีมากและไม่ใช้สิ่งอำนวยความสะดวกนี้


2
โหมดทับทิมใช้!เพื่อเน้น=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 */
  };

สมมติว่ารหัสไวยากรณ์และการเรียนไวยากรณ์ regex หมายถึงสิ่งเดียวกันฉันได้ใช้ด่างของ|ในcc-awk.elที่ใช้"\\s|"สำหรับไฮไลต์ตัวคั่นสตริงไม่สมดุล


2
พวกเขาจะใช้ในสถานที่ไม่กี่กรัมpython-syntax-stringify, ruby-syntax-propertize-percent-literalและคนอื่น ๆ ฉันไม่เห็นว่ามันแตกต่างจากSstringที่นี่แม้ว่า
Wilfred Hughes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.