由于我从未发现(或者我从来没有找到足够的)一篇关于如何管理init.m文件的好文章,我最终开发了自己的“标准”,但我想知道我做得多么糟糕。
例如,我通常的init.m存储在C:\Documents and Settings\All Users\Application Data\Mathematica\Kernel\init.m
(Windows)中,我使用文本编辑器对其进行编辑。
由于我不希望定义进入全局上下文,因此内容类似于:
(** User Mathematica initialization file **)
Begin["MyInitContext`"];
Cl:=Clear["Global`*"];
(* Other definitions in this Context *)
End[]; (* End Context *)
$ContextPath = Prepend[$ContextPath,"MyInitContext`"];
我不从init.m加载包,因为我想要严格控制我加载的内容,所以我只在这里定义我每天使用的实用程序函数的快捷方式和一些选项。
那么:有没有提到良好做法?更好的方法来实现这种行为?有什么警告吗?
答案 0 :(得分:7)
首先,我强烈建议不要放任何重要的init.m
,因为这会导致旧的东西在几年后再回来时被打破。将您的自定义设置放在路径上会更好,这样您就可以快速将其加载到每个笔记本的头部:这样就可以明确说明上下文,您可以轻松地更改版本而不会破坏旧版本。
我当前的设置是从Needs["Janus`"]
开始,其中Janus
目录有一个自定义init.m
文件,该文件将目录中的每个文件加载到上下文中。这意味着我可以在每个自己的文件中添加实用程序函数,例如这个(clear_cache.m
):
ClearCache::usage="ClearCache[f] unsets all numeric-only downvalues of f, \
see http://stackoverflow.com/questions/5086749"
Begin["`Private`"];
ClearCache[f_Symbol] :=
DownValues[f] = DeleteCases[DownValues[f], _?(FreeQ[First[#], Pattern] &)]
End[]
这是文件Janus/init.m
。请注意,它打印出已加载扩展名的名称,所有这些都是为了保持上下文显式而不会有太多麻烦。
Module[{packageName,packageFileName,fileNames},
(* $Input is set to Foo.m when evaluating Foo/init.m *)
If[$Input=="", Print["init.m cannot run interactively"];Abort[]];
packageName=StringDrop[$Input,-2];
packageFileName=FindFile[packageName<>"`"];
If[packageFileName==$Failed, Print["Unable to find package "<>packageName];Abort[]];
fileNames=Select[
FileNames["*.m",{DirectoryName@packageFileName},1],
FileBaseName[#]=!="init"&];
Print["Loading extensions from "<>DirectoryName@packageFileName<>" to context "<>packageName<>"`:"];
BeginPackage[packageName<>"`"];
Do[Print["Loading "<>fn]; Get@fn, {fn,fileNames}];
EndPackage[]]
答案 1 :(得分:6)
我的Kernel/init.m
看起来像这样:
AppendTo[$Path, Environment["MMA_LIB"]]
Needs["WRUtil`"]
WRUtil
包含我的所有小工具,并执行其他初始化,考虑到平台和Mathematica版本。 MMA_LIB
是一个环境变量,指向一个充满Mathematica包的目录。该目录保持在版本控制之下,可以由多个Mathematica实例共享。我希望保持init.m
简短,以便进入新的Mathematica安装就像输入我已经承诺记忆的两行一样简单 - 令人惊讶的是我似乎经常这样做。
答案 2 :(得分:5)
也没有遵循官方原则,我只能告诉你我做了什么。
我的Kernel/init.m
本身不包含任何功能。我用它来:
$HistoryLength
SetDirectory
等。DeclarePackage
来电