diff --git a/packages/vscode/package.json b/packages/vscode/package.json index ab53e7b7cc..e16a9f0b6b 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -60,6 +60,11 @@ "type": "boolean", "default": true, "description": "Enable/disable color preview decorations" + }, + "unocss.selectionStyle": { + "type": "boolean", + "default": true, + "description": "Enable/disable selection style decorations" } } } diff --git a/packages/vscode/src/index.ts b/packages/vscode/src/index.ts index 7996b7e530..ff78279ba8 100644 --- a/packages/vscode/src/index.ts +++ b/packages/vscode/src/index.ts @@ -6,6 +6,7 @@ import { log } from './log' import { registerAnnotations } from './annotation' import { registerAutoComplete } from './autocomplete' import { ContextLoader } from './contextLoader' +import { registerSelectionStyle } from './selectionStyle' export async function activate(ext: ExtensionContext) { log.appendLine(`⚪️ UnoCSS for VS Code v${version}\n`) @@ -50,6 +51,7 @@ export async function activate(ext: ExtensionContext) { registerAutoComplete(cwd, contextLoader, ext) registerAnnotations(cwd, contextLoader, status, ext) + registerSelectionStyle(cwd, contextLoader) } export function deactivate() {} diff --git a/packages/vscode/src/selectionStyle.ts b/packages/vscode/src/selectionStyle.ts new file mode 100644 index 0000000000..cda9af0f5d --- /dev/null +++ b/packages/vscode/src/selectionStyle.ts @@ -0,0 +1,90 @@ +import { MarkdownString, Position, Range, window, workspace } from 'vscode' +import parserCSS from 'prettier/parser-postcss' +import prettier from 'prettier/standalone' +import type { TextEditorSelectionChangeEvent } from 'vscode' +import { regexScopePlaceholder } from '@unocss/core' +import { log } from './log' +import { throttle } from './utils' +import type { ContextLoader } from './contextLoader' +import { getMatchedPositionsFromCode } from './integration' + +export async function registerSelectionStyle(cwd: string, contextLoader: ContextLoader) { + const hasSelectionStyle = (): boolean => workspace.getConfiguration().get('unocss.selectionStyle') ?? true + + const integrationDecoration = window.createTextEditorDecorationType({}) + + async function selectionStyle(editor: TextEditorSelectionChangeEvent) { + try { + if (!hasSelectionStyle()) + return reset() + + const doc = editor.textEditor.document + if (!doc) + return reset() + + const id = doc.uri.fsPath + const selection = editor.textEditor.selection + const range = new Range( + new Position(selection.start.line, selection.start.character), + new Position(selection.end.line, selection.end.character), + ) + let code = editor.textEditor.document.getText(range).trim() + if (!code.startsWith('<')) + code = `