Emacs: Open Last Closed File 📜
This page shows a command to open last closed file.
put this in your Emacs Init File:
(defcustom xah-recently-closed-buffers-max 40 "The maximum length for `xah-recently-closed-buffers'." :type 'integer) (defvar xah-recently-closed-buffers nil "A Alist of recently closed buffers. Each element is (bufferName . filePath). The max number to track is controlled by the variable `xah-recently-closed-buffers-max'.") (defun xah-add-to-recently-closed (&optional BufferName BufferFileName) "Add to `xah-recently-closed-buffers'. Version: 2023-03-02" (let ((xbn (if BufferName BufferName (buffer-name))) (xbfn (if BufferFileName BufferFileName buffer-file-name))) (setq xah-recently-closed-buffers (cons (cons xbn xbfn) xah-recently-closed-buffers))) (when (> (length xah-recently-closed-buffers) xah-recently-closed-buffers-max) (setq xah-recently-closed-buffers (butlast xah-recently-closed-buffers 1)))) (defvar xah-create-buffer-backup nil "If true, `xah-close-current-buffer' creates a backup file when closing non-file buffer. Version: 2024-11-09") (setq xah-create-buffer-backup t) (defvar xah-temp-dir-path nil "Path to temp dir used by xah commands. by default, the value is dir named temp at `user-emacs-directory'. Version: 2023-03-21") (setq xah-temp-dir-path (concat user-emacs-directory "temp/")) (defun xah-open-last-closed () "Open the last closed file. URL `http://xahlee.info/emacs/emacs/elisp_close_buffer_open_last_closed.html' Created: 2016-06-19 Version: 2022-03-22" (interactive) (if (> (length xah-recently-closed-buffers) 0) (find-file (cdr (pop xah-recently-closed-buffers))) (progn (message "No recently close buffer in this session.")))) (defun xah-open-recently-closed () "Open recently closed file. Prompt for a choice. URL `http://xahlee.info/emacs/emacs/elisp_close_buffer_open_last_closed.html' Created: 2016-06-19 Version: 2023-09-19" (interactive) (find-file (let ((completion-ignore-case t)) (completing-read "Open:" (mapcar (lambda (f) (cdr f)) xah-recently-closed-buffers) nil t )))) (defun xah-list-recently-closed () "List recently closed file. URL `http://xahlee.info/emacs/emacs/elisp_close_buffer_open_last_closed.html' Version: 2016-06-19" (interactive) (let ((xbuf (generate-new-buffer "*recently closed*"))) (switch-to-buffer xbuf) (mapc (lambda (xf) (insert (cdr xf) "\n")) xah-recently-closed-buffers))) (defun xah-close-current-buffer () "Close the current buffer with possible backup. • If the buffer is a file and not modified, kill it. If is modified, do nothing. Print a message. • If the buffer is not a file, and variable `xah-create-buffer-backup' is true, then save a backup to `xah-temp-dir-path' named untitled_‹datetime›_‹randomhex›.txt. If `universal-argument' is called first, call `kill-buffer'. (this is useful to force kill.) If the buffer is a file, add the path to the list `xah-recently-closed-buffers'. URL `http://xahlee.info/emacs/emacs/elisp_close_buffer_open_last_closed.html' Created: 2016-06-19 Version: 2025-04-13" (interactive) (widen) (cond (current-prefix-arg (kill-buffer)) ;; ((eq major-mode 'minibuffer-inactive-mode) (minibuffer-keyboard-quit)) ;; ((active-minibuffer-window) (minibuffer-keyboard-quit)) ((minibufferp (current-buffer)) (minibuffer-keyboard-quit)) ((eq major-mode 'dired-mode) (xah-add-to-recently-closed (buffer-name) default-directory) (kill-buffer)) ((and buffer-file-name (not (buffer-modified-p))) (xah-add-to-recently-closed (buffer-name) buffer-file-name) (kill-buffer)) ((and buffer-file-name (buffer-modified-p)) (message "buffer file modified. Save it first.\n%s" buffer-file-name)) ((and xah-create-buffer-backup (not buffer-file-name) (xah-user-buffer-p) (not (eq (point-max) 1))) (let ((xnewName (format "%suntitled_%s_%x.txt" xah-temp-dir-path (format-time-string "%Y-%m-%d_%H%M%S") (random #xfffff)))) (when (not (file-exists-p xah-temp-dir-path)) (make-directory xah-temp-dir-path)) (write-region (point-min) (point-max) xnewName) (xah-add-to-recently-closed (buffer-name) xnewName) (kill-buffer))) (t (kill-buffer))))
Give these commands keys:
xah-close-current-bufferxah-open-last-closed
〔see Emacs Keys: Define Key〕