Co to jest ogrodzenie łańcuchowe lub ogrodzenie komentarza?

9

Dokumentacja dla modify-syntax-entrymówi, co następuje:

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

Co to jest ogrodzenie i kiedy miałbym go użyć? Nic nie mogę znaleźć w instrukcji obsługi.

Wilfred Hughes
źródło
Na to pytanie sam Emacs powinien odpowiedzieć. Łańcuch doc powinien zdefiniować lub przynajmniej opisać termin „ ogrodzenie ”. Proszę zwrócić uwagę, zgłaszając błąd doc: M-x report-emacs-bug.
Drew
Zwykle ogranicznik ciągu lub komentarza może określać, który znak kończy ciąg. Np. A "może zostać zakończone tylko przez inną osobę ". Jednak gdy syntax-propertizedo rozpoznania ciągu używana jest funkcja niestandardowa , nie jest to możliwe. Zamiast tego można oznaczyć punkty końcowe ciągów i komentarzy użyciu |i !, odpowiednio. (Dokumentacja mówi, że tych klas składniowych należy używać przede wszystkim podczas korzystania z syntax-tablewłaściwości text, co syntax-propertizeustawia funkcja niestandardowa .)
Lindydancer

Odpowiedzi:

8

Są one udokumentowane w instrukcji, ale nie używa słowa „ogrodzenie”. Znaki !i |są wymienione jako „ogólne ograniczniki komentarzy” i „ogólne ograniczniki ciągu” w odwołaniu do klasy składni .

Te postacie zostały wprowadzone w Emacs 20.1. Cytując plik NEWS:

Istnieją dwa nowe kody składniowe !i |(wartości liczbowe 14 i 15). Znak z kodem !rozpoczyna komentarz, który kończy się tylko innym znakiem o tym samym kodzie (chyba że jest cytowany). Znak z kodem |rozpoczyna ciąg, który kończy się tylko innym znakiem o tym samym kodzie (chyba że jest cytowany).

Kody te są głównie przeznaczone do stosowania jako wartości właściwości tekstowej `tabela składni '.

Nie mogę znaleźć żadnego zastosowania !w standardowych trybach Emacsa. Istnieje kilka zastosowań |. Zamierzonym przypadkiem użycia są języki, które mają literały, które używają ograniczników innych niż zwykłe ograniczniki ciągów, zwykle ustawiane za pomocą nakładek dodawanych przez blokowanie czcionek na podstawie kontekstu. Na przykład w Perl, regularne spotkania wyrażenie można napisać /REGEXP/, lub m/REGEXP/lub m~REGEXP~lub m[REGEXP]lub dowolną liczbę wariantów. Ciągiem znaków można napisać 'STRING', ale również q'STRING', q~STRING~, q[STRING], itd. Gdy blokada czcionki rozpoznaje takie konstrukty, ustawia znaki cudzysłowu ( // /lub '/ 'i ~/ ~lub [/]w podanych przeze mnie przykładach) do ogólnej składni ogranicznika łańcucha. Nawet jeśli obecny jest zwykły ogranicznik łańcucha (np. q[foo"bar]), Ten ogranicznik będzie uważany za zwykłą część łańcucha, nie zakończy łańcucha.

Przyznaję, że nie widzę ostatecznej korzyści - na przykład tryb CPerl robi bardzo wymyślne rzeczy i nie korzysta z tej funkcji.

Gilles „SO- przestań być zły”
źródło
2
Tryb Ruby służy !do podświetlania =begin... =endbloków.
Lindydancer
5

Zaczerpnięte ze składni.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 */
  };

Zakładając, że kody składniowe i klasy składniowe wyrażeń regularnych odnoszą się do tej samej rzeczy, zauważyłem użycie, |w cc-awk.elktórych zastosowaniach "\\s|"do podświetlania niezrównoważonych ciągów znaków.

wasamasa
źródło
2
Są one używane w kilku miejscach, na przykład python-syntax-stringify, ruby-syntax-propertize-percent-literali innych . Nie rozumiem jednak, jak to się Sstringtutaj różni .
Wilfred Hughes