Emacs: Open Last Closed File 🚀
This page shows a command to open last closed file.
put them in your Emacs Init File:
(defvar xah-recently-closed-buffers nil "alist of recently closed buffers. Each element is (buffer name, file path). The max number to track is controlled by the variable `xah-recently-closed-buffers-max'.") (defvar xah-recently-closed-buffers-max 40 "The maximum length for `xah-recently-closed-buffers'.")
(defun xah-close-current-buffer () "Close the current buffer. Similar to `kill-buffer', with the following addition: • Prompt user to save if the buffer has been modified even if the buffer is not associated with a file. • If the buffer is editing a source file in an `org-mode' file, prompt the user to save before closing. • 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' Version: 2016-06-19 2021-07-01 2022-03-22 2022-05-13" (interactive) (let (($isOrgMode (string-match "^*Org Src" (buffer-name)))) (if (active-minibuffer-window) ; if the buffer is minibuffer ;; (string-equal major-mode "minibuffer-inactive-mode") (minibuffer-keyboard-quit) (progn ;; Offer to save buffers that are non-empty and modified, even for non-file visiting buffer. (Because `kill-buffer' does not offer to save buffers that are not associated with files.) (when (and (buffer-modified-p) (xah-user-buffer-p) (not (string-equal major-mode "dired-mode")) (if (equal (buffer-file-name) nil) (if (string-equal "" (save-restriction (widen) (buffer-string))) nil t) t)) (if (y-or-n-p (format "Buffer %s modified; Do you want to save? " (buffer-name))) (save-buffer) (set-buffer-modified-p nil))) (when (and (buffer-modified-p) $isOrgMode) (if (y-or-n-p (format "Buffer %s modified; Do you want to save? " (buffer-name))) (org-edit-src-save) (set-buffer-modified-p nil))) ;; save to a list of closed buffer (when (buffer-file-name) (setq xah-recently-closed-buffers (cons (cons (buffer-name) (buffer-file-name)) 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)))) (kill-buffer (current-buffer))))))
Here's commands to open last closed file.
(defun xah-open-last-closed () "Open the last closed file. URL `http://xahlee.info/emacs/emacs/elisp_close_buffer_open_last_closed.html' Version: 2016-06-19" (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' Version: 2016-06-19 2021-10-27 2022-04-07" (interactive) (find-file (completing-read "Open:" (mapcar (lambda (f) (cdr f)) xah-recently-closed-buffers)))) (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 (($buf (generate-new-buffer "*recently closed*"))) (switch-to-buffer $buf) (mapc (lambda ($f) (insert (cdr $f) "\n")) xah-recently-closed-buffers)))
Give these commands keys:
(global-set-key (kbd "C-x k") 'xah-close-current-buffer) (global-set-key (kbd "C-S-t") 'xah-open-last-closed) ; control+shift+t