65 lines
2.3 KiB
EmacsLisp
65 lines
2.3 KiB
EmacsLisp
;;; +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
|