diff --git a/src/core/Decorations.ts b/src/core/Decorations.ts index ac78512ec2..bede357ebd 100644 --- a/src/core/Decorations.ts +++ b/src/core/Decorations.ts @@ -19,6 +19,7 @@ import { DEFAULT_HAT_HEIGHT_EM, DEFAULT_VERTICAL_OFFSET_EM, } from "./shapeAdjustments"; +import { CommandServerApi } from "../util/getExtensionApi"; export type DecorationMap = { [k in HatStyleName]?: vscode.TextEditorDecorationType; @@ -37,7 +38,8 @@ export default class Decorations { constructor( fontMeasurements: FontMeasurements, - private extensionPath: string + private extensionPath: string, + private commandServerApi: CommandServerApi | null ) { this.constructDecorations(fontMeasurements); } @@ -154,6 +156,13 @@ export default class Decorations { (shape) => shapeEnablement[shape] ); + if (this.commandServerApi != null) { + this.commandServerApi.globalState.update("cursorless.hatEnablement", { + colors: activeHatColors.filter((color) => color !== "default"), + shapes: activeNonDefaultHatShapes, + }); + } + this.hatStyleMap = { ...Object.fromEntries( activeHatColors.map((color) => [color, { color, shape: "default" }]) diff --git a/src/extension.ts b/src/extension.ts index a7965b94d2..683cb00baf 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -17,16 +17,21 @@ import { logBranchTypes } from "./util/debug"; import { TestCase } from "./testUtil/TestCase"; import { ThatMark } from "./core/ThatMark"; import { TestCaseRecorder } from "./testUtil/TestCaseRecorder"; -import { getParseTreeApi } from "./util/getExtensionApi"; +import { getCommandServerApi, getParseTreeApi } from "./util/getExtensionApi"; import { canonicalizeAndValidateCommand } from "./util/canonicalizeAndValidateCommand"; import canonicalizeActionName from "./util/canonicalizeActionName"; export async function activate(context: vscode.ExtensionContext) { + const { getNodeAtLocation } = await getParseTreeApi(); + const commandServerApi = await getCommandServerApi(); + const fontMeasurements = new FontMeasurements(context); await fontMeasurements.calculate(); - const decorations = new Decorations(fontMeasurements, context.extensionPath); - - const { getNodeAtLocation } = await getParseTreeApi(); + const decorations = new Decorations( + fontMeasurements, + context.extensionPath, + commandServerApi + ); var isActive = vscode.workspace .getConfiguration("cursorless") diff --git a/src/util/getExtensionApi.ts b/src/util/getExtensionApi.ts index 4cf4cc9fb8..84c6424e26 100644 --- a/src/util/getExtensionApi.ts +++ b/src/util/getExtensionApi.ts @@ -15,9 +15,20 @@ export interface ParseTreeApi { loadLanguage: (languageId: string) => Promise; } +export interface CommandServerApi { + globalState: vscode.Memento; + workspaceState: vscode.Memento; +} + export async function getExtensionApi(extensionId: string) { const extension = vscode.extensions.getExtension(extensionId); + return extension == null ? null : ((await extension.activate()) as T); +} + +export async function getExtensionApiStrict(extensionId: string) { + const extension = vscode.extensions.getExtension(extensionId); + if (extension == null) { throw new Error(`Could not get ${extensionId} extension`); } @@ -26,7 +37,14 @@ export async function getExtensionApi(extensionId: string) { } export const getCursorlessApi = () => - getExtensionApi("pokey.cursorless"); + getExtensionApiStrict("pokey.cursorless"); export const getParseTreeApi = () => - getExtensionApi("pokey.parse-tree"); + getExtensionApiStrict("pokey.parse-tree"); + +/** + * + * @returns Command server API or null if not installed + */ +export const getCommandServerApi = () => + getExtensionApi("pokey.command-server");