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

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

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

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

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

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

Ответ 1

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

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

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

ИЗМЕНИТЬ

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

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

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

EDIT2

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

Ответ 2

Поскольку у вас есть версия 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"]

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

4) Скорее всего, вы должны добавить этот код к версии init.m(KDE)/Kernel ($ UserBaseDirectory/Kernel/init.m), а не к интерфейсной версии... таким образом, если вы покинете и перезапустите ядро, автосохранение функция также перезапустится. С другой стороны, это означает, что вы должны оценить хотя бы одно выражение после каждого запуска или перезапуска, чтобы начать автоматическое сохранение. Как только эта первоначальная оценка будет выполнена, вам НЕ нужно оценивать ячейку для ее резервного копирования (в отличие от встроенной утилиты автосохранения).

Надеюсь, это поможет кому-то! Не стесняйтесь отвечать на любые вопросы, предложения или просьбы об улучшении, которые могут возникнуть у вас. И, если вы найдете это сообщение полезным, upvotes будут наиболее привлекательными! Береги себя.

    $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]