# Syntax

## Colors

When you are writing a syntax highlight, you are supposed to distinguish colors of data types. EverEdit provides a couple of built-in colors.

```
COLOR_DEFAULT: Normal text without any syntax state
COLOR_COMMENT1: Single line comment, example:// in C/C++
COLOR_COMMENT2: Block line comment, example:/your comment/ in C/C++
COLOR_STRING1: Single quoted string, example:'your single quoted string' in PHP
COLOR_STRING2: Double quoted string, example:"your double quoted string" in PHP
COLOR_TAG: Use for HTML/XML tag match, EverEdit could find the matched tag automatically
COLOR_MACRO: Macro define, example:#define/Import/Range VALUE 100 in C/C++/C#/Java
COLOR_URL: URL, example:http://www.everedit.net
COLOR_EMAIL: Email address, example:support@everedit.net
COLOR_NUMBER: Numbers, example:10,0x20,1.35
COLOR_FOUND: When you search something, EverEdit will use this state to draw the found text
COLOR_PAIR: Paired strings, example:()[]{}<>""''
COLOR_FUNCTION: Function name
COLOR_VAR: Variables
COLOR_SUBLAN: Sub-language, example: in HTML
COLOR_OPERATOR: Operators, example:+-*/ ++ --
COLOR_WORD1: Key word 1, built-in keywords. example:int bool double do while in C/C++/Java
COLOR_WORD2: Key word 2, framework keywords. example:CString CMap CArray in MFC
COLOR_WORD3: Key word 3
COLOR_WORD4: Key word 4
COLOR_HIGHLIGHT1~COLOR_HIGHLIGHT8: User defined highlight, used for custom marker
COLOR_IGNORE: The foreground color of text will be same as the background. It will show on selecting
COLOR_CONCEAL: The text will not be displayed expect selecting
```

## Objects

### SyntaxItem

```c
// Functions
void Capture(int group, int state);

// Properties
string Name;//get,set
```

### WordItem

```c
// Properties
bool AutoCase;//get,set
string Name;//get,set
```

### SyntaxRegion

```c
// Functions
bool AddSnippet(string strPathName, bool bCase)
void AddItem(SyntaxItem item );
void AddWord(WordItem item );
void AddRegion(SyntaxRegion child );
void FoldText(string strFold, bool bFCase, string strUnFold, bool bUFCase);
void CommentBlock(string strOn, string strOff);
void CommentLine(string strText);
void SetPairs(string strText);
void IndentText(string strIndnet, bool c1, string strUnIndnet, bool c2);
void AddCallTip( string strPathName, bool bCase, string strWord="", string strBegin="(", string strSep=",", string strEnd=")", bool bRemoveSpace=false );
void AddSnippet( string title, string trigger, string text, bool script=false);

// Properties
void TransRegion;
string Name;//get;set
```

### Parser

```c
// Functions
bool AddSnippet(string strPathName );
void AddItem(SyntaxItem item );
void AddWord(WordItem item );
void AddRegion(SyntaxRegion child);
SyntaxRegion CopyRegion(SyntaxRegion pCopy);
SyntaxItem CreateItem(int state, string strMatch, bool bCase, bool bToRight=false);
WordItem CreateWord(int state, string strMatch, bool bCase, string strDelimiters="");
SyntaxRegion CreateRegion(int state, string strBegin, string strEnd, bool bCase, bool bToRight=false );
SyntaxRegion CreateStringRegion(int state, string strChar, string strEscape, bool mline, string strContinueChar );
void FoldText(string strFold, bool bFCase, string strUnFold, bool bUFCase);
void IndentText(string strIndnet, bool c1, string strUnIndnet, bool c2);
void FoldAnyText(int nLevel, string strText);
void SetPairs(string strText);
void CommentBlock(string strOn, string strOff);
void CommentLine(string strText);
void AddCallTip( string strPathName, bool bCase, string strWord="", string strBegin="(", string strSep=",", string strEnd=")", bool bRemoveSpace=false );
void SetFont( string font_name, int font_size, int base_line, bool bold);
void SetCJKFont( string font_name, int font_size, int base_line, bool bold);
void AddSnippet( string title, string trigger, string text, bool script=false);

// Properties
string Name;//get,set
string FoldingMethod;//get,set
string WordChars;//get,set
SyntaxRegion DefaultRegion;//get
```

