# QB64 syntax highlighting for the micro editor # Install: copy this file to ~/.config/micro/syntax/qb64.yaml(Linux/macOS) # or %USERPROFILE%\.config\micro\syntax\qb64.yaml (Windows) filetype: qb64 detect: filename: "\\.(bas|bi|bm)$" rules: # ------------------------------------------------------------------ # Comments: REM keyword and apostrophe comments (rest of line) # ------------------------------------------------------------------ - comment: start: "(?i)^[[:space:]]*rem\\b" end: "$" rules: [] - comment: start: "'" end: "$" rules: [] # ------------------------------------------------------------------ # Strings # ------------------------------------------------------------------ - constant.string: start: "\"" end: "\"" rules: - constant.specialChar: "\"\"" # ------------------------------------------------------------------ # Numbers: hex (&H), octal (&O), binary (&B), decimal/float/exp # ------------------------------------------------------------------ - constant.number: "(?i)&h[0-9a-f]+(&&|~&&)?" - constant.number: "(?i)&o[0-7]+(&&|~&&)?" - constant.number: "(?i)&b[01]+(&&|~&&)?" - constant.number: "(?i)\\b[0-9]+\\.?[0-9]*(e[+-]?[0-9]+)?[!#%&]?\\b" - constant.number: "(?i)\\b\\.[0-9]+(e[+-]?[0-9]+)?[!#%&]?\\b" # ================================================================== # SECTION 1: Standard QB4.5 / QBasic Compatibility Keywords (217) # ================================================================== # -- Data types -- - type: "(?i)\\b(DOUBLE|INTEGER|LONG|SINGLE|STRING)\\b" # -- Multi-word statements/keywords -- - statement: "(?i)\\bCALL[[:space:]]+ABSOLUTE\\b" - statement: "(?i)\\bCASE[[:space:]]+ELSE\\b" - statement: "(?i)\\bCASE[[:space:]]+IS\\b" - statement: "(?i)\\bDECLARE[[:space:]]+LIBRARY\\b" - statement: "(?i)\\bDEF[[:space:]]+SEG\\b" - statement: "(?i)\\bEND[[:space:]]+IF\\b" - statement: "(?i)\\bKEY[[:space:]]+LIST\\b" - statement: "(?i)\\bKEY[[:space:]]+n\\b" - statement: "(?i)\\bLINE[[:space:]]+INPUT\\b" - statement: "(?i)\\bLPRINT[[:space:]]+USING\\b" - statement: "(?i)\\bON[[:space:]]+ERROR\\b" - statement: "(?i)\\bON[[:space:]]+KEY\\b" - statement: "(?i)\\bON[[:space:]]+STRIG\\b" - statement: "(?i)\\bON[[:space:]]+TIMER\\b" - statement: "(?i)\\bOPEN[[:space:]]+COM\\b" - statement: "(?i)\\bOPTION[[:space:]]+BASE\\b" - statement: "(?i)\\bPALETTE[[:space:]]+USING\\b" - statement: "(?i)\\bPRINT[[:space:]]+USING\\b" - statement: "(?i)\\bRANDOMIZE[[:space:]]+USING\\b" - statement: "(?i)\\bSELECT[[:space:]]+CASE\\b" - statement: "(?i)\\bVIEW[[:space:]]+PRINT\\b" # -- Single-word statements, functions and keywords (A-Z, chunked) -- - statement: "(?i)\\b(ABS|ABSOLUTE|ACCESS|ALIAS|AND|APPEND|AS|ASC|ATN|BASE|BEEP|BINARY|BLOAD|BSAVE|BYVAL|CALL|CASE|CDBL|CHAIN|CHDIR)\\b" - statement: "(?i)\\b(CHR\\$|CINT|CIRCLE|CLEAR|CLNG|CLOSE|CLS|COLOR|COM|COMMAND\\$|COMMON|CONST|COS|CSNG|CSRLIN|CVD|CVDMBF|CVI|CVL|CVS)\\b" - statement: "(?i)\\b(CVSMBF|DATA|DATE\\$|DECLARE|DEF|DEFDBL|DEFINT|DEFLNG|DEFSNG|DEFSTR|DIM|DO|DRAW|ELSE|ELSEIF|END|ENVIRON|ENVIRON\\$|EOF|EQV)\\b" - statement: "(?i)\\b(ERASE|ERL|ERR|ERROR|EXIT|EXP|FIELD|FILES|FIX|FOR|FREE|FREEFILE|FUNCTION|GET|GOSUB|GOTO|HEX\\$|IF|IMP|INKEY\\$)\\b" - statement: "(?i)\\b(INP|INPUT|INPUT\\$|INSTR|INT|INTERRUPT|INTERRUPTX|IS|KEY|KILL|LBOUND|LCASE\\$|LEFT\\$|LEN|LET|LIBRARY|LINE|LIST|LOC|LOCATE)\\b" - statement: "(?i)\\b(LOCK|LOF|LOG|LOOP|LPOS|LPRINT|LSET|LTRIM\\$|MID\\$|MKD\\$|MKDIR|MKDMBF\\$|MKI\\$|MKL\\$|MKS\\$|MKSMBF\\$|MOD|NAME|NEXT|NOT)\\b" - statement: "(?i)\\b(OCT\\$|OFF|ON|OPEN|OPTION|OR|OUT|OUTPUT|PAINT|PALETTE|PCOPY|PEEK|PLAY|PMAP|POINT|POKE|POS|PRESET|PRINT|PSET)\\b" - statement: "(?i)\\b(PUT|RANDOM|RANDOMIZE|READ|REDIM|REM|RESET|RESTORE|RESUME|RETURN|RIGHT\\$|RMDIR|RND|RSET|RTRIM\\$|RUN|SADD|SCREEN|SEEK|SEG)\\b" - statement: "(?i)\\b(SELECT|SGN|SHARED|SHELL|SIN|SLEEP|SOUND|SPACE\\$|SPC|SQR|STATIC|STEP|STICK|STOP|STR\\$|STRIG|STRING\\$|SUB|SWAP|SYSTEM)\\b" - statement: "(?i)\\b(TAB|TAN|THEN|TIME\\$|TIMER|TO|TYPE|UBOUND|UCASE\\$|UNLOCK|UNTIL|USING|VAL|VARPTR|VARPTR\\$|VARSEG|VIEW|WAIT|WEND|WHILE)\\b" - statement: "(?i)\\b(WIDTH|WINDOW|WRITE|XOR)\\b" # ================================================================== # SECTION 2: QB64-PE Specific Extensions (underscore-prefixed, 614) # ================================================================== # -- 2a. Core underscore-prefixed keywords, types and functions -- - special: "(?i)\\bOPTION[[:space:]]+_EXPLICIT\\b" - special: "(?i)\\bOPTION[[:space:]]+_EXPLICITARRAY\\b" - special: "(?i)\\b(OPTION|_ACCEPTFILEDROP|_ACOS|_ACOSH|_ADLER32|_ALLOWFULLSCREEN|_ALPHA|_ALPHA32|_ANDALSO|_ARCCOT|_ARCCSC|_ARCSEC|_ASIN|_ASINH|_ASSERT|_ATAN2|_ATANH|_AUTODISPLAY|_AXIS|_BACKGROUNDCOLOR)\\b" - special: "(?i)\\b(_BASE64DECODE\\$|_BASE64ENCODE\\$|_BIN\\$|_BIT|_BLEND|_BLINK|_BLUE|_BLUE32|_BRIGHTNESS32|_BUTTON|_BUTTONCHANGE|_BYTE|_CAPSLOCK|_CAST|_CEIL|_CINP|_CLAMP|_CLEARCOLOR|_CLIP|_CLIPBOARD\\$)\\b" - special: "(?i)\\b(_CLIPBOARDIMAGE|_COLORCHOOSERDIALOG|_COMMANDCOUNT|_CONNECTED|_CONNECTIONADDRESS\\$|_CONSOLE|_CONSOLECURSOR|_CONSOLEFONT|_CONSOLEINPUT|_CONSOLETITLE|_CONTINUE|_CONTROLCHR|_COPYIMAGE|_COPYPALETTE|_COSH|_COT|_COTH|_CRC32|_CSC|_CSCH)\\b" - special: "(?i)\\b(_CV|_CWD\\$|_D2G|_D2R|_DECODEURL\\$|_DEFAULTCOLOR|_DEFINE|_DEFLATE\\$|_DELAY|_DEPTHBUFFER|_DESKTOPHEIGHT|_DESKTOPWIDTH|_DEST|_DEVICE\\$|_DEVICEINPUT|_DEVICES|_DIR\\$|_DIREXISTS|_DISPLAY|_DISPLAYORDER)\\b" - special: "(?i)\\b(_DONTBLEND|_DONTWAIT|_DROPPEDFILE|_ECHO|_EMBEDDED\\$|_ENCODEURL\\$|_ENVIRONCOUNT|_ERRORLINE|_ERRORMESSAGE\\$|_EXIT|_EXPLICIT|_EXPLICITARRAY|_FILEEXISTS|_FILES\\$|_FINISHDROP|_FLOAT|_FONT|_FONTHEIGHT|_FONTWIDTH|_FREEFONT)\\b" - special: "(?i)\\b(_FREEIMAGE|_FREETIMER|_FULLPATH\\$|_FULLSCREEN|_G2D|_G2R|_GLRENDER|_GREEN|_GREEN32|_HEIGHT|_HIDE|_HSB32|_HSBA32|_HUE32|_HYPOT|_ICON|_IIF|_INCLERRORFILE\\$|_INCLERRORLINE|_INFLATE\\$)\\b" - special: "(?i)\\b(_INPUTBOX\\$|_INSTRREV|_INTEGER64|_KEYCLEAR|_KEYDOWN|_KEYHIT|_LASTAXIS|_LASTBUTTON|_LASTWHEEL|_LIMIT|_LOADFONT|_LOADIMAGE|_LOGERROR|_LOGINFO|_LOGMINLEVEL|_LOGTRACE|_LOGWARN|_MAPTRIANGLE|_MAPUNICODE|_MAX)\\b" - special: "(?i)\\b(_MD5\\$|_MEM|_MEMCOPY|_MEMELEMENT|_MEMEXISTS|_MEMFILL|_MEMFREE|_MEMGET|_MEMIMAGE|_MEMNEW|_MEMPUT|_MEMSOUND|_MESSAGEBOX|_MIDDLE|_MIDISOUNDBANK|_MIN|_MK\\$|_MOUSEBUTTON|_MOUSEHIDDEN|_MOUSEHIDE)\\b" - special: "(?i)\\b(_MOUSEINPUT|_MOUSEMOVE|_MOUSEMOVEMENTX|_MOUSEMOVEMENTY|_MOUSESHOW|_MOUSEWHEEL|_MOUSEX|_MOUSEY|_NEGATE|_NEWIMAGE|_NOTIFYPOPUP|_NUMLOCK|_OFFSET|_OPENCLIENT|_OPENCONNECTION|_OPENFILEDIALOG\\$|_OPENHOST|_ORELSE|_OS\\$|_PALETTECOLOR)\\b" - special: "(?i)\\b(_PI|_PIXELSIZE|_PRESERVE|_PRINTIMAGE|_PRINTMODE|_PRINTSTRING|_PRINTWIDTH|_PUTIMAGE|_R2D|_R2G|_READBIT|_READFILE\\$|_RED|_RED32|_RESETBIT|_RESIZE|_RESIZEHEIGHT|_RESIZEWIDTH|_RGB|_RGB32)\\b" - special: "(?i)\\b(_RGBA|_RGBA32|_ROL|_ROR|_ROUND|_SATURATION32|_SAVEFILEDIALOG\\$|_SAVEIMAGE|_SCREENCLICK|_SCREENEXISTS|_SCREENHIDE|_SCREENICON|_SCREENIMAGE|_SCREENMOVE|_SCREENPRINT|_SCREENSHOW|_SCREENX|_SCREENY|_SCROLLLOCK|_SEC)\\b" - special: "(?i)\\b(_SECH|_SELECTFOLDERDIALOG\\$|_SETALPHA|_SETBIT|_SHELLHIDE|_SHL|_SHR|_SINH|_SMOOTH|_SNDBAL|_SNDCLOSE|_SNDCOPY|_SNDGETPOS|_SNDLEN|_SNDLIMIT|_SNDLOOP|_SNDNEW|_SNDOPEN|_SNDOPENRAW|_SNDPAUSE)\\b" - special: "(?i)\\b(_SNDPAUSED|_SNDPLAY|_SNDPLAYCOPY|_SNDPLAYFILE|_SNDPLAYING|_SNDRATE|_SNDRAW|_SNDRAWBATCH|_SNDRAWDONE|_SNDRAWLEN|_SNDSETPOS|_SNDSTOP|_SNDVOL|_SOURCE|_STARTDIR\\$|_STATUSCODE|_STRCMP|_STRICMP|_TANH|_TITLE)\\b" - special: "(?i)\\b(_TITLE\\$|_TOGGLEBIT|_TOSTR\\$|_TOTALDROPPEDFILES|_TRIM\\$|_UCHARPOS|_UFONTHEIGHT|_ULINESPACING|_UNSIGNED|_UPRINTSTRING|_UPRINTWIDTH|_WAVE|_WHEEL|_WIDTH|_WINDOWHANDLE|_WINDOWHASFOCUS|_WRITEFILE)\\b" # -- 2b. _gl OpenGL binding family (SUB _GL) -- - special: "(?i)\\b(_glAccum|_glAlphaFunc|_glAreTexturesResident|_glArrayElement|_glBegin|_glBindTexture|_glBitmap|_glBlendFunc|_glCallList|_glCallLists|_glClear|_glClearAccum|_glClearColor|_glClearDepth|_glClearIndex|_glClearStencil|_glClipPlane|_glColor3b|_glColor3bv|_glColor3d)\\b" - special: "(?i)\\b(_glColor3dv|_glColor3f|_glColor3fv|_glColor3i|_glColor3iv|_glColor3s|_glColor3sv|_glColor3ub|_glColor3ubv|_glColor3ui|_glColor3uiv|_glColor3us|_glColor3usv|_glColor4b|_glColor4bv|_glColor4d|_glColor4dv|_glColor4f|_glColor4fv|_glColor4i)\\b" - special: "(?i)\\b(_glColor4iv|_glColor4s|_glColor4sv|_glColor4ub|_glColor4ubv|_glColor4ui|_glColor4uiv|_glColor4us|_glColor4usv|_glColorMask|_glColorMaterial|_glColorPointer|_glCopyPixels|_glCopyTexImage1D|_glCopyTexImage2D|_glCopyTexSubImage1D|_glCopyTexSubImage2D|_glCullFace|_glDeleteLists|_glDeleteTextures)\\b" - special: "(?i)\\b(_glDepthFunc|_glDepthMask|_glDepthRange|_glDisable|_glDisableClientState|_glDrawArrays|_glDrawBuffer|_glDrawElements|_glDrawPixels|_glEdgeFlag|_glEdgeFlagPointer|_glEdgeFlagv|_glEnable|_glEnableClientState|_glEnd|_glEndList|_glEvalCoord1d|_glEvalCoord1dv|_glEvalCoord1f|_glEvalCoord1fv)\\b" - special: "(?i)\\b(_glEvalCoord2d|_glEvalCoord2dv|_glEvalCoord2f|_glEvalCoord2fv|_glEvalMesh1|_glEvalMesh2|_glEvalPoint1|_glEvalPoint2|_glFeedbackBuffer|_glFinish|_glFlush|_glFogf|_glFogfv|_glFogi|_glFogiv|_glFrontFace|_glFrustum|_glGenLists|_glGenTextures|_glGetBooleanv)\\b" - special: "(?i)\\b(_glGetClipPlane|_glGetDoublev|_glGetError|_glGetFloatv|_glGetIntegerv|_glGetLightfv|_glGetLightiv|_glGetMapdv|_glGetMapfv|_glGetMapiv|_glGetMaterialfv|_glGetMaterialiv|_glGetPixelMapfv|_glGetPixelMapuiv|_glGetPixelMapusv|_glGetPointerv|_glGetPolygonStipple|_glGetString|_glGetTexEnvfv|_glGetTexEnviv)\\b" - special: "(?i)\\b(_glGetTexGendv|_glGetTexGenfv|_glGetTexGeniv|_glGetTexImage|_glGetTexLevelParameterfv|_glGetTexLevelParameteriv|_glGetTexParameterfv|_glGetTexParameteriv|_glHint|_glIndexd|_glIndexdv|_glIndexf|_glIndexfv|_glIndexi|_glIndexiv|_glIndexMask|_glIndexPointer|_glIndexs|_glIndexsv|_glIndexub)\\b" - special: "(?i)\\b(_glIndexubv|_glInitNames|_glInterleavedArrays|_glIsEnabled|_glIsList|_glIsTexture|_glLightf|_glLightfv|_glLighti|_glLightiv|_glLightModelf|_glLightModelfv|_glLightModeli|_glLightModeliv|_glLineStipple|_glLineWidth|_glListBase|_glLoadIdentity|_glLoadMatrixd|_glLoadMatrixf)\\b" - special: "(?i)\\b(_glLoadName|_glLogicOp|_glMap1d|_glMap1f|_glMap2d|_glMap2f|_glMapGrid1d|_glMapGrid1f|_glMapGrid2d|_glMapGrid2f|_glMaterialf|_glMaterialfv|_glMateriali|_glMaterialiv|_glMatrixMode|_glMultMatrixd|_glMultMatrixf|_glNewList|_glNormal3b|_glNormal3bv)\\b" - special: "(?i)\\b(_glNormal3d|_glNormal3dv|_glNormal3f|_glNormal3fv|_glNormal3i|_glNormal3iv|_glNormal3s|_glNormal3sv|_glNormalPointer|_glOrtho|_glPassThrough|_glPixelMapfv|_glPixelMapuiv|_glPixelMapusv|_glPixelStoref|_glPixelStorei|_glPixelTransferf|_glPixelTransferi|_glPixelZoom|_glPointSize)\\b" - special: "(?i)\\b(_glPolygonMode|_glPolygonOffset|_glPolygonStipple|_glPopAttrib|_glPopClientAttrib|_glPopMatrix|_glPopName|_glPrioritizeTextures|_glPushAttrib|_glPushClientAttrib|_glPushMatrix|_glPushName|_glRasterPos2d|_glRasterPos2dv|_glRasterPos2f|_glRasterPos2fv|_glRasterPos2i|_glRasterPos2iv|_glRasterPos2s|_glRasterPos2sv)\\b" - special: "(?i)\\b(_glRasterPos3d|_glRasterPos3dv|_glRasterPos3f|_glRasterPos3fv|_glRasterPos3i|_glRasterPos3iv|_glRasterPos3s|_glRasterPos3sv|_glRasterPos4d|_glRasterPos4dv|_glRasterPos4f|_glRasterPos4fv|_glRasterPos4i|_glRasterPos4iv|_glRasterPos4s|_glRasterPos4sv|_glReadBuffer|_glReadPixels|_glRectd|_glRectdv)\\b" - special: "(?i)\\b(_glRectf|_glRectfv|_glRecti|_glRectiv|_glRects|_glRectsv|_glRenderMode|_glRotated|_glRotatef|_glScaled|_glScalef|_glScissor|_glSelectBuffer|_glShadeModel|_glStencilFunc|_glStencilMask|_glStencilOp|_glTexCoord1d|_glTexCoord1dv|_glTexCoord1f)\\b" - special: "(?i)\\b(_glTexCoord1fv|_glTexCoord1i|_glTexCoord1iv|_glTexCoord1s|_glTexCoord1sv|_glTexCoord2d|_glTexCoord2dv|_glTexCoord2f|_glTexCoord2fv|_glTexCoord2i|_glTexCoord2iv|_glTexCoord2s|_glTexCoord2sv|_glTexCoord3d|_glTexCoord3dv|_glTexCoord3f|_glTexCoord3fv|_glTexCoord3i|_glTexCoord3iv|_glTexCoord3s)\\b" - special: "(?i)\\b(_glTexCoord3sv|_glTexCoord4d|_glTexCoord4dv|_glTexCoord4f|_glTexCoord4fv|_glTexCoord4i|_glTexCoord4iv|_glTexCoord4s|_glTexCoord4sv|_glTexCoordPointer|_glTexEnvf|_glTexEnvfv|_glTexEnvi|_glTexEnviv|_glTexGend|_glTexGendv|_glTexGenf|_glTexGenfv|_glTexGeni|_glTexGeniv)\\b" - special: "(?i)\\b(_glTexImage1D|_glTexImage2D|_glTexParameterf|_glTexParameterfv|_glTexParameteri|_glTexParameteriv|_glTexSubImage1D|_glTexSubImage2D|_glTranslated|_glTranslatef|_gluPerspective|_glVertex2d|_glVertex2dv|_glVertex2f|_glVertex2fv|_glVertex2i|_glVertex2iv|_glVertex2s|_glVertex2sv|_glVertex3d)\\b" - special: "(?i)\\b(_glVertex3dv|_glVertex3f|_glVertex3fv|_glVertex3i|_glVertex3iv|_glVertex3s|_glVertex3sv|_glVertex4d|_glVertex4dv|_glVertex4f|_glVertex4fv|_glVertex4i|_glVertex4iv|_glVertex4s|_glVertex4sv|_glVertexPointer|_glViewport)\\b" # ================================================================== # SECTION 3: Metacommands & Preprocessor Directives (26, $-prefixed) # ================================================================== - preproc: "(?i)\\$END[[:space:]]+IF" - preproc: "(?i)(\\$ASSERTS|\\$CHECKING|\\$COLOR|\\$CONSOLE|\\$DEBUG|\\$DYNAMIC|\\$ELSE|\\$ELSEIF|\\$EMBED|\\$ERROR|\\$EXEICON|\\$FORMAT|\\$IF|\\$INCLUDE|\\$INCLUDEONCE|\\$LET|\\$MIDISOUNDFONT|\\$NOPREFIX|\\$RESIZE|\\$SCREENHIDE)" - preproc: "(?i)(\\$SCREENSHOW|\\$STATIC|\\$UNSTABLE|\\$USELIBRARY|\\$VERSIONINFO)" # ------------------------------------------------------------------ # Type-suffix sigils and numeric-base prefixes (not reserved words, # documented on the wiki's "Symbols" page - included for completeness) # ------------------------------------------------------------------ - type: "[!#%&~`]|##|%%|%&" # ------------------------------------------------------------------ # Symbols / operators # ------------------------------------------------------------------ - symbol.operator: "(<>|<=|>=|=|<|>|\\+|-|\\*|/|\\\\|\\^)" - symbol: "(:|,|;|\\(|\\))" # ------------------------------------------------------------------ # Line-continuation underscore at end of line # ------------------------------------------------------------------ - special: "_[[:space:]]*$"