У меня есть процедура автосохранения, которая сохраняет копию каждой открытой модифицированной записной книжки каждые 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]