Skip to content

Instantly share code, notes, and snippets.

@awilkins
Last active July 5, 2024 08:19
Show Gist options
  • Save awilkins/8d553e86b046d2c817b9062efc692779 to your computer and use it in GitHub Desktop.
Save awilkins/8d553e86b046d2c817b9062efc692779 to your computer and use it in GitHub Desktop.
Sublime syntax for SoftwareAG Natural, useful for `bat`, based on Unnatural Sublime Package (with fixed hex pattern)
%YAML 1.2
---
# http://www.sublimetext.com/docs/syntax.html
name: Natural
file_extensions:
- NSA # Parameter data area (PDA)
- NSC # Copycode
- NSD # DDM
- NSG # Global data area (GDA)
- NSH # Helproutine
- NSL # Local data area (LDA)
- NSM # Map
- NSN # Subprogram
- NSP # Program
- NSS # Subroutine
- NST # Text
- NS4 # Class
- NS5 # Command processor
- NS7 # Function
- NS8 # Adapter
scope: source.natural
contexts:
main:
- include: data-definition
- include: wrong
- include: placeholder
- include: trailing-space
- include: comments
- include: subroutine
- include: hash-vars
- include: operators
- include: keywords
- include: date-and-time
- include: labels
- include: numbers
- include: strings
- include: keys
- include: system-vars
- include: variable-modifier
comments:
- match: (^\*.*$|\/\*.*$)
scope: comment.natural
data-definition:
- match: (?i:define\s+data)
captures:
0: keyword.natural
push:
- meta_scope: data.definition.natural
- match: (?i:end-define)
captures:
0: keyword.natural
pop: true
- include: comments
- include: data-definition-keywords
- include: external-storage-area
- include: variable-level
- include: variable-modifier
- include: variable-type
- include: view-definition
- include: system-vars
- include: hash-vars
- include: placeholder
- include: numbers
- include: strings
- include: wrong
data-definition-keywords:
- match: '(?<![\w-])(?i:with|view|value|result|redefine|parameter|optional|of|object|local|init|independent|global|dynamic|context|constant|const|by)(?![\w-])'
scope: keyword.natural
date-and-time:
- match: '([tTdDeE]?)\''[0-9:\/\.\-]+\'''
scope: support.constant.datetime.natural
captures:
1: punctuation.definition.datetime.natural
external-storage-area:
- match: '(?i:(using)\s+([a-z0-9]+))'
scope: storage.definition.using.natural
captures:
1: keyword.natural
2: string.object.natural
hash-vars:
- match: '\#[a-zA-Z0-9-]+'
scope: variable.natural
keys:
- match: '(?<![\w-])(?i:p[af][0-9]+|entr|clr|)(?![\w-])'
scope: support.constant.key.natural
keywords:
- match: '(?<![\w-])(?i:year|xml|write|work|with|window|while|where|when|view|via|vertically|vert|variables|variable|vargraphic|values|value|val|using|user|used|upper|upload|update|until|unknown|unique|union|underlined|types|type|true|treq|translate|transfer|transaction|trailer|total|top|to|title|timezone|timestamp|time|thru|then|them|than|textvariable|textarea|text|terminate|tan|system|sync|symbol|suspend|suppressed|suppress|sum|subtract|substring|substr|subroutine|subprograms|subprogram|store|stop|step|status|static|statement|starting|start|stack|sqrt|sqlid|sql|specified|space|sound|sortkey|sorted|sort|some|skip|size|single|sin|show|short|sgn|settime|sets|set|server|sequence|separate|sensitive|send|selection|select|second|scroll|screen|scan|same|run|rulevar|rows|row|routine|rounded|rollback|right|reversed|returns|return|retry|retained|retain|ret|result|restore|response|resize|resetting|reset|required|request|reposition|reporter|report|replace|repeat|remainder|release|relationship|relation|rel|reject|reinput|referencing|referenced|reduce|redefine|recursively|records|record|rec|readonly|read|queryno|quarter|prty|prototype|property|program|profile|processing|process|printer|print|prefix|position|pos|policy|physical|pgup|pgdn|perform|pen|pattern|path|password|passw|pass|parse|parent|parameters|parameter|page|packageset|output|outer|order|or|options|optional|optimize|open|only|once|on|old|offset|off|of|occurrences|obtain|object|numeric|number|null-handle|null|notitle|notit|not|normalized|normalize|none|nohdr|node|no|nmin|newpage|ne|ncount|naver|native|namespace|named|name|multiply|multi-fetch|moving|move|more|month|module|modified|modal|minute|min|microsecond|mgid|method|messages|max|mask|mark|map|macroarea|lt|lower|loop|logical|log-ps|log-ls|log|locks|local|listed|lines|lindicator|limit|like|library-password|library|libpw|lib|level|less|length|left|leaving|leave|le|last|language|keys|key|keep|justified|just|join|isn|is|investigate|inverted|into|intersect|intermediate|interface4|interface|intercepted|integer|int|insert|insensitive|input|inner|initial|init|indicator|indexed|index|independent|incmac|including|included|include|incdir|incdic|inccont|inc|in|import|immediate|ignore|if|identical|id|hours|hour|horizontally|horiz|hold|histogram|hex|header|having|gui|gt|greater|globals|global|giving|give|gfid|get|generated|gen|ge|functions|function|full|from|framed|frac|found|forward|forms|formatting|formatted|format|form|for|float|first|find|final|filler|fill|file|fields|field|fetch|false|extracting|external|export|expand|exp|exit|exists|except|examine|every|event|even|escape|errors|error|erase|equal|eq|entire|enter|ending|endhoc|end-work|end-toppage|end-subroutine|end-start|end-sort|end-select|end-result|end-repeat|end-read|end-prototype|end-property|end-process|end-parse|end-parameters|end-norec|end-method|end-loop|end-interface|end-if|end-histogram|end-function|end-for|end-find|end-file|end-error|end-endpage|end-endfile|end-enddata|end-define|end-decide|end-class|end-browse|end-break|end-before|end-all|end|encoded|else|eject|edited|dynamic|download|doend|document|do|dnret|dnative|dlogon|dlogoff|divide|distinct|display|disp|disabled|direction|digits|dialog-id|dialog|descending|desc|delimiters|delimiter|delimited|delete|definition|define|decimal|decide|days|day|date|dataarea|data|cursor|current|coupled|count|cos|copy|copies|conversation|control|context|constant|const|condition|concat|compute|compress|compose|commit|command|codepage|coalesce|close|class|cipher|ciph|child|charposition|charlength|char|cdid|case|captioned|cap|callnat|calling|calldbproc|call|cabinet|by|but|browse|break|bottom|bot|block|between|before|base|backward|backout|avg|aver|auto|authorization|auth|attributes|att|atn|at|async|assigning|assign|ascending|asc|as|array|application|appl|any|and|alphabetically|alpha|all|alarm|after|add|activation|action|accept|absolute|abs)(?![\w-])'
scope: keyword.natural
labels:
- match: '^\s*(?i:[a-z0-9]+\.)(?![\w])'
scope: entity.name.tag.natural
- match: '(?<=\()(?i:[a-z0-9]+\.)'
scope: entity.name.tag.reference.natural
numbers:
- match: '(?<![\w-])[\+\-]?[0-9]+[,.]?[0-9]*(?![\w-])'
scope: constant.numeric.natural
- match: '([hH]?)\''[0-9a-fA-F]+\'''
scope: constant.numeric.hex.natural
captures:
1: punctuation.definition.hex.natural
operators:
- match: '(?<![\w-])(?i:thru|or|notequal|not|ne|lt|less\s+than\s+or\s+equal\s+to|less\s+than|less\s+equal|le|gt|greater\s+than\s+or\s+equal\s+to|greater\s+than|greater\s+equal|ge|equal\s+to|equal|eq|but|and)(?![\w-])'
scope: keyword.operator.natural
placeholder:
- match: '(?<![\w-])(?i:[0-9]+x)(?![\w-])'
scope: support.constant.placeholder.natural
strings:
- match: '([uU]?)\'''
captures:
1: punctuation.definition.string.unicode.natural
push:
- meta_scope: string.natural
- match: \'\'
scope: constant.character.escape.natural
- match: \'
pop: true
- match: '([uU]?)\"'
captures:
1: punctuation.definition.string.unicode.natural
push:
- meta_scope: string.natural
- match: \"\"
scope: constant.character.escape.natural
- match: \"
pop: true
- match: '(?i:(uh)\''[0-9a-f]+\'')'
scope: string.unicode.hex.natural
captures:
1: punctuation.definition.string.unicode.natural
subroutine:
- match: '(?<=subroutine)\s+([a-z0-9\-]+)'
scope: definition.subroutine.natural
captures:
1: entity.name.function.natural
system-vars:
- match: (?i:\*(winmgrvers|winmgr|window-ps|window-pos|window-ls|username|user|ui|ubound|type|tpvers|tpsys|tp|timx|timn|timestmp|timeout|time|timd|this-object|subroutine|steplib|startup|server-type|screenio|rowcount|program|pid|pf-name|pf-key|patch-level|parse-type|parse-row|pars-namespace-uri|parse-level|parse-col|parm-user|pagesize|page-number|pagelevel|page-event|osvers|os|opsys|occurrence|number|net-user|natvers|machineclass|log-ps|log-ls|locale|linesize|line-count|line|library-id|level|length|lbound|language|isn|init-user|init-program|initid|hostname|hardware|hardcopy|group|etid|error-ta|error-nr|error-line|devicedatx|datvs|datv|datu|datn|datj|dati|datg|date|datd|data|dat4u|dat4j|dat4i|da4e|dat4d|cursor|curs-line|curs-field|curs-col|current-unit|cputime|counter|convid|com|codepage|browser-io|applic-name|applic-id))
scope: constant.language.natural
trailing-space:
- match: '[ \t]+$'
scope: invalid.deprecated.trailing-whitespace
variable-level:
- match: '^\s*[0-9]+'
scope: support.constant.level.natural
variable-modifier:
- match: '(?<=\()(?i:ad|al|bx|cd|em|hd|pm)=[^\)]+'
scope: variable.parameter.natural
variable-type:
- match: '(?<=\()(?i:[abu][0-9]*|[np][0-9\,\.]+|i0*[148]|f0*[48]|[cdlt])'
scope: storage.type.natural
view-definition:
- match: '([a-zA-Z0-9\-]+)(?=\s+view)'
scope: definition.view.natural
wrong:
- match: \t
scope: invalid
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment