创建调色板以在安装的Mathematica版本之间切换.NB关联

时间:2011-06-17 07:39:08

标签: windows wolfram-mathematica registry file-association mathematica-frontend

我想创建一个调色板,用于在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 版本之间切换的按钮(但我认为可能可以使用DynamicSetterBar更好地实现):

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和调色板创建。

1 个答案:

答案 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];

可以使用“调色板”菜单中的“安装调色板...”菜单项永久安装此调色板。

以下是它的外观:

screenshot1 screenshot2

欢迎任何建议和改进!


由于 Mathematica 的所有已安装版本共享相同的$BaseDirectory$UserBaseDirectory,因此建议在安装的最旧版本中安装此调色板以避免标准警告弹出:< / p>

  

这款笔记本是在最近的Mathematica版本中创建的   使用较旧的前端可能无法正常工作。   请联系Wolfram Research(www.wolfram.com)获取升级信息。