Що таке огорожа або коментар?


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 повинен визначати або принаймні описувати термін " огорожа ". Будь ласка , розглянути питання про подання DOc помилки: M-x report-emacs-bug.
Дрю

Зазвичай роздільник рядка або коментаря може визначати, який символ закінчує рядок. Наприклад, а "може бути припинений лише іншим ". Однак, коли 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
У режимі 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.