Guidelines for using the IntelliJ Registry API. Use when working with registry keys or feature flags.
Guidelines for using the IntelliJ Registry API.
plugin.xml or registry.propertiesAlways prefer declaring in plugin.xml (not registry.properties):
<registryKey key="my.feature.enabled"
defaultValue="true"
description="Enables my feature"
restartRequired="false"/>
To override in a dependent plugin:
<registryKey key="my.feature.enabled"
defaultValue="false"
description="Enables my feature"
restartRequired="false"
overrides="true"/>
In suspending code:
val isEnabled = RegistryManager.getInstanceAsync().get("my.key")
In blocking code:
val isEnabled = RegistryManager.getInstance().get("my.key")
Access via Registry.get() or Registry.is() is effectively deprecated, since it might cause problems during early IDE startup.
Always prefer the RegistryManager when possible.
When code may run before COMPONENTS_LOADED state (e.g., during EULA dialog, splash screen),
you MUST use Registry.is(key, defaultValue) with an explicit default:
// Required for early startup code
Registry.`is`("my.key", false) // default must match registry.properties
How to find the default value:
community/platform/util/resources/misc/registry.properties<registryKey> declaration in plugin.xmlWhy: Registry.is(key) without default throws an exception if called before
LoadingState.COMPONENTS_LOADED. The safe overload returns the provided default
when Registry is not yet initialized.
For testing or run configurations:
-Dmy.registry.key=value
Use @RegistryKey annotation instead of Registry.get().setValue():
@Test
@RegistryKey(key = "my.registry.key", value = "true")
fun testWithRegistryEnabled() { ... }
See writing-tests.md for more test patterns.