2

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)システムレジストリでMathematicaフロントエンドを起動するためのコマンドラインオプション -b(スプラッシュ画面を無効にする)と(インストールされている-directlaunch最新のMathematicaバージョンを起動するメカニズムを無効にする)をコマンドライン文字列に追加する関数:

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バージョン間でのプリファレンスの共有を無効にするコマンドがあります(デフォルトでは、インストールされているすべてのバージョンがフロントエンド設定を保存するために1つのファイルを使用します):

SetOptions[$FrontEnd, "VersionedPreferences" -> True]

だから私の問題は:

Palette.NBファイルの現在のファイルの関連付けを動的に表示し、ボタンをクリックしてそれらを切り替えることができる小さなファイルを作成してインストールするにはどうすればよいですか?たぶんそれだけで実装できると思いますが、まだパレット作成のSetterBar経験がありません。Dynamic

4

1 に答える 1

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

このパレットは、「パレット」メニューの「パレットのインストール...」メニュー項目を使用して永続的にインストールできます。

外観は次のとおりです。

スクリーンショット1 スクリーンショット2

任意の提案や改善を歓迎します!


インストールされているすべてのバージョンのMathematica$BaseDirectoryは同じとを共有しているので$UserBaseDirectory、標準の警告ポップアップを避けるために、インストールされている最も古いバージョンにこのパレットをインストールすることをお勧めします。

このノートブックはMathematicaの最新バージョンで作成されたものであり、使用している古いフロントエンドでは正しく機能しない可能性があります。アップグレード情報については、Wolfram Research(www.wolfram.com)にお問い合わせください。

于 2011-06-17T16:00:43.700 に答える