我想创建一个调色板,用于在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)添加command line options -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
和调色板创建。
答案 0 :(得分:1)
到目前为止,我已经找到了以下解决方案:
CreatePalette@
Framed[DynamicModule[{b, installedVersions},
Dynamic[Column[
Join[{Style["Associate .NB-files with:", Bold],
SetterBar[
Dynamic[val,
Function[{v, e},
Developer`WriteRegistryKeyValues["HKEY_CLASSES_ROOT\\.nb",
Null -> v];
e = Null /.
Developer`ReadRegistryKeyValues[
"HKEY_CLASSES_ROOT\\.nb"], HoldRest],
Initialization -> (installedVersions =
Select[Developer`EnumerateRegistrySubkeys[
"HKEY_CLASSES_ROOT"],
StringMatchQ[#, "Mathematica.NB." ~~ ___] || # ===
"MathematicaNB" &];
If[StringFreeQ[
value =
Null /.
Developer`ReadRegistryKeyValues[
"HKEY_CLASSES_ROOT\\" ~~ # ~~
"\\shell\\open\\command"], " -b -directlaunch "],
Developer`WriteRegistryKeyValues[
"HKEY_CLASSES_ROOT\\" ~~ # ~~
"\\shell\\open\\command",
Null ->
StringReplace[value,
path__ ~~ "\\Mathematica.exe\"" ~~ __ ~~ "\"%1\"" :>
path ~~
"\\Mathematica.exe\" -b -directlaunch \"%1\""]]] \
& /@ installedVersions)], installedVersions,
Appearance -> "Vertical"]},
If[Last@Last@Options[$FrontEnd, "VersionedPreferences"] ===
False &&
b == True, {Button[
Pane[Style[
"This FrontEnd uses shared preferences file. Press this \
button to set FrontEnd to use versioned preferences file (all the \
FrontEnd settings will be reset to defaults).", Red], 300],
AbortProtect[
SetOptions[$FrontEnd, "VersionedPreferences" -> True];
b = False]]}, {}]], Alignment -> Center],
Initialization :>
If[! Last@Last@Options[$FrontEnd, "VersionedPreferences"],
b = True, b = False]]], FrameMargins -> {{0, 0}, {0, 5}},
FrameStyle -> None];
可以使用“调色板”菜单中的“安装调色板...”菜单项永久安装此调色板。
以下是它的外观:
欢迎任何建议和改进!
由于 Mathematica 的所有已安装版本共享相同的$BaseDirectory
和$UserBaseDirectory
,因此建议在安装的最旧版本中安装此调色板以避免标准警告弹出:< / p>
这款笔记本是在最近的Mathematica版本中创建的 使用较旧的前端可能无法正常工作。 请联系Wolfram Research(www.wolfram.com)获取升级信息。