Skip to content

Commit ef02bb1

Browse files
authored
feat(vscode): support configuration of languageIds via vscode settings (unocss#2374)
1 parent 97f5d17 commit ef02bb1

File tree

2 files changed

+52
-7
lines changed

2 files changed

+52
-7
lines changed

packages/vscode/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@
4040
"default": false,
4141
"description": "Disable the UnoCSS extension"
4242
},
43+
"unocss.languageIds": {
44+
"type": [
45+
"array"
46+
],
47+
"items": {
48+
"type": "string"
49+
}
50+
},
4351
"unocss.root": {
4452
"type": [
4553
"array",

packages/vscode/src/autocomplete.ts

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import type { UnocssAutocomplete } from '@unocss/autocomplete'
22
import { createAutocomplete } from '@unocss/autocomplete'
3-
import type { CompletionItemProvider, ExtensionContext } from 'vscode'
4-
import { CompletionItem, CompletionItemKind, CompletionList, MarkdownString, Range, languages } from 'vscode'
3+
import type { CompletionItemProvider, Disposable, ExtensionContext } from 'vscode'
4+
import { CompletionItem, CompletionItemKind, CompletionList, MarkdownString, Range, languages, window, workspace } from 'vscode'
55
import type { UnoGenerator, UnocssPluginContext } from '@unocss/core'
66
import { getCSS, getColorString, getPrettiedCSS, getPrettiedMarkdown, isSubdir } from './utils'
77
import { log } from './log'
88
import type { ContextLoader } from './contextLoader'
99
import { isCssId } from './integration'
1010

11-
const languageIds = [
11+
const defaultLanguageIds = [
1212
'erb',
1313
'haml',
1414
'hbs',
@@ -48,6 +48,7 @@ export async function registerAutoComplete(
4848
contextLoader: ContextLoader,
4949
ext: ExtensionContext,
5050
) {
51+
const allLanguages = await languages.getLanguages()
5152
const autoCompletes = new Map<UnocssPluginContext, UnocssAutocomplete>()
5253
contextLoader.events.on('contextReload', (ctx) => {
5354
autoCompletes.delete(ctx)
@@ -71,6 +72,21 @@ export async function registerAutoComplete(
7172
return new MarkdownString(await getPrettiedMarkdown(uno, util))
7273
}
7374

75+
function validateLanguages(targets: string[]) {
76+
const unValidLanguages: string[] = []
77+
const validLanguages = targets.filter((language) => {
78+
if (!allLanguages.includes(language)) {
79+
unValidLanguages.push(language)
80+
return false
81+
}
82+
return true
83+
})
84+
if (unValidLanguages.length)
85+
window.showWarningMessage(`These language configurations are illegal: ${unValidLanguages.join(',')}`)
86+
87+
return validLanguages
88+
}
89+
7490
const provider: CompletionItemProvider<UnoCompletionItem> = {
7591
async provideCompletionItems(doc, position) {
7692
const id = doc.uri.fsPath
@@ -134,11 +150,32 @@ export async function registerAutoComplete(
134150
},
135151
}
136152

137-
ext.subscriptions.push(
138-
languages.registerCompletionItemProvider(
139-
languageIds,
153+
let completeUnregister: Disposable
154+
155+
const registerProvider = () => {
156+
completeUnregister?.dispose?.()
157+
158+
const languagesIds: string[] = workspace.getConfiguration().get('unocss.languageIds') || []
159+
160+
const validLanguages = validateLanguages(languagesIds)
161+
162+
completeUnregister = languages.registerCompletionItemProvider(
163+
defaultLanguageIds.concat(validLanguages),
140164
provider,
141165
...delimiters,
142-
),
166+
)
167+
return completeUnregister
168+
}
169+
170+
ext.subscriptions.push(workspace.onDidChangeConfiguration(async (event) => {
171+
if (event.affectsConfiguration('unocss.languageIds')) {
172+
ext.subscriptions.push(
173+
registerProvider(),
174+
)
175+
}
176+
}))
177+
178+
ext.subscriptions.push(
179+
registerProvider(),
143180
)
144181
}

0 commit comments

Comments
 (0)