F#geditでの言語構文の強調表示

はじめに



geditで任意の言語の構文強調表示を作成するには、gtksourceviewライブラリを使用します。 一般に、gnome-editで特定の言語の構文強調表示を追加する作業は、拡張子.langを持つファイルを書くことから成ります。これは、本質的に特定の言語の構文の説明を格納するXMLファイルです。 通常、gtksourceviewがサポートする.langファイルは/usr/share/gtksourceview-2.0/language-specs/ディレクトリにあります



.langファイル形式の説明



他のXMLドキュメントと同様に、.langファイルは、ルートとドキュメントのルートから発生するノードで構成されます。 .langでは、ドキュメントのルートはタグです。 ルートタグには次の属性が含まれる場合があります。



ID-説明の識別子。 この要素への外部リンクに使用され、一意である必要があります。 文字、数字、アンダースコアを含めることができます。 属性IDの値では、大文字を使用しないでください。



名前 -ユーザーに提供される言語の名前。



バージョン -フォーマットのバージョン。 (GTKSOUREVIEWは2.0を使用します)



セクション -メニューのどのセクションに言語を配置するかを決定します:スクリプト、科学など(geditメニューの場合)



非表示 -ヒント、ユーザー向けのツールチップ。



hiddenおよびsectionを除くすべての属性が必要です。



また、ルート要素には次の要素が含まれる場合があります。



メタデータ -要素にはメタデータの説明が含まれます。 1つの属性を含むproperties要素を含めることができます。 nameの値は次のとおりです。



Mimetypes-メディアタイプのリストが含まれています

Globs-言語ファイル拡張子

行コメント開始 -単一行コメントの説明に使用

ブロックコメント開始 -複数行コメントの開始を記述するために使用

block-comment- end-複数行コメントの始まりを記述するために使用されます

スタイル -現在の言語で使用されているスタイルの説明が含まれています。 1つの要素を含む-スタイル



スタイル -特定のIDに関連付けられているスタイルを説明します。 次の3つの要素が含まれます。

ID-スタイル識別子

名前 -スタイル名

Map- to-特定のフォントと色でスタイルを表示するために使用されます。



定義 -言語の定義を含むルートのメイン要素。 1つの属性が含まれます。

ID-言語の構文を記述する特定の正規表現を含めるために使用される識別子



コンテキストは、構文の説明を含む最も重要な要素です。 次の要素が含まれる場合があります。

Start-現在のコンテキストの初期正規表現が含まれています

End-現在のコンテキストの終了正規表現が含まれています

含める -コンテキストのリストが含まれます



また、要素には次の属性が含まれる場合があります。



ID-一意のコンテキスト識別子

style-ref-このコンテキストの強調表示スタイル



キーワード -このコンテキストのキーワードが含まれています。



これは基本的にすべての標準要素です。これはgtksourceviewの基本要素です。



さて、F#言語を記述するスターター.langファイルの場合:



<? xml version ="1.0" encoding ="utf-8" ? >



< language id ="fsharp" _name ="F#" version ="2.0" _section ="Sources" >

< metadata >

< property name ="mimetypes" > text/x-fsharp </ property >

< property name ="globs" > *.fs; </ property >

< property name ="line-comment-start" > // </ property >

< property name ="block-comment-start" > (* </ property >

< property name ="block-comment-end" > *) </ property >

</ metadata >

< styles >

< style id ="comment" _name ="Comment" map-to ="def:comment" />

< style id ="base-n-integer" _name ="Base-N Integer" map-to ="def:base-n-integer" />

< style id ="floating-point" _name ="Floating Point number" map-to ="def:floating-point" />

< style id ="decimal" _name ="Decimal number" map-to ="def:decimal" />

< style id ="string" _name ="String" map-to ="def:string" />

< style id ="keyword" _name ="Keyword" map-to ="def:keyword" />

< style id ="meta-keyword" _name ="Type, module or object keyword" map-to ="def:keyword" />

< style id ="fun-keyword" _name ="Builtin-function keyword" map-to ="def:keyword" />

< style id ="type" _name ="Data Type" map-to ="def:type" />

< style id ="label" _name ="Labeled argument" map-to ="def:type" />

< style id ="poly-variant" _name ="Polymorphic Variant" map-to ="def:type" />

< style id ="variant" _name ="Variant Constructor" map-to ="def:type" />

< style id ="type-var" _name ="Type Variable" map-to ="def:type" />

< style id ="module" _name ="Module Path" map-to ="def:type" />

< style id ="escape" _name ="Escaped Character" map-to ="def:special-char" />

< style id ="boolean" _name ="Boolean value" map-to ="def:boolean" />

< style id ="preprocessor" _name ="Preprocessor" map-to ="def:preprocessor" />

</ styles >

< definitions >

