Laborante kun Syntax Highlighting

Superrigardo

Sintakso Highlighting estas tio, kio igas la redaktilon aŭtomate montri tekston en malsamaj stiloj/koloroj, depende de la funkcio de la ĉeno rilate al la celo de la dosiero. En programa fontkodo ekzemple, kontroldeklaroj povas esti grasigitaj, dum datumtipoj kaj komentoj ricevas malsamajn kolorojn de la resto de la teksto. Tio multe plibonigas la legeblecon de la teksto, kaj tiel helpas la aŭtoron esti pli efika kaj produktiva.

C++-funkcio, bildita kun sintaksa reliefigo.

C++-funkcio, bildita kun sintaksa reliefigo.

La sama C++-funkcio, sen reliefigo.

La sama C++-funkcio, sen reliefigo.

El la du ekzemploj, kiu estas plej facile legebla?

KatePart venas kun fleksebla, agordebla kaj kapabla sistemo por fari sintaksan reliefigon, kaj la norma distribuo disponigas difinojn por larĝa gamo de programado, skriptlingvoj kaj markado kaj aliaj tekstdosierformatoj. Krome vi povas provizi viajn proprajn difinojn en simpla XML dosierojn.

KatePart aŭtomate detektos la ĝustajn sintaksajn regulojn kiam vi malfermas dosieron, surbaze de la MIME Tipo de la dosiero, determinita de ĝia etendaĵo, aŭ, se ĝi ne havas, la enhavo. Se vi spertas malbonan elekton, vi povas mane agordi la sintakson por uzi el la menuo IlojEmstarigado .

La stiloj kaj koloroj uzataj de ĉiu sintaksa emfaza difino povas esti agorditaj uzante la langeton Elstarigante Tekstajn Stilojn de la Agorda Dialogo, dum la MIME Tipoj kaj dosier-etendoj por kiuj ĝi estu uzata estas pritraktataj de la langeto Reĝimoj & Dosiertipoj.

Rimarko

La sintaksa reliefigo estas tie por plibonigi la legeblecon de ĝusta teksto, sed vi ne povas fidi ĝin por validigi vian tekston. Marki tekston por sintakso estas malfacila depende de la formato, kiun vi uzas, kaj en iuj kazoj la aŭtoroj de la sintaksaj reguloj fieros se 98% de teksto estas ĝuste bilditaj, kvankam plej ofte vi bezonas maloftan stilon por vidi la malĝustajn 2% .

La KatePart Sintakso Highlight System

Ĉi tiu sekcio diskutos pri la KatePart sintaksa reliefiga mekanismo pli detale. Ĝi estas por vi, se vi volas scii pri ĝi, aŭ se vi volas ŝanĝi aŭ krei sintaksajn difinojn.

Kiel ĝi Funkcias

Kiam ajn vi malfermas dosieron, unu el la unuaj aferoj la KatePart redaktilo faras estas detekti kiun sintaksan difinon uzi por la dosiero. Dum legado de la teksto de la dosiero, kaj dum vi tajpas en ĝi, la sintaksa emfaza sistemo analizos la tekston uzante la regulojn difinitajn de la sintaksa difino kaj markos en ĝi kie komenciĝas kaj finiĝas malsamaj kuntekstoj kaj stiloj.

Kiam vi tajpas la dokumenton, la nova teksto estas analizita kaj markita sur la flugo, tiel ke se vi forigas signon kiu estas markita kiel la komenco aŭ fino de kunteksto, la stilo de ĉirkaŭa teksto ŝanĝiĝas laŭe.

La sintaksaj difinoj uzataj de la KatePart Sintakso Highlighting System estas XML dosieroj, enhavantaj

  • Reguloj por detekti la rolon de teksto, organizitaj en kuntekstblokojn

  • Listo de ŝlosilvortoj

  • Stilo Item-difinoj

Kiam oni analizas la tekston, la detektaj reguloj estas taksitaj en la ordo en kiu ili estas difinitaj, kaj se la komenco de la nuna ĉeno kongruas kun regulo, la rilata kunteksto estas uzata. La komenca punkto en la teksto estas movita al la fina punkto ĉe kiu tiu regulo kongruis kaj nova buklo de la reguloj komenciĝas, komencante en la kunteksto fiksita per la kongrua regulo.

Reguloj

La detektaj reguloj estas la koro de la reliefiga detektsistemo. Regulo estas ĉeno, signo aŭ regula esprimo kontraŭ kiu kongrui la analizitan tekston. Ĝi enhavas informojn pri kiu stilo uzi por la kongrua parto de la teksto. Ĝi povas ŝanĝi la laborkuntekston de la sistemo aŭ al eksplicite menciita kunteksto aŭ al la antaŭa kunteksto uzata de la teksto.

Reguloj estas organizitaj en kuntekstaj grupoj. Kunteksta grupo estas uzata por ĉefaj tekstokonceptoj ene de la formato, ekzemple cititaj tekstoĉenoj aŭ komentblokoj en programfontokodo. Ĉi tio certigas, ke la emfaza sistemo ne bezonas trapasi ĉiujn regulojn kiam ĝi ne estas necesa, kaj ke iuj signosekvencoj en la teksto povas esti traktataj malsame depende de la nuna kunteksto.

Kuntekstoj povas esti generitaj dinamike por permesi la uzon de instancospecifaj datenoj en reguloj.

Kuntekstaj Stiloj kaj Ŝlosilvortoj

En kelkaj programlingvoj, entjeraj nombroj estas traktataj alimaniere ol glitkomaj fare de la kompililo (la programo kiu konvertas la fontkodon al binara efektivigebla), kaj povas ekzisti signoj havantaj specialan signifon ene de citita ĉeno. En tiaj kazoj, estas senco redoni ilin alimaniere de la ĉirkaŭaĵo por ke ili estu facile identigeblaj dum legado de la teksto. Do eĉ se ili ne reprezentas specialajn kuntekstojn, ili povas esti viditaj kiel tiaj per la sintaksa reliefigsistemo, tiel ke ili povas esti markitaj por malsama bildigo.

