Я хотел бы создать палитру для переключения ассоциаций .NB-файлов между установленными версиями Mathematica под Windows.
На данный момент я разработал следующий код для перечисления установленных версий Mathematica и переключения между ними:
1) Получение списка имен ключей системного реестра установленных версий Mathematica:
installedVersions =
Select[Developer`EnumerateRegistrySubkeys["HKEY_CLASSES_ROOT"],
StringMatchQ[#, "Mathematica.NB." ~~ ___] || # ===
"MathematicaNB" &]
=> {"Mathematica.NB.7.0.1.1213965", "MathematicaNB"}
2) Функция, которая добавляет параметры командной строки -b
( отключает заставку) и -directlaunch
(отключает механизм запуска самой последней установленной версии Mathematica) в строку командной строки для запуска Mathematica FrontEnd в системном реестре:
customizeOpenCommand[id_String] := Module[{value},
value =
Cases[Developer`ReadRegistryKeyValues[
"HKEY_CLASSES_ROOT\\" ~~ id ~~ "\\shell\\open\\command"],
Verbatim[Rule][Null,
val_String /;
StringFreeQ[val, " -b -directlaunch "]] :> (Null ->
StringReplace[val,
path__ ~~ "\\Mathematica.exe\"" ~~ __ ~~ "\"%1\"" :>
path ~~ "\\Mathematica.exe\" -b -directlaunch \"%1\""])];
Developer`WriteRegistryKeyValues[
"HKEY_CLASSES_ROOT\\" ~~ id ~~ "\\shell\\open\\command", value]];
Эту функцию можно использовать следующим образом:
customizeOpenCommand /@ installedVersions
3) Функция получения текущей ассоциации .NB-файла:
Null /. Developer`ReadRegistryKeyValues["HKEY_CLASSES_ROOT\\.nb"]
4) Кнопки для переключения между всеми установленными версиями Mathematica (но я думаю, что это, вероятно, можно было бы реализовать лучше, используя Dynamic
и SetterBar
):
Column[Button[
Row[{"Associate .NB-files with ", Style[#, Bold], " (",
First@Cases[
Developer`ReadRegistryKeyValues["HKEY_CLASSES_ROOT\\" ~~ #],
Verbatim[Rule][Null, str_String] :> str], ")"}],
Developer`WriteRegistryKeyValues["HKEY_CLASSES_ROOT\\.nb",
Null -> #], Alignment -> Left] & /@ installedVersions]
В дополнение к вышесказанному здесь есть команда, которая отключает совместное использование настроек между разными установленными версиями Mathematica (по умолчанию все установленные версии используют один файл для хранения настроек FrontEnd):
SetOptions[$FrontEnd, "VersionedPreferences" -> True]
Итак, моя проблема:
Как создать и установить небольшой Palette
, который будет динамически отображать текущие файловые ассоциации для .NB-файлов и позволит переключаться между ними нажатием кнопки? Я думаю, что это, вероятно, может быть реализовано только с SetterBar
, но я все еще неопытен с Dynamic
и созданием палитры.