Apa itu pagar tali atau pagar komentar?

9

Doktring untuk modify-syntax-entrymengatakan sebagai berikut:

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

Apa itu pagar, dan kapan saya akan menggunakannya? Saya tidak dapat menemukan apa pun di manual info.

Wilfred Hughes
sumber
Ini adalah pertanyaan yang harus dijawab Emacs sendiri. String doc harus mendefinisikan atau setidaknya menggambarkan istilah " pagar ". Silakan mempertimbangkan mengajukan bug doc: M-x report-emacs-bug.
Drew
Biasanya, pembatas string atau komentar dapat menentukan karakter mana yang mengakhiri string. Misalnya a "hanya dapat diakhiri oleh orang lain ". Namun, ketika syntax-propertizefungsi khusus digunakan untuk mengenali string, ini tidak mungkin. Sebagai gantinya, Anda dapat menandai titik akhir dari string dan komentar menggunakan |dan !, masing-masing. (Dokumentasi mengatakan bahwa kelas sintaks ini terutama harus digunakan ketika menggunakan syntax-tableproperti teks, yang merupakan apa syntax-propertizefungsi set kustom .)
Lindydancer

Jawaban:

8

Mereka didokumentasikan dalam manual, tetapi tidak menggunakan kata "pagar". Karakter !dan |terdaftar sebagai "pembatas komentar generik" dan "pembatas string generik" dalam referensi kelas sintaks .

Karakter-karakter ini diperkenalkan di Emacs 20.1. Mengutip file BERITA:

Ada dua kode sintaks baru, !dan |(nilai numerik 14 dan 15). Karakter dengan kode !memulai komentar yang diakhiri hanya oleh karakter lain dengan kode yang sama (kecuali dikutip). Karakter dengan kode |memulai string yang diakhiri hanya oleh karakter lain dengan kode yang sama (kecuali dikutip).

Kode-kode ini terutama dimaksudkan untuk digunakan sebagai nilai properti teks `sintaks-tabel '.

Saya tidak dapat menemukan penggunaan !dalam mode Emacs standar. Ada beberapa penggunaan |. Case use yang dimaksud adalah bahasa yang memiliki literal yang menggunakan pembatas selain pembatas string yang biasa, biasanya diatur melalui overlay yang ditambahkan oleh penguncian font berdasarkan konteks. Misalnya, dalam perl, kecocokan ekspresi reguler dapat ditulis /REGEXP/, atau m/REGEXP/atau m~REGEXP~atau m[REGEXP]sejumlah variasi. Sebuah string literal dapat ditulis 'STRING'tetapi juga q'STRING', q~STRING~, q[STRING], dll Ketika kunci font yang mengakui konstruksi seperti, ia menetapkan karakter quote ( // /atau '/ 'atau ~/ ~atau [/]dalam contoh yang saya berikan) ke sintaks pembatas string generik. Bahkan jika pembatas string biasa ada (misalnya q[foo"bar]), pembatas itu akan dianggap sebagai bagian biasa dari string, itu tidak akan mengakhiri string.

Saya akui bahwa saya tidak melihat manfaat pasti - misalnya mode CPerl melakukan beberapa hal yang sangat mewah dan tidak menggunakan fasilitas ini.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Mode Ruby digunakan !untuk menyorot =begin... =endblok.
Lindydancer
5

Diambil dari sintaks: jam:

/* 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 */
  };

Dengan asumsi bahwa kode sintaks dan kelas sintaks regex merujuk pada hal yang sama, saya sudah menggunakan tutul dari |dalam cc-awk.elyang menggunakan "\\s|"untuk menyoroti pemisah string tidak seimbang.

wasamasa
sumber
2
Mereka digunakan di beberapa tempat, misalnya python-syntax-stringify, ruby-syntax-propertize-percent-literaldan lain - lain . Saya tidak melihat perbedaannya dari Sstringsini.
Wilfred Hughes