├── KnownFunctions.md ├── README.md ├── sprak.YAML-tmLanguage ├── sprak.sublime-completions └── sprak.tmLanguage /KnownFunctions.md: -------------------------------------------------------------------------------- 1 | #Known Functions 2 | 3 | SPOILER WARNING!!! 4 | ------------------ 5 | YOU HAVE BEEN WARNED 6 | --------------------------------------- 7 | 8 | ---------- 9 | Below these lines may contain spoilers for you depending how far you have gotten as you may find out about new items you did not know about yet. 10 | *** 11 | This would be a good place to find out if a function you think is not in the completion is or not. 12 | 13 | ## Known but not added yet 14 | - No items in this list 15 | 16 | ## Known and added to completions 17 | - General Functions (Available on most things) 18 | * Count 19 | * Range 20 | * GetIndexes 21 | * Remove 22 | * RemoveAll 23 | * HasIndex 24 | * Append 25 | * Type 26 | * Round 27 | * Int 28 | * Mod 29 | - General Functions (Not as widely available) 30 | * Say 31 | * Sleep 32 | * Quit 33 | - Networking 34 | * GetConnections 35 | * Slurp 36 | * Connect 37 | * DisconnectAll 38 | * Broadcast 39 | - Terminals With Monitors 40 | * Print 41 | * PrintS 42 | * Input 43 | * Info 44 | * Random 45 | * GetUser 46 | * Name 47 | * Time 48 | * Width 49 | * Height 50 | - Apis / Random (Forgot where I found them or don't care enough to log) 51 | * CharToInt 52 | * IntToChar 53 | * ClearText 54 | * PlaySound 55 | * Pitch 56 | * Sin 57 | * Cos 58 | * Line 59 | * Text 60 | * Rect 61 | * DisplayGraphics 62 | * Color 63 | * Repeat 64 | * HSVtoRGB 65 | * RGBToHSV 66 | * Lines 67 | * StringContains 68 | * IsKeyPressed 69 | * HasFloppy 70 | * LoadData 71 | * ClearData 72 | * SaveData 73 | * BootFromFloppy 74 | - Screwdriver 75 | * SetMhz 76 | * EnableAPI 77 | * SetMaxTime 78 | - Drinkables 79 | * Speed 80 | * Charisma 81 | * Smelliness 82 | * Sleepiness 83 | * Drunkenness 84 | * Drink 85 | * Corruption 86 | * IsUser 87 | * GetRoom 88 | * RemoteFunctionCall 89 | - Eatables 90 | * Trippy 91 | * TurnLeft 92 | * TurnRight 93 | * FastForward 94 | * Move 95 | * QuickBoost 96 | - Security Terminals (I do not know if thats what they are called but thats what I am calling them) 97 | * OnHack 98 | * OnIntruder 99 | * MovePerson 100 | * ZapPerson 101 | * RestoreCode 102 | * GetHour 103 | * GetMinute 104 | - Keys 105 | * Unlock 106 | * Lock 107 | * Toggle 108 | - Radios 109 | * Blip 110 | * GetChannel 111 | * SetChannel 112 | * TurnOffSound 113 | * TurnOnSound 114 | - Hacking Devices 115 | * Log 116 | - Teleportation Devices 117 | * Position 118 | * Teleport 119 | * SetWorldPosition 120 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sublime Språk Syntax 2 | SublimeText Syntax Definitions for Språk the language used in the game else Heart.Break() 3 | 4 | ## Installation 5 | ### Auto Install 6 | 1. Use [PackageControl.io](https://packagecontrol.io/installation) (PackageControl.io is super simple to install if you don't already have it) 7 | 2. Then install the package [Sprak Syntax & Completions for else Heartbreak()](https://packagecontrol.io/packages/Sprak%20Syntax%20%26%20Completions%20for%20else%20Heartbreak()) 8 | 9 | ### Manual Install 10 | 1. Download the repo eather via `git cloan` or via a zip in the Releases tab. 11 | 2. Unzip the repo if needed. 12 | 3. Put the folder in your `...\Sublime Text 3\Packages` folder. (You can find this by clicking `Preferences>Browse Packages...`) 13 | > **Note:** If you install using this method then to update you will have to replace the folder and restart Sublime Text 14 | 15 | ## Usage 16 | After installing the plugin you should be able to select it out of language selections like any other language or by haveing your files end with .sprak 17 | 18 | #### File Naming Convention 19 | I have gone with the naming convention of *.sprak if you feel that I should use another naming convention please contact me and I would be pleased to discuse it with you. 20 | 21 | #### Me 22 | I have no affiliation with the game nor its author if anything is incompleate or incorrect that is on me as it is my work seen here. In that very posible case I am very sorry this is only a hobby afterall. 23 | 24 | #### The Game Else Heart.Break() 25 | The award winning game [else Heart.Break()](http://elseheartbreak.com/) uses a language called Språk ingame to allow the player to hack computers and "Stuff" (You will see if you play the game, and if your looking for this you likely already know) 26 | 27 | #### Why 28 | To have SublimeText Code Highlighting and Compleation for else Heart.Break() and cause why not! But really I like programming in Sublime Text 3 and the game allows you to copy and paste in and out code from the game so I wanted to beable to do so and still have text highlighting and code hints but with compleation aswell 29 | 30 | #### What 31 | This Package contains both a syntax Highlighter and some but not all compleations in a robust form. 32 | 33 | #### Help 34 | Please feel free to fork this and then make a pull request when you add more code compleates to the library or enhance the syntax highlighter 35 | 36 | #### Checked Devices / Known Functions (Included in completion) 37 | 38 | SPOILER WARNING!!! 39 | ------------------ 40 | YOU HAVE BEEN WARNED 41 | --------------------------------------- 42 | 43 | [Click Here to go to Known Functions Page](KnownFunctions.md) 44 | -------------------------------------------------------------------------------- /sprak.YAML-tmLanguage: -------------------------------------------------------------------------------- 1 | # [PackageDev] target_format: plist, ext: tmLanguage 2 | --- 3 | name: Sublime Sprak Syntax 4 | scopeName: source.sprak 5 | fileTypes: [Sprak] 6 | uuid: 2e4fc05e-56be-4036-9f17-8a721250c786 7 | 8 | patterns: 9 | 10 | - comment: Comment 11 | name: comment.line.sprak 12 | match: (#).* 13 | captures: 14 | '1': { name: punctuation.definition.comment.sprak } 15 | 16 | - comment: Keyword 17 | name: keyword.control.sprak 18 | match: \b((end )?if|(end )?select|(resume )?next|case|end|void|close|do|else|for|gosub|goto|loop|on|open|return|then|to|until|while)\b 19 | 20 | - comment: Operator 21 | name: keyword.operator.sprak 22 | match: (\+|=|<|>|<>|AND|OR) 23 | 24 | - comment: Function 25 | name: support.function.sprak 26 | match: \b(OnHack|OnIntruder|Count|Range|GetIndexes|Remove|RemoveAll|HasIndex|Append|Type|Round|Int|Mod|Info|Random|GetUser|Name|Time|Width|Height|GetHour|GetMinute|Sleep|Quit|CharToInt|IntToChar|ClearText|Print|Say|PlaySound|Pitch|Sin|Cos|PrintS|Input|Line|Text|Rect|DisplayGraphics|Color|Repeat|HSVtoRGB|RGBToHSV|Lines|GetConnections|Slurp|Connect|DisconnectAll|StringContains|MovePerson|ZapPerson|RestoreCode|Broadcast|IsKeyPressed|HasFloppy|LoadData|ClearData|SaveData|BootFromFloppy|SetMhz|EnableAPI|SetMaxTime|Speed|Charisma|Smelliness|Sleepiness|Drunkenness|Drink|Corruption|IsUser|GetRoom|RemoteFunctionCall|Trippy|TurnLeft|TurnRight|FastForward|Move|QuickBoost|Unlock|Lock|Toggle|Blip|GetChannel|SetChannel|TurnOffSound|TurnOnSound|Log|Position|Teleport|SetWorldPosition)\b 27 | 28 | - comment: Numeric 29 | name: constant.numeric.sprak 30 | match: \b(\d(\.\d)?)+ 31 | 32 | - comment: Global 33 | name: constant.global.sprak 34 | match: \b\w+\$ 35 | 36 | - comment: SUB 37 | name: meta.function.sprak 38 | match: '^(\w+):' 39 | captures: 40 | '1': { name: entity.name.function.sprak } 41 | 42 | - comment: Brace, round 43 | name: meta.brace.round.sprak 44 | match: '[\(\)]' 45 | 46 | - comment: Brace, curly 47 | name: meta.brace.curly.sprak 48 | match: '[\{\}]' 49 | 50 | - comment: Array 51 | name: other.array.sprak 52 | begin: (\w+\() 53 | beginCaptures: 54 | '1': { name: constant.array.sprak } 55 | end: (\)) 56 | endCaptures: 57 | '1': { name: constant.array.sprak } 58 | patterns: 59 | - include: $self 60 | 61 | - comment: String, double-quoted 62 | name: string.quoted.double.sprak 63 | match: \"[^"]*\" 64 | 65 | - comment: String, single-quoted 66 | name: string.quoted.single.sprak 67 | match: \'[^']*\' 68 | 69 | ... -------------------------------------------------------------------------------- /sprak.sublime-completions: -------------------------------------------------------------------------------- 1 | { 2 | "scope": "source.sprak", 3 | 4 | "completions": 5 | [ 6 | { "trigger": "Sebastian\tThe name of the player charicter", "contents": "Sebastian" }, 7 | 8 | { "trigger": "OnHack\t", "contents": "void OnHack(string name){\n\t$0\n}" }, 9 | { "trigger": "OnIntruder\t", "contents": "void OnIntruder(string name){\n\t$0\n}" }, 10 | { "trigger": "Count\tCount the number of elements in an array", "contents": "Count(${0:array})" }, 11 | { "trigger": "Range\tCreate a range of numbers from 'min' to (and including) 'max'", "contents": "Range(${1:min}, ${0:max})" }, 12 | { "trigger": "GetIndexes\tCreate a new array that contains the indexes of another array", "contents": "GetIndexes(${0:array})" }, 13 | { "trigger": "Remove\tRemove an element from an array", "contents": "Remove(${1:array}, ${0:position})" }, 14 | { "trigger": "RemoveAll\tRemove all elements from an array", "contents": "RemoveAll(${0:array})" }, 15 | { "trigger": "HasIndex\tCheck if an index is in the array", "contents": "HasIndex(${1:array}, ${0:key})" }, 16 | { "trigger": "Append\tAdd an element to the end of an array", "contents": "Append(${1:array}, ${0:element})" }, 17 | { "trigger": "Type\tGet the type of something (returns a string)", "contents": "Type(${0:value})" }, 18 | { "trigger": "Round\tRound a number to the nearest integer", "contents": "Round(${0:x})" }, 19 | { "trigger": "Int\tRemove the decimals of a float", "contents": "Int(${0:x})" }, 20 | { "trigger": "Mod\tGet the remainder of x / y", "contents": "Mod(${1:x}, ${0:y})" }, 21 | { "trigger": "%\tGet the remainder of x / y", "contents": "Mod(${1:x}, ${0:y})" }, 22 | { "trigger": "Info\tGet information about the system", "contents": "Info()" }, 23 | { "trigger": "Random\tGet a random number between 0.0 and 1.0", "contents": "Random()" }, 24 | { "trigger": "GetUser\tGet the name of who is using the computer, if any", "contents": "GetUser()" }, 25 | { "trigger": "Name\tGet the name of the computer", "contents": "Name()" }, 26 | { "trigger": "Time\tGet the total time as a float", "contents": "Time()" }, 27 | { "trigger": "Width\tGet the screen width", "contents": "Width()" }, 28 | { "trigger": "Height\tGet the screen height", "contents": "Height()" }, 29 | { "trigger": "GetHour\tGet the current hour", "contents": "GetHour()" }, 30 | { "trigger": "GetMinute\tGet the current minute", "contents": "GetMinute()" }, 31 | { "trigger": "Sleep\tPause the master program", "contents": "Sleep(${0:seconds})" }, 32 | { "trigger": "Quit\tStop the program", "contents": "Quit()" }, 33 | { "trigger": "CharToInt\tConvert a single character to a numeric value, 'a' equals 0", "contents": "CharToInt(${0:character})" }, 34 | { "trigger": "IntToChar\tConvert a number to a character, 0 equals 'a'", "contents": "IntToChar(${0:number})" }, 35 | { "trigger": "ClearText\tRemove all text from the screen", "contents": "ClearText()" }, 36 | { "trigger": "Print\tPrint text to the screen", "contents": "Print(${0:text})" }, 37 | { "trigger": "Say\tSay something through speaker. (via the object)", "contents": "Say(${0:text})" }, 38 | { "trigger": "PlaySound\tPlay a sound", "contents": "PlaySound(${0:soundName})" }, 39 | { "trigger": "Pitch\tSet the pitch of the sound", "contents": "Pitch(${0:pitch})" }, 40 | { "trigger": "Sin\tThe sinus function", "contents": "Sin(${0:x})" }, 41 | { "trigger": "Cos\tThe cosinus function", "contents": "Cos(${0:x})" }, 42 | { "trigger": "PrintS\tPrint text without skipping to a new line afterwards", "contents": "PrintS(${0:text})" }, 43 | { "trigger": "Input\tDisplay a prompt and receive text input from the keyboard", "contents": "Input(${0:prompt})" }, 44 | { "trigger": "Line\tDraw a line on the screen", "contents": "Line(${1:x1}, ${0:y1}, ${2:x2}, ${3:y2})" }, 45 | { "trigger": "Text\tDraw text in a specific place", "contents": "Text(${1:x}, ${0:y}, ${2:text})" }, 46 | { "trigger": "Rect\tDraw a rectangle on the screen", "contents": "Rect(${1:x1}, ${0:y1}, ${2:x2}, ${3:y2})" }, 47 | { "trigger": "DisplayGraphics\tClear the screen and display graphical elements", "contents": "DisplayGraphics()" }, 48 | { "trigger": "Color\tSet the color to draw or print text with", "contents": "Color(${1:r}, ${0:g}, ${2:b})" }, 49 | { "trigger": "Repeat\tKeep a value between between 0 and an upper bound", "contents": "Repeat(${1:x}, ${0:bound}" }, 50 | { "trigger": "HSVtoRGB\tHue, Saturation, Value -> [r, g, b]", "contents": "HSVtoRGB(${1:H},${0:S},${2:V})" }, 51 | { "trigger": "RGBToHSV\t[r, g, b] -> Hue, Saturation, Value", "contents": "RGBToHSV(${1:r},${0:g},${2:b})" }, 52 | { "trigger": "Lines\tno ingame desc likely a list of [x,y] objects to denote points on a poly line", "contents": "Lines(${0:points})" }, 53 | { "trigger": "GetConnections\tGet a list of all connections (list of names)", "contents": "GetConnections()" }, 54 | { "trigger": "Slurp\tUse with caution", "contents": "Slurp()" }, 55 | { "trigger": "Connect\tNo ingame desc", "contents": "Connect(${0:name})" }, 56 | { "trigger": "DisconnectAll\tRemove all connections", "contents": "DisconnectAll()" }, 57 | { "trigger": "StringContains\tChecks whether a string contains a substring", "contents": "StringContains(${1:string}, ${0:substring})" }, 58 | { "trigger": "MovePerson\tMove an intruder in the room to the position of another thing", "contents": "MovePerson(${1:name}, ${0:target} )" }, 59 | { "trigger": "ZapPerson\tZap an intruder in the room (will make them fall asleep)", "contents": "ZapPerson(${0:name})" }, 60 | { "trigger": "RestoreCode\tResets code to default state", "contents": "RestoreCode(${0:name})" }, 61 | { "trigger": "Broadcast\tBroadcast a message, Use with caution.", "contents": "Broadcast(${0:pMessage})" }, 62 | { "trigger": "IsKeyPressed\tIs a key pressed? (left/right/down/up/space)", "contents": "IsKeyPressed(${0:key})" }, 63 | { "trigger": "HasFloppy\tIs there a floppy in the drive?", "contents": "HasFloppy()" }, 64 | { "trigger": "LoadData\tLoad data from the floppy, split by lines", "contents": "LoadData()" }, 65 | { "trigger": "ClearData\tClear all data on the floppy", "contents": "ClearData()" }, 66 | { "trigger": "SaveData\tSave data to the floppy by appending a line at the end", "contents": "SaveData(${0:data})" }, 67 | { "trigger": "BootFromFloppy\tRestart the computer but run the code on the floppy instead", "contents": "BootFromFloppy()" }, 68 | { "trigger": "SaveMemory\tSave data to the given memory key", "contents": "SaveMemory(${1:key}, ${0:data})" }, 69 | { "trigger": "LoadMemory\tLoad a specific data previously saved with SaveMemory", "contents": "LoadMemory(${0:key})" }, 70 | { "trigger": "EraseMemory\tErase a specific data previously saved with SaveMemory", "contents": "EraseMemory(${0:key})" }, 71 | { "trigger": "HasMemory\tChecks if a specific data was set", "contents": "HasMemory(${0:key})" }, 72 | { "trigger": "GetMemories\tGet all keys saved with SaveMemory", "contents": "GetMemories()" }, 73 | { "trigger": "ClearMemories\tRemoves all keys saved with SaveMemory", "contents": "ClearMemories()" }, 74 | 75 | /* Screwdrivers */ 76 | { "trigger": "SetMhz\tSet the speed of the computer you use the screwdriver on. (Max 500)", "contents": "SetMhz(${0:Mhz})" }, 77 | { "trigger": "EnableAPI\tEnable an API", "contents": "EnableAPI(${0:name})" }, 78 | { "trigger": "SetMaxTime\tSet the maximum execution time for the computer", "contents": "SetMaxTime(${0:maxTime})" }, 79 | 80 | /* Drinks */ 81 | { "trigger": "Speed\tChange the speed of the drinker", "contents": "Speed(${0:d})" }, 82 | { "trigger": "Charisma\tChange the Charisma of the drinker", "contents": "Charisma(${0:d})" }, 83 | { "trigger": "Smelliness\tChange the Smelliness of the drinker", "contents": "Smelliness(${0:d})" }, 84 | { "trigger": "Sleepiness\tChange the Sleepiness of the drinker", "contents": "Sleepiness(${0:d})" }, 85 | { "trigger": "Drunkenness\tChange the Drunkenness of the drinker", "contents": "Drunkenness(${0:d})" }, 86 | { "trigger": "Drink\tJust lower the amount of liquid", "contents": "Drink(${0:d})" }, 87 | { "trigger": "Corruption\tUndocumented effect", "contents": "Corruption(${0:amount})" }, 88 | { "trigger": "IsUser\tTest if the drinker has a certain name", "contents": "IsUser(${0:name})" }, 89 | { "trigger": "GetRoom\tGet the room of the drinker", "contents": "GetRoom()" }, 90 | { "trigger": "RemoteFunctionCall\tCall remote function on connected objects", "contents": "RemoteFunctionCall(${1:receiverIndex}, ${0:functionName}, ${2:arguments})" }, 91 | 92 | /* Drugs / Food */ 93 | { "trigger": "Trippy\t\"Trippy\"", "contents": "Trippy()" }, 94 | { "trigger": "TurnLeft\tTurn left", "contents": "TurnLeft()" }, 95 | { "trigger": "TurnRight\tTurn right", "contents": "TurnRight()" }, 96 | { "trigger": "FastForward\tMakes time appear to go faster", "contents": "FastForward()" }, 97 | { "trigger": "Move\tMove forward one step", "contents": "Move()" }, 98 | { "trigger": "QuickBoost\tGet a quick energy boost", "contents": "QuickBoost()" }, 99 | 100 | /* Keys and some computers not sure which yet */ 101 | { "trigger": "Unlock\tUnlock, returns true on success", "contents": "Unlock(${0:code})" }, 102 | { "trigger": "Lock\tLock, returns true on success", "contents": "Lock(${0:code})" }, 103 | { "trigger": "Toggle\tLock or unlock depending on if the door is locked", "contents": "Toggle(${0:code})" }, 104 | 105 | /* Radio */ 106 | { "trigger": "Blip\tMake a blip sound", "contents": "Blip()" }, 107 | { "trigger": "GetChannel\tGet the nr of the current channel", "contents": "GetChannel()" }, 108 | { "trigger": "SetChannel\tSet the channel", "contents": "SetChannel(${0:newChannel})" }, 109 | { "trigger": "TurnOffSound\tExactly what it says on the tin", "contents": "TurnOffSound()" }, 110 | { "trigger": "TurnOnSound\tExactly what it says on the tin", "contents": "TurnOnSound()" }, 111 | 112 | /* Hacking Device */ 113 | { "trigger": "Log\t'Log' (No other text ingame)", "contents": "Log()" }, 114 | 115 | 116 | /* Teleportation Device */ 117 | { "trigger": "Position\tGet the coordinates of your current position", "contents": "Position()" }, 118 | { "trigger": "Teleport\tTeleport to another position in the same room. Returns an error (can't read please report in issue on github what it says if you can)", "contents": "Teleport(${1:x}, ${0:y})" }, 119 | { "trigger": "SetWorldPosition\tTeleport to another position anywhere in the world, returns stat(can't read please report in issue on github what it says if you can)", "contents": "SetWorldPosition(${1:room}, ${0:x}, ${2:y})" }, 120 | 121 | /* Templates 122 | { "trigger": "\t", "contents": "(${0:x})" }, 123 | { "trigger": "\t", "contents": "(${0:x})" }, 124 | { "trigger": "\t", "contents": "(${0:x})" }, 125 | { "trigger": "\t", "contents": "(${0:x})" }, 126 | { "trigger": "\t", "contents": "(${0:x})" }, 127 | { "trigger": "\t", "contents": "(${0:x})" }, 128 | { "trigger": "\t", "contents": "(${0:x})" }, 129 | { "trigger": "\t", "contents": "(${0:x})" }, 130 | { "trigger": "\t", "contents": "(${0:x})" }, 131 | { "trigger": "\t", "contents": "(${0:x})" }, 132 | { "trigger": "\t", "contents": "(${0:x})" }, 133 | { "trigger": "\t", "contents": "(${0:x})" }, 134 | */ 135 | ] 136 | } 137 | -------------------------------------------------------------------------------- /sprak.tmLanguage: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | fileTypes 6 | 7 | Sprak 8 | 9 | name 10 | Sublime Sprak Syntax 11 | patterns 12 | 13 | 14 | captures 15 | 16 | 1 17 | 18 | name 19 | punctuation.definition.comment.sprak 20 | 21 | 22 | comment 23 | Comment 24 | match 25 | (#).* 26 | name 27 | comment.line.sprak 28 | 29 | 30 | comment 31 | Keyword 32 | match 33 | \b((end )?if|(end )?select|(resume )?next|case|end|void|close|do|else|for|gosub|goto|loop|on|open|return|then|to|until|while)\b 34 | name 35 | keyword.control.sprak 36 | 37 | 38 | comment 39 | Operator 40 | match 41 | (\+|=|<|>|<>|AND|OR) 42 | name 43 | keyword.operator.sprak 44 | 45 | 46 | comment 47 | Function 48 | match 49 | \b(OnHack|OnIntruder|Count|Range|GetIndexes|Remove|RemoveAll|HasIndex|Append|Type|Round|Int|Mod|Info|Random|GetUser|Name|Time|Width|Height|GetHour|GetMinute|Sleep|Quit|CharToInt|IntToChar|ClearText|Print|Say|PlaySound|Pitch|Sin|Cos|PrintS|Input|Line|Text|Rect|DisplayGraphics|Color|Repeat|HSVtoRGB|RGBToHSV|Lines|GetConnections|Slurp|Connect|DisconnectAll|StringContains|MovePerson|ZapPerson|RestoreCode|Broadcast|IsKeyPressed|HasFloppy|LoadData|ClearData|SaveData|BootFromFloppy|SetMhz|EnableAPI|SetMaxTime|Speed|Charisma|Smelliness|Sleepiness|Drunkenness|Drink|Corruption|IsUser|GetRoom|RemoteFunctionCall|Trippy|TurnLeft|TurnRight|FastForward|Move|QuickBoost|Unlock|Lock|Toggle|Blip|GetChannel|SetChannel|TurnOffSound|TurnOnSound|Log|Position|Teleport|SetWorldPosition)\b 50 | name 51 | support.function.sprak 52 | 53 | 54 | comment 55 | Numeric 56 | match 57 | \b(\d(\.\d)?)+ 58 | name 59 | constant.numeric.sprak 60 | 61 | 62 | comment 63 | Global 64 | match 65 | \b\w+\$ 66 | name 67 | constant.global.sprak 68 | 69 | 70 | captures 71 | 72 | 1 73 | 74 | name 75 | entity.name.function.sprak 76 | 77 | 78 | comment 79 | SUB 80 | match 81 | ^(\w+): 82 | name 83 | meta.function.sprak 84 | 85 | 86 | comment 87 | Brace, round 88 | match 89 | [\(\)] 90 | name 91 | meta.brace.round.sprak 92 | 93 | 94 | comment 95 | Brace, curly 96 | match 97 | [\{\}] 98 | name 99 | meta.brace.curly.sprak 100 | 101 | 102 | begin 103 | (\w+\() 104 | beginCaptures 105 | 106 | 1 107 | 108 | name 109 | constant.array.sprak 110 | 111 | 112 | comment 113 | Array 114 | end 115 | (\)) 116 | endCaptures 117 | 118 | 1 119 | 120 | name 121 | constant.array.sprak 122 | 123 | 124 | name 125 | other.array.sprak 126 | patterns 127 | 128 | 129 | include 130 | $self 131 | 132 | 133 | 134 | 135 | comment 136 | String, double-quoted 137 | match 138 | \"[^"]*\" 139 | name 140 | string.quoted.double.sprak 141 | 142 | 143 | comment 144 | String, single-quoted 145 | match 146 | \'[^']*\' 147 | name 148 | string.quoted.single.sprak 149 | 150 | 151 | scopeName 152 | source.sprak 153 | uuid 154 | 2e4fc05e-56be-4036-9f17-8a721250c786 155 | 156 | 157 | --------------------------------------------------------------------------------