• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

TextMate is a graphical text editor for OS X 10.7+


Commit MetaInfo

修订版3c79f275f1a504aa3fedf6b4aca600fc7ed808f6 (tree)
时间2012-08-24 00:15:12
作者Allan Odgaard <git@abet...>
CommiterAllan Odgaard

Log Message

Use constants for settings keys

更改概述

差异

--- a/Frameworks/DocumentWindow/src/DocumentController.mm
+++ b/Frameworks/DocumentWindow/src/DocumentController.mm
@@ -601,7 +601,7 @@ NSString* const kUserDefaultsFileBrowserPlacementKey = @"fileBrowserPlacement";
601601 {
602602 D(DBF_DocumentController, bug("\n"););
603603 scratchDocument = oak::uuid_t();
604- [self addDocuments:std::vector<document::document_ptr>(1, document::from_content("", settings_for_path(NULL_STR, file::path_attributes(NULL_STR), to_s(self.fileBrowserPath)).get("fileType", "text.plain"))) atIndex:documentTabs.size() andSelect:kSelectDocumentFirst closeOther:NO pruneTabBar:NO];
604+ [self addDocuments:std::vector<document::document_ptr>(1, document::from_content("", settings_for_path(NULL_STR, file::path_attributes(NULL_STR), to_s(self.fileBrowserPath)).get(kSettingsFileTypeKey, "text.plain"))) atIndex:documentTabs.size() andSelect:kSelectDocumentFirst closeOther:NO pruneTabBar:NO];
605605 }
606606
607607 // =========================
@@ -612,7 +612,7 @@ NSString* const kUserDefaultsFileBrowserPlacementKey = @"fileBrowserPlacement";
612612 {
613613 D(DBF_DocumentController, bug("\n"););
614614 scratchDocument = oak::uuid_t();
615- [self addDocuments:std::vector<document::document_ptr>(1, document::from_content("", settings_for_path(NULL_STR, file::path_attributes(NULL_STR), to_s(self.fileBrowserPath)).get("fileType", "text.plain"))) andSelect:kSelectDocumentFirst closeOther:NO pruneTabBar:YES];
615+ [self addDocuments:std::vector<document::document_ptr>(1, document::from_content("", settings_for_path(NULL_STR, file::path_attributes(NULL_STR), to_s(self.fileBrowserPath)).get(kSettingsFileTypeKey, "text.plain"))) andSelect:kSelectDocumentFirst closeOther:NO pruneTabBar:YES];
616616 }
617617
618618 - (BOOL)openFile:(NSString*)aPath
@@ -651,8 +651,8 @@ NSString* const kUserDefaultsFileBrowserPlacementKey = @"fileBrowserPlacement";
651651 }
652652
653653 settings_t const settings = [self selectedDocument]->settings();
654- path::glob_t const excludeGlob(settings.get("exclude", ""));
655- path::glob_t const binaryGlob(settings.get("binary", ""));
654+ path::glob_t const excludeGlob(settings.get(kSettingsExcludeKey, ""));
655+ path::glob_t const binaryGlob(settings.get(kSettingsBinaryKey, ""));
656656
657657 std::vector<std::string> v;
658658 iterate(path, candidates)
@@ -1220,7 +1220,7 @@ static std::string parent_or_home (std::string const& path)
12201220 - (NSString*)projectPath
12211221 {
12221222 settings_t const& settings = documentTabs.empty() || [self selectedDocument]->path() == NULL_STR ? settings_for_path(NULL_STR, "", to_s(self.fileBrowserPath)) : [self selectedDocument]->settings();
1223- return [NSString stringWithCxxString:settings.get("projectDirectory", NULL_STR)] ?: self.fileBrowserPath ?: self.documentPath;
1223+ return [NSString stringWithCxxString:settings.get(kSettingsProjectDirectoryKey, NULL_STR)] ?: self.fileBrowserPath ?: self.documentPath;
12241224 }
12251225
12261226 - (NSString*)fileBrowserPath
@@ -1335,7 +1335,7 @@ static std::string parent_or_home (std::string const& path)
13351335 static std::string file_chooser_glob (std::string const& path)
13361336 {
13371337 settings_t const& settings = settings_for_path(NULL_STR, "", path);
1338- std::string const propertyKeys[] = { "includeFilesInFileChooser", "includeInFileChooser", "includeFiles", "include" };
1338+ std::string const propertyKeys[] = { kSettingsIncludeFilesInFileChooserKey, kSettingsIncludeInFileChooserKey, kSettingsIncludeFilesKey, kSettingsIncludeKey };
13391339 iterate(key, propertyKeys)
13401340 {
13411341 if(settings.has(*key))
--- a/Frameworks/DocumentWindow/src/DocumentTabs.mm
+++ b/Frameworks/DocumentWindow/src/DocumentTabs.mm
@@ -42,7 +42,7 @@ namespace
4242
4343 // This is also set after open succeeds
4444 settings_t const& settings = [self selectedDocument]->settings();
45- self.windowTitle = [NSString stringWithCxxString:settings.get("windowTitle", [self selectedDocument]->display_name())];
45+ self.windowTitle = [NSString stringWithCxxString:settings.get(kSettingsWindowTitleKey, [self selectedDocument]->display_name())];
4646 self.representedFile = [NSString stringWithCxxString:[self selectedDocument]->path()];
4747 self.isDocumentEdited = [self selectedDocument]->is_modified();
4848
@@ -77,7 +77,7 @@ namespace
7777 if(*aDocument == *[self selectedDocument])
7878 {
7979 settings_t const& settings = [self selectedDocument]->settings();
80- self.windowTitle = [NSString stringWithCxxString:settings.get("windowTitle", [self selectedDocument]->display_name())];
80+ self.windowTitle = [NSString stringWithCxxString:settings.get(kSettingsWindowTitleKey, [self selectedDocument]->display_name())];
8181 self.representedFile = [NSString stringWithCxxString:[self selectedDocument]->path()];
8282 self.isDocumentEdited = [self selectedDocument]->is_modified();
8383 }
@@ -284,7 +284,7 @@ namespace
284284 }
285285
286286 settings_t const& settings = aDocument->settings();
287- self.windowTitle = [NSString stringWithCxxString:settings.get("windowTitle", aDocument->display_name())];
287+ self.windowTitle = [NSString stringWithCxxString:settings.get(kSettingsWindowTitleKey, aDocument->display_name())];
288288 self.representedFile = [NSString stringWithCxxString:aDocument->path()];
289289 self.isDocumentEdited = aDocument->is_modified();
290290
--- a/Frameworks/Find/src/Find.mm
+++ b/Frameworks/Find/src/Find.mm
@@ -245,7 +245,7 @@ NSString* const FolderOptionsDefaultsKey = @"Folder Search Options";
245245 std::string excludeGlob = "";
246246 if(![controller.searchIn isEqualToString:FFSearchInOpenFiles])
247247 {
248- static std::string const excludeKeys[] = { "excludeInFolderSearch", "exclude" };
248+ static std::string const excludeKeys[] = { kSettingsExcludeInFolderSearchKey, kSettingsExcludeKey };
249249 for(size_t i = 0; i < sizeofA(excludeKeys) && excludeGlob == ""; ++i)
250250 excludeGlob = settings_for_path(NULL_STR, "", to_s(controller.searchFolder)).get(excludeKeys[i], "");
251251 }
--- a/Frameworks/OakFileBrowser/src/io/FSDirectoryDataSource.mm
+++ b/Frameworks/OakFileBrowser/src/io/FSDirectoryDataSource.mm
@@ -91,10 +91,10 @@ namespace
9191 {
9292 request_t (std::string const& path = NULL_STR, NSUInteger options = 0) : _path(path), _options(options), _include_file_glob(""), _include_folder_glob(""), _exclude_file_glob(""), _exclude_folder_glob("")
9393 {
94- static std::string const includeFileKeys[] = { "includeFilesInBrowser", "includeInBrowser", "includeFiles", "include" };
95- static std::string const includeFolderKeys[] = { "includeDirectoriesInBrowser", "includeInBrowser", "includeDirectories", "include" };
96- static std::string const excludeFileKeys[] = { "excludeFilesInBrowser", "excludeInBrowser", "excludeFiles", "exclude" };
97- static std::string const excludeFolderKeys[] = { "excludeDirectoriesInBrowser", "excludeInBrowser", "excludeDirectories", "exclude" };
94+ static std::string const includeFileKeys[] = { kSettingsIncludeFilesInBrowserKey, kSettingsIncludeInBrowserKey, kSettingsIncludeFilesKey, kSettingsIncludeKey };
95+ static std::string const includeFolderKeys[] = { kSettingsIncludeDirectoriesInBrowserKey, kSettingsIncludeInBrowserKey, kSettingsIncludeDirectoriesKey, kSettingsIncludeKey };
96+ static std::string const excludeFileKeys[] = { kSettingsExcludeFilesInBrowserKey, kSettingsExcludeInBrowserKey, kSettingsExcludeFilesKey, kSettingsExcludeKey };
97+ static std::string const excludeFolderKeys[] = { kSettingsExcludeDirectoriesInBrowserKey, kSettingsExcludeInBrowserKey, kSettingsExcludeDirectoriesKey, kSettingsExcludeKey };
9898
9999 settings_t const& settings = settings_for_path(NULL_STR, "", path);
100100
--- a/Frameworks/OakFilterList/src/datasources/OakFileChooser.mm
+++ b/Frameworks/OakFilterList/src/datasources/OakFileChooser.mm
@@ -177,7 +177,7 @@ void file_chooser_t::set_path (std::string const& path)
177177 _ranked_items.clear();
178178
179179 std::string excludeGlob = "";
180- static std::string const excludeKeys[] = { "excludeInFileChooser", "exclude" };
180+ static std::string const excludeKeys[] = { kSettingsExcludeInFileChooserKey, kSettingsExcludeKey };
181181 for(size_t i = 0; i < sizeofA(excludeKeys) && excludeGlob == ""; ++i)
182182 excludeGlob = settings_for_path(NULL_STR, "", path).get(excludeKeys[i], "");
183183
--- a/Frameworks/OakTextView/src/OakDocumentView.mm
+++ b/Frameworks/OakTextView/src/OakDocumentView.mm
@@ -127,7 +127,7 @@ private:
127127
128128 std::string themeUUID = to_s([[NSUserDefaults standardUserDefaults] stringForKey:kUserDefaultsThemeUUIDKey]);
129129 if(themeUUID == NULL_STR)
130- themeUUID = settings.get("theme", "71D40D9D-AE48-11D9-920A-000D93589AF6");
130+ themeUUID = settings.get(kSettingsThemeKey, "71D40D9D-AE48-11D9-920A-000D93589AF6");
131131
132132 [self setThemeWithUUID:[NSString stringWithCxxString:themeUUID]];
133133
--- a/Frameworks/OakTextView/src/OakTextView.mm
+++ b/Frameworks/OakTextView/src/OakTextView.mm
@@ -386,9 +386,9 @@ static std::string shell_quote (std::vector<std::string> paths)
386386 settings_t const& settings = document->settings();
387387
388388 editor = ng::editor_for_document(document);
389- wrapColumn = settings.get("wrapColumn", wrapColumn);
390- layout.reset(new ng::layout_t(document->buffer(), theme, fontName, fontSize, settings.get("softWrap", false), wrapColumn, document->folded()));
391- if(settings.get("showWrapColumn", false))
389+ wrapColumn = settings.get(kSettingsWrapColumnKey, wrapColumn);
390+ layout.reset(new ng::layout_t(document->buffer(), theme, fontName, fontSize, settings.get(kSettingsSoftWrapKey, false), wrapColumn, document->folded()));
391+ if(settings.get(kSettingsShowWrapColumnKey, false))
392392 layout->set_draw_wrap_column(true);
393393
394394 BOOL hasFocus = (self.keyState & (OakViewViewIsFirstResponderMask|OakViewWindowIsKeyMask|OakViewApplicationIsActiveMask)) == (OakViewViewIsFirstResponderMask|OakViewWindowIsKeyMask|OakViewApplicationIsActiveMask);
@@ -439,9 +439,9 @@ static std::string shell_quote (std::vector<std::string> paths)
439439 CGFloat defaultFontSize = [[NSUserDefaults standardUserDefaults] floatForKey:kUserDefaultsFontSizeKey] ?: [defaultFont pointSize];
440440
441441 theme = parse_theme(bundles::item_ptr()); // set a fallback theme, OakDocumentView will call setThemeWithUUID: later
442- fontName = settings.get("fontName", to_s(defaultFontName));
443- fontSize = settings.get("fontSize", (int32_t)defaultFontSize);
444- showInvisibles = settings.get("showInvisibles", false);
442+ fontName = settings.get(kSettingsFontNameKey, to_s(defaultFontName));
443+ fontSize = settings.get(kSettingsFontSizeKey, (int32_t)defaultFontSize);
444+ showInvisibles = settings.get(kSettingsShowInvisiblesKey, false);
445445 antiAlias = ![[NSUserDefaults standardUserDefaults] boolForKey:kUserDefaultsDisableAntiAliasKey];
446446
447447 [self registerForDraggedTypes:[[self class] dropTypes]];
--- a/Frameworks/document/src/document.cc
+++ b/Frameworks/document/src/document.cc
@@ -485,10 +485,10 @@ namespace document
485485 return false;
486486
487487 settings_t const& settings = settings_for_path(path);
488- if(settings.has("binary"))
488+ if(settings.has(kSettingsBinaryKey))
489489 {
490- D(DBF_Document_Binary, bug(".tm_properties reports it as binary: %s\n", BSTR(path::glob_t(settings.get("binary", "")).does_match(path))););
491- return path::glob_t(settings.get("binary", "")).does_match(path);
490+ D(DBF_Document_Binary, bug(".tm_properties reports it as binary: %s\n", BSTR(path::glob_t(settings.get(kSettingsBinaryKey, "")).does_match(path))););
491+ return path::glob_t(settings.get(kSettingsBinaryKey, "")).does_match(path);
492492 }
493493
494494 return false;
@@ -546,9 +546,9 @@ namespace document
546546 }
547547
548548 settings_t const& settings = this->settings();
549- _buffer->indent() = text::indent_t(settings.get("tabSize", 4), SIZE_T_MAX, settings.get("softTabs", false));
550- _buffer->set_spelling_language(settings.get("spellingLanguage", "en"));
551- _buffer->set_live_spelling(settings.get("spellChecking", false));
549+ _buffer->indent() = text::indent_t(settings.get(kSettingsTabSizeKey, 4), SIZE_T_MAX, settings.get(kSettingsSoftTabsKey, false));
550+ _buffer->set_spelling_language(settings.get(kSettingsSpellingLanguageKey, "en"));
551+ _buffer->set_live_spelling(settings.get(kSettingsSpellCheckingKey, false));
552552
553553 const_cast<document_t*>(this)->broadcast(callback_t::did_change_indent_settings);
554554
--- a/Frameworks/file/src/open.cc
+++ b/Frameworks/file/src/open.cc
@@ -436,7 +436,7 @@ namespace
436436 break;
437437
438438 case kEstimateEncodingStatePathSettings:
439- _encoding = settings_for_path(_path, "attr.file.unknown-encoding " + file::path_attributes(_path)).get("encoding", kCharsetUnknown);
439+ _encoding = settings_for_path(_path, "attr.file.unknown-encoding " + file::path_attributes(_path)).get(kSettingsEncodingKey, kCharsetUnknown);
440440 break;
441441
442442 case kEstimateEncodingStateAskUser:
--- a/Frameworks/file/src/path_info.cc
+++ b/Frameworks/file/src/path_info.cc
@@ -144,7 +144,7 @@ namespace file
144144 }
145145 }
146146
147- res.push_back(settings_for_path(path, text::join(res, " ")).get("scopeAttributes", ""));
147+ res.push_back(settings_for_path(path, text::join(res, " ")).get(kSettingsScopeAttributesKey, ""));
148148 res.erase(std::remove(res.begin(), res.end(), ""), res.end());
149149 return text::join(res, " ");
150150 }
--- a/Frameworks/file/src/save.cc
+++ b/Frameworks/file/src/save.cc
@@ -332,11 +332,11 @@ namespace
332332 _select_encoding_state = kSelectEncodingStateAskUser;
333333
334334 settings_t const& settings = settings_for_path(_path);
335- std::string encoding = settings.get("encoding", kCharsetNoEncoding);
335+ std::string encoding = settings.get(kSettingsEncodingKey, kCharsetNoEncoding);
336336 if(encoding != kCharsetNoEncoding)
337337 {
338338 _encoding = encoding;
339- _bom = settings.get("useBOM", false);
339+ _bom = settings.get(kSettingsUseBOMKey, false);
340340 }
341341 else if(_encoding == kCharsetNoEncoding)
342342 {
@@ -469,7 +469,7 @@ namespace file
469469 // ==============
470470
471471 // bool hasEncoding = path::get_attr(path, "com.apple.TextEncoding") != NULL_STR;
472- // bool storeEncoding = dstSettings.get("storeEncodingPerFile", hasEncoding);
472+ // bool storeEncoding = dstSettings.get(kSettingsStoreEncodingPerFileKey, hasEncoding);
473473 // if(storeEncoding || hasEncoding)
474474 // path::set_attr(path, "com.apple.TextEncoding", storeEncoding ? encoding : NULL_STR);
475475
--- a/Frameworks/file/src/type.cc
+++ b/Frameworks/file/src/type.cc
@@ -136,7 +136,7 @@ static std::string file_type_from_bytes (io::bytes_ptr const& bytes)
136136 static std::string find_file_type (std::string const& path, io::bytes_ptr const& bytes, std::string const& virtualPath = NULL_STR)
137137 {
138138 // FIXME we need to use “current” folder when getting (fileType) settings
139- std::string res = settings_for_path(path, file::path_attributes(path)).get("fileType", NULL_STR);
139+ std::string res = settings_for_path(path, file::path_attributes(path)).get(kSettingsFileTypeKey, NULL_STR);
140140
141141 if(res == NULL_STR && (virtualPath != NULL_STR || path != NULL_STR))
142142 res = user_bindings().grammar_for(virtualPath != NULL_STR ? virtualPath : path);
@@ -148,7 +148,7 @@ static std::string find_file_type (std::string const& path, io::bytes_ptr const&
148148 res = file_type_from_path(virtualPath != NULL_STR ? virtualPath : path);
149149
150150 if(res == NULL_STR)
151- res = settings_for_path(path, "attr.file.unknown-type " + file::path_attributes(path)).get("fileType", NULL_STR);
151+ res = settings_for_path(path, "attr.file.unknown-type " + file::path_attributes(path)).get(kSettingsFileTypeKey, NULL_STR);
152152
153153 return res;
154154 }
--- /dev/null
+++ b/Frameworks/settings/src/keys.cc
@@ -0,0 +1,44 @@
1+#include "keys.h"
2+
3+std::string const kSettingsFileTypeKey = "fileType";
4+
5+std::string const kSettingsTabSizeKey = "tabSize";
6+std::string const kSettingsSoftTabsKey = "softTabs";
7+
8+std::string const kSettingsSpellCheckingKey = "spellChecking";
9+std::string const kSettingsSpellingLanguageKey = "spellingLanguage";
10+
11+std::string const kSettingsThemeKey = "theme";
12+std::string const kSettingsFontNameKey = "fontName";
13+std::string const kSettingsFontSizeKey = "fontSize";
14+std::string const kSettingsSoftWrapKey = "softWrap";
15+std::string const kSettingsWrapColumnKey = "wrapColumn";
16+std::string const kSettingsShowWrapColumnKey = "showWrapColumn";
17+std::string const kSettingsShowInvisiblesKey = "showInvisibles";
18+
19+std::string const kSettingsProjectDirectoryKey = "projectDirectory";
20+std::string const kSettingsWindowTitleKey = "windowTitle";
21+std::string const kSettingsScopeAttributesKey = "scopeAttributes";
22+
23+std::string const kSettingsBinaryKey = "binary";
24+std::string const kSettingsEncodingKey = "encoding";
25+std::string const kSettingsUseBOMKey = "useBOM";
26+std::string const kSettingsStoreEncodingPerFileKey = "storeEncodingPerFile";
27+
28+std::string const kSettingsIncludeKey = "include";
29+std::string const kSettingsIncludeDirectoriesKey = "includeDirectories";
30+std::string const kSettingsIncludeDirectoriesInBrowserKey = "includeDirectoriesInBrowser";
31+std::string const kSettingsIncludeFilesKey = "includeFiles";
32+std::string const kSettingsIncludeFilesInBrowserKey = "includeFilesInBrowser";
33+std::string const kSettingsIncludeFilesInFileChooserKey = "includeFilesInFileChooser";
34+std::string const kSettingsIncludeInBrowserKey = "includeInBrowser";
35+std::string const kSettingsIncludeInFileChooserKey = "includeInFileChooser";
36+
37+std::string const kSettingsExcludeKey = "exclude";
38+std::string const kSettingsExcludeDirectoriesKey = "excludeDirectories";
39+std::string const kSettingsExcludeDirectoriesInBrowserKey = "excludeDirectoriesInBrowser";
40+std::string const kSettingsExcludeFilesKey = "excludeFiles";
41+std::string const kSettingsExcludeFilesInBrowserKey = "excludeFilesInBrowser";
42+std::string const kSettingsExcludeInBrowserKey = "excludeInBrowser";
43+std::string const kSettingsExcludeInFileChooserKey = "excludeInFileChooser";
44+std::string const kSettingsExcludeInFolderSearchKey = "excludeInFolderSearch";
--- /dev/null
+++ b/Frameworks/settings/src/keys.h
@@ -0,0 +1,49 @@
1+#ifndef SETTINGS_KEYS_H_7IGXFQJ6
2+#define SETTINGS_KEYS_H_7IGXFQJ6
3+
4+#include <oak/misc.h>
5+
6+PUBLIC extern std::string const kSettingsFileTypeKey;
7+
8+PUBLIC extern std::string const kSettingsTabSizeKey;
9+PUBLIC extern std::string const kSettingsSoftTabsKey;
10+
11+PUBLIC extern std::string const kSettingsSpellCheckingKey;
12+PUBLIC extern std::string const kSettingsSpellingLanguageKey;
13+
14+PUBLIC extern std::string const kSettingsThemeKey;
15+PUBLIC extern std::string const kSettingsFontNameKey;
16+PUBLIC extern std::string const kSettingsFontSizeKey;
17+PUBLIC extern std::string const kSettingsSoftWrapKey;
18+PUBLIC extern std::string const kSettingsWrapColumnKey;
19+PUBLIC extern std::string const kSettingsShowWrapColumnKey;
20+PUBLIC extern std::string const kSettingsShowInvisiblesKey;
21+
22+PUBLIC extern std::string const kSettingsProjectDirectoryKey;
23+PUBLIC extern std::string const kSettingsWindowTitleKey;
24+PUBLIC extern std::string const kSettingsScopeAttributesKey;
25+
26+PUBLIC extern std::string const kSettingsBinaryKey;
27+PUBLIC extern std::string const kSettingsEncodingKey;
28+PUBLIC extern std::string const kSettingsUseBOMKey;
29+PUBLIC extern std::string const kSettingsStoreEncodingPerFileKey;
30+
31+PUBLIC extern std::string const kSettingsIncludeKey;
32+PUBLIC extern std::string const kSettingsIncludeDirectoriesKey;
33+PUBLIC extern std::string const kSettingsIncludeDirectoriesInBrowserKey;
34+PUBLIC extern std::string const kSettingsIncludeFilesKey;
35+PUBLIC extern std::string const kSettingsIncludeFilesInBrowserKey;
36+PUBLIC extern std::string const kSettingsIncludeFilesInFileChooserKey;
37+PUBLIC extern std::string const kSettingsIncludeInBrowserKey;
38+PUBLIC extern std::string const kSettingsIncludeInFileChooserKey;
39+
40+PUBLIC extern std::string const kSettingsExcludeKey;
41+PUBLIC extern std::string const kSettingsExcludeDirectoriesKey;
42+PUBLIC extern std::string const kSettingsExcludeDirectoriesInBrowserKey;
43+PUBLIC extern std::string const kSettingsExcludeFilesKey;
44+PUBLIC extern std::string const kSettingsExcludeFilesInBrowserKey;
45+PUBLIC extern std::string const kSettingsExcludeInBrowserKey;
46+PUBLIC extern std::string const kSettingsExcludeInFileChooserKey;
47+PUBLIC extern std::string const kSettingsExcludeInFolderSearchKey;
48+
49+#endif /* end of include guard: SETTINGS_KEYS_H_7IGXFQJ6 */
--- a/Frameworks/settings/src/settings.h
+++ b/Frameworks/settings/src/settings.h
@@ -1,6 +1,7 @@
11 #ifndef SETTINGS_H_F99MMG5F
22 #define SETTINGS_H_F99MMG5F
33
4+#include "keys.h"
45 #include <io/io.h>
56 #include <oak/oak.h>
67 #include <text/format.h>
--- a/Frameworks/settings/target
+++ b/Frameworks/settings/target
@@ -1,4 +1,4 @@
11 TEST_SOURCES = tests/*.cc
22 SOURCES = src/*.{cc,rl}
3-EXPORT = src/{settings,volume,track_paths}.h
3+EXPORT = src/{settings,volume,track_paths,keys}.h
44 LINK += io plist OakSystem regexp scope