Emacs で自動作成されるファイル(バックアップ、自動保存、ロック)の設定

Emacs ではファイルを編集すると、バックアップファイルという ~(チルダ)の付いたファイルができてしまい、これが結構うっとうしかったりします。
今回はこのバックアップファイルなどの Emacs が自動で作成するファイル、およびその設定について説明します。

Emacs が自動で作成するファイルの種類

Emacs がファイルの編集時に自動で作成するファイルはバックアップファイルを含めて大きく分けて 3 種類(細かく言うと 4 種類)あります。

種別 自動削除 用途
バックアップファイル foo.txt~ しない 編集前のファイルのバックアップ
自動保存ファイル #foo.txt# する 作業中のファイルの自動保存。 Emacs が不正終了した場合に使用
自動保存リストファイル .saves-xxx する 自動保存ファイルのリスト
ロックファイル .#foo.txt する 同時に修正しないためのロックに使用


これらのファイルは設定によって、作らないようにしたり、 作成先を変更したりできます。 お勧めは次のようにする感じです。
  • バックアップファイルは一カ所にまとめて作成
  • 自動保存ファイルは作成
  • 自動保存リスト、ロックファイルは作成しない
以降から 3 つのファイルについてそれぞれ解説していきます。

バックアップファイル (foo.txt~)

バックアップ(backup)ファイルはファイルをオープンする際、オープン時(編集前)のファイルをバックアップとして残します。 これは間違って修正や削除した時に使えます。

Emacs はかなり古くからあります。最近のソフトウェア開発ではバージョン管理システムを使うのが当たり前になってきているので、 いらないといえばいらないです。 うっとうしから作らないということにするというのも一つの手です。


作成しない場合には init.el に以下のように記述します。
 (setq make-backup-files t) 

ただ、チェックイン(コミット)はタイミングがあり、残しておきたいこともあります。 また、すべてのファイルをバージョン管理しているわけでもないです。
バックアップファイルはデフォルトだと編集対象と同じディレクトリーに作成します。 そのため、あちこちにできて、うっとうしくなります。 作成先を指定してまとめておくとそれほど邪魔ではありません。