Sintaksa difino povas enhavi tiom da stiloj kiom necesas por kovri la konceptojn de la formato por kiu ĝi estas uzata.

En multaj formatoj, ekzistas listoj de vortoj kiuj reprezentas specifan koncepton. Ekzemple, en programlingvoj, kontroldeklaroj estas unu koncepto, datumtipnomoj alia, kaj konstruitaj en funkcioj de la lingvo triono. La KatePart Syntax Highlighting System povas uzi tiajn listojn por detekti kaj marki vortojn en la teksto por emfazi konceptojn de la tekstoformatoj.

Defaŭltaj Stiloj

Se vi malfermas fontdosieron C++, Java™ fontdosiero kaj HTML dokumenton en KatePart, vi vidos ke kvankam la formatoj estas malsamaj, kaj tiel malsamaj vortoj estas elektitaj por speciala traktado, la koloroj uzataj estas la samaj. Ĉi tio estas ĉar KatePart havas antaŭdifinitan liston de Defaŭltaj Stiloj, kiuj estas uzataj de la individuaj sintaksaj difinoj.

Ĉi tio faciligas rekoni similajn konceptojn en malsamaj tekstoformatoj. Ekzemple, komentoj ĉeestas en preskaŭ ajna programado, skripto aŭ markadlingvo, kaj kiam ili estas prezentitaj uzante la saman stilon en ĉiuj lingvoj, vi ne devas halti kaj pensi identigi ilin en la teksto.

Sugesto

Ĉiuj stiloj en sintaksa difino uzas unu el la defaŭltaj stiloj. Kelkaj sintaksaj difinoj uzas pli da stiloj ol estas defaŭltaj, do se vi uzas formaton ofte, eble indas lanĉi la agordan dialogon por vidi ĉu iuj konceptoj uzas la saman stilon. Ekzemple, ekzistas nur unu defaŭlta stilo por ĉenoj, sed ĉar la Perl programlingvo funkcias kun du specoj de ĉenoj, vi povas plibonigi la reliefigon agordante tiujn por esti iomete malsamaj. Ĉiuj disponeblaj defaŭltaj stiloj estos klarigitaj poste.

La Marka Difino XML Formato

Superrigardo

KatePart uzas la kadron Syntax-Highlighting de KDE Frameworks™. La defaŭlta reliefigo XML dosieroj senditaj kun KatePart estas kompilitaj en la bibliotekon Syntax-Highlighting defaŭlte.

Ĉi tiu sekcio estas superrigardo de la Highlight Definition XML formato. Surbaze de malgranda ekzemplo ĝi priskribos la ĉefajn komponantojn kaj ilian signifon kaj uzadon. La sekva sekcio eniros en detalojn kun la plej elstaraj detektaj reguloj.

La formala difino, ankaŭ konata kiel la XSD, kiun vi trovas en Syntax Highlighting-deponejo en la dosiero language.xsd

Propraj .xml elstaraj difindosieroj troviĝas en org.kde.syntax-highlighting/syntax/ en via uzanto dosierujo trovita kun qtpaths --paths GenericDataLocation kiuj kutime estas $HOME/.local/share/ kaj /usr/share/.

En Flatpak kaj Snap-pakaĵoj, ĉi-supra dosierujo ne funkcios ĉar la datuma loko estas malsama por ĉiu aplikaĵo. En aplikaĵo de Flatpak, la loko de propra XML dosieroj estas kutime $HOME/.var/app/flatpak-package-name/data/org.kde.syntax-highlighting/syntax/ kaj en Snap-aplikaĵo tiu loko estas $HOME/snap/snap-package-name/ current/.local/share/org.kde.syntax-highlighting/syntax/.

Sur Windows® ĉi tiuj dosieroj troviĝas %USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax. %USERPROFILE% kutime vastiĝas al C:\Users\uzanto.

Resume, por plej multaj agordoj la dosierujo de propra XML dosieroj estas kiel sekvas:

Por loka uzanto$HOME/.local/share/org.kde.syntax-highlighting/syntax/
Por ĉiuj uzantoj/usr/share/org.kde.syntax-highlighting/syntax/
Por Flatpak-pakaĵoj$HOME/.var/app/flatpak-package-name/data/org.kde.syntax-highlighting/syntax/
Por Snap-pakaĵoj$HOME/snap/snap-package-name/current/.local/share/org.kde.syntax-highlighting/syntax/
Sur Windows®%USERPROFILE%\AppData\Local\org.kde.syntax-highlighting\syntax

Se ekzistas pluraj dosieroj por la sama lingvo, la dosiero kun la plej alta versio atributo en la elemento lingvo estos ŝargita.

Ĉefaj sekcioj de KatePart Emfazaj Difindosierojn

Elstariga dosiero enhavas kaplinion kiu fiksas la XML versio:
&?xml version="1.0" encoding="UTF-8"?>
La radiko de la difindosiero estas la elemento lingvo. Disponeblaj atributoj estas:

Bezonataj atributoj:

nomo fiksas la nomon de la lingvo. Ĝi aperas poste en la menuoj kaj dialogoj.

sekcio specifas la kategorion.

etendoj difinas dosierajn etendaĵojn, kiel "*.cpp;*.h"

versio specifas la nunan revizion de la difindosiero laŭ entjera nombro. Kiam ajn vi ŝanĝas elstaran difindosieron, certigu pliigi ĉi tiun nombron.

kateversion specifas la plej lastan subtenatan KatePart versio.

Laŭvolaj atributoj:

mimetype asocias MIME-tipon al dosieroj.

majusklesendebla difinas ĉu la ŝlosilvortoj distingas minusklecon aŭ ne.

