配置管理 API
Trae IDE 提供了灵活的配置管理系统,允许用户和扩展自定义编辑器的行为和外观。
概述
配置管理 API 支持:
- 用户设置管理
- 工作区配置
- 扩展配置
- 配置监听和更新
配置层级
Trae IDE 使用分层配置系统:
- 默认配置 - 系统默认设置
- 用户配置 - 全局用户设置
- 工作区配置 - 特定工作区设置
- 文件夹配置 - 特定文件夹设置
主要接口
Configuration 对象
typescript
interface Configuration {
// 获取配置值
get<T>(section: string): T | undefined
get<T>(section: string, defaultValue: T): T
// 检查配置是否存在
has(section: string): boolean
// 更新配置
update(section: string, value: any, target?: ConfigurationTarget): Promise<void>
// 获取配置详情
inspect<T>(section: string): ConfigurationInspect<T> | undefined
}配置目标
typescript
enum ConfigurationTarget {
Global = 1, // 全局配置
Workspace = 2, // 工作区配置
WorkspaceFolder = 3 // 工作区文件夹配置
}基本用法
读取配置
typescript
import { workspace } from 'trae-api'
// 获取编辑器配置
const config = workspace.getConfiguration('editor')
// 读取字体大小
const fontSize = config.get<number>('fontSize', 14)
// 读取主题设置
const theme = config.get<string>('theme')更新配置
typescript
// 更新全局配置
await config.update('fontSize', 16, ConfigurationTarget.Global)
// 更新工作区配置
await config.update('tabSize', 2, ConfigurationTarget.Workspace)检查配置来源
typescript
// 检查配置的详细信息
const fontSizeInspect = config.inspect('fontSize')
console.log('默认值:', fontSizeInspect?.defaultValue)
console.log('全局值:', fontSizeInspect?.globalValue)
console.log('工作区值:', fontSizeInspect?.workspaceValue)配置监听
监听配置变化
typescript
import { workspace } from 'trae-api'
// 监听所有配置变化
workspace.onDidChangeConfiguration((event) => {
if (event.affectsConfiguration('editor.fontSize')) {
console.log('字体大小已更改')
updateFontSize()
}
if (event.affectsConfiguration('editor.theme')) {
console.log('主题已更改')
updateTheme()
}
})特定配置监听
typescript
// 只监听特定配置节的变化
workspace.onDidChangeConfiguration((event) => {
// 检查是否影响特定配置
if (event.affectsConfiguration('myExtension')) {
const newConfig = workspace.getConfiguration('myExtension')
handleConfigurationChange(newConfig)
}
}, null, context.subscriptions)配置架构
定义配置架构
typescript
// 在 package.json 中定义配置架构
{
"contributes": {
"configuration": {
"title": "我的扩展",
"properties": {
"myExtension.enable": {
"type": "boolean",
"default": true,
"description": "启用我的扩展"
},
"myExtension.maxItems": {
"type": "number",
"default": 10,
"minimum": 1,
"maximum": 100,
"description": "最大项目数量"
},
"myExtension.theme": {
"type": "string",
"enum": ["light", "dark", "auto"],
"default": "auto",
"description": "主题设置"
}
}
}
}
}高级用法
配置验证
typescript
function validateConfiguration(config: any): boolean {
// 验证配置值的有效性
if (typeof config.maxItems !== 'number' || config.maxItems < 1) {
return false
}
if (!['light', 'dark', 'auto'].includes(config.theme)) {
return false
}
return true
}
// 使用验证
const config = workspace.getConfiguration('myExtension')
if (!validateConfiguration(config)) {
console.error('配置无效')
}配置迁移
typescript
// 处理配置版本迁移
function migrateConfiguration() {
const config = workspace.getConfiguration('myExtension')
const version = config.get<string>('version', '1.0.0')
if (version === '1.0.0') {
// 从 1.0.0 迁移到 2.0.0
const oldSetting = config.get('oldSetting')
if (oldSetting !== undefined) {
config.update('newSetting', transformOldSetting(oldSetting))
config.update('oldSetting', undefined) // 删除旧设置
}
config.update('version', '2.0.0')
}
}实用示例
动态配置更新
typescript
class ConfigurationManager {
private config: Configuration
constructor() {
this.config = workspace.getConfiguration('myExtension')
this.setupConfigurationWatcher()
}
private setupConfigurationWatcher() {
workspace.onDidChangeConfiguration((event) => {
if (event.affectsConfiguration('myExtension')) {
this.config = workspace.getConfiguration('myExtension')
this.applyConfiguration()
}
})
}
private applyConfiguration() {
const enabled = this.config.get<boolean>('enable', true)
const theme = this.config.get<string>('theme', 'auto')
if (enabled) {
this.enableFeature()
} else {
this.disableFeature()
}
this.applyTheme(theme)
}
}配置备份和恢复
typescript
// 备份当前配置
function backupConfiguration(): any {
const config = workspace.getConfiguration()
return {
editor: config.get('editor'),
workbench: config.get('workbench'),
extensions: config.get('extensions')
}
}
// 恢复配置
async function restoreConfiguration(backup: any): Promise<void> {
const config = workspace.getConfiguration()
for (const [section, value] of Object.entries(backup)) {
await config.update(section, value, ConfigurationTarget.Global)
}
}最佳实践
- 默认值: 始终为配置项提供合理的默认值
- 验证: 验证用户输入的配置值
- 文档: 为每个配置项提供清晰的描述
- 向后兼容: 处理配置架构的变更和迁移
- 性能: 避免频繁读取配置,考虑缓存机制