Я хотел бы создать палитру для переключения ассоциаций .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
и созданием палитры.