Sözdizim Vurgulama, dosyanın amacına göre dizinin işlevine bağlı olarak düzenleyicinin metni kendiliğinden farklı biçemlerde/renklerde görüntülemesini sağlayan şeydir. Örneğin program kaynak kodunda, denetim ifadeleri kalın harflerle gösterilebilirken, veri türleri ve yorumlar metnin geri kalanından farklı renkler alır. Bu, metnin okunabilirliğini büyük ölçüde artırır ve böylece yazarın daha verimli ve üretken olmasına yardımcı olur.

Sözdizim vurgulama ile gösterilen bir C++ işlevi.

Aynı C++ işlevi, vurgulama olmadan.
İki örnekten hangisini okuması daha kolay?
KatePart, sözdizim vurgulaması yapmak için esnek, yapılandırılabilir ve yetenekli bir sistemle birlikte gelir ve standart dağıtım, çok çeşitli programlama, komut dosyası yazma ve işaretleme dilleri ve diğer metin dosyası biçimleri için tanımlar sağlar. Ayrıca basit XML dosyalarında kendi tanımlarınızı da sağlayabilirsiniz.
KatePart, bir dosyayı açtığınızda onun doğru sözdizim kurallarını sırasıyla MIME türü, dosya uzantısı veya bunlardan ikisi de yoksa içeriğine bakarak algılayacaktır. Yanlış bir seçimle karşı karşıya kalırsanız → menüsünden elle bir vurgulama türü seçebilirsiniz.
Sözdizim vurgulamaları tarafından kullanılan biçemler ve renkler yapılandırma iletişim kutusunun Vurgulanan Metin Biçemleri sekmesinden düzenlenebilirken, MIME türleri ve kullanması gereken dosya uzantıları ise Kipler ve Dosya Türleri sekmesinden ayarlanır.
Not
Sözdizim vurgulama, doğru metnin okunabilirliğini artırmak için vardır; ancak metninizi doğrulamak için ona güvenemezsiniz. Kullandığınız biçime bağlı olarak metni sözdizimi için işaretlemek zordur ve bazı durumlarda sözdizim kurallarının yazarları metnin %98’i doğru şekilde oluşturulursa gurur duyacaktır; ancak çoğunlukla yanlış %2’yi görmek için nadir bir biçeme gereksiniminiz vardır.
Bu bölümde KatePart sözdizim vurgulama mekanizmasını daha ayrıntılı olarak ele alacağız. Bu konuda bilgi sahibi olmak istiyor ve sözdizim tanımlarını değiştirmek veya yeni bir tane oluşturmak istiyorsanız tam size göre.
Bir dosyayı açtığınızda KatePart düzenleyicisinin yaptığı ilk şeylerden biri, dosya için hangi sözdizim tanımının kullanılacağını algılamaktır. Dosya metnini okurken ve siz dosyaya bir şeyler yazarken, sözdizim vurgulama sistemi, sözdizim tanımıyla tanımlanan kuralları kullanarak metni çözümleyecek ve farklı bağlamların ve biçimlerin başladığı ve bittiği yerleri imleyecektir.
Belgeye bir şeyler yazdığınızda, yeni metin anında çözümlenir ve imlenir; böylece, bir bağlamın başlangıcı veya sonu olarak imlenen bir karakteri silerseniz çevreleyen metnin biçemi buna göre değişir.
KatePart Sözdizim Vurgulama Sistemi tarafından kullanılan sözdizim tanımları XML dosyalarıdır ve şunları içerir:
Bağlam blokları halinde düzenlenmiş metnin rolünü algılamaya yönelik kurallar
Anahtar sözcük listeleri
Biçem ögesi tanımları
Metin çözümlenirken algılama kuralları tanımlandıkları sıraya göre değerlendirilir ve geçerli dizinin başlangıcı bir kuralla eşleşiyorsa ilgili bağlam kullanılır. Metindeki başlangıç noktası, kuralın eşleştiği son noktaya taşınır ve eşleşen kural tarafından belirlenen bağlamdan başlayarak yeni bir kurallar döngüsü başlar.
Algılama kuralları, vurgulama algılama sisteminin kalbidir. Kural, çözümlenen metinle eşleştirilecek bir dizi, karakter veya düzenli ifadedir. Metnin eşleşen kısmı için hangi biçemin kullanılacağı hakkında bilgi içerir. Sistemin çalışma bağlamını ya açıkça belirtilen bir bağlama ya da metin tarafından kullanılan önceki bağlama çevirebilir.
Kurallar bağlam gruplarında düzenlenir. Bir bağlam grubu, biçim içindeki ana metin kavramları için kullanılır; örneğin, alıntılanan metin dizileri veya program kaynak kodundaki yorum blokları. Bu, vurgulama sisteminin gerekli olmadığında tüm kurallar arasında döngü yapmasına gerek kalmamasını ve metindeki bazı karakter dizilerinin geçerli bağlama bağlı olarak farklı şekilde ele alınabilmesini sağlar.
Örneklere özgü verinin kurallarda kullanılmasına izin vermek için bağlamlar devingen olarak oluşturulabilir.
Bazı programlama dillerinde tamsayılar, derleyici (kaynak kodunu ikili yürütülebilir dosyaya dönüştüren program) tarafından kayan noktalı sayılardan farklı şekilde ele alınır ve tırnak içine alınan bir dizi içinde özel bir anlama sahip karakterler olabilir. Bu gibi durumlarda, metni okurken kolayca tespit edilebilmeleri için onları çevreden farklı kılmak mantıklıdır. Dolayısıyla, özel bağlamları temsil etmeseler bile sözdizim vurgulama sistemi tarafından bu şekilde görülebilirler, böylece farklı sunum için imlenebilirler.
Bir sözdizim tanımı, kullanıldığı biçimin kavramlarını kapsayacak kadar çok sayıda biçem içerebilir.
Pek çok biçimde belirli bir kavramı temsil eden sözcük listeleri bulunur. Örneğin, programlama dillerinde, denetim ifadeleri bir kavramdır, veri türü adları başka bir kavramdır ve dilin yerleşik işlevleri üçüncüsüdür. KatePart Sözdizim Vurgulama Sistemi, metin biçimlerinin kavramlarını vurgulamak amacıyla metindeki sözcükleri tespit etmek ve imlemek için bu tür listeleri kullanabilir.
KatePart’de bir C++ kaynak dosyası, bir Java™ kaynak dosyası ve bir HTML belgesi açarsanız biçimler farklı olsa ve dolayısıyla özel işlem için farklı sözcükler seçilse bile, kullanılan renklerin aynı olduğunu göreceksiniz. Bunun nedeni, KatePart’in ayrı ayrı sözdizimi tanımları tarafından kullanılan, önceden tanımlanmış bir Öntanımlı Biçemler listesine sahip olmasıdır.
Bu, farklı metin biçimlerindeki benzer kavramların tanınmasını kolaylaştırır. Örneğin, yorumlar hemen hemen her programlama, komut dosyası veya biçimlendirme dilinde bulunur ve tüm dillerde aynı biçem kullanılarak oluşturulduklarında, bunları metin içinde bunların ne olduğunu tanımlamaya çalışmakla vakit kaybetmezsiniz.
İpucu
Bir sözdizim tanımındaki tüm biçemler, öntanımlı biçemlerden birini kullanır. Birkaç sözdizim tanımı, öntanımlılardan daha çok biçem kullanır; bu nedenle, bir biçimi sık sık kullanıyorsanız bazı kavramların aynı biçemi kullanıp kullanmadığını görmek için yapılandırma iletişim kutusunu açmanız faydalı olabilir. Örneğin, diziler için yalnızca bir öntanımlı biçem vardır; ancak Perl programlama dili iki tür diziyle çalıştığından, bunları biraz farklı olacak şekilde yapılandırarak vurgulamayı geliştirebilirsiniz. Tüm kullanılabilir öntanımlı biçemler daha sonra açıklanacaktır.
KatePart, KDE Frameworks™’ten Syntax-Highlighting kitaplığını kullanır. KatePart ile verilen öntanımlı XML vurgulama dosyaları, Syntax-Highlighting tarafından öntanımlı olarak derlenirler.
Bu bölüm, XML Vurgu Tanımı biçimine genel bir bakış sunar. Küçük bir örneğe dayanarak ana bileşenleri, bunların anlamlarını ve kullanımlarını açıklayacağız. Bir sonraki bölümde vurgu algılama kurallarının ayrıntılarına girilecektir.
XSD olarak da bilinen resmi tanım, Sözdizim Vurgulama deposundaki language.xsd dosyasında bulunabilir
.xml vurgu tanımlama dosyaları, kullanıcı klasörünüzde genelde ve $HOME/.local/share//usr/share/ olan qtpaths ile --paths GenericDataLocationorg.kde.syntax-highlighting/syntax/ konumunda bulunur.
Flatpak ve Snap paketlerinde, yukarıdaki dizin işe yaramaz; çünkü her bir uygulamanın veri konumları farklıdır. Bir Flatpak uygulamasında, özel XML dosyalarının konumu genellikle olup Snap uygulamalarında ise $HOME/.var/app/flatpak-package-name/data/org.kde.syntax-highlighting/syntax/ olur. $HOME/snap/snap-package-name/current/.local/share/org.kde.syntax-highlighting/syntax/
Windows®’ta bu dosyalar genelde C:\Users\ user%USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax olarak genişleyen %USERPROFILE% konumundadır.
Özetle, çoğu yapılandırma için özel XML dosyalarının dizini aşağıdaki gibidir:
| Yerel kullanıcı için | |
| Tüm kullanıcılar için | /usr/share/org.kde.syntax-highlighting/syntax/ |
| Flatpak paketleri için | |
| Snap paketleri için | |
| Windows® üzerinde | %USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax |
| macOS® üzerinde | |
Aynı dil için birden çok dosya varsa language ögesindeki en yüksek version özniteliğine sahip dosya yüklenir.
KatePart Vurgu Tanımı dosyalarının ana bölümleri
- Vurgulama dosyası, XML sürümünü ayarlayan bir üstbilgi içerir:
<?xml version="1.0" encoding="UTF-8"?>
- Tanım dosyasının kökü öge
dilidir. Kullanılabilir öznitelikler şunlardır: Zorunlu öznitelikler:
name, dilin adını ayarlar. Sonrasında menülerde ve iletişim kutularında görünür.section, kategoriyi belirtir.extensions, dosya uzantılarını tanımlar, "*.cpp;*.h" gibiversion, tanım dosyasının geçerli revizyonunu bir tamsayı türünden belirtir. Vurgu tanımı dosyasını değiştirdiğinizde bu sayıyı artırdığınızdan emin olun.kateversion, en son desteklenen KatePart sürümünü belirtir.İsteğe bağlı öznitelikler:
mimetype, dosyaların MIME türlerini ilişkilendirir.casesensitive, anahtar sözcüklerin BÜYÜK/küçük harf duyarlı olup olmadığını tanımlar.priority, başka bir vurgu tanım dosyası aynı uzantıları kullanıyorsa gereklidir. Daha yüksek öncelik kazanır.author, yazarın adını ve e-posta adresini içerir.license, lisansı içerir. Yeni sözdizim vurgulama dosyaları için genelde MIT lisansıdır.style, sağlanan dili içerir verequired-syntax-styleözniteliği için olan girintileyiciler tarafından kullanılır.indenter, öntanımlı olarak hangi girintileyicinin kullanılacağını tanımlar. Kullanılabilir girintileyiciler: ada, normal, cstyle, cmake, haskell, latex, lilypond, lisp, lua, pascal, python, replicode, ruby ve xml.hidden, adın KatePart menülerinde görünüp görünmeyeceğini tanımlar.Böylece, bir sonraki satır böyle görünebilir:
<language name="C++" version="1" kateversion="2.4" section="Sources" extensions="*.cpp;*.h" />
- Sonrasında
highlightingögesi gelir. Bu öge, isteğe bağlılistögesini ve zorunlucontextsveitemDatasögelerini içerir. listögeleri bir anahtar sözcükler listesi içerir. Bu durumda, anahtar sözcükler class ve const olur. İstediğiniz kadar liste ekleyebilirsiniz.KDE Frameworks™ 5.53 sürümünden bu yana, bir liste, başka bir listeden ve/veya dilden/dosyadan
includeögesini kullanarak anahtar sözcükler içerebilirler.IncludeRuleskuralında olduğu gibi,##, liste adını ve dil tanımını ayırmak için kullanılır. Bu, başka bir dilin/dosyanın anahtar sözcüklerini içermeniz gerekiyorsa yinelenen anahtar sözcük listelerini önlemek için yararlıdır. Örneğin, othername listesi, ISO C++ diline ait olan str anahtar sözcüğünü ve types listesinin tüm anahtar sözcüklerini içerir.contextsögesi tüm bağlamları içerir. İlk bağlam, öntanımlı olarak, vurgulamanın başlangıcıdır. Normal Text adlı bağlamda iki adet kural vardır: somename adındaki bir kuralla eşleşen anahtar sözcükler ve bir tırnağı algılayıp bağlamı string yapan başka bir tanesi. Kurallar hakkında daha fazla bilgi almak için sonraki fasılı okuyun.Üçüncü kısımsa
itemDatasögesidir. Bağlamlar ve kurallar tarafından gereksinim duyulan tüm renk ve yazıtipi biçemlerini içerir. Bu örnekte,itemDataNormal Text, String ve Keyword kullanılmıştır.<highlighting> <list name="somename"> <item>class</item> <item>const</item> </list> <list name="othername"> <item>str</item> <include>types##ISO C++</include> </list> <contexts> <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" > <keyword attribute="Keyword" context="#stay" String="somename" /> <keyword attribute="Keyword" context="#stay" String="othername" /> <DetectChar attribute="String" context="string" char=""" /> </context> <context attribute="String" lineEndContext="#stay" name="string" > <DetectChar attribute="String" context="#pop" char=""" /> </context> </contexts> <itemDatas> <itemData name="Normal Text" defStyleNum="dsNormal" /> <itemData name="Keyword" defStyleNum="dsKeyword" /> <itemData name="String" defStyleNum="dsString" /> </itemDatas> </highlighting>- Bir vurgu tanımının son kısmı ise isteğe bağlı olan
generalbölümüdür. Anahtar sözcükler, kod katlama, yorumlar, girintileme, boş satırlar ve yazım denetim üzerine bilgiler içerir. commentbölümü, tek bir satırlık bir yorumun hangi diziye konulduğunu tanımlar. Ayrıca, ek end özniteliği ile multiLine kullanarak çok satırlı bir yorum da tanımlayabilirsiniz. Bu, kullanıcı comment/uncomment ile ilişkili kısayola bastığı zaman kullanılır.keywordsbölümü, anahtar sözcük listelerinin BÜYÜK/küçük harf duyarlı olup olmadığını tanımlar. Diğer öznitelikler daha sonra açıklanacaktır.folding,emptyLinesvespellcheckingbölümleri genelde gerekli değildir ve daha sonra açıklanacaklardır.<general> <comments> <comment name="singleLine" start="#"/> <comment name="multiLine" start="###" end="###" region="CommentFolding"/> </comments> <keywords casesensitive="1"/> <folding indentationsensitive="0"/> <emptyLines> <emptyLine regexpr="\s+"/> <emptyLine regexpr="\s*#.*"/> </emptyLines> <spellchecking> <encoding char="á" string="\'a"/> <encoding char="à" string="\`a"/> </spellchecking> </general> </language>
Bu kısım; bağlamlar, itemData’lar, anahtar sözcükler, yorumlar, kod katlama ve girintileme ile ilgili tüm öznitelikleri açıklar.
contextögesi,contextsgrubuna aittir. Bağlamın kendisi, vurgu sistemi bir satırın sonuna ulaştığında ne olması gerektiği gibi bağlama özgü kuralları tanımlar. Kullanılabilir özellikler şunlardır:name, bağlam adını belirtir. Kurallar, kuralın eşleşmesi durumunda geçiş yapılacak bağlamı belirtmek için bu adı kullanır.attribute, hiçbir kural eşleşmediğinde veya bir kural özniteliği belirtilmediğinde bir karakter için kullanılacak biçemi tanımlar. Sonraki durumda, kuralın context’inde belirtilen attribute kullanılır.lineEndContext, vurgu sistemi satırın sonuna geldiğinde geçiş yapılacak bağlamı tanımlar. Bu, ya başka bir bağlam adı, bağlamı değiştirmemek (bir şey yapmamak) için#stayveya bağlamdan çıkış yapmak için#popolabilir. Örneğin, üç kez#pop#pop#popyapmak veya hatta iki kez#pop#pop!OtherContextveOtherContextadlı başka bağlama geçiş yapmak da olabilir. Ayrıca başka bir dil tanımına ait olan başka bir bağlama geçiş yapmak da olanaklıdır. Bu,IncludeRuleskuralları ile aynı tarzdadır; örneğin,SomeContext##JavaScript. Bağlam anahtarları ek olarak “Vurgu Algılama Kuralları” içinde açıklanırlar. Öntanımlı: #stay.lineEmptyContext, boş bir satıra rastlandığındaki bağlamı tanımlar. Bağlam anahtarlarının terminolojisi daha önce lineEndContext’te açıklananla aynıdır. Öntanımlı: #stay.fallthroughContext, hiçbir kural eşleşmediğinde geçiş yapılacak sonraki bağlamı belirtir. Bağlam anahtarlarının terminolojisi daha önce lineEndContext’te açıklananla aynıdır. Öntanımlı: #stay.fallthrough, hiçbir kural eşleşmediğinde sisteminfallthroughContextiçinde belirtilen geçiş yapacağı bağlamı belirtir. KDE Frameworks™ 5.62 sürümünden bu yana bu özniteliğinfallthroughContextnamına kullanımdan kaldırıldığını aklınızdan çıkarmayın. Özellikle,fallthroughContextözniteliği varsa örtük olarakfallthroughdeğerinin true olacağı anlaşılır. Öntanımlı: false.noIndentationBasedFolding, bu bağlamdaki girintileme tabanlı katlamayı devre dışı bırakır. Girintileme tabanlı katlama etkinleştirilmemişse bu öznitelik bir işe yaramaz. Bu, general grubunun folding ögesinde tanımlanmıştır. Öntanımlı: false.itemDataögesi,itemDatasgrubundadır. Yazıtipi biçemini ve renklerini tanımlar. Böylece, kendi biçemlerinizi ve renklerinizi tanımlamanız olanaklıdır. Ancak biz yine de öntanımlı biçemlere sadık kalmanızı öneririz; böyle yaparsanız kullanıcı farklı dillerde de aynı renkleri görür. Bazen başka bir şansınız olmaz ve yazıtipi/renk özniteliklerini değiştirmeniz gerekebilir. name ve defStyleNum öznitelikleri zorunludur, diğerleri isteğe bağlıdır. Kullanılabilir öznitelikler şunlardır:name, itemData’nın adını ayarlar. Bağlamlar ve kurallar, attribute özniteliğinde bir itemData’ya başvurmak için bu adı kullanırlar.defStyleNum, hangi öntanımlı biçemin kullanılacağını tanımlar. Kullanılabilir öntanımlı biçemler ilerde daha ayrıntılı açıklanır.color, bir renk tanımlar. Geçerli biçimler “#rrggbb” veya “#rgb”dir.selColor, seçim rengini tanımlar.italictrue ise metin yatık olur.boldtrue ise metin kalın olur.underlinetrue ise metnin altı çizili olur.strikeOuttrue ise metnin üzeri çizili olur.spellCheckingtrue ise metnin yazımı denetlenir.generalgrubundakikeywordsögesi, anahtar sözcük özelliklerini tanımlar. Kullanılabilir öznitelikler şunlardır:casesensitive, true veya false olabilir. true ise tüm anahtar sözcükler BÜYÜK/küçük harf duyarlı olarak eşlenirler.weakDeliminator, sözcük sınırlandırıcısı olarak davranmayan bir karakterler listesidir. Örneğin,'.'noktası bir sözcük sınırlandırıcısıdır.listiçindeki bir anahtar sözcüğün bir nokta içerdiğini varsayalım; bu, noktayı eğer yalnızca bir zayıf sınırlandırıcı olarak tanımlarsanız eşleştirir.additionalDeliminator, ek sınırlandırıcılar tanımlar.wordWrapDeliminator, ardından bir satır kaydırma oluşabilecek karakterleri tanımlar.Öntanımlı sınırlandırıcılar ve sözcük kaydırma sınırlandırıcıları şunlardır:
.():!+,-<=>%&*/;?[]^{|}~\, boşluk (' ') ve sekmelendirici ('\t').commentsgrubundakicommentögesi; → , → ve → seçenekleri için kullanılan yorum özelliklerini tanımlar. Kullanılabilir öznitelikler şunlardır:name, ya singleLine ya da multiLine olabilir. multiLine seçerseniz end ve region öznitelikleri zorunludur. singleLine seçerseniz isteğe bağlı olan position özniteliğini ekleyebilirsiniz.start, bir yorum başlatmak için kullanılan diziyi tanımlar. C++ için bu, çoklu satır yorumlarda "/*" olur. Bu öznitelik, multiLine ve singleLine türleri için zorunludur.end, bir yorum kapatmak için kullanılan diziyi tanımlar. C++ için bu, çoklu satır yorumlarda "*/" olur. Bu öznitelik, yalnızca multiLine türü yorumlar için kullanılabilir ve onun için zorunludur.region, katlanabilir çoklu satır yorumun adı olmalıdır. Kurallarınızda beginRegion="Comment" … endRegion="Comment" olduğunu varsayalım; o zaman region="Comment" kullanmalısınız. Böylece, çoklu satır yorumun tüm metnini seçmeseniz bile yorumu kapatmak çalışır. Yalnızca, imleç çoklu satır yorumun içerisinde olmalıdır. Bu öznitelik, yalnızca multiLine türü için kullanılabilirdir.position, tek satırlık yorumun nereye eklendiğini tanımlar. Öntanımlı olarak, tek satırlık yorum satırın başında 0. sütuna koyulur; ancak position="afterwhitespace" kullanırsanız yorum, ilk boş olmayan karakterden sonra sağa doğru boşluk bırakılarak eklenir. Bu; örneğin, Python veya YAML gibi girintilemenin önemli olduğu diller için kullanışlıdır. Bu öznitelik isteğe bağlıdır ve tek olası değeri afterwhitespace’dir. Bu, yalnızca singleLine türü için kullanılabilirdir.generalgrubundakifoldingögesi, kod katlama özelliklerini tanımlar. Kullanılabilir öznitelikler şunlardır:indentationsensitivetrue ise kod katlama imleyicileri girintileme tabanlı olarak eklenir. Örnek olarak yine Python verilebilir. Genelde öntanımlı olarak false olduğundan pek ayarlamanıza gerek olmaz.emptyLinesgrubundakiemptyLineögesi, hangi satırlara boş satır gibi davranılması gerektiğini tanımlar. Bu,contextögelerindeki lineEmptyContext özniteliğinin davranışının değiştirilmesine olanak tanır. Kullanılabilir öznitelikler şunlardır:regexpr, boş bir satır olarak davranılacak bir düzenli ifade tanımlar. Öntanımlı olarak, boş satırlar hiçbir karakter içermezler, dolayısıyla, bu ek boş satırlar ekler; örneğin, boşluklar içeren satırların da boş satırlar olarak kabul edilmesini istiyorsanız yararlıdır. Çoğu sözdizim tanımında bu özniteliği ayarlamanız gerekmez.spellcheckinggrubundakiencodingögesi, yazım denetimi için bir karakter kodlaması tanımlar. Kullanılabilir öznitelikler şunlardır:char, bir kodlanmış karakterdir.string, yazım denetimindeki char karakteri olarak kodlanacak karakterler dizisidir. Örneğin, LaTeX için\"{A}dizisiÄkarakterini temsil eder.
Öntanımlı Biçemler daha önce halihazırda kısa bir özet olarak açıklammıştı: Öntanımlı biçemler, önceden tanımlanan yazıtipi ve renk biçemleridir.
- Genel öntanımlı biçemler:
Özel bir vurgulama gerekmediğinde
dsNormal.dsKeyword, yerleşik dil anahtar sözcükleri.dsFunction, işlev çağrıları ve tanımları.dsVariable, kullanılabiliyorsa değişken adları (örneğin., PHP/Perl için $someVar).dsControlFlow; if, else, switch, break, return, yield, vb. denetim akışı anahtar sözcükleri.dsOperator, + - * / :: < > gibi işleçler.dsBuiltIn, yerleşik işlevler, sınıflar ve nesneler.dsExtension, ortak uzantılar; örneğin, C++ ve Python içindeki Qt™ sınıfları ve işlevler/makrolar.dsPreprocessor, önişlemci ifadeleri veya makro tanımları.dsAttribute, @override ve __declspec(…) gibi açıklamalar.- Dizi ile ilgili öntanımlı biçemler:
dsChar, “x” gibi tekli karakterler.dsSpecialChar, kaçışlar, yer değiştirmeler, veya düzenli ifade işleçleri gibi özel anlama sahip diziler.dsString, "merhaba dünya" gibi diziler.dsVerbatimString, Perl, CoffeeScript ve kabuklardaki ’raw \backlash’ ve Python’daki r’\raw’ gibi gerçek veya ham diziler.dsSpecialString, SQL, regex’ler, HERE belgeleri, LATEX matematik kipi, …dsImport; modüllerin import, include, require ifadeleri.- Sayı ile ilgili öntanımlı biçemler:
dsDataType; int, void, u64 gibi yerleşik veri türleri.dsDecVal, ondalık değerler.dsBaseN, 10 dışında tabana sahip değerler.dsFloat, kayan noktalı değerler.dsConstant, Pİ gibi yerleşik ve kullanıcı tanımlı sabitler.- Yorum ve belgelendirmeyle ilgili öntanımlı biçemler:
dsComment, yorumlar.dsDocumentation, /** Belgelendirme yorumları */ veya """docstrings""".dsAnnotation, @param, @brief gibi belgelendirme komutları.dsCommentVar, yukarıdaki komutlarda kullanılan değişken adları; @param foobar’daki "foobar" gibi.dsRegionMarker; yorumlardaki //BEGIN, //END gibi bölge imleyicileri.- Diğer öntanımlı biçemler:
dsInformation, doxygen içindeki @note gibi notlar ve ipuçları.dsWarning, doxygen’deki @warning gibi uyarılar.dsAlert; TODO, FIXME, XXXX gibi özel sözcükler.dsError, hata vurgulaması ve yanlış sözdizim.dsOthers, başka hiçbir şey uymadığında kullanılır.
Bu bölüm, sözdizim algılama kurallarını tanımlar.
Her kural, sınandıkları dizinin başlangıcındaki sıfır veya daha fazla karakterle eşleşebilir. Kural eşleşirse eşleşen karakterlere kural tarafından tanımlanan biçem veya öznitelik atanır ve bir kural, geçerli bağlamın değiştirilmesini isteyebilir.
Kural şuna benzer:
<KuralAdı attribute="(tanımlayıcı)" context="(tanımlayıcı)" [kurala özel öznitelikler] />
attribute, eşleşen karakterlerle kullanılacak biçemi ada göre tanımlar ve context ise buradan sonra kullanılacak bağlamı tanımlar.
context, şöyle tanımlanabilir:
identifier, bu diğer bağlamın adıdır.
Bir order, işletkeye geçerli bağlamda kalmasını (
#stay) veya dizide kullanılan bir önceki bağlama geri gitmesini (#pop) söyler. Boş veya var olmayan bir bağlam#stayile eşdeğerdir.Daha çok adım geri gitmek için #pop anahtar sözcüğü yinelenebilir:
#pop#pop#popBir ünlem işareti (!) ve tanımlayıcı tarafından izlenen bir sıra, işletkenin ilk sırayı izlemesini ve başka bir bağlama geçmesini söyler; örneğin,
#pop#pop!OtherContext.Bir bağlam adı olan, iki adet kare tarafından izlenen (
##) ve sonrasında başka bir tanımlayıcı olan bir tanımlayıcı, bir dil tanımının adıdır. Bu adlandırma,IncludeRuleskurallarında kullanılana benzerdir ve başka bir sözdizim vurgulama tanımında kullanılan bağlama geçiş yapmanıza olanak tanır; örneğin,SomeContext##JavaScript.
Kurala özgü öznitelikler farklılık gösterir ve aşağıdaki bölümlerde açıklanmaktadır.
Ortak öznitelikler
Tüm kurallar aşağıdaki ortak özelliklere sahiptir ve (ortak özellikler) göründüğünde kullanılabilir. Tüm özellikler isteğe bağlıdır.
attribute: Bir tanımlı ile itemData eşlemlenen öznitelik. Öntanımlı: context özniteliğinde tanımlanan attribute.
context: Kural eşleşirse vurgulama sisteminin geçiş yapacağı bağlamı belirtir. Öntanımlı: #stay.
beginRegion: Bir kod katlama bloku başlatın. Öntanımlı: Ayarsız.
endRegion: Bir kod katlama blokunu kapatın. Öntanımlı: Ayarsız.
lookAhead: true ise vurgulama sistemi eşleşmelerin uzunluğunu dikkate almaz.Öntanımlı: false.
firstNonSpace: Dizi, satırdaki ilk boşluk olmayan karakterse eşleşir. Öntanımlı: false.
column: Yalnızca sütun eşleşirse eşleşir. Öntanımlı: Ayarsız.
Devingen kurallar
Bazı kurallar, öntanımlı olarak false olan isteğe bağlı Boole türündeki dynamic özniteliğine izin verirler. Dynamic true ise bir kural bir regular expression ile eşleşen metni temsil eden yer tutucular kullanabilir. Bunlar kendi string veya char özniteliklerinde geçerli bağlama geçiş yaparlar. Bir string’de, %N yer tutucusu (N bir sayıdır), çağırdığı düzenli ifadede ilişkili olduğu N ile değiştirilir. Bir char’da, yer tutucu bir N sayısı olmalıdır ve çağıran düzenli ifadedeki ilişkili olduğu N ile değiştirilir. Bir kural bu özniteliğe izin veriyorsa bir (dynamic) içerir.
dynamic: (true|false) olabilir.
Nasıl çalışır:
RegExpr kuallarının düzenli ifadelerinde, basit süslü ayraçlar arasındaki tüm metin (PATTERN) yakalanır ve anımsanır. Bu yakalamalar, geçiş yapıldıkları bağlama göre kullanılabilirler. Bu, dynamic özniteliği true iken ve %N (String içinde) veya N (char içinde) iken geçerlidir.
Bir RegExpr kuralında yakalanan metnin, context özniteliğinde belirtildiği üzere, yalnızca geçiş yapıldığı bağlam için depolandığını belirtmek önemlidir.
İpucu
Yakalamalar, hem devingen kurallar hem de düzenli ifadeler tarafından kullanılmayacaksa
yakalamayan gruplarkullanılmalıdır:(?:PATTERN)(?=PATTERN),(?!PATTERN)or(?<=PATTERN)gibi lookahead veya lookbehind grupları yakalanmazlar. Daha fazla bilgi için Düzenli İfadeler bölümüne bakın.Yakalama grupları,
%Nyerine\Nkullanılarak aynı düzenli ifadede kullanılabilirler. Daha fazla bilgi için Düzenli İfadeler içindeki Eşleşen metni yakalamak (geriye başvurular) bölümüne bakın.
Örnek 1:
Bu basit örnekte, =* düzenli ifadesi ile eşleşen metin yakalanır ve devingen kuralda %1 yerine yerleştirilir. Bu, yorumun başlangıçta aynı sayıda = ile bitmesine olanak tanır. Şu tür metinlerle eşleştirilir: [[ comment ]], [=[ comment ]=]veya [=====[ comment ]=====].
Ek olarak, yakalamalar yalnızca geçilen Multi-line Comment bağlamında kullanılabilirdir.
<context name="Normal" attribute="Normal Text" lineEndContext="#stay"> <RegExpr context="Multi-line Comment" attribute="Comment" String="\[(=*)\[" beginRegion="RegionComment"/> </context> <context name="Multi-line Comment" attribute="Comment" lineEndContext="#stay"> <StringDetect context="#pop" attribute="Comment" String="]%1]" dynamic="true" endRegion="RegionComment"/> </context>
Örnek 2:
Devingen kuralda; %1, #+ ve %2, "+ ile eşleşen yakalamalara karşılık gelir. Bu, şu tür metinlerle eşleşir: #etiket""""bağlamın içi""""#.
Bu yakalamalar; OtherContext, FindEscapes veya SomeContext gibi başka bağlamlarda kullanılabilir olmayacaktır.
<context name="SomeContext" attribute="Normal Text" lineEndContext="#stay"> <RegExpr context="#pop!NamedString" attribute="String" String="(#+)(?:[\w-]|[^[:ascii:]])("+)"/> </context> <context name="NamedString" attribute="String" lineEndContext="#stay"> <RegExpr context="#pop!OtherContext" attribute="String" String="%2(?:%1)?" dynamic="true"/> <DetectChar context="FindEscapes" attribute="Escape" char="\"/> </context>
Örnek 3:
Bu, şunun gibi metinlerle eşleşir: Class::function<T>(…).
<context name="Normal" attribute="Normal Text" lineEndContext="#stay">
<RegExpr context="FunctionName" lookAhead="true"
String="\b([a-zA-Z_][\w-]*)(::)([a-zA-Z_][\w-]*)(?:<[\w\-\s]*>)?(\()"/>
</context>
<context name="FunctionName" attribute="Normal Text" lineEndContext="#pop">
<StringDetect context="#stay" attribute="Class" String="%1" dynamic="true"/>
<StringDetect context="#stay" attribute="Operator" String="%2" dynamic="true"/>
<StringDetect context="#stay" attribute="Function" String="%3" dynamic="true"/>
<DetectChar context="#pop" attribute="Normal Text" char="4" dynamic="true"/>
</context>
Yerel sınırlandırıcılar
Bazı kurallar, aynı adlı keywords etiketinin öznitelikleriyle birleştirilen weakDeliminator ve additionalDeliminator gibi isteğe bağlı özniteliklere izin verirler. Örneğin, '%', keywords’ün zayıf bir sınırlandırıcısıysa yalnızca onun additionalDeliminator özniteliğine konularak bir sözcük sınırlandırıcısı olabilir. Ne zaman bir kural bu özniteliklere izin veriyorsa o bir (local deliminators) (yerel sınırlandırıcılar) içerir.
weakDeliminator: Sözcük sınırlandırıcısı olarak davranmayan karakterlerin listesi.
additionalDeliminator: Ek sınırlandırıcılar tanımlar.
- DetectChar
Tek bir belirli karakteri algılar. Genellikle kapatma tırnaklarını bulmak için kullanılır.
<DetectChar char="(karakter)" (ortak öznitelikler) (devingen) />
charözniteliği, eşleştirilecek karakteri tanımlar.- Detect2Chars
Tanımlı bir sırada iki belirli karakteri algılar.
<2KarakterAlgıla char="(karakter)" char1="(karakter)" (ortak öznitelikler) />
charözniteliği, eşleştirilecek ilk karakteri,char1ise ikincisini tanımlar.Bu kural tarihsel nedenlerden dolayı buradadır; okunabilirlik açısından
StringDetectkullanılması tercih nedenidir.- AnyChar
Belirli bir karakter kümesinden tek bir karakteri algılar.
<AnyChar String="(dizi)" (ortak öznitelikler) />
Stringözniteliği, karakterlerin kümesini tanımlar.- StringDetect
Kesin bir diziyi algılar.
<StringDetect String="(dizi)" [insensitive="true|false"] (ortak öznitelikler) (devingen) />
Stringözniteliği, eşleştirilecek diziyi tanımlar.insensitiveözniteliği öntanımlı olarak false’tur ve dizi karşılaştırma işlevine geçirilir. Değer true ise duyarsız karşılaştırma kullanılır.- WordDetect
Tam bir diziyi algılar; ancak sözcük başlangıcında ve sonunda
'.'veya boşluk gibi sözcük sınırlarına gereksinim duyar. Bir düzenli ifade kapsamında\b<string>\bgibi düşünün; ancakRegExprkuralından daha hızlıdır.<SözcükAlgıla String="(dizi)" [insensitive="true|false"] (ortak öznitelikler) (yerel sınırlandırıcılar) />
Stringözniteliği, eşleştirilecek diziyi tanımlar.insensitiveözniteliği öntanımlı olarak false’tur ve dizi karşılaştırma işlevine geçirilir. Değer true ise duyarsız karşılaştırma kullanılır.Kate 3.5 (KDE 4.5) sürümünden bu yana
- RegExpr
Bir düzenli ifade ile eşleşir.
<RegExpr String="(dizi)" [insensitive="true|false"] [minimal="true|false"] (ortak öznitelikler) (devingen) />
Stringözniteliği, düzenli ifadeyi tanımlar.insensitiveöntanımlı olarak false’tur ve düzenli ifade işletkesine geçirilir.minimalöntanımlı olarak false’tur ve düzenli ifade işletkesine geçirilir.Kurallar her zaman geçerli dizinin başlangıcına göre eşleştirildiğinden, şapka (
^) ile başlayan düzenli ifade, kuralın yalnızca satırın başlangıcına göre eşleştirilmesi gerektiğini belirtir.Bunlar hakkında daha fazla bilgi için Düzenli İfadeler bağlantısına bakın.
- keyword
Belirli bir listeden bir anahtar sözcüğü algılar.
<anahtar sözcük String="(liste ado)" (ortak öznitelikler) (yerel sınırlandırıcılar) />
Stringözniteliği, adıyla anahtar sözcük listesini tanımlar. Bu ada sahip bir liste var olmalıdır.Vurgulama sistemi, anahtar sözcük kurallarını oldukça eniyilenmiş bir biçimde işler. Bu, eşleştirilecek tüm anahtar sözcüklerin, örtük biçimde (öntanımlı sınırlandırıcılar) veya keywords etiketinin additionalDeliminator özelliğiyle açıkça belirtilmiş bir biçimde tanımlı sınırlandırıcılarla eşleştirilmiş olmasını bir gereklilik kılar.
Eşleştirilecek bir anahtar sözcükte sınırlandırıcı bir karakter varsa bu ilgili karakter keywords etiketinin weakDeliminator özelliğine eklenmelidir. Sonrasında bu karakter tüm keyword kurallarında sınırlandırıcı kimliğini kaybeder. Aynı zamanda, keyword’ün weakDeliminator özniteliği de kullanılabilir; böylece bu değişiklik yalnızca bu kural için geçerli olur.
- Int
Bir tamsayıyı algılar (şu düzenli ifade gibi:
\b[0-9]+).<Int (ortak öznitelikler) (yerel sınırlandırıcılar) />
Bu kuralın belirli bir özniteliği yoktur.
- Float
Bir kayan noktalı sayıyı algılar (şu düzenli ifade gibi:
(\b[0-9]+\.[0-9]*|\.[0-9]+)([eE][-+]?[0-9]+)?).<Float (ortak öznitelikler) (yerel sınırlandırıcılar) />
Bu kuralın belirli bir özniteliği yoktur.
- HlCOct
Bir sekizlik noktalı sayı temsilini algılar (şu düzenli ifade gibi:
\b0[0-7]+).<HlCOct (ortak öznitelikler) (yerel sınırlandırıcılar) />
Bu kuralın belirli bir özniteliği yoktur.
- HlCHex
Bir onaltılık sayı temsilini algılar (şu düzenli ifade gibi:
\b0[xX][0-9a-fA-F]+).<HlCHex (ortak öznitelikler) (yerel sınırlandırıcılar) />
Bu kuralın belirli bir özniteliği yoktur.
- HlCStringChar
Kaçırılan bir karakteri algılar.
<HlCStringChar (ortak öznitelikler) />
Bu kuralın belirli bir özniteliği yoktur.
Program kodunda sıkça kullanılan karakterlerin gerçek temsilleriyle eşleşir; örneğin,
\n(yenisatır) veya\t(SEKME).Eğer bir ters eğik çizgi (
\) sonrasında geliyorlarsa aşağıdaki karakterler eşleşir:abefnrtv"'?\. Ek olarak, kaçırılan onaltılık (örneğin,\xff) ve sekizlik (örneğin,\033) karakterler de eşleşir.- HlCChar
Bir C karakterini algılar.
<HlCChar (ortak öznitelikler) />
Bu kuralın belirli bir özniteliği yoktur.
Bir kesme işareti çifti içine alınmış C karakterleriyle eşleşir (Örnek:
'c'). Kesme işaretleri normal bir karakter veya kaçırılmış bir karakter olabilir. Eşleştirilen kaçırılmış karakter dizileri hakkında daha fazla bilgi için HlCStringChar bölümüne bakın.- RangeDetect
Tanımlı bir başlangıç ve bitiş karakterleri olan bir diziyi algılar.
<RangeDetect char="(karakter)" char1="(karakter)" (ortak öznitelikler) />
char, erimi başlatan karakteri,char1ise bitiren karakteri tanımlar.Örneğin küçük alıntılanmış dizileri ve benzerlerini algılamak için kullanışlıdır; ancak vurgulama işletkesi her kerede bir satır üzerinde çalıştığından, bunun bir satır sonu boyunca uzanan dizileri bulmayacağını unutmayın.
- LineContinue
Satırın sonundaki belirli bir karakterle eşleşir.
<LineContinue (ortak öznitelik) [char="\"] />
charisteğe bağlı eşleştirilecek karakterdir, öntanımlısı ise ters eğik çizgidir ('\'). KDE 4.13 sürümünden bu yana eklidir.Bu kural, satırın sonunda bağlamı değiştirmek için kullanışlıdır. Bu, örneğin C/C++’da makroları veya dizileri sürdürmek için gereklidir.
- IncludeRules
Başka bir bağlamdan, dilden veya dosyadan kuralları içerir.
<IncludeRules context="contextlink" [includeAttrib="true|false"] />
contextözniteliği, hangi bağlamın içerileceğini tanımlar.Basit bir diziyse tanımlı tüm kuralları geçerli bağlama içerir; örneğin:
<IncludeRules context="anotherContext" />
Dizi bir
##içeriyorsa vurgu sistemi, verilen adda başka bir dilden bir bağlam arar; örneğin,<IncludeRules context="String##C++" />
, C++ vurgulama tanımından String bağlamını içerir.
includeAttribözniteliği true ise hedef özniteliği kaynağın olanına değiştirin. Bu; örneğin dahil edilen bağlamla eşleşen metnin ana bilgisayar bağlamından farklı bir vurgu olması durumunda yorum yapma işleminin gerçekleştirilmesi için gereklidir.- DetectSpaces
Boşlukları algılar.
<DetectSpaces (ortak öznitelikler) />
Bu kuralın belirli bir özniteliği yoktur.
İleride birkaç boşluk olabileceğini biliyorsanız; örneğin, girintili çizgilerin başında bu kuralı kullanın. Bu kural, birden fazla kuralı sınamak ve eşleşme olmaması nedeniyle birer birer atlamak yerine, tüm boşlukları tek kerede atlayacaktır.
- DetectIdentifier
Tanımlayıcı dizilerini algılar (şu düzenli ifade gibi:
[a-zA-Z_][a-zA-Z0-9_]*).<DetectIdentifier (ortak öznitelikler) />
Bu kuralın belirli bir özniteliği yoktur.
Birden çok kuralla sınamak ve eşleşme olmaması nedeniyle birer birer atlamak yerine, bir dizi sözcük karakterini aynı anda atlamak için bu kuralı kullanın.
Bağlam değiştirmenin nasıl çalıştığını anladıktan sonra vurgu tanımlarını yazmak kolay olacaktır. Hangi durumda hangi kuralı seçtiğinizi dikkatlice denetlemelisiniz. Düzenli ifadeler çok güçlüdür; ancak diğer kurallara göre yavaştırlar. Bu nedenle aşağıdaki ipuçlarını dikkate alabilirsiniz.
Düzenli ifadelerin kullanımı kolaydır ancak çoğu zaman aynı sonucu elde etmenin çok daha hızlı başka bir yolu vardır. Satırdaki ilk karakter ise
'#'karakterini eşleştirmek istediğinizi varsayalım. Düzenli ifade tabanlı bir çözüm şöyle görünecektir:<RegExpr attribute="Macro" context="macro" String="^\s*#" />
Aynısını çok daha hızlıca şunu kullanarak elde edebilirsiniz:
<DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" />
.
'^#'düzenli ifadesini eşleştirmek istiyorsanız hâlâcolumn="0"özniteliğiyleDetectCharkullanabilirsiniz.columnözniteliği karakterleri sayar, bu nedenle, sekme karakteri yalnızca bir karakter olarak geçer.RegExprkurallarında,^PATTERNdizgisi satırın başındaki metni eşleştirmek için kullanılacaksacolumn="0"özniteliğini kullanın. Geri kalan sütunlarda arama yapmayacağından bu, başarımı önemli ölçüde iyileştirir.Düzenli ifadelerde, yakalamalar aynı düzenli ifadeler içinde veya devingen kurallarda kullanılmayacaklarsa
(PATTERN)yakalayan grupları yerine yakalamayan(?:PATTERN)gruplarını kullanın. Bu, gereksiz yere yakalamaları depolamayı önler.Karakterleri işlemeden bağlamlar arasında geçiş yapabilirsiniz.
*/dizisiyle karşılaştığınızda bağlamı değiştirmek istediğinizi; ancak bu diziyi bir sonraki bağlamda işlemeniz gerektiğini varsayalım. Aşağıdaki kural eşleşecektir velookAheadözelliği, vurgulayıcının eşleşen diziyi bir sonraki bağlam için tutmasını sağlar.<StringDetect attribute="Comment" context="#pop" String="*/" lookAhead="true" />
Çok sayıda boşluk oluşacağını biliyorsanız
DetectSpaceskullanın.'[a-zA-Z_]\w*'düzenli ifadesi yerineDetectIdentifierkullanın.Olabildiğince öntanımlı biçemleri kullanın. Böylece, kullanıcı tanıdık bir ortam bulacaktır.
Başkalarının karmaşık kuralları nasıl uyguladıklarını görmek için diğer XML dosyalarına bakın.
validatehl.sh mySyntax.xml komutunu kullanarak tüm XML dosyalarını doğrulayabilirsiniz.
validatehl.shdosyası, her ikisi de Sözdizim Vurgulaması deposunda bulunabilenlanguage.xsddosyalarını kullanır.Karmaşık düzenli ifadeleri pek sık yineliyorsanız ENTITIES kullanabilirsiniz. Örnek:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE language [ <!ENTITY myref "[A-Za-z_:][\w.:_-]*"> ]>Şimdi, düzenli ifade yerine &myref; kullanabilirsiniz.
Kate’de, yerleşik komut satırını (öntanımlı kısayolu
F7) ve reload-highlighting komutunu kullanarak sözdizimleri yenileyebilirsiniz.Bir sözdizimi sınamak ve biçemi ve metnin her bir kısmıyla ilgili bölgeleri görüntülemek için
ksyntaxhighlighter6(eski sürümlerdekate-syntax-highlighter) adlı komut satırı izlencesini kullanabilirsiniz.
ksyntaxhighlighter6 --output-format=ansi --syntax-trace=format test.cpp sonucu.
Daha çok seçenek için ksyntaxhighlighter6 -h kullanın.