Dize çit veya yorum çit nedir?


9

Öğretisi modify-syntax-entryşöyle diyor:

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

Çit nedir ve ne zaman kullanırım? Bilgi kılavuzunda hiçbir şey bulamıyorum.


Bu Emacs'ın kendisinin cevaplaması gereken bir sorudur. Doc dizesi " çit " terimini tanımlamalı veya en azından tanımlamalıdır . Doc hata kaydı düşünün: M-x report-emacs-bug.
Drew

Normalde, bir dize veya yorum sınırlayıcısı hangi karakterin bir dizeyi sona erdireceğini belirtebilir. Örneğin, a "sadece bir başkası tarafından sonlandırılabilir ". Ancak, syntax-propertizebir dizeyi tanımak için özel bir işlev kullanıldığında, bu mümkün değildir. Bunun yerine, sırasıyla |ve kullanarak dizelerin ve yorumların uç noktalarını işaretleyebilirsiniz !. (Belgeler, bu sözdizimi sınıflarının öncelikle syntax-table, özel bir syntax-propertizeözelliğin ayarladığı text özelliği kullanılırken kullanılması gerektiğini söylüyor .)
Lindydancer

Yanıtlar:


8

Kılavuzda belgelenmiştir, ancak “çit” kelimesini kullanmaz. Karakterleri !ve sözdizimi sınıfı başvurusunda| "genel yorum sınırlayıcılar" ve "genel dize sınırlayıcılar" olarak listelenir .

Bu karakterler Emacs 20.1'de tanıtıldı. NEWS dosyasından alıntı:

İki yeni sözdizimi kodu vardır !ve |(sayısal değerler 14 ve 15). Kodlu bir karakter, !yalnızca aynı koda sahip başka bir karakterle (alıntı yapılmadığı sürece) sona eren bir açıklama başlatır. Kodlu bir karakter, |yalnızca aynı koda sahip başka bir karakterle (alıntı yapılmadığı sürece) biten bir dize başlatır.

Bu kodlar temel olarak `` sözdizimi tablosu '' metin özelliğinin değerleri olarak kullanılmak içindir.

!Standart Emacs modlarında herhangi bir kullanım bulamıyorum . Birçok kullanım alanı vardır |. Amaçlanan kullanım durumu, genellikle bağlama göre yazı tipi kilidi ile eklenen bindirmeler yoluyla ayarlanan, normal dize sınırlayıcıları dışındaki sınırlayıcıları kullanan değişmez değerleri olan dillerdir. Örneğin, perl'de, normal ifade eşleşmesi /REGEXP/ya m/REGEXP/da m~REGEXP~ya m[REGEXP]da ya da herhangi bir sayıda varyasyon yazılabilir . Değişmez dize yazılabilir 'STRING'değil, aynı zamanda q'STRING', q~STRING~, q[STRING]yazı kilidi bu tür yapılar tanıdığında, vb, bu (tırnak karakterleri ayarlar // /veya '/ 'veya ~/ ~veya [/]verdiğim örneklerde) genel dize sınırlayıcı sözdizimine. Alışılmış bir dize sınırlayıcı mevcut olsa bile (örn. q[foo"bar]), Bu sınırlayıcı dizenin sıradan bir parçası olarak kabul edilir, dizeyi sonlandırmaz.

Kesin bir fayda görmediğimi itiraf ediyorum - örneğin CPerl modu çok süslü şeyler yapıyor ve bu tesisi kullanmıyor.


2
Yakut modu kullanımı !vurgulamak için =begin... =endbloklar.
Lindydancer

5

Sözdizimi.h dosyasından alınmıştır:

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

Sözdizimi kodları ve düzenli ifade sözdizimi sınıfları aynı şeyi ifade varsayarsak, ben benekli kullanımını ettik |içinde cc-awk.elhangi kullandığı "\\s|"dengesiz dize ayırıcıları vurgulamak için.


2
Onlar birkaç yerde, örneğin kullanılan python-syntax-stringify, ruby-syntax-propertize-percent-literalve diğerleri . SstringYine de buradan nasıl farklı olduğunu görmüyorum .
Wilfred Hughes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.