Exestack | Code executor, snippets, and more scripting utilities!

Downloads: | Creator Marketplace | GitHub

You can support me and Exestack on https://ko-fi.com/spacecube9!

Exestack is a general purpose scripting plugin that helps developers with anything script related. It is a compilation of useful and powerful utilities design to empower programmers do their work faster. It includes an in-studio executor, a snippets program and a performance profiler, with even more to come!

BytExecutor2


Screenshot 2023-07-08 134726

BytExecutor2 is an in-studio, code executor designed as a completely free yet powerful alternative to InCommand. It can create, run, and save your multi-lined code from within studio without having to rely on the command bar, sporting a sleek and modern interface. It’s also packed with useful QoL features such as contextual exporting, error redirects, and a utility library.

On a sidenote, Exestack actually originated as a complete redesign to my original BytExecutor, so Exestack’s strongest utility is still the in-studio script executor. Here is an incomplete list of everything that is new or has changed since BytExecutor 1 for everyone who used it:

  • Explorer system: BE2 now has a folder element to better organize your byts.
    • Interacting with byt elements has also changed. Editing a byt script is now a double-click, removing some clutter from its available icons.
      • Opening folders is also a double-click
  • Tutorial: A tutorial for using BE2 is provided by default. This is where I will put documentation and is why this post does not contain a guide for using it. I highly recommend you read it.
  • Pop-up menus: Right-clicking on empty space gives you a pop-up menu with actions such as saving and loading backups, running scripts outside BE2 (like with RunLSC), etc.
  • Custom code editor: You may now use a custom code editor over the native one Roblox provides. In order to use it you need to enable it in the experimental options.

Screenshot 2023-07-08 134946

  • Error message redirects: In BE1 whenever an error occurs it spits out an error log that unfortunately isn’t a link. BE2 creates redirect script errors that brings you to where it actually occurred. It is another experimental feature and needs to be enabled in order to be used.
  • Server/Client execution: BE2 can now run byts from either the server or client without having you to switch testing mode, saving time. It is an experimental feature and needs to be enabled in order to be used.
  • Lazy saving: Previously BE1 saved a byt every single time you reselected a script. Now it only saves every half second during state changes. Hopefully this reduces data loss that was present in BE1.
    • Additionally, you can now create backups for when you do lose your byts
  • Simplified top bar: There is less clutter at the top of the widget compared to BE1.
  • More key binds: There are a couple of new key binds BE2 provides to execute scripts without using the mouse.
  • Trimmed byt library: BE1’s library (or “API” as I called it back then) contained too many unnecessary methods with questionable use cases. They were reduced to only three methods but hopefully three that are actually useful. To access it use local BytLib = require(script.BytLib). More information is available in the Help option.
  • Snippet elements: BE2 now has snippets that reduce boilerplate code.

Snippets


Screenshot 2023-07-08 135015

Coding can occasionally be repetitive. Boilerplate like getting LocalPlayer, getting Services and creating classes uses the same code over and over again. But what if you only had to write it once? This is where snippets come in. They emerged as a general solution to all the extremely repetitive and simple code and many IDEs either directly support snippets or have a plugin or extension. Exestack provides its own snippet utility.

Snippets don’t actually have their own widget. Instead they are embedded into BytExecutor2 to take advantage of its Explorer system. To create a snippet, right click the plus icon in the top-left and choose New Snippet. A typical snippet may look something like this:

--@class/${className}
local ${className} = {}
${className}.__index = ${className}

function ${className}.new()
	local properties = {}

	return setmetatable(properties, ${className})
end

There are two main parts of a snippet: the call line and the body. The call line is formatted as --@(snippet name)/${var1}/${var2}/ ..., where (snippet name) is the name of the snippet, and all the ${var} stuff afterwards is the name of a placeholder that you can fill in later. The body comes immediately after the call and is the code you want to put in.

As an example, if you wrote

--@class/Topic

it autocompletes into:

local Topic = {}
Topic.__index = Topic

function Topic.new()
	local properties = {}

	return setmetatable(properties, Topic)
end

Performance Profiler


Sometimes it’s important for us to review the performance of our code. Faster is better, so Exestack provides a way for you to have an overview over overall speed.

