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

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

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

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

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

Кстати: с помощью MMA V8

Ответы [ 4 ]

8 голосов
/ 25 августа 2011

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

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

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

EDIT

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

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

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

EDIT2

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

5 голосов
/ 26 августа 2011

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

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

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

Для удаления автосохранить задачу использовать:

RemoveScheduledTask[saveTask];

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

0 голосов
/ 17 ноября 2014

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

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

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

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

2) В SwapDirectory вы должны создать подкаталог с именем «Recovery».Именно здесь процедура 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] 
0 голосов
/ 08 января 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...