11801


軽いメモを取るときにGmailのメール下書きを利用しています。

理由としては、PCがフリーズしてもGmailの下書きであれば、データが残るからです。

MacOS X Yosemiteを利用していますが、何故かブラウザで動画を閲覧しているとフリーズすることが頻繁に発生します。（Flashのせい？）

本日、たまたまEmacsでメモをとっており、メモの途中で電話が入り、そこで動画を閲覧していたところ、OSがフリーズしてしまいました。

マルチディスプレイで、Emacsを画面に表示したままだったので、アナログ的にモニタをiphoneのカメラで撮影することで、なんとかテキストを失うことは避けれたのですが、これがディスプレイに表示されていなかったらということを考えるとフリーズが恐ろしくてたまりません。

いちいちGmailを利用するのも面倒なので、Emacsのスクラッチバッファが自動保存される仕組みが作ることができればよいのでは？とおもいました。

既にemacsでファイルを保存すると、その段階で`~/.emacs.d/backup`にもバックアップを作成するような設定は行っていますので（１日だけでものすごい大量のファイルが作られますが）、スクラッチバッファのテキストを`~/.emacs.d/.scratch`などに自動保存できれば、恐らくそれだけで世代バックアップもできると考えられますので素敵だなと思っています。

emacsで指定時間放置または指定文字以上の編集が行われた時に自動保存する仕組みが備わっているのは、わりとよく聞く話で、検索すると設定方法も出てくるのですが、この自動保存の仕組をスクラッチバッファのみ有効にする方法がわかりません。できれば、その自動保存の条件（放置時間やタイプ数）もカスタマイズしたいとおもっていますので、以下の３点を教えていただきたいです。

  1. スクラッチバッファを自動保存するelisp
  2. 操作の放置による自動保存発動時間の設定方法
  3. テキスト入力数による自動保存発動文字数の設定方法

よろしくお願いいたします。


CC BY-SA 3.0
2015-06-27T08:23:47.553
11795
2020-05-16T22:58:41.773
2020-05-16T22:58:41.773
19110
5840
question
emacs elisp
emacsでスクラッチバッファのテキストを自動保存したい。


`*scratch*` バッファで以下を実行するとできます。

[code]

    ; 自動保存を有効にする
    (auto-save-mode)
    
    ; 自動保存するまでの時間
    (make-local-variable 'auto-save-timeout)
    (setq auto-save-timeout 10)
    
    ; 自動保存するまでのタイプ数
    (make-local-variable 'auto-save-interval)
    (setq auto-save-interval 20)
    
[/code]

追記: ~/.emacs.d/init.el とのことですので、以下のようにするとよろしいかと思います。

[code]

    (setq initial-buffer-choice t)
    (add-hook 'emacs-startup-hook
              (function
               (lambda ()
                 (auto-save-mode)
                 (make-local-variable 'auto-save-timeout)
                 (setq auto-save-timeout 10)
                 (make-local-variable 'auto-save-interval)
                 (setq auto-save-interval 20)
                 )))
    
[/code]

emacs 24.5 で確認しました。


CC BY-SA 3.0
2015-06-27T09:48:13.350
11797
2015-06-27T13:07:57.967
2015-06-27T13:07:57.967
5288
5288
11795
answer


使ったことはないですが、るびきちさんのブログで幾つか紹介されています。

  * [emacs scratch-log.el : *scratch*バッファのログを取り、削除不能にし、再起動時に復元する | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 | るびきち「日刊Emacs」](http://rubikitch.com/2015/01/05/scratch-log/)


CC BY-SA 3.0
2015-06-27T12:08:48.733
11801
2015-06-27T12:08:48.733
7291
11795
answer


masm さんの回答ですが、`with-current-buffer` を使うと以下の様に書く事ができます。

[code]

    (add-hook 'emacs-startup-hook
          '(lambda ()
             (with-current-buffer "*scratch*"
               ;;(setq default-directory user-emacs-directory)
               ;; or
               ;;(setq buffer-file-name (concat user-emacs-directory ".scratch"))
               (auto-save-mode)
               (set (make-local-variable 'auto-save-timeout) 10)
               (set (make-local-variable 'auto-save-interval) 20))))
    
[/code]

ただ、この方法ですと、自動保存されるファイルが `default-directory`(`*scratch*`
バッファでの初期値はホームディレクトリ)に作成される事になります。

[code]

    $ ls -l ~/
    -rw-r--r--  1 nemo nemo 12  Jun 28 00:55 #%2Ascratch%2A#27799ads#
    
[/code]

`~/.emacs.d/` ディレクトリに作成したい場合は、`default-directory` か `buffer-file-name`(どちらも
buffer local 変数)を設定すると良いかもしれません。  
`buffer-file-name` を設定する場合、`*scratch*` バッファがファイルに関連付けられますので、Emacs
を終了する際にセーブしていない場合には「`Save file
~/.emacs.d/.scratch?`」などと尋ねられる事になります(ファイルと同じ扱い)。


CC BY-SA 3.0
2015-06-27T16:22:21.703
11807
2015-06-27T16:22:21.703
11795
answer