prioritato estas necesa se alia elstara difindosiero uzas la samajn etendaĵojn. La pli alta prioritato venkos.

aŭtoro enhavas la nomon de la aŭtoro kaj lian retadreson.

licenco enhavas la permesilon, kutime la MIT-licencon por novaj sintaksaj eminentaj dosieroj.

stilo enhavas la provizitan lingvon kaj estas uzata de la indentistoj por la atributo required-syntax-style.

indentor difinas kiun indentigilo estos uzata defaŭlte. Disponeblaj indentiloj estas: ada, normala, cstyle, cmake, haskell, latex, lilypond, lisp, lua, pascal, python, replicode, ruby kaj xml.

kaŝita difinas ĉu la nomo aperu en la menuoj de KatePart.

Do la sekva linio povas aspekti jene:

<language name="C++" version="1" kateversion="2.4" section="Fontoj" extensions="*.cpp;*.h" />
Poste venas la elemento markigo, kiu enhavas la laŭvolan elementon list kaj la postulatajn elementojn kuntekstoj kaj itemDatas.

listo elementoj enhavas liston de ŝlosilvortoj. Ĉi-kaze la ŝlosilvortoj estas klaso kaj konst. Vi povas aldoni tiom da listoj kiom vi bezonas.

Ekde KDE Frameworks™ 5.53, listo povas inkluzivi ŝlosilvortojn de alia listo aŭ lingvo/dosiero, uzante la elementon include. ## estas uzata por apartigi la listonomon kaj la lingvodifinnomon, same kiel en la regulo Inkludi Regulojn. Ĉi tio estas utila por eviti duobligi ŝlosillistojn, se vi bezonas inkluzivi la ŝlosilvortojn de alia lingvo/dosiero. Ekzemple, la listo alianomo enhavas la ŝlosilvorton str kaj ĉiujn ŝlosilvortojn de la listo tipoj, kiu apartenas al la ISO C++ lingvo.

La elemento kuntekstoj enhavas ĉiujn kuntekstojn. La unua kunteksto estas defaŭlte la komenco de la reliefigo. Estas du reguloj en la kunteksto Normala Teksto, kiuj kongruas kun la listo de ŝlosilvortoj kun la nomo iunomo kaj regulo, kiu detektas citilon kaj ŝanĝas la kuntekston al ĉeno. Por lerni pli pri reguloj legu la sekvan ĉapitron.

La tria parto estas la elemento itemDatas. Ĝi enhavas ĉiujn kolorojn kaj tiparstilojn bezonatajn de la kuntekstoj kaj reguloj. En ĉi tiu ekzemplo, la itemData Normala Teksto, String kaj Ŝlosilvorto estas uzataj.

<highlighting>
    <list name="iunomo">
      <item>class</item>
      <item>const</item>
    </list>
    <list name="alianomo">
      <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="iunomo" />
        <keyword attribute="Keyword" context="#stay" String="alianomo" />
        <DetectChar attribute="String" context="string" char="&quot;" />
      </context>
      <context attribute="String" lineEndContext="#stay" name="string" >
        <DetectChar attribute="String" context="#pop" char="&quot;" />
      </context>
    </contexts>
    <itemDatas>
      <itemData name="Normal Text" defStyleNum="dsNormal" />
      <itemData name="Keyword" defStyleNum="dsKeyword" />
      <itemData name="String" defStyleNum="dsString" />
    </itemDatas>
  </highlighting>
La lasta parto de elstara difino estas la laŭvola sekcio ĝenerala. Ĝi povas enhavi informojn pri ŝlosilvortoj, kodfaldado, komentoj, deŝovo, malplenaj linioj kaj literuma kontrolo.

La sekcio komento difinas per kia ĉeno unulinia komento estas enkondukita. Vi ankaŭ povas difini plurlinian komenton uzante multiLine kun la kroma atributo end. Ĉi tio estas uzata se la uzanto premas la respondan ŝparvojon por comment/uncomment.

La sekcio keywords difinas ĉu ŝlosilvortlistoj distingas usklecon aŭ ne. Aliaj atributoj estos klarigitaj poste.

La aliaj sekcioj, folding, emptyLines kaj spellchecking, kutime ne necesas kaj estas klarigitaj poste.

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

La Sekcioj en Detalo

Ĉi tiu parto priskribos ĉiujn disponeblajn atributojn por kuntekstoj, itemDatoj, ŝlosilvortoj, komentoj, kodo-faldado kaj indentaĵo.

La elemento context apartenas al la grupo contexts. Kunteksto mem difinas kunteksto-specifajn regulojn kiel ekzemple kio devus okazi se la elstara sistemo atingas la finon de linio. Disponeblaj atributoj estas:

name deklaras la kuntekstan nomon. Reguloj uzos ĉi tiun nomon por specifi la kuntekston por ŝanĝi, se la regulo kongruas.

attribute identigas la stilon por uzi por signo kiam neniu regulo kongruas aŭ kiam regulo ne specifas atributon. En ĉi-lasta kazo, estos uzata attribute de la kunteksto specifita en la context de la regulo.

lineEndContext difinas la kuntekston, al kiu la emfazsistemo ŝanĝas se ĝi atingas la finon de linio. Ĉi tio povas aŭ esti nomo de alia kunteksto, #stay por ne ŝanĝi la kuntekston (ekz.. fari nenion) aŭ #pop kiu igos ĝin forlasi ĉi tiun kuntekston. Eblas uzi ekzemple #pop#pop#pop por krevi trifoje, aŭ eĉ #pop#pop!OtherContext por krevi dufoje kaj ŝanĝi al la kunteksto nomata Alia Kunteksto. Eblas ankaŭ ŝanĝi al kunteksto, kiu apartenas al alia lingvodifino, same kiel en la reguloj Inkluzi Reguloj, ekz., IuKunteksto##JavaScript. Kuntekstŝaltiloj ankaŭ estas priskribitaj en la sekcio nomata “Emfazodetektaj Reguloj”. Defaŭlto: #stay.

