SimpleComplete | General scripting plugin

SimpleComplete is a relatively simple plugin which allows you to add docstrings to variables, table members and functions, add tags/attributes for your docstrings, as well as have shorthands for importing any of Roblox’s services.

Documentation

Table Of Contents

Commands
Docstrings
Docstring Tags^
Docstring Syntax/Attributes^
Auto-Imports
Service^
Module^
Snippets

Commands

The command line can be used to set/get certain settings of SimpleComplete.

Syntax:
--sc #COMMAND_NAME: #SETTING_NAME; #SETTING_VALUE?

There are a variety of commands for SimpleComplete, heres a list of all of them:

Command Name Args and Format Description
setlocal: settingName; value Sets the local (current place) value for the setting.
getlocal: settingName Gets a local value for the setting.
setglobal: settingName; value Sets the global (all places/default) value for the setting.
getglobal: settingName Gets a global value for the setting.
reset: `local global`
exportsettings: `local global`
getsettings: `local global`

image

You can also chain command calls by wrapping them in parentheses, like so:
image
Very effichient!!!

Table of setting names, default values and possible values:

#define Casing as "PascalCase" | "CamelCase" | "SnakeCase" | "LoudSnakeCase" | "UpperCase" | "FlatCase"

Setting Name Default Value Possible Values
ModuleAncestors " " any-string
ImportShorthand “!” any-string
ModuleAncestorTag “SC_Ancestor” any-string
FindShortestPath “true” “true” | “false”
ImportSort “off” “off” | “descending” | “ascending”
ModuleSearchMode “descendants” “descendants” | “children”
SnippetModulePath “” any-string
SnippetShorthand "" any-string
ImportTransformMod “PascalCase” Casing
ImportTransformSer “PascalCase” Casing
Docstrings

Docstrings

To declare a docstring for functions, it is as simple as putting a comment ontop of it, like this:
image

This functionality already exists in vanilla Studio, however SimpleComplete does allow you to use all the tags and attributes within function docstrings.

However, for variables and table members, you must declare docstrings like this, with the <docstring> tag:
image
image
Just putting a comment ontop won’t work.

Docstring Tags

Docstring Tags