The performance profiler can be accessed via a byt script using BytLib.Perf(runs: number, {[string]: function}). This feature is still in alpha and under heavy development so expect lots of bugs, missing features, and overall ugliness.

Plans for the Future


Nothing here is guaranteed. Expect things to change.

Exestack is still in alpha, so there are still a lot a things I want to do. Here is what is currently in my to-do list.

BytExecutor2

  • Add basic Rojo support/compatibility
  • Add better control over the positions of elements
  • Improved tutorial
  • Improved backups

Snippets

  • Evaluate current DX and improve it if possible
  • Better edge-case and error handling

Performance Profiler

  • Add ability to compare different functions
  • Improved visuals
  • Improved presentation of statistical information
  • Improved overall histogram

Utilities

  • Documentation reader: An in-studio documentation reader for external resources.
  • Script Templates: Replaces some default code for scripts with developer-defined code
  • Block Coding: A visual programming widget
  • Stylizer: Detects and removed deprecated and/or bad practice code
  • Yue: Reduces small boilerplate code that isn’t easily covered by snippets
  • Script Statistics: Read interesting statistics on your scripts
56 Likes

Alright, I wasnt expecting a “sequel” to BytExecutor, but this is really cool.

The addition of snippets is also really useful. I always wanted to use some kind of snippet plugin, but none of them really had a great prefix or options to add variables. This is perfect though. I like the simple way of adding them too. The performance graph is an interesting addition as well. Well done!

I have a lot of smaller clarity issues though. With some of these, I dont know if Im dumb, or if something is wrong. I know that this is a new plugin, and some things might just not be implemented yet, but here it is anyway:

Some issues and suggestions
  • Adding a new byt, and double clicking the text to select it opens the script instead. It would be pretty nice if you could double click the text to quickly rename stuff.

  • The + button is kinda useless. I was slightly confused at first, since it only adds byts. Ideally there should be a dropdown when clicking it, asking if you want to add a byt, snippet, or folder.

  • What does “Run selected scripts” do? At first I thought it would let me execute multiple byts at once, if I select multiple with ctrl (which is an option), but all of them get deselected if I right click.

  • What is the purpose of selecting multiple things at once at all? There is even a selection box thing, but you cant drop snippets or byts into folders or anything. I assume this just isnt done yet though

  • What is the purpose of the clipboard icon on byts? It seems to get replaced with the trash icon when hovering over byts.

  • Dont know if this is intentional, but a backslash is used here, and then normal slashes
    image

  • Having to double click the bar on the top to return to the parent folder is not exactly clear

  • You can have byts, folders and snippets with no names at all. And also clearing the name shows “Insert byt name…” even when editing a folder or snippet

  • Folders have a export button, but it doesnt do anything

  • It would be nice to have some extra autocomplete for snippets. Just typing --@ should show a list of available snippets if possible

  • The “Code Executor” button should toggle the widget instead of only opening it

Also exporting byts seems to be broken:


Import selected scripts errors too:

5 Likes

Woops. Small oversight. The problem seems to be that you have to select a parent first before exporting and that importing previously required some metadata. It should be fixed now.

3 Likes
  • Adding a new byt, and double clicking the text to select it opens the script instead. It would be pretty nice if you could double click the text to quickly rename stuff.

I did want to do this at some point but I couldn’t figure out a way to do it without ruining the “double click to open” thing. It’s supposed to act like how you would open a script in Studio.

  • The + button is kinda useless. I was slightly confused at first, since it only adds byts. Ideally there should be a dropdown when clicking it, asking if you want to add a byt, snippet, or folder.

There is. You just have to right click it :smile: . I will try making it more obvious.

  • What does “Run selected scripts” do? At first I thought it would let me execute multiple byts at once, if I select multiple with ctrl (which is an option), but all of them get deselected if I right click.

It’s supposed to be used with a key bind. I’ll make it so it doesn’t deselect when you right click.

What is the purpose of selecting multiple things at once at all? There is even a selection box thing, but you cant drop snippets or byts into folders or anything. I assume this just isnt done yet though

You should be able to. Hold left click on it and it’ll drag all the elements you’re selecting. If this isn’t working are there any errors or anything of the sort?

What is the purpose of the clipboard icon on byts? It seems to get replaced with the trash icon when hovering over byts.

It displays execution status (when it’s running or completed execution it changes).

