Theia APIs——Preferences

  • 时间:
  • 浏览:0
  • 来源:大发uu快3_uu快3概率_大发uu快3概率

上一篇:Theia APIs——命令和快捷键

Preferences

  Theia有有另另一个多多preference service,模块可不可以 通过它来获取preference的值,提供默认的preferences以及监听preference的更改。

  Preferences的内容可不可以 保占据 workspace根目录下的.theia/settings.json中,有之前 Linux系统的$HOME/.theia/settings.json文件中。在Windows系统中,用户设置默认保占据 %USERPROFILE%/.theia/settings.json文件中(这类c:\Users\epatpol\.theia\settings.json)。

  所有那些文件都可不可以 包蕴含有另另一个多有效的JSON,其中蕴含preferences的名称和值(注意下面例子中的preference可不可以 官方指定的,这里仅作为有有另另一个多示例)。如有可不可以 ,你不可不可以 在settings.json文件中加进注释。如:

{
    // Enable/Disable the line numbers in the monaco editor
    "monaco.lineNumbers": "off",
    // Tab width in the editor
    "monaco.tabWidth": 4,
    "fs.watcherExcludes": "path/to/file"
}

  亲戚亲戚.我都.我都以filesystem作为示例,它是使用preference service的有有另另一个多模块。

使用inversity创建具有默认preferences的模块

  为了提供preference的值,模块可不可以 提供有有另另一个多有效的json schema,用来验证所提供的值。模块可不可以 像下面有有另另一个多 将PreferenceContributton绑定到值:

export interface PreferenceSchema {
    [name: string]: Object,
    properties: {
        [name: string]: object
    }
}

export interface PreferenceContribution {
    readonly schema: PreferenceSchema;
}

  这类,filesystem中的代码:

export const filesystemPreferenceSchema: PreferenceSchema = {
    "type": "object",
    "properties": {
        "files.watcherExclude": {
            "description": "List of paths to exclude from the filesystem watcher",
            "additionalProperties": {
                "type": "boolean"
            }
        }
    }
};

bind(PreferenceContribution).toConstantValue(
{ 
    schema: filesystemPreferenceSchema 
});

  下面是你这俩 有关提供验证的schema的链接:

通过配置监听preference的更改

  要使用preference的值,只需从容器中获得注入的PreferenceService。

const preferences = ctx.container.get(PreferenceService);

   对filesystem而言,服务在一开使绑定的之前 获取。这里,之前 使用onPreferenceChanged依据来注册preference更改的回调。

constructor(@inject(PreferenceService) protected readonly prefService: PreferenceService
    prefService.onPreferenceChanged(e => { callback }

  这里,事件接收到的对象e是下面你这俩 类型:

export interface PreferenceChangedEvent {
    readonly preferenceName: string;
    readonly newValue?: any;
    readonly oldValue?: any;
}

   实在亲戚亲戚.我都.我都可不可以 在类中直接有有另另一个多 使用,不过filesystem提供了有有另另一个多特定于filesystem preferences的代理preference服务(该服务在后台运行),有有另另一个多 可不可以 很快、更有效地搜索preference(有之前 它在filesystem preference service中进行搜索,而可不可以 通过更通用的preference service搜索所有的内容)。从某种生活意义上来说,它也更高效,有之前 只能那些监视与某个模块相关的特定preferences的模块才会得到通知。要做到你这俩 点,可不可以 看看有关filesystem配置的代理接口是怎样才能绑定使用preference代理接口的:

export type PreferenceProxy<T> = Readonly<T> & Disposable & PreferenceEventEmitter<T>;
export function createPreferenceProxy<T extends Configuration>(preferences: PreferenceService, configuration: T): PreferenceProxy<T> {
    /* Register a client to the preference server
    When a preference is received, it is validated against the schema and then fired if valid, otherwise the default value is provided.

    This proxy is also in charge of calling the configured preference service when the proxy object is called i.e editorPrefs['preferenceName']

    It basically forwards methods to the real object, i.e dispose/ready etc.
}

  要使用你这俩 代理,只可不可以 将它绑定到有有另另一个多新类型X = PreferenceProxy<CONFIGURATION_INTERFACE>,有之前 使用上方的依据bind(X)到有有另另一个多代理。

export interface FileSystemConfiguration {
    'files.watcherExclude': { [globPattern: string]: boolean }
}

export const FileSystemPreferences = Symbol('FileSystemPreferences');
export type FileSystemPreferences = PreferenceProxy<FileSystemConfiguration>;

export function createFileSystemPreferences(preferences: PreferenceService): FileSystemPreferences {
    return createPreferenceProxy(preferences, defaultFileSystemConfiguration, filesystemPreferenceSchema);
}

export function bindFileSystemPreferences(bind: interfaces.Bind): void {

    bind(FileSystemPreferences).toDynamicValue(ctx => {
        const preferences = ctx.container.get(PreferenceService);
        return createFileSystemPreferences(preferences);
    });

    bind(PreferenceContribution).toConstantValue({ schema: filesystemPreferenceSchema });

}

  最后,在模块中使用filesystem配置,只可不可以 将它注入到你可不可以 的地方。之前 像有有另另一个多 访问preference(以filesystem为例):

const patterns = this.preferences['files.watcherExclude'];

  你不可不可以 像有有另另一个多 监听preference的更改:

this.toDispose.push(preferences.onPreferenceChanged(e => {
    if (e.preferenceName === 'files.watcherExclude') {
        this.toRestartAll.dispose();
    }
}));
constructor(...,
        @inject(FileSystemPreferences) protected readonly preferences: FileSystemPreferences) {
    ...
         this.toDispose.push(preferences.onPreferenceChanged(e => {
            if (e.preferenceName === 'files.watcherExclude') {
                this.toRestartAll.dispose();
            }
        }));
    ...
}

Preference的修改流程

  当在${workspace}/.theia/有之前 os.homedir()/.theia/中修改settings.json的内容时,JSON preference服务器会触发有有另另一个多事件。首先,CompoundPreferenceServer用来管理不同的服务器(作用域),这类workspace/user/defaults(提供上方说的contributions)。接下来,PreferenceService管理该服务器并在其加进进更多api以方便调用(这类getBoolean,getSrtring等等),它同時 还允许客户端监听preference的修改。你这俩 PreferenceService可不可以 直接或通过特定的代理(如上方你这俩 filesystem配置)被注入到模块中。

  当preference被修改时,对应的流程是:

.theia/settings.json -> JsonPreferenceServer -> CompoundPreferenceServer -> PreferenceService -> PreferenceProxy<FileSystemConfiguration> -> FileSystemWatcher

获取preference的值

  对于filesystem来说,亲戚亲戚.我都.我都可不可以 使用与上方相同的代理配置来访问preference的内容。

    if (this.prefService['preferenceName']) {
    ...
    }
    
    if (this.prefService['preferenceName2']) {
    ...
    }
})

  它能正常工作,正如亲戚亲戚.我都.我都在上方所看一遍的那样,代理将简单地调用prefService.get('preferenceName')。

TODO/FIXME

  • 在CompoundPreferenceServer中加进server优先级

  • 当在theia的settings.json中修改内容时加进自动完成和描述功能

原文地址:https://theia-ide.org/docs/preferences