Easier/better settings chaining
まだ誰も着手していません。
評価
調査の方向性
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分
- マージ済み PR(30日)
- 4
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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 件 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
SublimeText/sublime_lib#164 · コメント 1 件 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
SublimeText/sublime_lib#141 · コメント 2 件 ·
SublimeText/sublime_lib の issue をすべて見る
似ている issue
-
curriculum documentation quality
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
githubnext/gh-aw-workshop#5367 ·
メンテナーはふだん 3 日以内に返信
-
Create Noise Latents ignores randomize_seed and produces the same noise every run対応中かも @griptapeops が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
griptape-ai/griptape-nodes-library-diffusers#127 ·
メンテナーはふだん 1 日以内に返信
-
Jenkins capacity report: metrics history is lost when archiving a month fails対応中かも @RaphaelFakhri が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
adoptium/infrastructure#4568 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
huggingface/deep-rl-class#723 ·
-
premises-missing
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
WingedGuardian/GENesis-AGI#3928 ·
メンテナーはふだん 1 日以内に返信