This release is a pre-release and may not be stable for production use.
sublime-text-stubs
PEP 561 typing stubs
for the Sublime Text plugin API,
covering the sublime, sublime_plugin and sublime_types modules.
The stubs carry the API documentation as docstrings, so hovering a symbol in an editor shows the same prose as the official API reference.
Sublime Text exposes these modules only inside its own embedded interpreter, so they cannot be imported or introspected from a normal Python environment. Installing this package as a dev dependency gives type checkers and editors something to resolve them against.
Installation
uv add --dev sublime-text-stubs
# or
pip install --upgrade sublime-text-stubs
Versioning
Versions follow the scheme 1.${st_build_version}.${patch}:
| Version | Sublime Text build | Embedded Python |
|---|---|---|
1.4200.* |
4200 (stable) | 3.8 |
1.4206.* |
4206 (dev) | 3.14 |
The leading 1 is the schema version of this package itself,
the middle segment is the Sublime Text build the stubs describe,
and the trailing segment is the patch level within that build.
This is deliberately not semantic versioning.
Pin the build you target:
sublime-text-stubs = "==1.4200.*"
Sublime Text 4 also still ships a legacy Python 3.3 runtime. It is scheduled for removal and is not targeted by this package.
Notes for plugin authors
-
Commands do not declare
run. Sublime Text invokes it with command-specific keyword arguments, so the stubs leave the signature to your subclass. Writedef run(self, **kwargs), ordef run(self, edit, **kwargs)for aTextCommand. -
is_enabled,is_visible,is_checkedanddescriptionreceive their command arguments the same dynamic way, but are declared without parameters.def is_enabled(self),def is_enabled(self, my_arg="")anddef is_enabled(self, **kwargs)all type-check. A required parameter is rejected, and correctly so: such an override also raisesTypeErrorat runtime when the command is invoked without that argument. -
TextChangeListener.bufferissublime.Buffer, neverNone. -
ValueLikeis what you pass in,Valueis what you get back. Every parameter a plugin hands a value to is annotatedValueLike, which accepts arbitrary sequences and mappings, so aList[str]variable can be passed directly even though the invariantlist[Value]would reject it:tags: List[str] = ["fix", "feature"] settings.set("tags", tags) sublime.encode_value(tags)
Two things it does not model. A
collections.abc.Mappingthat is not adicttype-checks asValueLike, but is rejected at runtime everywhere exceptSettings.update, which genuinely accepts any mapping. And a value that makes the round trip through Sublime Text comes back as a plainlistordict, not as the type that was passed;bytesin particular is accepted and arrives back aslist[int].sublime.Regionis rejected by both the checkers and the runtime. -
The input handlers are generic.
ListInputHandlerandsublime.ListInputItemtake a type parameter for the value the selected row passes to the command, and that value type is whatlist_items(),description(),preview(),validate()andconfirm()traffic in. You may parameterize on anything aValueLikeallows, soListInputHandler[List[str]]type-checks, while a bare annotation resolves toValue, which is what the runtime actually delivers.TextInputHandleris aCommandInputHandler[str]. A bareCommandInputHandler, as in the return types ofCommand.input()andnext_input(), still accepts every kind of handler, soOptional[sublime_plugin.CommandInputHandler]keeps working unchanged. The real classes cannot be subscripted on the Python 3.8 plugin host, so parameterize a base class through anif TYPE_CHECKING:alias and quote subscripted annotations:if TYPE_CHECKING: _StrListInputHandler = sublime_plugin.ListInputHandler[str] else: _StrListInputHandler = sublime_plugin.ListInputHandler class NameInputHandler(_StrListInputHandler): ...
-
Several
sublime_typesnames exist only in these stubs, not in the real module at runtime, so each must be imported inside anif TYPE_CHECKING:block:ModifierKeys, the type of themodifier_keysentry of anEvent.UIInfoand its partsUIInfoSystem,UIInfoTheme,UIInfoColorSchemeandUIInfoPalette, describing the return value ofsublime.ui_info().ScopeStyle, the return value ofView.style_for_scope().MacroStep, the entries of the listsublime.get_macro()returns.WindowLayout, used byWindow.layout(),Window.get_layout()andWindow.set_layout().WindowVariables, the return value ofWindow.extract_variables().FontOptions, the default and callback argument types ofchoose_font_dialog().ValueLike, the covariant companion toValue, accepted wherever a plugin passes a value into Sublime Text.CommandArgsLike, the same widening applied to commandargs, mirroringCommandArgs.
The stubs are not validated against the running editor, so divergences from the actual runtime API are possible. Please report any you find.
Contributing
See CONTRIBUTING.md for the project structure, how the stubs are generated and validated, and how to correct them.
License
Not yet chosen. See LICENSE.
Metadata
Release files for sublime-text-stubs 1.4200.0b2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sublime_text_stubs-1.4200.0b2.tar.gz | 72.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sublime_text_stubs-1.4200.0b2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 109.2 kB
Release files / sublime_text_stubs-1.4200.0b2.tar.gz
| Download URL | sublime_text_stubs-1.4200.0b2.tar.gz |
|---|---|
| Size | 72.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1e5742bd3eee20140c2b609f5f02544c67e445d0f09ea657c2404436b1fca5f0
|
|
BLAKE2b-256 checksum How to use checksums |
f77c895f90ef23ac3bc784b88e805d4e8fc26bfe3538f1dc7b0b661bde4b79d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency logRelease files / sublime_text_stubs-1.4200.0b2-py3-none-any.whl
| Download URL | sublime_text_stubs-1.4200.0b2-py3-none-any.whl |
|---|---|
| Size | 36.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
84ab71657d716533e4e269e242b6d3c5989e843f5ffe5fc1267be9e6d868e2e3
|
|
BLAKE2b-256 checksum How to use checksums |
6bec590cd176f8088128ce954d85260f02516a78a27fc93fed9c14e468b34734
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency log