基になるファイルが削除されたときに、どうすれば自動的にバッファを閉じることができますか?


9

私は一日中Emacsを実行したままにしているので、Emacsバッファーで開いているファイルに対して多くのファイルシステム操作を行うことがよくあります。たとえば、非常に異なるディレクトリ構造を持つGitの別のブランチに切り替える場合があります。

残念ながら、これにより、Emacsが「新しい」ファイルを参照する「変更された」バッファーとして登録する多数のオープンバッファーが残ります。これを行うたびに手動でそれらを閉じるように注意しない限り、それらのバッファーを再帰的に保存するのは簡単です。その結果、プロジェクト内に誤った、おそらく重複したファイルが作成されます。それぞれについて「このバッファーを保存する」という質問に答えずにemacsを閉じることすらできません。

基になるファイルが消えたときに未変更のバッファーを自動的に閉じる方法はありますか?精神global-auto-revert-mode的には、ファイルが完全に削除されたときにも処理すると似ていますか?


Emacsマニュアルのセクション38.20ファイル変更に関する通知を
izkon

回答:


6

私はこれらの線に沿った何かがうまくいくと思います:

(defun buffer-backed-by-file-p (buffer)
  (let ((backing-file (buffer-file-name buffer)))
    (if (buffer-modified-p buffer)
        t
      (if backing-file
          (file-exists-p (buffer-file-name buffer))
        t))))

(mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))

buffer-backed-by-file-p機能ファイルはファイルによってバックアップされたかどうかを確認する-はtrue、そうでない場合は、返品、バッキングファイルが存在する場合はそれ以外を返します。次に、バッファーのリストを取得し、バッキングファイルが必要なもの以外はすべて除外しますが、ファイルは存在せず、それらを強制終了します。

-removeにはdash.elが必要です。これは、同じことを達成するために組み込みを見つけるのが面倒だったためです。

お役に立てれば!


mapcただし、ファイルでバッキングされていないバッファーを削除したい場合は、いつでもそのコマンドを実行する必要があります。したがって、完全に自動化されているわけではありません。完全な自動化を行うmapcには、それが単独で繰り返し実行されることを確認するかinotify、ファイルが実際に削除されたときに実行するようなものを使用する必要があります。
izkon

はい、これを定期的に、またはinotifyイベントなどに応答して実行する必要があります。私自身、1分ごとに定期的に実行します。完璧ではありませんが、ほとんどの場合十分です。(run-with-timer 60 60 (lambda () (mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))))最初の近似として使用するものです。
algernon 2017年

1
これを実装しましたが、うまくいきました。誰かが似たようなものを必要とする場合に備えて、この小さなラッパー関数を使って呼び出しました: `(defun kill-removed-buffers()(interactive)(let((to-kill(-remove 'buffer-backed-by-file-p (buffer-list))))(mapc 'kill-buffer to-kill)(message "Killed%s buffers"(length to-kill)))) `申し訳ありませんが、コメントボックスで正しくフォーマットできません。
levand 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.