作成先を変更する場合、 (対象ファイルの正規表現 . 作成先ディレクトリー) のペアー(コンスセル)を要素とするリスト(backup-directory-alist)で指定します。 デフォルトは nil(空) でリストの対象ファイルに引っかからない場合は元のファイルと同じところに作成します。
以下の例では すべて(".*")のファイルを対象に "~/.ehist" ディレクトリーに作成します。
 (setq backup-directory-alist '((".*" . "~/.ehist")))

移動して邪魔にならなくなったなら、一つ前だけでなく、もっとおいておきたいということもあります。番号をつけて複数前のまで残しておく なんてこともできます。
番号を付けて残す場合は、もちろん過去の全部残すってわけにはいかないので、範囲を指定します。
 ;; 番号付けによる複数保存
 (setq version-control     t)  ;; 実行の有無
 (setq kept-new-versions   5)  ;; 最新の保持数
 (setq kept-old-versions   1)  ;; 最古の保持数
 (setq delete-old-versions t)  ;; 範囲外を削除
kept-new-versions は過去の 5 個分残すという意味です。 kept-old-versions の方はちょっとわかりづらいですが、残し始めからの数です。 これが 1 であれば、最初(オリジナル)の分は残すってことになります。

自動保存

自動保存(auto-save)ファイルは編集中のファイルを保存したファイルで、 自動保存リスト(auto-save-list)ファイル はその自動保存しているファイルのリストを記述したファイルです。 これらは 正常に終了すると削除されますが、Emacs がエラーで落ちたりするとファイルが残ります。


Word などでも途中で落ちて、起動しなおすと編集中だったものが 「修復されたファイル」として出てきます。

Emacs の場合、異常終了した後、編集中だったファイルを開くと自動保存ファイルが残っていることを教えてくれます。 そこで M-x recover-this-file を実行して、自動保存された状態に戻すことができます。

ただ、それだと再度オープンした時にしかわかりません。 落ちた後、残っている自動保存ファイルを調べるには、自動保存リストファイルの中身を見ます。 recover-file というコマンドもあり、これはファイルを指定しての復帰です。
自動保存リストファイル自体は M-x recover-session でリストファイルのリストを表示することができます。

自動保存ファイル (#foo.txt#)

自動保存ファイルはバッファーを正常に閉じれば消えますし、復帰で助かることもあるので、 デフォルトのまま作るようにてしておいて問題ないと思います。


ちなみに自動保存をしない場合は次のようにします。
 (setq auto-save-default nil)

作成先を変更する場合、 (対象ファイルの正規表現 作成ファイルのパス t) のリストのリスト(auto-save-file-name-transforms)で指定します。
リストの 2 番目の要素はバックファイルのように作成先のディレクトリーでもいいですし、 正規表現のマッチング結果を使ったファイル名にすることもできます。 3 番目の t は名前の付け方を変えるオプションですが、 t で問題ないです。

リストの正規表現にマッチするものがない場合は元のファイルと同じところに出来ます。
デフォルトでは、一つだけリストに入っています。 これはリモートファイル( /ftp:xxx など)の場合に自動保存ファイルの作成先をローカルの一時ディレクトリー(temporary-file-directory)にするものです。
 '(("\\`/[^/]*:\\([^/]*/\\)*\\([^/]*\\)\\'" "一時ディレクトリー/\\2" t))
以下はすべてのファイル(".*")に対して "~/tmp" 以下に作成する例です。
 (setq auto-save-file-name-transforms   '((".*" "~/tmp/" t)))

この自動保存はデフォルトでは 30 秒たつか、 300 回入力操作を行うと実行されます。 ただ、デフォルトのままだとちょっと間隔が長いです。
自動保存の間隔を調整することもできます。
 ;; 保存の間隔
 (setq auto-save-timeout 10)     ;; 秒   (デフォルト : 30)
 (setq auto-save-interval 100)   ;; 打鍵 (デフォルト : 300)

自動保存リストファイル (~/.emacs.d/auto-save-list/.saves-xxxx)

こちらも正常に終了すれば消えるのですが、残っていたとしてもわざわざみて調べたりはあまりしないと思うので、 作る必要はないです。


作成しない場合は次のように記述します。
 (setq auto-save-list-file-prefix nil)
デフォルトではリストファイルは "~/.emacs.d/auto-save-list" のディレクトリーに作成されます。
以下は 作成先を変更する場合の例です。
 (setq auto-save-list-file-prefix "~/tmp/.saves-")
中止、作成先の変更ともに auto-save-list-file-prefix の変数を使います。
これはリストファイルの名前の前につける文字列で、これのパスの部分で作成先を変更し、 nil ならば作らないというようになります。 デフォルトは、この値が "~/.emacs.d/auto-save-list/.saves-" となっています。

ロックファイル (.#foo.txt)

ロック(lock)ファイル同じファイルを同時に編集しないためのロックとして作成されます。 こちらも正常に終了すると削除されます。
Emacs はもともと Unix 向けに作られたもので、 Unix は PC と違い、ネットを介して、あちこちからログインして使うことが想定されています。 ロックファイルはユーザーが同じファイルを編集していないかのチェックに使われます。

このロックファイルは ".#編集ファイル" の形式で編集ファイルと同じディレクトリーに作成されます。 実際はユーザー名やプロセス ID を組み合わせた長い名前のファイルを作成し、 そのシンボリックリンクとなっています。
自動で削除されるため作っておいても別にいいのですが、一人で使う PC などでは無駄なので、作成しないようにした方がいいでしょう。


作成しない場合は次のように記述します。 なお、作成先の変更はできないみたいです。
 (setq create-lockfiles nil)

特定のディレクトリーだけ作成しない

自動作成は行うけど、特定のディレクトリーにあるファイルに対しては作成したくないという時もあります。
例えば、 Google ドライブや DropBox のようなファイル共有サービスを使う場合、 その対象のディレクトリーは、サービス側で保存の度に履歴をとっているので、バックアップする必要がありません。


しかし、残念ながら Emacs では特定のディレクトリーだけ除くという機能は用意してくれてないみたいです。 というわけで自分で書いてみました。
 (defvar my-inhibit-auto-file-directory-list
   (list
    "~/DropBox"
    (concat (getenv "USERPROFILE") "/Google ドライブ")
    )
   "自動作成(バックアップ、自動保存、ロック)を禁止するディレクトリーのリスト")
   
 (add-hook 'find-file-hook
          '(lambda ()
             (when (listp my-inhibit-auto-file-directory-list)
               (let ((inhibit-ptn (concat "^\\(" (mapconcat '(lambda (str) (regexp-quote (expand-file-name str)))
                                                            my-inhibit-auto-file-directory-list "\\|") "\\)")))
                 (when (string-match inhibit-ptn buffer-file-name)
                   (setq backup-inhibited t) ;; バックアップ禁止
                   (auto-save-mode nil)      ;; 自動保存しない
                   (make-local-variable 'create-lockfiles) ;; ロックファイルを作成しない
                   (setq create-lockfiles nil)
                   )))))
my-inhibit-auto-file-directory-list のリストの要素にすると、そのディレクトリー以下(サブディレクトリーも含む)のファイルに対しては自動作成しないようになります。
自動作成ファイルは 3 つとも作らないようなっています。 変えたい場合は対象のところをコメントアウトしてください。


関連記事
スポンサーサイト



Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
20位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
5位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

02月 | 2023年03月 | 04月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。