Dont know if this is intentional, but a backslash is used here, and then normal slashes

It’s a tiny mistake that I forgot to fix.

  • Having to double click the bar on the top to return to the parent folder is not exactly clear

I don’t know how to make this more obvious. I’ll probably have to include it in the tutorial at some point.

  • You can have byts, folders and snippets with no names at all. And also clearing the name shows “Insert byt name…” even when editing a folder or snippet

Another oversight. I’ll fix this when I have more time.

Folders have a export button, but it doesnt do anything

Oops. I’ll get to the bottom of this when I have more time.

  • It would be nice to have some extra autocomplete for snippets. Just typing --@ should show a list of available snippets if possible

Noted.

  • The “Code Executor” button should toggle the widget instead of only opening it

I expected the user to click the x button as opposed to that. I’ll add this in the next update.


Sorry it’s a little buggy. It’s one of the most complex plugins I’ve ever made. There’s tons of little things I forgot to do since it’s so big.

3 Likes

Top quality. Probably defeated incommand! Its this good in the first release???

The UI is really clean and very good. Where did you get those icons.

5 Likes

I used Lucide Icon Picker.

3 Likes

Replacing right clicking with left clicking should be fine.

Having some sort of up arrow or back arrow should do the trick. Kind of like Windows explorer

Seems to not work, no errors in console either:


Some errors with snippets also started popping up.
When deleting:

When renaming/adding new snippet:

When writing snippet code:

All of these actions still work though, so Im not sure whats happening there


Of course! Dont be discouraged, this is still an awesome plugin.

4 Likes

I think I know why you can’t drag elements now. You have to hold left click for longer than a second. I’ll shorten this timeframe to something more reasonable in the next patch.


The snippet errors are probably coming from the Server/Client Execution experimental option. This shouldn’t affect overall functionality but I’ll still patch it.

3 Likes

Seems like that is correct. Now I feel stupid for not noticing this.

Yep, disabled that setting and its all fine now.

Bonus:
The help and about buttons do nothing. They do open the correct scripts when you have the plugin source in the game though.

4 Likes

0.1.3 Patch


BytExecutor2

Changes

  • Switched the right-click and left-click functionality of the top-left Add Element button.
  • Reduced timeframe needed to register dragging from 1 second to 0.35 seconds
  • Added mechanism to prevent developers from adding empty names to elements
  • Clicking the Code Executor option in the toolbar now toggles instead of enabling

Bugfixes

  • Directory label now only uses backslashes instead of forwards slashes
  • Right-clicking no longer deselects all elements
  • Fixed issue where Folder elements couldn’t be exported
  • Documents should now open properly
  • Fixed replication errors with snippets when Server/Client Execution option was enabled
3 Likes

Finally, a plugin that seems like a worthy competitor to InCommand. The addition of snippets and a benchmarker are a long-due update to the code editor, on top of the mock filesystem.

5 Likes

This looks promising, might use this over my own plugin actually :joy:

Edit:

  11:12:47.701  cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting:69: attempt to index nil with 'Hover'
  11:12:47.701  Stack Begin
  11:12:47.701  Script 'cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting', Line 69
  11:12:47.701  Stack End
  11:12:48.583  cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting:59: attempt to index nil with 'Hold'
  11:12:48.583  Stack Begin
  11:12:48.583  Script 'cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting', Line 59
  11:12:48.583  Stack End
  11:12:48.651  cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting:63: attempt to index nil with 'Hover'
  11:12:48.651  Stack Begin
  11:12:48.651  Script 'cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting', Line 63
  11:12:48.651  Stack End
  11:12:51.923  cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting:73: attempt to index nil with 'Setting'
  11:12:51.924  Stack Begin
  11:12:51.924  Script 'cloud_14011346933.Exestack.Modules.SettingsManager.SelectionSetting', Line 73
  11:12:51.924  Stack End

Reproduceable by opening this dropdown selector:
image

Might want to set the min window size for this as well:
image

The Byt.Perf result window stopped appearing for some reason (the performance graph)

But seriously, this plugin has surpassed RunLSC in many ways, I’m glad that you made this

1 Like

Known bug. Unfortunately very hard to fix right now.

Performance Profiler is still in need of a significant update :slight_smile:.