## Sample 1 (create a syntax highlight for C/C++)

This sample will guide you to define a new syntax highlight for EverEdit! let's have a look at some key syntax elements of C/C++:

* Single line comment
* Multiple line comment
* String
* Key word

The above elements are key parts for most of syntax highlights.

### 1. Create a file

Create a mycpp.mac and put it into (syntax) folder;

### Include color define file

EverEdit provides predefined colors, so let's include it first.

```c
Include( ".\const.mac" )
```

### 3. Create a parser object

```
Set cpp=Parser.CreateParser()
```

### 4. Highlight single line comment

Single line comment is be a region which starts from `//` and ends with End of Line(`EOL`).

```c
Set regionLine=cpp.CreateRegion( COLOR_COMMENT1, "+//+", "$", True )
```

**Note**: The text surrounded by plus(+) means this is a normal string match (simple\&fast), not regular expression.(This kind of usage is available in `CreateRegion` function only).

### 5. Highlight multiple line comment

```c
regionBlock=cpp.CreateRegion( COLOR_COMMENT1, "+/*+", "+*/+", True )
```

### 6. Highlight string

```c
Set regionString=cpp.CreateStringRegion( COLOR_STRING1, """", "\", False )
```

The last param of CreateStringRegion means whether the match will be continue to next line!

### 7. Highlight key words

```c
Set itemWord2=cpp.CreateWord(COLOR_WORD1, "int float double char void for while if else return break continue", True)
```

There are 4 params in CreateWord function. The last one is a string which contains the delimiters that can be treated as word, example:

```c
cpp.CreateWord(COLOR_WORD1, "bottom-top bottom-right", True, "-")
```

### 8. Add matches into Parser

```c
cpp.AddRegion( regionLine )
cpp.AddRegion( regionBlock )
cpp.AddRegion( regionString )
cpp.AddItem( itemWord )
```

### 9. Overview

```c
Include( ".\const.mac" )
Set cpp=Parser.CreateParser()
Set regionLine=cpp.CreateRegion( COLOR_COMMENT1, "+//+", "", True )
Set regionBlock=cpp.CreateRegion( COLOR_COMMENT1, "+/*+", "+*/+", True )
Set regionString=cpp.CreateStringRegion( COLOR_STRING1, """", "\", False )
Set itemWord=cpp.CreateItem(COLOR_WORD1, "\b(int|float|double|char|void|for|while|if|else|return|break|continue)\b", True)
cpp.AddRegion( regionLine )
cpp.AddRegion( regionBlock )
cpp.AddRegion( regionString )
cpp.AddItem( itemWord )
```

## Sample 2 (Enhance C++ syntax highlight)

### 1. Add todo match in comment region

Create a todo match and add it into single/multiple line comment:

```c
Set itemTodo=cpp.CreateItem(COLOR_HIGHLIGHT1, "\bTODO\b", True)

regionLine.AddItem( itemTodo )
regionBlock.AddItem( itemTodo )
```

### 2. Code folding

C++ source files are normally folded begin with `{` and `}`

```c
cpp.FoldText "\{", False, "\}", False
```

### 3. Auto Indent

```c
cpp.IndentText "\{$", False, "^\s*}$", False
```

### 4. Add auto pair complete

```
cpp.SetPairs "[]{}()""""''"
```

### 5. Add quick line comment

```
cpp.CommentLine "//"
cpp.CommentBlock "/*", "*/"
```

Now you can use `Ctrl+/` to comment your selection or active line quickly.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://everedit.gitbook.io/doc/syntax.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
