;;; +compat.el --- Thin backward-compatibility shim -*- lexical-binding: t; -*- ;;; Commentary: ;; I use different versionso of Emacs. Sometimes I have to copy-paste functions ;; from newer Emacs to make my customizations work. This is that file. ;; This is probably ill-advised. ;;; Code: ;;; Load stuff in +compat/ subdirectory (dolist (file (directory-files (locate-user-emacs-file "lisp/+compat") :full "\\.el\\'")) (load file :noerror)) ;;; Only define things if not already defined (defmacro +compat-defun (name &rest args) `(if (fboundp ',name) (message "+compat: `%s' already bound." ',name) (defun ,name ,@args))) (defmacro +compat-defmacro (name &rest args) `(if (fboundp ',name) (message "+compat: `%s' already bound." ',name) (defmacro ,name ,@args))) ;;; Single functions (+compat-defmacro dlet (binders &rest body) "Like `let' but using dynamic scoping." (declare (indent 1) (debug let)) ;; (defvar FOO) only affects the current scope, but in order for ;; this not to affect code after the main `let' we need to create a new scope, ;; which is what the surrounding `let' is for. ;; FIXME: (let () ...) currently doesn't actually create a new scope, ;; which is why we use (let (_) ...). `(let (_) ,@(mapcar (lambda (binder) `(defvar ,(if (consp binder) (car binder) binder))) binders) (let ,binders ,@body))) ;; https://git.savannah.gnu.org/cgit/emacs.git/diff/?id=772b189143453745a8e014e21d4b6b78f855bba3 (+compat-defun rename-visited-file (new-location) "Rename the file visited by the current buffer to NEW-LOCATION. This command also sets the visited file name. If the buffer isn't visiting any file, that's all it does. Interactively, this prompts for NEW-LOCATION." (interactive (list (if buffer-file-name (read-file-name "Rename visited file to: ") (read-file-name "Set visited file name: " default-directory (expand-file-name (file-name-nondirectory (buffer-name)) default-directory))))) (when (and buffer-file-name (file-exists-p buffer-file-name)) (rename-file buffer-file-name new-location)) (set-visited-file-name new-location nil t)) (provide '+compat) ;;; +compat.el ends here