lineEmptyContext difinas la kuntekston se malplena linio estas renkontita. La nomenklaturo de kuntekstŝaltiloj estas la sama kiel antaŭe priskribita en lineEndContext. Defaŭlto: #stay.

fallthroughContext specifas la sekvan kuntekston por ŝanĝi se neniu regulo kongruas. La nomenklaturo de kuntekstŝaltiloj estas la sama kiel antaŭe priskribita en lineEndContext. Defaŭlto: #stay.

fallthrough difinas ĉu la emfazsistemo ŝanĝas al la kunteksto specifita en fallthroughContext se neniu regulo kongruas. Notu ke ekde KDE Frameworks™ 5.62 ĉi tiu atributo estas malrekomendita favore al fallthroughContext, ĉar se la atributo fallthroughContext ĉeestas, estas implicite komprenite, ke la valoro de fallthrough estas true. Defaŭlto: false.

noIndentationBasedFolding malŝaltas indent-bazitan faldadon en la kunteksto. Se indent-bazita faldado ne estas aktivigita, ĉi tiu atributo estas senutila. Ĉi tio estas difinita en la elemento folding de la grupo general. Defaŭlto: false.

La elemento itemData estas en la grupo itemData. Ĝi difinas la tiparstilon kaj kolorojn. Do eblas difini viajn proprajn stilojn kaj kolorojn. Tamen, ni rekomendas vin alteni la defaŭltajn stilojn se eble, por ke la uzanto ĉiam vidu la samajn kolorojn uzatajn en malsamaj lingvoj. Tamen, foje ne ekzistas alia maniero kaj necesas ŝanĝi kolorojn kaj tipatributojn. La atributoj name kaj defStyleNum estas postulataj, la aliaj estas laŭvolaj. Disponeblaj atributoj estas:

name fiksas la nomon de la itemData. Kuntekstoj kaj reguloj uzos ĉi tiun nomon en sia atributo attribute por referenci elementon.

defStyleNum difinas kiun defaŭltan stilon uzi. Disponeblaj defaŭltaj stiloj estas klarigitaj detale poste.

color difinas koloron. Validaj formatoj estas '#rrggbb' aŭ '#rgb'.

selColor difinas la elektokoloron.

italic se true, la teksto estos kursiva.

bold se true, la teksto estos grasa.

underline se true, la teksto estos substrekita.

strikeout se true, la teksto estos forstrekita.

spellChecking se true, la teksto estos literumkontrolita.

La elemento keywords en la grupo general difinas ŝlosilvortojn. Disponeblaj atributoj estas:

casesensitive povas esti truefalse. Se true, ĉiuj ŝlosilvortoj estas kongruaj majuskle.

weakDeliminator estas listo de signoj, kiuj ne funkcias kiel vortlimigiloj. Ekzemple, la punkto '.' estas vortlimigilo. Supozu, ke ŝlosilvorto en listo enhavas punkton, ĝi nur kongruos se vi specifigas la punkton kiel malfortan limigilon.

additionalDeliminator difinas kromajn limigilojn.

wordWrapDeliminator difinas signojn post kiuj povas okazi linivolviĝo.

Defaŭltaj limigiloj kaj vortvolvaĵlimigiloj estas la signoj .():!+,-<=>%&*/;?[]^{|}~\, spaceto (' ') kaj tabeligilo ('\t').

La elemento komento en la grupo komentoj difinas komentajn trajtojn, kiuj estas uzataj por IlojKomento, IlojMalkomenti kaj IlojBaskuligi Komenton. Disponeblaj atributoj estas:

nomo estas aŭ unuLiniomultlinio. Se vi elektas multLinio la atributoj fino kaj regiono estas postulataj. Se vi elektas unuLinio vi povas aldoni la laŭvolan atributon pozicio.

komenco difinas la ĉenon uzatan por komenci komenton. En C++ ĉi tio estus "/*" en plurliniaj komentoj. Ĉi tiu atributo estas postulata por tipoj multiLine kaj singleLine.

end difinas la ĉenon uzatan por fermi komenton. En C++ ĉi tio estus "*/". Ĉi tiu atributo estas nur disponebla kaj necesas por komentoj de tipo multiLine.

regiono devus esti la nomo de la faldebla plurlinia komento. Supozu, ke vi havas beginRegion="Comment" ... endRegion="Comment" en viaj reguloj, vi devus uzi region="Comment". Tiel malkomentado funkcias eĉ se vi ne elektas la tutan tekston de la plurlinia komento. La kursoro nur devas esti en la plurlinia komento. Ĉi tiu atributo disponeblas nur por tipo multilinio.

position difinas kie la unulinia komento estas enmetita. Defaŭlte, la unulinia komento estas metita komence de la linio ĉe kolumno 0, sed se vi uzas position="afterwhitespace" la komento estas enmetita post gvidado de blankspacoj dekstre, antaŭ la unua ne-blankspaca signo. Ĉi tio estas utila por meti komentojn ĝuste en lingvoj kie deŝoviĝo estas grava, kiel Python aŭ YAML. Ĉi tiu atributo estas nedeviga kaj la nura ebla valoro estas afterwhitespace. Ĉi tio disponeblas nur por tipo singleLine.

La elemento folding en la grupo general difinas kodfaldajn ecojn. Disponeblaj atributoj estas:

indentationsensitive se true, la kodaj faldmarkoj estos aldonitaj deŝovo bazitaj, kiel en la skriptlingvo Python. Kutime vi ne bezonas agordi ĝin, ĉar ĝi defaŭlte estas false.

La elemento emptyLine en la grupo emptyLines difinas kiuj linioj estu traktataj kiel malplenaj linioj. Ĉi tio permesas modifi la konduton de la atributo lineEmptyContext en la elementoj context. Disponeblaj atributoj estas:

