Všechny sofistikovanější aplikace potřebují nějaký způsob, jak si zapamatovat interní nastavení, které obnoví při příštím spuštění. Mohou to udělat po svém a vytvořit si někde na disku konfigurační soubor s vlastními pravidly pro jeho vnitřní podobu.
V unixových systémech stačí letmý pohled do adresáře /etc
. Každý soubor bude pravděpodobně vypadat jinak. Microsoftí Windows na to jdou diametrálně odlišnou cestou binární databáze (registry). Co OS X?
Application defaults
Desítkové šelmy zdědily od svého předchůdce (NeXTStepu) specifický systém pro ukládání nastavení postavený na identifikátoru aplikace a mapování datových typů CoreFoundation na jejich ekvivalenty v Property Listu. Každá správná aplikace pro OS X by měla mít svůj unikátní identifikátor ve tvaru obráceného DNS záznamu domény pod kontrolou vývojáře. Pro svůj program mohu použít identifikátor cz.osxadmin.mujprogram
, protože je to momentálně moje doména 🙂 Aplikace má možnost využít svojí doménu pro uložení nějakých dat na disk. Odpadají trable se strukturou souboru + snadné načítání a ukládání zajistí CF API.
Programování v CF frameworku přenechám jiným a v tomto postu se zaměřím na práci s aplikačním nastavením pomocí nástroje defaults
. Většina mírně pokročilých uživatelů Maca se s ním pravděpodobně již někdy setkala, když ho copy&paste vkládala do terminálu, aby změnila nějaké skryté nastavení systému.
Domény a data
defaults domains | tr ' ' '\n'
Vypíše všechny domény se kterými lze přímo manipulovat.
defaults read com.apple.Finder
Zobrazí zformátovaný (o něco čitelenější než xml) obsah konfiguračního souboru pro Finder. Tato doména odpovídá souboru com.apple.Finder.plist v knihovně uživatele.
Plisty s nastavením programů najdete v ~/Library/Preferences/ nebo ~/Library/Containers pro sandboxované aplikace.
Globální doména
Vedle domén jednotlivých aplikací existuje i společný globální prostor. Fyzicky se tato data nachází v souboru ~/Library/Preferences/.GlobalPreferences.plist
Při práci s globálním prostorem je potřeba defaults
dodat upřsňující argument. Možností zápisu je více: -g | -globalDomain | NSGlobalDomain
.
Příklad: defaults read NSGlobalDomain
.
Local Library
Vedle nastavení konkrétního uživatele je tu ještě lokální knihovna společná pro všechny /Library (a mnoho dalších míst, kde potkáte property list). Pokud chcete využít defaults
k upravení plistu v ní, musíte uvést celou cestu k souboru ->
defaults read /Library/Preferences/com.apple.security.plist
defaults read /Library/Preferences/.GlobalPreferences.plist
(Globální prostor pro všechny uživatele)
Číst
defaults read doména|plist
– komletní obsah domény/plistu
defaults read doména|plist klíč
– konkrétní informace podle klíče
defaults read-typu doména|plist klíč
– datový typ
Zapsat
defaults write doména|plist klíč data
Defaultně jsou data brána jako řetězec. Jiný datový typ je nutné specifikovat přípanačem:
-string -data -int -float -bool -date -array -dict
Do existujících polí a slovníků lze přidat další položky přepínači:
-dict-add -array-add
Smazat
defaults delete doména|plist
– smaže doménu/plist. Samotný zůstane zachován, jeho obsah nikoliv.
defaults delete doména|plist klíč
– smaže jen specifikovaný key-value pár.
Závěrem
defaults
hraje důležitou roli v shell-skriptování pro OS X. Často může být potřeba vytáhnou z plistu nějakou hodnotu, na základě které se skript rozhodne, co bude dělat dál. Není vůbec na škodu pomocí defaults ukládat nastavení samotného skriptu (pokud je určen pouze pro OS X) a vyhnout se tak psaní funkcí pro parsování konfiguráku.
Zrada přichází, pokud chcete upravovat víceúrovňový plist (slovníky a pole zanořené v sobě). Na ty defaults
nestačí a nezbývá než sáhnout po nástroji PlistBuddy.
Další inforamce v manuálové stránce -> man defaults
Bonus: Secrets
Uvnitř property listů různých systémových komponent často vývojáři “zapomněli” nastavovací proměnné, které nemají žádné přepínátko v GUI. Většinou jde o drobnosti, ale najde se tam mnoho vyloženě šikovných nastavení. Mezi moje oblíbené patří možnost vypnout otravnou animaci při otevření nového okna aplikace:
defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool NO
Uživatelé našli skrytých nastavení poměrně velké množství, proto přijde vhod aplikace Secrets v podobě panelu do System Preferences , která v nich umí vyhledávat…