自动保存笔记本(或其他类型的文件在mathematica)文件



我一直面临这个问题,部分原因是微软Office会自动保存你正在处理的文件,并自动恢复。

很多时候,当我在mathematica中开始一个新的笔记本做一些测试或其他事情时,我经常忘记保存我正在做的事情。

时不时地,根据我使用的电脑,电脑崩溃了,我所做的所有漂亮的工作都永远丢失了…

有没有一种方法可以避免每隔五分钟就疯狂地保存我的文件?那么文件版本控制呢?

BTW:使用MMA V8

关于自动保存,您可能想要检查NotebookAutoSave选项,可以通过Fromat->Option Inspector设置为True。你需要选择"Selected notebook",然后进入Notebook Options -> File Options,将NotebookAutoSave设置为True。然后,你的笔记本将在每次评估后保存。这是不是一个令人满意的解决办法,当然要视情况而定。

但我的经验是,最可靠的方法是开发一个CTRL+S反射-这个从来没有让我失望,而且工作得很好。

至于版本控制,使用包要容易得多,您可以使用WorkBench,它通过Eclipse插件集成了对CVS的支持和对SVN的支持。对于笔记本,我建议你参考这个SO线程。你可能也会对这个数学小组的讨论感兴趣。

编辑

对于M8,出于自动保存的目的,您可能还可以运行

RunScheduledTask[NotebookSave[EvaluationNotebook[]],{300}]

但是我现在不能测试这个代码

EDIT2

我刚刚在Toolbag储存库中看到这篇文章-这也可能是自动保存部分问题的另一种选择(但请参阅评论中关于计划任务与Dynamic的相对优势的讨论)

既然您有MMA版本8,您可以使用:

saveTask = CreateScheduledTask[FrontEndExecute[FrontEndToken["Save"]], 5*60];
StartScheduledTask[saveTask];

每5分钟节省一次(其他时间改为5*60)。

删除自动保存任务使用:

RemoveScheduledTask[saveTask];

为了只保存一个固定的,特定的笔记本,将其句柄存储在nb中(使用Notebooks, SelectedNotebook, InputNotebookEvaluationNotebook找到它),并使用FrontEndToken[nb,"Save"]而不是FrontEndToken["Save"]

我有一个Mathematica包,它提供自动备份功能。启用后,当前的笔记本——称之为"废话"。——将被备份为"废话"。在经过一段可配置的时间之后。我经常使用它,它让我避免了很多次丢掉工作。它比自动保存要好,因为它不会触及实际的笔记本文件:如果你搞砸了什么或什么东西损坏了,你不想覆盖你的主文件。:)

我有一个自动保存程序,每隔5分钟(或任何你喜欢的间隔)保存一个打开的、修改过的笔记本的副本。它保留手动保存的副本,并在需要时可以轻松恢复的单独目录中保存"交换文件"。要复制到init.m的代码如下:https://mathematica.stackexchange.com/questions/18380/automatic-recovery-after-crash/65852#65852,并复制如下:

出于同样的考虑,我编写了以下代码并将其添加到我的init中。m文件。要使用它,您需要更改两个主要条目。全局变量$SwapDirectory是保存交换文件的地方(这里的交换文件是指VIm意义上的交换文件;一个"额外的"笔记本副本,与手动保存的副本分开(手动保存的副本定期保存任何新工作)。交换文件被组织在交换目录中的目录结构中,该目录结构"镜像"了它们的原始文件位置,并且具有"。Swp"附加到他们的文件名。您可能想要更改的另一个变量是自动保存之间的秒数,由下面代码底部的"300"(对应于5分钟)表示。在适当的时候,这段代码将(自动在后台)为所有打开的笔记本保存交换文件,除非它们与手动保存的版本没有修改过(这种例外使代码更有效,更重要的是,例如,防止为文档笔记本存储交换文件)。

在其当前形式中,代码并不只过滤输入单元格,但希望您可以使用其他答案自己进行修改。

注意事项:
1)即使启用了离线访问,Mathematica Put命令似乎也无法向网络驱动器写入数据。因此,最好选择本地机器上的SwapDirectory。

2)在SwapDirectory中创建一个名为"Recovery"的子目录。这是AutoSaveSwap例程将对没有现有手动保存位置的任何笔记本进行初始保存的地方。

3)简单求值RecoverSwap("filePath")其中"filePath"是一个字符串,表示手动保存文件副本的filePath(即,不是由AutoSave创建的文件)。然后将弹出一个窗口,其中包含该文件的最新自动保存版本。手动保存的版本永远不会被覆盖,除非您明确选择这样做。一旦恢复的版本弹出,你可以保存到任何你喜欢的地方,或丢弃它在你的自由裁量权。

你可能应该把这段代码添加到内核版本的init中。.m ($UserBaseDirectory/Kernel/init.m)而不是前端版本…这样,如果您退出并重新启动内核,自动保存功能也将重新启动。另一方面,这意味着必须在每次启动或重新启动后计算至少一个表达式才能开始自动保存。一旦完成了这个初始评估,您就不需要评估一个单元来备份它(不像内置的自动保存实用程序)。

希望这能帮助到一些人!请随时回答您可能有的任何问题、建议或改进请求。而且,如果你觉得这篇文章有用,我将非常感谢你的支持!当心

    $SwapDirectory= "C:\Users\pacoj\Swap Files\"; 
    SaveSwap[nb_NotebookObject]:=Module[
        {fileName, swapFileName, nbout, nbdir, nbdirout, recoveryDir},
        If[ ! SameQ[Quiet[NotebookFileName[nb]], $Failed],
        (* if the notebook is already saved to the file system *)
            fileName = Last[ FileNameSplit[ NotebookFileName[nb]] ];
            swapFileName = fileName <> ".swp";
            nbdir = Rest[FileNameSplit @ NotebookDirectory[nb]];
            nbdirout= FileNameJoin[ FileNameSplit[$SwapDirectory]~Join~nbdir]<>"\";
            If[!DirectoryQ[nbdirout], CreateDirectory[nbdirout]];
            nbout = NotebookGet[nb];
            Put[nbout, nbdirout <> swapFileName],
            (* else, if the file has never been saved, save as untitled *)
            recoveryDir= $SwapDirectory <> "Recovery\";
            fileName= ("WindowTitle" /. NotebookInformation[nb])<>".nb";
            NotebookSave[nb, recoveryDir <> fileName]
        ] 
    ]; 
    RecoverSwap::noswp= "swap file `1` not found in expected location";
    RecoverSwap[nbfilename_String]:=Module[
        {fileName, swapFileName, nbin, nbdir, nbdirout},
        fileName= Last[ FileNameSplit[ nbfilename] ];
        swapFileName= fileName <> ".swp";
        nbdir= Most[ Rest[FileNameSplit @ nbfilename] ];
        nbdirout= FileNameJoin[ FileNameSplit[$SwapDirectory]~Join~nbdir]<>"\";
        If[ FileNames[swapFileName, {nbdirout}] == {},
           Message[RecoverSwap::noswp,nbdirout <> swapFileName]; Return[],
           nbin= Get[nbdirout <> swapFileName]; NotebookPut[nbin]
        ] 
    ]; 
    AutoSaveSwaps= CreateScheduledTask[
        SaveSwap /@ Select[Notebooks[], "ModifiedInMemory" /. NotebookInformation[#]&],
        300 
    ] 
    StartScheduledTask[AutoSaveSwaps] 

最新更新