Docstring tags add certain functionality to docstrings without needing any other value.

  1. @deprecated
  • This tag simply crosses out the name for the item and hides it unless specifically searched for.
    image
  1. @client_only
  • This tag makes it so that if the item is being accessed from somewhere other than a LocalScript or a Client RunContext script, it will not register as an autocomplete choice.
  1. @server_only
  • This tag makes it so that if the item is being accessed from somewhere other than a non-Client RunContext Script, it will not register as an autocomplete choice.
  1. @plugin_only
  • This tag makes it so that if the item is being accessed from somewhere other than a script with Plugin permissions, it will not register as an autocomplete choice.
  1. @cmd_line_only
  • This tag makes it so that if the item is being accessed from somewhere other than the command line, it will not register as an autocomplete choice.
  1. @corescript_only
  • This tag makes it so that if the item is being accessed from somewhere other than a CoreScript, it will not register as an autocomplete choice.
  1. @cursor_after_parens
  • This tag will add () after the autocompleted variable, and put the cursor after the ).
  1. @cursor_in_parens
  • This tag will add () after the autocompleted variable, and put the cursor after the (.
Docstring Syntax/Attributes

Docstring Syntax/Attributes

There is a special syntax for docstring values.

  1. Strings
  • Attribute strings are declared via $…$.
    Example:


2. Booleans

  • Attribute booleans are declared the same way as strings, but with $true$ or $false$ as the value.
  1. Numbers
  • Attribute numbers are declared the same way as strings, but with $n$ as the value.
    Example:

Docstring attributes add certain functionality to docstrings using a provided value.

  1. @override_docstring #string
  • This attribute sets the docstring to the string.
  1. @code_sample #string
  • This attribute sets the code sample part of the docstring to the string.
  1. @learn_more #string
  • This attribute sets the “Open Documentation” link of the docstring to the specified url string.
    Note that if the url is not Roblox’s own documentation website, it will not display.
  1. @preselect #bool
  • I have no idea what this does, but I added it anyway :V
  1. @detail #string
  • Sets the detail part of the docstring to the string.
    Example:


6. @num_overloads #number

  • Sets the #overloads part of the docstring to the number.
  1. @kind #string
  • Sets the Enum.CompletionItemKind of the item to the string.
    Example:
    image
Auto-Imports

Auto-Imports

SimpleComplete offers a convenient system of auto-importing services and modules from tagged ancestors/ancestors list

To get access to auto imports, you must first set a shorthand for it. It is ! by default, however can be configured via the --?import-shorthand (symbol_here) directive or the plugin setting ImportShorthand. Its value can be set to nil if you want it to appear with no prefix symbol

If you select an autocomplete suggestion for an auto-import (these typically have a snippet/enum icons), the name will be filled out on your current line, and the variable will be defined somewhere on the top.
image

Docstrings

There are also module auto imports, which are defined by several settings.

The first are ModuleAncestors and ModuleAncestorTag, both determine what ancestors to search thru for modules.

ModuleAncestors has a directive form, --?module-ancestors {...paths}, and a plugin setting, ModuleAncestors

ModuleAncestorTag is a plugin setting, and determines the tag for items which will be searched for modules.

The last setting is ModuleSearchMode which determines if searching will be done recursively (descendants) or shallowly (children)

Snippets

Snippets

Snippets are one of the cooler features of SimpleComplete, which allow you to define custom blocks of text which you can fill out in just 1 click.

Screenshot 2025-04-08 212321

In order to define your snippets, you must first create a ModuleScript to store them (as seen above), then set your SnippetsModulePath setting to its path, like so:
image

And then the snippets can be accessed via a shorthand symbol, which you can configure via the --?snippet-shorthand (symbol_here) directive or via the plugin setting SnippetShorthand
Like import shorthands, this can also be set to nil.

Example:

Get SimpleComplete here! →

SimpleCompleteU15.rbxmx (124.4 KB)

(broken link, waiting for roblox to unblacklist me from publishing :((((( )

If you wanna donate to me for my work, feel free to do so here! →

Any donations mean alot to me and means I can make more stuff :slight_smile:

38 Likes

Oops forgot to public it, it’s public now

2 Likes

Update 1:

2 Likes

I need a better tutorial. The currwnt tutorial flies off my head

1 Like

Essentially, there are 2 main things inside the docstrings: Tags and Attributes

These work similarly to Instance tags and attributes, tags are simply names and attributes have both a name and a value.

For example, <deprecated> is a tag, while <kind>: $Function$ is an attribute ($…$ is used to define strings)
These can be in any order inside the docstring, for example:

image

But for defining variable/table member docstrings, you need a special <docstring> tag at the start of the comment, like this:

--[[<docstring>

]]

on the top of it. This is as to not conflict with any existing comments

1 Like

This makes alot more sense! Thx ill use it now

2 Likes

Update 2:

  • Added service auto-imports

    Screenshot 2025-03-24 113040
    It does not work when writing inside strings/comments (multiline and single line) and also does not work when you have already defined the service names as their own variables
3 Likes

Update 3:

  • Service auto imports no longer show up when defining a local variable and when doing a table member access via . or :
  • Docstrings & import utilities are now enabled by default
2 Likes

Update 4:

  • Docstrings now are completely reliable, same for service auto imports and shorthands:

    The next update will be module autoimports!
1 Like

Update 5:

  • Added module auto imports, with the syntax for determining what ancestors to check being the --?module-ancestors {..paths...} directive, like so:

Note that all descendants of the ancestor which are modulescripts will be considered.

1 Like

Patch 5.1:

  • Fixed module imports showing up after a service shorthand
2 Likes

Update 6:

  • Fixed module and service imports going in random order, now it goes directives → services → modules
  • Fixed service suggestions popping up in unwanted places such as string patterns or directives
  • Fixed a very big performance issue with auto imports, now it runs very smoothly even for relatively big scripts
2 Likes

Patch 6.1:

1 Like

Patch 6.2:

  • Made it so that module path refreshes are done incrementally instead of clearing the whole table and rebuilding it, this considerably improved performance for module auto imports

  • Improved the new isInNonImportContext function to return true when inside multiline comments/strings (Also works for scoped multiline comments)

1 Like

Update 7:

  • Added “script” and “.Parent” as usable within the --?module-ancestors {} directive (for example, you can now do --?module-ancestors {script.Parent})

  • Service imports no longer appear in function parameter lists

  • --? directives are now autocompleted:

  • Directives no longer apply when used within strings

Known issues:

  • Service imports show up when defining tuple variables, e.g local a, b, c
2 Likes

Patch 7.1:

  • Service imports no longer appear in tuple variable declarations
1 Like

Patch 7.2:

  • Module results from different ancestors now combine with eachother
  • Module paths are resolved as the shortest

4 Likes

Patch 7.3:

  • Module and service imports now no longer consider statements within strings
  • Fixed relative path issue (e.g require(script.ServerScriptService.MyScript.MyModule when it should just be Script.MyModule)
  • Fixed a whole bunch of minor string pattern inconveniences
1 Like

Update 8:

  • Made it so that module auto imports now use game:GetService(name) instead of game.name when using services (if a variable has not been declared as it), but if a variable HAS been declared as the service (doesn’t matter the name, just need to be declared with game:GetService()), it’ll use that instead. (This doesn’t affect script relative paths)

  • Name sorting coming soon!

2 Likes

Patch 8.1:

  • Modules are now properly cleaned up if the module-ancestors directive has been changed/removed
1 Like