[beta, updated Oct 15] A whole lot of things


  • /*#gml <code> */ and /*//#gml <code>*/ can be used for syntax highlighting inside comment blocks.
  • There are now two more auto-completion modes - GMS2-style "containing" and section start matching.
    (the later can be ridiculously fast if you can get used to it)
  • There is now error checking (called "linter")!
    It's pretty smart and can even resolve macros (unlike the current GMS2 error checker).
  • Projects now have properties (open via main menu)!
    This has settings for code conventions, lambdas, and linter.
  • Added an option to store lambdas as scripts in GMS2 projects
    This is good if not everyone on your team use GMEdit [...yet] and don't want to switch.
  • Hovering the mouse over an opening/closing bracket now shows a tooltip about the matching bracket.
  • You can now edit variable definitions in GMS2 objects.
  • You may use "#macro let var" and/or "#macro const var" for ES6 style block scoped variables
    (checked for by linter; "const" also prevents reassignment)
  • There are now C-style macro functions! Very powerful.
  • Themes can now use accent colors on Windows!
    Also there are now two sample themes with this feature that you can pick apart.
  • There is now support for custom GML dialects!
    Primarily intended for making it easier to make mods for games with GML-like scripting languages in GMEdit.


  • #import rule processing is now faster for extension files containing large numbers of scripts.
  • JSDoc now supports {type} syntax.
  • Combined view now supports most of the syntax extensions (except for coroutines).
  • Combined room creation code editor now supports #lambda and #import.
  • Argument auto-detection now distinguishes optional arguments (and is generally even smarter).
  • GMEdit now shows most GMS2 resource types and lets you pick what to do if it can't open them.
  • #lambda now allows linebreak(s) before {} and also allows #lambda() {...}.
  • You can now use Ctrl+T in recent projects list.
  • Smart completion now sorts results by relevance.
  • Combined room creation code now partakes in global search (thanks to nommiin)
  • Preferences are now a tab rather than a floating window.
  • When reopening the project, GMEdit will now focus the previously active tab.
  • Argument help in status bar can now scroll if needed.
  • Multi-line macros are now indexed correctly,
  • GMEdit now prefers to show macro tooltips for the current configuration.
  • aceEditor.debugShowToken now shows JSON dump of token (for theme/plugin making).
  • GMEdit now detects and notifies about GMS2 project resource ID collisions on load (goes into console).
  • GMEdit now considers GMS2 room inheritance for most purposes.
  • Original event order is now maintained when using "sorted" GMS2 event order option.
  • JSON format now matches that of GMS2 identically in most cases
    (field order, formatting, non-standard behaviours like escaping forward slashes)
  • "Show API" option for extensions is now a little smarter, grouping entries by their visibility and noting if exposed name doesn't match auto-completion name.
  • You can now create/rename/delete file-based resource tree items.
  • You can now "open externally" file-based resource tree directories.
  • #import directory is now shown inside resource tree.
  • Directory-based projects now have lookup, global search (inside GML files), and optional indexing.
  • [Oct 04] You can now fold case-labels
  • [Oct 04] There is now a linter option to consider case-labels blocks (lasting until the next case / closing bracket / default-case)
  • [Oct 08] There is now a preference for displaying tooltips when navigating via keyboard (shown below the cursor)
  • [Oct 08] Color previews are now shown in tooltips for hex literals (0xABCDEF, $ABCDEF)
  • [Oct 15] Global lookup (Ctrl+T) now shows types of items
  • [Oct 15] It is now possible to filter global lookup results via "name fragment:type fragment" syntax
  • [Oct 15] Added "Reload GMEdit" to command palette (Ctrl+Shift+T) for quick access


  • Fixed OSX version detecting -psn auto-argument as a path to open (thanks to nommiin).
  • Fixed local var syntax highlighting breaking if you Ctrl+S&switch tab really fast.
  • Fixed GMS1 extension API viewer thinking that all functions are hidden.
  • Fixed enum highlighting inside Markdown.
  • Fixed roomCCs not supporting import/lambda, add a generic "#target" scope.
  • Status bar can no longer extend the width of main area if the contents don't fit.
  • Fixed treeview forgetting to lazy-load thumbnails when using "show in treeview" menu option.
  • Fixed it taking more than one save to get imports to work if the file didn't use them before.
  • Fixed extern files opened via "open here" reopening normally when reopening the project.
  • Fixed argument names sometimes not being auto-detected from variables.
  • Fixed search results sometimes declining to save if there was >1 result per line.
  • Fixed a caret bug with Vim keybind mode.
  • Fixed enum highlighthing in search results overtaking subsequent results.
  • Fixed typed arguments not working in lambdas.
  • Fixed a Preferences.load error if you had no saved preferences before.
  • Fixed `var q; q.hspeed` not highlighting in built-in color.
  • Fixed some namespace highlighting oddities inside deeply nested lambdas.
  • Fixed GMS2 objects denying to load if YY points at missing event files.
  • Fixed outline-view breaking if your code closes unopened regions.
  • Fixed argument auto-completion not showing for freshly created scripts (before Ctrl+R)
  • Fixed "No idea what to do with this YY resource" dialog defaulting to "open here [as JSON]" instead of "do nothing"
  • Fixed Ctrl+D removing lines (Ace style) instead of duplicating them (GMS2/VS style)
  • Fixed GMEdit doing its best to remove unrecognized GMS2 resources when requested (and usually leaving behind files that were not referenced in YYP), despite showing a "no idea how to remove this" message box prior.
  • Fixed some GM API entries being parsed incorrectly due to inconsistent formatting.
  • [Oct 08] Fixed it being possible to break the linter with specific uses of #import.

CSS changes and additions (for custom themes):

  • Markdown code-block tags now have individual styles for default tokens instead of inheriting one from markdown
  • Merged some styles for consistency (e.g. keyboard events no longer have a custom comment-note class)
  • Empty treeview directories are now indicated via .is-empty class
  • Treeview directories now have a data-filter attribute that indicates what's supposed to be inside

Get GMEdit

Download NowName your own price


Log in with itch.io to leave a comment.

The #mfunc is useful, and i can do this with it:

#mfunc foreach(i, ins, ary) \
for (var i##__ = array_length_1d(ary), i = 0; i < i##__; i++) { var ins = ary[@ i];

var array = [100, 101, 102];

foreach (i, ins, array) 

It's cool,  but missing a left brace.

I wonder if i can write it with the left brace just like this in some way:

#mfunc foreach(i, ins, ary){  \
for (var i##__ = array_length_1d(ary), i = 0; i < i##__; i++) { var ins = ary[@ i];

var array = [100, 101, 102];

foreach (i, ins, array)  {

You can use for-loops to "chain" declarations and statements,

#mfunc foreach(arr, val)\
    for (var val##_arr = arr, val##_len = array_length_1d(val##_arr), val##_ind = 0;\
    val##_ind < val##_len; val##_ind++) for (var val = val##_arr[val##_ind];;break)
foreach([1,2,3], v) {

(note: if you want "break" to work, you'll need a bit of extra logic)

Or write them out like you would in higher-end programming languages [with actual AST processing in macros],

#mfunc foreach(arr, val, block)\
    for (var val##_arr = arr, val##_len = array_length_1d(val##_arr), val##_ind = 0;\
    val##_ind < val##_len; val##_ind++) { var val = val##_arr[val##_ind]; block; }
foreach([1,2,3], v, {

Get it, thanks for the answer.


And two days after I decided to compile the Git repo myself with Haxe! Huge update and great job as always, very thankful for GMEdit!