Автоматическое сохранение записных книжек (или файлов других типов в mathematica)

Я иногда сталкиваюсь с этой проблемой, лень, частично вызванная тем, что Microsoft Office автоматически сохраняет файлы, над которыми вы работаете, с версиями и автоматическим восстановлением.

Много раз, когда я запускаю новый ноутбук в Mathematica для проведения каких-то тестов или чего-то еще, я часто забываю сохранить то, что я делаю.

Время от времени, в зависимости от компьютера, который я использую, компьютер падает, и вся красивая работа, которую я делал, теряется навсегда...

Есть ли способ обойти это другое, что вручную сохранять мои файлы каждые пять минут? Как насчет версий файлов?

Кстати: использование MMA V8

4 ответа

Что касается автосохранения, вы можете проверить NotebookAutoSave опция, которая может быть установлена ​​в True через Fromat->Option Inspector, Вы должны выбрать "Выбранная записная книжка", а затем перейти к Notebook Options -> File Options и установить NotebookAutoSave к Истине. Затем ваш блокнот будет сохранен после каждой оценки. Является ли это удовлетворительным решением или нет, конечно, зависит от ситуации.

Но мой опыт показывает, что самый надежный способ - выработать рефлекс CTRL+S - этот никогда не подводит меня и работает довольно хорошо.

Что касается управления версиями, это намного проще с пакетами, для которых вы можете использовать WorkBench, который имеет встроенную поддержку CVS и поддержку SVN через плагин Eclipse. Для ноутбуков, я отсылаю вас к этой теме. Вы также можете найти интересную дискуссию в Mathgroup.

РЕДАКТИРОВАТЬ

Для M8, для целей автосохранения вы также можете запустить

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

Но я не могу проверить этот код в данный момент

EDIT2

Я только что наткнулся на этот пост в репозитории Toolbag - который также может быть альтернативой для автосохранения части вопроса (но, пожалуйста, смотрите также обсуждение в комментариях об относительных преимуществах запланированных задач по сравнению с Dynamic)

Так как у вас есть версия 8 MMA, вы можете использовать:

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

экономить каждые 5 минут (измените срок 5*60 на другое время).

Чтобы удалить задачу автосохранения, используйте:

RemoveScheduledTask[saveTask];

Чтобы сохранить только фиксированный, определенный блокнот, сохраните его дескриптор в nb (найти его с помощью Notebooks, SelectedNotebook, InputNotebook или же EvaluationNotebook) и использовать FrontEndToken[nb,"Save"] вместо просто FrontEndToken["Save"]

У меня есть процедура автосохранения, которая сохраняет копию каждой открытой, измененной записной книжки каждые 5 минут (или любой другой интервал, который вы предпочитаете. Она оставляет вашу копию, сохраненную вручную, одну, и сохраняет "файл подкачки" в отдельном каталоге, который может быть легко восстанавливается при необходимости. Код (для копирования в init.m) приводится в этом ответе: https://mathematica.stackexchange.com/questions/18380/automatic-recovery-after-crash/65852 и скопировано ниже:

Руководствуясь теми же проблемами, я написал следующий код и добавил его в мой файл init.m. Есть две основные записи, которые вы хотите изменить, чтобы использовать это. Глобальная переменная $SwapDirectory - это место, где сохраняются файлы подкачки (под файлом подкачки, я имею в виду это в смысле VIm; "дополнительная" копия вашей записной книжки, отдельная от сохраненной вручную копии, которая периодически сохраняет любую новую работу). Файлы подкачки организованы в каталоге подкачки в структуре каталогов, которая "отражает" их исходное расположение файлов, и к их именам добавляется ".swp". Другая переменная, которую вы можете изменить, - это количество секунд между автосохранениями, обозначенное символом "300" (соответствует 5 минутам) в нижней части кода ниже. В соответствующее время этот код (автоматически в фоновом режиме) сохраняет файлы подкачки для ВСЕХ открытых записных книжек, если только они не изменены из сохраненных вручную версий (это исключение делает код более эффективным и, что более важно, предотвращает хранение подкачки файлы для документации тетрадей, например).

В своей текущей форме код не фильтрует только входные ячейки, но, надеюсь, вы можете использовать другие ответы, чтобы сделать это изменение самостоятельно.

Некоторые вещи на заметку:
1) Кажется, что у команды Mathematica Put проблемы с записью на сетевые диски, даже когда автономный доступ включен. Поэтому, вероятно, лучше выбрать SwapDirectory, который находится на вашем локальном компьютере.

2) В SwapDirectory вы должны создать подкаталог с именем "Восстановление". Именно здесь процедура AutoSaveSwap сделает первоначальное сохранение любых записных книжек, для которых НЕТ существующего места для сохранения вручную.

3) Просто оцените RecoverSwap["filePath"], где "filePath" - это строка, представляющая filePath копии, сохраненной вручную, файла (т. Е. Не файла, созданного с помощью автосохранения). После этого появится окно с самой последней автоматически сохраненной версией файла. Сохраненная вручную версия НИКОГДА не перезаписывается, если вы явно не решите это сделать. Когда всплывет восстановленная версия, вы можете сохранить ее по своему усмотрению или отказаться от нее по своему усмотрению.

4) Вы, вероятно, должны добавить этот код в KERNEL-версию 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] 

У меня есть пакет Mathematica, который обеспечивает функцию автоматического резервного копирования. При включении текущая записная книжка - назовите ее "blah.nb"- будет скопирована в "blah.nb~" по истечении настраиваемого промежутка времени. Я использую его постоянно, и это спасло меня от потери работы много, много раз. Это лучше, чем автосохранение, поскольку оно не затрагивает фактический файл записной книжки: если вы что-то напортачили или испортили, вы не хотите перезаписывать свой основной файл.:)

Это на GitHub здесь.

Другие вопросы по тегам