regexpr difinas regulan esprimon, kiu estos traktata kiel malplena linio. Defaŭlte, malplenaj linioj enhavas neniujn signojn, tial ĉi tio aldonas pliajn malplenajn liniojn, ekzemple, se vi volas, ke linioj kun spacoj ankaŭ estu konsiderataj malplenaj linioj. Tamen, en la plej multaj sintaksaj difinoj vi ne bezonas agordi ĉi tiun atributon.

La elemento encoding en la grupo spellchecking difinas signan kodigon por literumkontrolo. Disponeblaj atributoj:

char estas kodita signo.

ĉeno estas sinsekvo de signoj kiuj estos kodita kiel la signo char en la literuma kontrolo. Ekzemple, en la lingvo LaTeX, la ĉeno \"{A} reprezentas la signon Ä.

Disponeblaj Defaŭltaj Stiloj

Defaŭltaj Stiloj estis jam klarigitaj, kiel mallonga resumo: Defaŭltaj stiloj estas antaŭdifinitaj tiparo kaj kolorstiloj.

Ĝeneralaj defaŭltaj stiloj:

dsNormal, kiam ne necesas speciala reliefigo.

dsKeyword, enkonstruitaj lingvaj ŝlosilvortoj.

dsFunction, funkciovokoj kaj difinoj.

dsVariable, se aplikebla: variablo-nomoj (ekz. $someVar en PHP/Perl).

dsControlFlow, kontrolfluaj ŝlosilvortoj kiel se, else, ŝaltilo, rompo, reveno, rendimento, ...

dsOperator, operatoroj kiel + - * / :: < >

dsBuiltIn, enkonstruitaj funkcioj, klasoj kaj objektoj.

dsExtension, oftaj etendaĵoj, kiel Qt™ klasoj kaj funkcioj/makrooj en C++ kaj Python.

dsPreprocessor, antaŭprocesoraj deklaroj aŭ makrodifinoj.

dsAttribute, komentarioj kiel @override kaj __declspec(...).

Defaŭltaj stiloj rilataj al ĉenoj:

dsChar, unuopaj signoj, kiel 'x'.

dsSpecialChar, signoj kun speciala signifo en ĉenoj kiel eskapoj, anstataŭaĵoj aŭ regex operatoroj.

dsString, ĉenoj kiel "saluton mondo".

dsVerbatimString, laŭvortaj aŭ krudaj ĉenoj kiel 'raw \backslash' en Perl, CoffeeScript, kaj ŝeloj, same kiel r'\raw' en Python.

dsSpecialString, SQL, regeksoj, TIE dokumentoj, LATEX matematika reĝimo, ...

dsImport, importi, inkluzivi, postuli de moduloj.

Nombro-rilataj defaŭltaj stiloj:

dsDataType, enkonstruitaj datumtipoj kiel int, void, u64.

dsDecVal, decimalaj valoroj.

dsBaseN, valoroj kun bazo alia ol 10.

dsFloat, glitkomaj valoroj.

dsConstant, konstantoj enkonstruitaj kaj uzantodifinitaj kiel PI.

Komento kaj dokumentar-rilataj defaŭltaj stiloj:

dsComment, komentoj.

dsDocumentation, /** Dokumentaj komentoj */ aŭ """docstrings""".

dsAnnotation, dokumentaj komandoj kiel @param, @brief.

dsCommentVar, la variablonomoj uzataj en supraj komandoj, kiel "foobar" en @param foobar.

dsRegionMarker, regionmarkoj kiel //BEGIN, //END en komentoj.

Aliaj defaŭltaj stiloj:

dsInformation, notoj kaj konsiloj kiel @note en doxygen.

dsWarning, avertoj kiel @warning en doksigeno.

dsAlert, specialaj vortoj kiel TODO, FIXME, XXXX.

dsError, erara reliefigo kaj malĝusta sintakso.

dsOthers, kiam nenio alia taŭgas.

Emfazodetektaj Reguloj

Ĉi tiu sekcio priskribas la sintaksdetektajn regulojn.

Ĉiu regulo povas kongrui kun nul aŭ pli da signoj ĉe la komenco de la ĉeno kontraŭ kiu ili estas testitaj. Se la regulo kongruas, la kongruaj signoj ricevas la stilon aŭ attribute difinitan de la regulo, kaj regulo povas peti ke la nuna kunteksto estas ŝanĝita.

Regulo aspektas jene:

<RegulNomo attribute="(identigilo)" context="(identigilo)" [specifaj atributoj de la regulo] />

La attribute identigas la stilon uzi por kongruaj signoj laŭ nomo, kaj la context identigas la kuntekston uzi de ĉi tie.