< define-regex id ="cap-ident" > \b[AZ][A-Za-z0-9_']* </ define-regex >

< define-regex id ="low-ident" > \b[az][A-Za-z0-9_']* </ define-regex >

< define-regex id ="char-esc" > \\((\\|"|'|n|t|b|r)|[0-9]{3}|x[0-9a-fA-F]{2}) </ define-regex >

< define-regex id ="preproc-start" > ^\s*#\s* </ define-regex >

< define-regex id ="symbolchar" > [!#$%&*+. /> = <? @:\\^|~-] </ define-regex >



< context id ="escape-seq" style-ref ="escape" >

< match > \%{char-esc} </ match >

</ context >



< context id ="line-comment" style-ref ="comment" end-at-line-end ="true" >

< start > // </ start >

< include >

< context ref ="def:in-line-comment" />

</ include >

</ context >



< context id ="multiline-comment" style-ref ="comment" >

< start > \(\* </ start >

< end > \*\) </ end >

< include >

< context ref ="string" />

< context ref ="def:in-comment:*" />

</ include >

</ context >



< context id ="preprocessor" style-ref ="preprocessor" end-at-line-end ="false" >

< start extended ="true" >

\%{preproc-start}(if(n?def)?|else|endif|light|region|endregion)\b

</ start >

< include >

< context ref ="def:line-continue" ignore-style ="true" />

< context ref ="string" ignore-style ="true" />

</ include >

</ context >



< context id ="if-false-comment" style-ref ="comment" >

< start > \%{preproc-start}if\s*false\b </ start >

< end > \%{preproc-start}(endif|else|elif)\b </ end >

< include >

< context id ="if-in-if-false" >

< start > \%{preproc-start}if(n?def)?\b </ start >

< end > \%{preproc-start}endif\b </ end >

< include >

< context ref ="if-in-if-false" />

< context ref ="def:in-comment" />

</ include >

</ context >

< context ref ="def:in-comment" />

</ include >

</ context >



< context id ="poly-variant" style-ref ="poly-variant" >

< match > `\%{cap-ident} </ match >

</ context >



< context id ="modpath" style-ref ="module" >

< match > \%{cap-ident}(\.\%{cap-ident})*(?=\.) </ match >

</ context >



< context id ="variant" style-ref ="variant" >

< match > \%{cap-ident} </ match >

</ context >



< context id ="string" style-ref ="string" >

< start > " </ start >

< end > " </ end >

< include >

< context ref ="escape-seq" />

</ include >

</ context >



< context id ="character-constant" style-ref ="string" >

< match > ('\%{char-esc}')|('[^\\']') </ match >

</ context >



< context id ="type-var" style-ref ="type-var" >

< match > '\%{low-ident} </ match >

</ context >



< context id ="boolean-constant" style-ref ="boolean" >

< keyword > true </ keyword >

< keyword > false </ keyword >

</ context >



< context id ="keysymbol" style-ref ="keyword" >

< prefix > (? <! \%{symbolchar}) </ prefix >

< suffix > (?!\%{symbolchar}) </ suffix >

< keyword > \.\. </ keyword >

< keyword > :: </ keyword >

< keyword > = </ keyword >

< keyword > @ </ keyword >

< keyword > ~ </ keyword >

< keyword > - ></ keyword >

< keyword > | </ keyword >

< keyword > :? </ keyword >

< keyword > :? ></ keyword >

< keyword > ^ </ keyword >

< keyword >< - </ keyword >

< keyword > && </ keyword >

< keyword > & </ keyword >

</ context >



< context id ="keywords" style-ref ="keyword" >

< keyword > abstract </ keyword >

< keyword > and </ keyword >

< keyword > as </ keyword >

< keyword > assert </ keyword >

< keyword > asr </ keyword >

< keyword > begin </ keyword >

< keyword > class </ keyword >

< keyword > default </ keyword >

< keyword > delegate </ keyword >

< keyword > do </ keyword >

< keyword > done </ keyword >

< keyword > downcast </ keyword >

< keyword > downto </ keyword >

< keyword > else </ keyword >

< keyword > end </ keyword >

< keyword > enum </ keyword >

< keyword > exception </ keyword >

< keyword > false </ keyword >

< keyword > finaly </ keyword >

< keyword > for </ keyword >

< keyword > fun </ keyword >

< keyword > function </ keyword >

< keyword > if </ keyword >

< keyword > in </ keyword >

< keyword > iherit </ keyword >

< keyword > interface </ keyword >

< keyword > land </ keyword >

< keyword > lazy </ keyword >

< keyword > let </ keyword >

< keyword > lor </ keyword >

< keyword > lsl </ keyword >

< keyword > lsr </ keyword >

< keyword > lxor </ keyword >

< keyword > match </ keyword >

< keyword > member </ keyword >

< keyword > mod </ keyword >

< keyword > module </ keyword >

< keyword > mutable </ keyword >

< keyword > namespace </ keyword >

< keyword > new </ keyword >

< keyword > null </ keyword >

< keyword > of </ keyword >

< keyword > open </ keyword >

< keyword > or </ keyword >

< keyword > override </ keyword >

< keyword > sig </ keyword >

< keyword > static </ keyword >

< keyword > struct </ keyword >

< keyword > then </ keyword >

< keyword > to </ keyword >

< keyword > true </ keyword >

< keyword > try </ keyword >

< keyword > type </ keyword >

< keyword > val </ keyword >

< keyword > when </ keyword >

< keyword > inline </ keyword >

< keyword > upcast </ keyword >

< keyword > while </ keyword >

< keyword > with </ keyword >

</ context >



<!-- main context -->

< context id ="fsharp" >

< include >

< context ref ="keywords" />

< context ref ="keysymbol" />

< context ref ="boolean-constant" />

< context ref ="arraylit" />

< context ref ="character-constant" />

< context ref ="string" />

< context ref ="variant" />

< context ref ="modpath" />

< context ref ="poly-variant" />

< context ref ="label" />

< context ref ="line-comment" />

< context ref ="multiline-comment" />

< context ref ="type-var" />

< context ref ="if-false-comment" />

< context ref ="preprocessor" />

</ include >

</ context >

<!-- main context -->

</ definitions >

</ language >




* This source code was highlighted with Source Code Highlighter .








ps GtkSourceView公式ウェブサイト



pps Habrahabrに関する最初の投稿。






All Articles