Что такое ограждение из струн или забор комментариев?


9

Строка документа для 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.
Дрю

Обычно разделитель строки или комментария может указывать, какой символ завершает строку. Например, a "может быть прекращено только другим ". Однако, когда пользовательская syntax-propertizeфункция используется для распознавания строки, это невозможно. Вместо этого вы можете пометить конечные точки строк и комментариев с помощью |и !, соответственно. (В документации сказано, что эти синтаксические классы в первую очередь должны использоваться при использовании syntax-tableсвойства text, которое 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
Режим Ruby используется !для выделения =begin... =endблоков.
Lindydancer

5

Взято из синтаксиса.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-stringify, ruby-syntax-propertize-percent-literalи другие . Я не вижу, как это отличается от Sstringздесь, хотя.
Уилфред Хьюз
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.