Easier/better settings chaining
还没有人认领这个 Issue。
评估
调研方向
Start by reviewing the existing SettingsDict abstraction and the ChainMap-based examples in the issue, then compare their subscription and mutation behavior across view, window, and project settings. The issue is complete only after the project settles the API design, including chain modification, subscriptions, and project-data handling.
由索引模型根据 Issue 内容生成。
描述
Inspired by this forum thread.
Some packages want to allow package settings to be overridden per view, per window, and/or per project. We recommend using a ChainMap of SettingsDicts for this. However, this only works if all of the Settings objects use the same keys. In practice, packages should and often do cordon off the package-specific parts of view, window, and project settings. This is usually done in one of two ways:
- Prefixing the key (e.g.
my_settingin the global package settings,Example Package-my_settingin the view settings). - Putting all package settings under a struct (e.g.
Example Package→my_settingin the project settings).
Even with SettingsDict and ChainMap, this requires boilerplate to implement. Consider the following code sample from ESLint-Formatter:
@staticmethod
def get_pref(key):
global_settings = sublime.load_settings(SETTINGS_FILE)
value = global_settings.get(key)
# Load active project settings
project_settings = sublime.active_window().active_view().settings()
# Overwrite global config value if it's defined
if project_settings.has(PROJECT_NAME):
value = project_settings.get(PROJECT_NAME).get(key, value)
return value
This only handles two levels (package and project), is read-only, and relies on active_window(). but it's still a fair bit of code. Adding window and view settings would add yet more complication.
It would seem beneficial for sublime_lib to provide an abstraction for this pattern that is robust, full-featured, and easy to use. The simplest approach (in terms of implementation) would be to define simple dictionary decorators and rely on ChainMap:
settings = ChainMap(
PrefixedDict(SettingsDict(view.settings()), 'MySettings-'),
PrefixedDict(SettingsDict(window.settings()), 'MySettings-'),
NamedSettingsDict('MySettings')
)
This is still a fair bit of boilerplate, though. In addition, the ChainMap is missing the subscribe functionality that SettingsDict provides; a plugin would have to subscribe to each individually and manually check whether the value has changed.
A more usable solution would be a single constructor:
settings = SettingsChain('MySettings', window)
settings = SettingsChain('MySettings', view) # includes window implicitly?
This is a bit more opinionated than the user building their own stack piece-by-piece, but it's a lot more concise and would encourage consistency among packages that used it.
Questions:
- Does this generally sound like a reasonable feature to provide?
- What's the right balance of convenience without confusion?
- How should we handle modifying the chain? We could follow the ChainMap convention of modifying the top dict, or we could require that the user specify, e.g.
my_chain.view[key] = value. - What do we do about project data? It's not a real Settings, so even if we shimmed it there's no way to subscribe to changes.
- 主要语言
- Python
- 星标
- 56
- 派生
- 5
- 平均合并
- 19 分钟
- 30 天内合并 PR
- 4
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
SublimeText/sublime_lib 的其他 Issue
-
Conversion error未关闭
难度 2/5 1-3 小时 新手友好度 66/100
SublimeText/sublime_lib#210 · 1 条评论 ·
-
documentation
难度 3/5 1-2 天 新手友好度 35/100
SublimeText/sublime_lib#183 ·
-
documentation
难度 2/5 1-3 小时 新手友好度 38/100
SublimeText/sublime_lib#173 · 1 个 reaction ·
-
难度 5/5 一周以上 新手友好度 35/100
SublimeText/sublime_lib#164 · 1 条评论 ·
-
难度 5/5 一周以上 新手友好度 25/100
SublimeText/sublime_lib#141 · 2 条评论 ·
查看 SublimeText/sublime_lib 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 76/100
autowarefoundation/autoware_carla_scenario#1485 ·
维护者通常 1 天内回复
-
needs-area-label
难度 2/5 1-3 小时 新手友好度 66/100
维护者通常 2 天内回复
-
enhancement good first issue
难度 2/5 1-3 小时 新手友好度 84/100
Official-Space-AI/OpenPhysGraspGen#114 ·
维护者通常 2 天内回复
-
changelog investigate
难度 2/5 1-3 小时 新手友好度 62/100
ramnes/notion-sdk-py#441 ·
-
copy_tree splits same-file errors into characters可能已有人在做 @Gambit-Checkmate 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 14 天内回复