La context povas esti identigita per:

  • identigilo, kiu estas la nomo de la alia kunteksto.

  • order ordonanta al la motoro resti en la nuna kunteksto (#stay), aŭ reiri al antaŭa kunteksto uzata en la ĉeno (#pop). Malplena aŭ forestanta kunteksto ekvivalentas al #stay.

    Por retroiri pliajn paŝojn, la #pop ŝlosilvorto povas esti ripetita: #pop#pop#pop

  • ordo sekvata de ekkria signo (!) kaj identigilo, kiuj igos la motoron unue sekvi la ordon kaj poste ŝanĝi al la alia kunteksto, ekz. #pop#pop!AliaKunteksto.

  • identigilo, kiu estas kunteksta nomo, sekvata de du kradoj (##) kaj alia identigilo, kiu estas la nomo de lingvodifino . Ĉi tiu nomado estas simila al tiu uzata en reguloj de Inkluzi Reguloj kaj ebligas al vi ŝanĝi al kunteksto apartenanta al alia sintaksa emfaza difino, ekz. IomKunteksto##JavaScript.

Regulaj specifaj atributoj varias kaj estas priskribitaj en la sekvaj sekcioj.

Komunaj atributoj

Ĉiuj reguloj havas la jenajn atributojn komunaj kaj disponeblas kiam ajn (common attributes) aperas. Ĉiuj atributoj estas laŭvolaj.

  • attribute: Atributo mapiĝas al difinita itemData. Defaŭlto: attribute el la kunteksto specifita en context atributo.

  • context: Specifu la kuntekston, al kiu la reliefiga sistemo ŝanĝas se la regulo kongruas. Defaŭlto: #stay.

  • beginRegion: Komenci kodan faldblokon. Defaŭlto: malŝaltita.

  • endRegion: Fermi kodan faldblokon. Defaŭlte: malŝaltita.

  • lookAhead: Se true, la emfaza sistemo ne prilaboros la kongruan longon. Defaŭlte: false.

  • firstNonSpace: Kongruas nur, se la ĉeno estas la unua neblankspaco en la linio. Defaŭlte: false.

  • column: Kongruas nur, se la kolumno kongruas. Defaŭlte: malŝaltita.

Dinamikaj reguloj

Iuj reguloj permesas la laŭvolan atributon dynamic de tipo bulea kiu defaŭlte estas false. Se dynamic estas true, regulo povas uzi anstataŭaĵojn reprezentantajn la tekston kongruan per regula esprimo kiu ŝanĝis al la nuna kunteksto en sia stringchar atributoj. En string, la lokokupilo %N (kie N estas nombro) estos anstataŭigita per la responda kapto N de la voka regula esprimo, komencante de 1. En char la lokokupilo devas esti nombro N kaj ĝi estos anstataŭigita per la unua signo de la responda kapto N de la voka regula esprimo. Kiam ajn regulo permesas ĉi tiun atributon ĝi enhavos (dynamic).

  • dynamic: povas esti (true|false).

Kiel ĝi funkcias:

En la regulaj esprimoj de la reguloj RegExpr, ĉio teksto ene de simplaj kurbaj krampoj (PATTERN) estas kaptita kaj memorita. Tiuj ĉi kaptoj povas esti uzataj en la kunteksto al kiu ĝi estas ŝanĝita, en la reguloj kun la atributo dynamic true, per %N (en String) aŭ N (en char).

Gravas mencii, ke teksto kaptita en regulo RegEx estas nur konservita por la ŝanĝita kunteksto, specifita en ĝia context-atributo.

Sugesto

  • Se la kaptoj ne estos uzataj, kaj laŭ dinamikaj reguloj kaj en la sama regula esprimo, oni uzu nekaptajn grupojn: (?:PATTERN)

    La rigardomalantaŭen grupoj kiel (?=PATTERN), (?!PATTERN) (?<=PATTERN) ne estas kaptitaj. Vidu Regulaj esprimoj por pliaj informoj.

  • La kaptogrupoj povas esti uzataj ene de la sama regula esprimo, uzante \N anstataŭ %N respektive. Por pliaj informoj, vidu Kapti kongruan tekston (malantaŭaj referencoj) en Regulaj Esprimoj.

Ekzemplo 1:

En ĉi tiu simpla ekzemplo, la teksto kongrua per la regula esprimo =* estas kaptita kaj enmetita en %1 en la dinamika regulo. Tio ebligas al la komento finiĝi kun la sama kvanto de = kiel ĉe la komenco. Ĉi tio kongruas kun teksto kiel: [[ komento ]], [=[ komento ]=][=====[ komento ]===== ].

Krome, la kaptoj disponeblas nur en la ŝanĝita kunteksto Multlinia Komento.

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

Ekzemplo 2:

En la dinamika regulo, %1 respondas al la kapto, kiu kongruas kun #+, kaj %2 al &"+. Ĉi tio kongruas kun teksto kiel: #label""""en la kunteksto""""#.

Tiuj ĉi kaptoj ne estos disponeblaj en aliaj kuntekstoj, kiel AliaKunteksto, FindEscapesIuKunteksto.

<context name="SomeContext" attribute="Normal Text" lineEndContext="#stay">
  <RegExpr context="#pop!NamedString" attribute="String" String="(#+)(?:[\w-]|[^[:ascii:]])(&quot;+)"/>
</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>

Ekzemplo 3:

Ĉi tio kongruas kun teksto kiel: 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-]*)(?:&lt;[\w\-\s]*&gt;)?(\()"/>
</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>

Lokaj limigiloj

Iuj reguloj permesas la laŭvolajn atributojn weakDeliminator kaj additionalDeliminator kiuj estas kombinitaj kun samnomaj atributoj de keywords-etikedo. Ekzemple, kiam '%' estas malforta limigilo de keywords, ĝi povas fariĝi vortlimigilo nur por regulo metante ĝin en sian atributon additionalDeliminator. Kiam ajn regulo permesas ĉi tiujn atributojn ĝi enhavos (lokaj limigiloj).

  • malfortaDeliminilo: listo de signoj, kiuj ne funkcias kiel vortlimigiloj.

  • aldonaDeliminilo: difinas kromajn limilojn.

La Reguloj en Detalo

DetectChar

Detekti ununuran specifan signon. Ofte uzata ekzemple por trovi la finojn de cititaj ĉenoj.

<DetectChar char="(signo)" (komunaj atributoj) (dinamika) />

La atributo char difinas la signon por kongrui.

Detekti2Chars

Detekti du specifajn signojn en difinita ordo.

<Detect2Chars char="(signo)" char1="(signo)" (oftaj atributoj) />

La atributo char difinas la unuan signon kongruan, char1 la duan.

Ĉi tiu regulo ĉeestas pro historiaj kialoj kaj por legebleco estas preferinde uzi StringDetect.

AnyChar

Detekti unu signon de aro de specifitaj signoj.

<AnyChar String="(ĉeno)" (komunaj atributoj) />

La atributo String difinas la aron de signoj.

StringDetect

Detekti precizan ĉenon.

<StringDetect String = "(ĉeno)" [insensitive="true|false"] (oftaj atributoj) (dinamika) />

La atributo String difinas la ĉenon kongruan. La atributo insensitive defaŭlte estas false kaj estas transdonita al la ĉena kompara funkcio. Se la valoro estas true ne-usklecdistinga komparo estas uzata.

WordDetect

Detektu precizan ĉenon sed aldone postulas vortlimojn kiel punkton '.' aŭ blankspacon ĉe la komenco kaj la fino de la vorto. Pensu pri \b<string>\b laŭ regula esprimo, sed ĝi estas pli rapida ol la regulo RegExpr.

<WordDetect String="(ĉeno)" [insensitive="true|false"] (oftaj atributoj) (lokaj limigiloj) />

La atributo String difinas la ĉenon kongruan. La atributo insensitive defaŭlte estas false kaj estas transdonita al la ĉena kompara funkcio. Se la valoro estas true ne-usklecdistinga komparo estas uzata.

Ekde: Kate 3.5 (KDE 4.5)

RegEx

Kongruas kontraŭ regula esprimo.

<RegExpr String="(ĉeno)" [insensitive="true|false"] [minimal="true|false"] (oftaj atributoj) (dynamic) />

La atributo String difinas la regulan esprimon.

insensitive defaŭlte al false kaj estas transdonita al la regula esprimo-motoro.

minimuma defaŭlte al false kaj estas transdonita al la regula esprimo-motoro.

Ĉar la reguloj ĉiam kongruas kontraŭ la komenco de la nuna ĉeno, regula esprimo komencanta per signo (^) indikas ke la regulo devus esti egalita nur kontraŭ la komenco de linio.

Vidu Regulaj esprimoj por pliaj informoj pri tiuj.

keyword

Detekti ŝlosilvorton el difinita listo.

<keyword String="(listnomo)" (komunaj atributoj) (lokaj limigiloj) />

La atributo String identigas la ŝlosilvortliston laŭ nomo. Listo kun tiu nomo devas ekzisti.

La elstara sistemo prilaboras ŝlosilvortajn regulojn en tre optimumigita maniero. Ĉi tio igas absolutan neceson, ke ĉiuj ŝlosilvortoj kongruaj devas esti ĉirkaŭitaj de difinitaj limigiloj, aŭ implicitaj (la defaŭltaj limigiloj), aŭ eksplicite specifitaj ene de la eco additionalDeliminator de la keyword etikedo.

Se kongruota ŝlosilvorto enhavas limigan signon, ĉi tiu respektiva signo devas esti aldonita al la eco weakDeliminator de la etikedo keyword. Ĉi tiu signo tiam perdos sian limigilon en ĉiuj reguloj de keyword. Eblas ankaŭ uzi la atributon weakDeliminator de keyword tiel ke ĉi tiu modifo nur validu por ĉi tiu regulo.

Int

Detekti entjeron (kiel la regula esprimo: \b[0-9]+).

<Int (komunaj atributoj) (lokaj limigiloj) />

Ĉi tiu regulo ne havas specifajn atributojn.

Float

Detekti glitkoman nombron (kiel la regula esprimo: (\b[0-9]+\.[0-9]*|\.[0-9]+)([eE][- +]?[0-9]+)?).

<Float (komunaj atributoj) (lokaj limigiloj) />

Ĉi tiu regulo ne havas specifajn atributojn.

HlCOct

Detekti okuman punktonombro-reprezenton (kiel la regula esprimo: \b0[0-7]+).

<HlCOct (komunaj atributoj) (lokaj limigiloj) />

Ĉi tiu regulo ne havas specifajn atributojn.

HlCHex

Detekti deksesuman nombro-reprezenton (kiel regula esprimo: \b0[xX][0-9a-fA-F]+).

<HlCHex (komunaj atributoj) (lokaj limigiloj) />

Ĉi tiu regulo ne havas specifajn atributojn.

HlCStringChar

Detektu eskapintan signon.

<HlCStringChar (komunaj atributoj) />

Ĉi tiu regulo ne havas specifajn atributojn.

Ĝi kongruas laŭvortajn prezentojn de signoj kutime uzataj en programkodo, ekzemple \n (novlinio) aŭ \t (TAB).

La sekvaj signoj kongruos se ili sekvas malantaŭan oblikvon (\): abefnrtv"'?\. Aldone, eskapintaj deksesumaj nombroj kiel ekzemple \xff kaj eskapintaj okumaj nombroj, ekzemple \033 kongruos.

HlCChar

Detekti C-signon.

<HlCChar (komunaj atributoj) />

Ĉi tiu regulo ne havas specifajn atributojn.

Ĝi kongruas kun C-signoj enfermitaj en apostrofo (Ekzemplo: 'c'). La apostrofoj povas esti simpla signo aŭ eskapita signo. Vidu HlCStringChar por egalitaj eskapintaj signosekvencoj.

RangeDetect

Detekti ĉenon kun difinitaj komencaj kaj finaj signoj.

<RangeDetect char="(signo)" char1="(signo)" (oftaj atributoj) />

char difinas la signon komencantan la intervalon, char1 la signon finantan la intervalon.

Utila por detekti ekzemple malgrandajn cititajn ĉenojn kaj similajn, sed rimarku, ke ĉar la reliefiga motoro funkcias sur unu linio samtempe, ĉi tio ne trovos ĉenojn etendantajn super liniorompo.

LinioDaŭrigi

Kongruas kun specifita signo ĉe la fino de linio.

<LineContinue (komunaj atributoj) [char="\"] />

char laŭvola signo por kongrui, defaŭlta estas malantaŭa oblikvo ('\'). Nova ekde KDE 4.13.

Ĉi tiu regulo estas utila por ŝanĝi kuntekston ĉe fino de linio. Ĉi tio necesas ekzemple en C/C++ por daŭrigi makroojn aŭ ĉenojn.

Inkluzivi Regulojn

Enmeti regulojn de alia kunteksto aŭ lingvo/dosiero.

<IncludeRules context="contextlink" [includeAttrib="true|false"] />

La atributo context difinas kiun kuntekston inkluzivi.

Se ĝi estas simpla ĉeno, ĝi inkluzivas ĉiujn difinitajn regulojn en la nunan kuntekston, ekzemple:

<IncludeRules context="aliaKunteksto" />

Se la ĉeno enhavas ## la reliefigsistemo serĉos kuntekston el alia lingvodifino kun la persona nomo, ekzemple

<IncludeRules context="String##C++" >

inkluzivus la kuntekston String el la C++-reliefiga difino.

Se la atributo includeAttrib estas true, ŝanĝi la cel-atributon al tiu de la fonto. Ĉi tio estas bezonata por ke, ekzemple, komentu funkciu, se teksto kongrua per la inkluzivita kunteksto estas malsama kulminaĵo de la gastiga kunteksto.

DetectSpaces

Detekti blankspacojn.

<DetectSpaces (komunaj atributoj) />

Ĉi tiu regulo ne havas specifajn atributojn.

Uzu ĉi tiun regulon se vi scias, ke povas esti pluraj blankspacoj antaŭe, ekzemple en la komenco de indentitaj linioj. Ĉi tiu regulo preterlasos ĉiujn blankspacojn samtempe, anstataŭ testi plurajn regulojn kaj preterlasi unu samtempe pro neniu kongruo.

DetektiIdentigilo

Detekti identigajn ĉenojn (kiel la regula esprimo: [a-zA-Z_][a-zA-Z0-9_]*).

<DetectIdentifier (komunaj atributoj) />

Ĉi tiu regulo ne havas specifajn atributojn.

Uzu ĉi tiun regulon por preterlasi ĉenon de vortsignoj samtempe, anstataŭ provi kun pluraj reguloj kaj salti unuope pro neniu kongruo.

Konsiloj & Trukoj

Post kiam vi komprenis kiel funkcias la kuntekstoŝanĝo, estos facile skribi elstarajn difinojn. Tamen vi devas zorge kontroli kian regulon vi elektas en kiu situacio. Regulaj esprimoj estas tre potencaj, sed ili estas malrapidaj kompare kun la aliaj reguloj. Do vi povas konsideri la sekvajn konsiletojn.

  • Regulaj esprimoj estas facile uzeblaj sed ofte ekzistas alia multe pli rapida maniero atingi la saman rezulton. Konsideru, ke vi volas kongrui kun la signo '#' nur se ĝi estas la unua signo en la linio. Solvo bazita en regula esprimo aspektus jene:

    <RegExpr attribute="Macro" context="macro" String="^\s*#" />

    Vi povas atingi la samon multe pli rapide uzante :

    <DetectChar attribute="Macro" context="macro" char="#" firstNonSpace="true" />

    Se vi volas kongrui kun la regula esprimo '^#' vi ankoraŭ povas uzi DetectChar kun la atributo column="0". La atributo column nombras signojn, do tabelilo estas nur unu signo.

  • En reguloj RegExpr, uzu la atributon column="0" se la ŝablono ^PATTERN estos uzata por kongrui tekston komence de linion. Ĉi tio plibonigas rendimenton, ĉar ĝi evitos serĉi kongruojn en la ceteraj kolumnoj.

  • En regulaj esprimoj, uzu nekaptajn grupojn (?:PATTERN) anstataŭ kapti grupojn (PATTERN), se la kaptoj ne estos uzataj en la sama regula esprimo aŭ en dinamikaj reguloj. Ĉi tio evitas konservi kaptojn nenecese.

  • Vi povas ŝanĝi kuntekstojn sen prilabori signojn. Supozu, ke vi volas ŝanĝi kuntekston kiam vi renkontas la ĉenon */, sed bezonas prilabori tiun ĉenon en la sekva kunteksto. La suba regulo kongruos, kaj la atributo lookAhead igos la reliefigilon konservi la kongruan ĉenon por la sekva kunteksto.

    <StringDetect attribute="Comment" context="#pop" String="*/" lookAhead="true" />

  • Uzu Detekti Spacojn se vi scias ke multaj blankspacoj okazas.

  • Uzu DetectIdentifier anstataŭ la regula esprimo '[a-zA-Z_]\w*'.

  • Uzu defaŭltajn stilojn kiam ajn vi povas. Tiel la uzanto trovos konatan medion.

  • Rigardu aliajn XML dosierojn por vidi kiel aliaj homoj efektivigas malfacilajn regulojn.

  • Vi povas validigi ĉiun XML-dosieron per la komando validatehl.sh mySyntax.xml. La dosiero validatehl.sh uzas language.xsd kiuj ambaŭ estas disponeblaj en Deponejo pri sintaksa reliefigo.

  • Se vi ripetas kompleksan regulan esprimon tre ofte, vi povas uzi ENTOJN. Ekzemplo:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE language
    [
            <!ENTITY miaref   "[A-Za-z_:][\w.:_-]*">
    ]>
    

    Nun vi povas uzi &miaref; anstataŭ la regula esprimo.

  • En Kate Editor, vi povas reŝargi sintaksojn uzante la enkonstruitan komandlinion (F7 ŝparvojo defaŭlte) kaj la komandon reload-highlighting.

  • Vi povas uzi la komandlinian ilon nomitan ksyntaxhighlighter6 (kate-syntax-highlighter ĉe pli malnovaj versioj) por testi sintakson kaj montri la stilon kaj regionojn asociitajn kun ĉiu parto de teksto.

    Rezulto de ksyntaxhighlighter6 --output-format=ansi --syntax-trace=format test.cpp.

    Rezulto de ksyntaxhighlighter6 --output-format=ansi --syntax-trace=format test.cpp.

    Uzu ksyntaxhighlighter6 -h por pliaj opcioj.