Bug on Roblox’s end. I do have a workaround that I just forgot to apply onto the Profiler.

1 Like

0.1.4 Patch


BytExecutor2

Changes

  • Changed toolbar icons

Old:
Screenshot 2023-07-11 134259

New:
Screenshot 2023-07-11 154830

Bugfixes

  • Fixed a bug where the Preferences widget would sometimes fail to apply a theme.
  • Increased the minimal window size for the Performance Profiler.

0.2.0 Update


Performance Profiler

Additions

  • Added the ability to compare different functions. This comes with an incompatible change to the library.
    • It is also possible to name them so you can see which bar belongs to which function.
  • Legends: Coming with mulitiple graphs comes the legend that tells you which color belongs to which function.
  • Graphs can now be focused on. Having multiple histograms in Performance Profiler’s fashion can be very confusing so individual graphs can be clicked on to make every other graph fade away. It can also be accessed by clicking the markers in the legend.

  • The summary of data in the right can now be partially hidden, helping you focus on whatever function’s performance is most important.
  • New information can be toggled such as range, IQR, and outliers in the Preferences window.

Screenshot 2023-07-13 211107

  • Hovering over a bar gives you the precise amount of times in that range.
  • There is now a label telling you what units the x-axis is using.

Changes

  • Increased the minimum size of the Profiler.
  • Improved the graph window size determiner. It should now be more precise and use up more space
  • The x-axis labels are now tilted 30 degrees to make for more room
  • Grid lines now come in a lesser variant to more closely resemble a graph
  • Some information like skewness and kurtosis is now hidden unless enabled in Preferences
  • Light mode is now supported

BytExecutor2

Bugfixes

  • Fixed an issue where the execute icon would disappear if an error occurred.
  • Elements being dragged now display correctly
  • Elements can no longer be dragged while in the process of being deleted.
  • Reduced the amount of false-positive saving
  • Errors should now be less likely to point to an invalid line
  • Internal errors now attempt to redirect you to the correct line if Redirect Byt Script Errors is enabled.
2 Likes

Looks nice, probably gonna try out this!

1 Like

At least you changed it so light mode users can see it (it’s a literal sin so don’t even think about using light mode)

but at least this is a better version of InCommand

2 Likes

0.2.1 Patch


BytExecutor2 has reached over 3,000 lines of code with this patch!

BytExecutor2

Additions

  • Added basic Rojo support (theoretically any file-syncing plugin should work but I used Rojo). Creating a folder named BytLocalSync under ServerStorage using default.project.json and then creating any kind of script under that will automatically be registered and create a local byt. These do not save across places. Example shown here in VSC:

  • Local Byts. These are byts that exist only inside a specific place and is not saved anywhere else. To create one select a script in the Explorer and then press Add Local Byt Local Byts also act as automatic exporting as they are linked to another script. These are mainly intended for Rojo so expect some strange behaviors.

Changes

  • Improved search such that it now indexes the contents of folders.
  • Significantly improved custom code editor. It now supports auto-indentation completely and covers all cases I’m aware of.
    • Extended the themes possible with code editor matching Studio’s settings.
    • It now uses tabs properly instead of using 4 spaces.

Bugfixes

  • Fixed issue where BE2 would sometimes fail to clean up folders if ServerClientExecution was enabled.

Exestack

Bugfixes

  • Preferences should now scale properly.
  • Increased minimum size for Preferences widget preventing clipping.
1 Like

Patch 0.2.2


BytExecutor2

Fixes

  • Fixed issue where <, >, ", and ' would not display the correct highlight in the custom script editor.
    • Using [[ and ]] for strings no longer correctly highlights. This is a bug I cannot fix for the time being until I develop my own lexer.
  • Slightly improved performance of custom script editor.
1 Like

Patch 0.2.3

Thanks for the >50 installs everyone! :partying_face: If you installed my plugin, please give it a like or favorite to show your support.


Exestack

Additions

  • Added importing/exporting options button for Preferences.
  • Added update checker. This can be disabled in the Preferences widget under the General category.

Fixes

  • Preferences should now clean up unused options.
  • Preferences widget should now rescale properly.
  • DefaultBytName option no longer allows spaces.

BytExecutor2

Additions

  • Added option to use the new script run context when exporting.

Fixes

  • Fixed the About page to show the correct version number.
2 Likes