Một hàng rào chuỗi hoặc hàng rào bình luận là gì?


9

Các chuỗi cho modify-syntax-entrybiết như sau:

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

Hàng rào là gì và khi nào tôi sẽ sử dụng nó? Tôi không thể tìm thấy bất cứ điều gì trong hướng dẫn thông tin.


Đây là một câu hỏi mà chính Emacs nên trả lời. Chuỗi doc nên định nghĩa hoặc ít nhất là mô tả thuật ngữ " hàng rào ". Vui lòng xem xét việc gửi một lỗi doc : M-x report-emacs-bug.
vẽ

Thông thường, một chuỗi hoặc dấu phân cách nhận xét có thể chỉ định ký tự nào kết thúc chuỗi. Ví dụ a "chỉ có thể bị chấm dứt bởi người khác ". Tuy nhiên, khi một syntax-propertizechức năng tùy chỉnh được sử dụng để nhận ra một chuỗi, điều này là không thể. Thay vào đó, bạn có thể đánh dấu điểm cuối của chuỗi và nhận xét bằng cách sử dụng |!, tương ứng. (Tài liệu nói rằng các lớp cú pháp này chủ yếu nên được sử dụng khi sử dụng thuộc tính syntax-tablevăn bản, đó là những gì một syntax-propertizehàm tùy chỉnh thiết lập.)
Lindydancer

Câu trả lời:


8

Chúng được ghi lại trong tài liệu hướng dẫn, nhưng nó không sử dụng từ hàng rào. Các ký tự !|được liệt kê dưới dạng các dấu phân cách nhận xét chung chung và các dấu phân cách chuỗi chung chung trong các tham chiếu lớp cú pháp .

Những nhân vật này đã được giới thiệu trong Emacs 20.1. Trích dẫn tập tin TIN TỨC:

Có hai mã cú pháp mới !|(giá trị số 14 và 15). Một ký tự có mã !bắt đầu một nhận xét chỉ được kết thúc bởi một ký tự khác có cùng mã (trừ khi được trích dẫn). Một ký tự có mã |bắt đầu một chuỗi chỉ được kết thúc bởi một ký tự khác có cùng mã (trừ khi được trích dẫn).

Các mã này chủ yếu được sử dụng làm giá trị của thuộc tính văn bản `bảng cú pháp '.

Tôi không thể tìm thấy bất kỳ việc sử dụng nào !trong các chế độ Emacs tiêu chuẩn. Có một số cách sử dụng |. Trường hợp sử dụng dự định là các ngôn ngữ có các ký tự sử dụng các dấu phân cách khác với các dấu phân cách chuỗi thông thường, thường được đặt qua các lớp phủ được thêm bằng cách khóa phông chữ dựa trên ngữ cảnh. Ví dụ: trong perl, một kết hợp biểu thức chính quy có thể được viết /REGEXP/, m/REGEXP/hoặc m~REGEXP~hoặc m[REGEXP]hoặc bất kỳ số lượng biến thể. Một chuỗi chữ có thể được viết 'STRING'mà còn q'STRING', q~STRING~, q[STRING], vv Khi khóa phông chữ nhận cấu trúc như vậy, nó đặt các nhân vật quote ( // /hoặc '/ 'hay ~/ ~hay [/]trong các ví dụ tôi đã đưa ra) cho cú pháp dấu phân cách chuỗi chung. Ngay cả khi có một dấu phân cách chuỗi theo thói quen (ví dụ q[foo"bar]), thì dấu phân cách đó sẽ được coi là một phần thông thường của chuỗi, nó sẽ không chấm dứt chuỗi.

Tôi thừa nhận rằng tôi không thấy một lợi ích dứt khoát - ví dụ chế độ CPerl thực hiện một số điều rất lạ mắt và không sử dụng thiết bị này.


2
Chế độ Ruby sử dụng !để làm nổi bật =begin... =endkhối.
Lindydancer

5

Lấy từ cú pháp.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 */
  };

Giả sử rằng các mã cú pháp và các lớp cú pháp regex đề cập đến cùng một thứ, tôi đã phát hiện ra cách sử dụng |trong cc-awk.elđó sử dụng "\\s|"để làm nổi bật các dấu phân cách chuỗi không cân bằng.


2
Chúng được sử dụng ở một vài nơi, ví dụ python-syntax-stringify, ruby-syntax-propertize-percent-literalnhững nơi khác . Tôi không thấy nó khác Sstringở đây như thế nào .
Wilfred Hughes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.