我想创建一个调色板,用于在 Windows 下已安装的Mathematica版本之间切换 .NB 文件关联。
目前,我开发了以下代码来枚举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
and可能会更好地实现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版本之间共享首选项(默认情况下,所有安装的版本都使用一个文件来存储前端设置):
SetOptions[$FrontEnd, "VersionedPreferences" -> True]
所以我的问题是:
如何创建和安装一个小Palette
程序,它将动态显示 .NB 文件的当前文件关联,并允许通过单击按钮在它们之间切换?我认为它可能可以实现,SetterBar
但我仍然没有经验Dynamic
和调色板创建。