These two function names are confusing, but they are different functions.
The content of this article is explained in Creating Buffer-Local in GNU Emacs Lisp Reference Manual.
- “Local” in Emacs means that variables can hold independent values for each buffer.
make-local-variable*temporarily* makes the variable local in the current buffer
make-variable-buffer-localensures that the variable is *always* set as local.
Emacs Lispers targeting Emacs 24.3 and later should only use
setq-local. Looking at its implementation (
subr.el added in Emacs 24.3), you will find a difference between the two functions.
(defmacro setq-local (var val) "Set variable VAR to value VAL in current buffer." ;; Can't use backquote here, it's too early in the bootstrap. (declare (debug (symbolp form))) (list 'set (list 'make-local-variable (list 'quote var)) val)) (defmacro defvar-local (var val &optional docstring) "Define VAR as a buffer-local variable with default value VAL. Like `defvar' but additionally marks the variable as being automatically buffer-local wherever it is set." (declare (debug defvar) (doc-string 3)) ;; Can't use backquote here, it's too early in the bootstrap. (list 'progn (list 'defvar var val docstring) (list 'make-variable-buffer-local (list 'quote var))))
In the past, I wrote as follows in my
(defun my/enh-ruby-mode-hook () "Enhanced Ruby Modeでだけ ac-ignore-case を t にしたいお" (set (make-local-variable 'ac-ignore-case) t))
setq-local makes that code simple.
(defun my/enh-ruby-mode-hook () "Enhanced Ruby Modeでだけ ac-ignore-case を t にしたいお" (setq-local ac-ignore-case t))
If you are the author of Lisp packages, please carefully consider using this function. Do you want to set it temporarily locally?
This is exclusively a function for Lisp package authors.
;;;###autoload (progn (defvar copy-file-on-save-dest-dir nil "Path to deployment directory or convert (mapping) function.") (make-variable-buffer-local 'copy-file-on-save-dest-dir) (put 'copy-file-on-save-dest-dir 'safe-local-variable #'stringp))
This function reduces repetition of function names.
;;;###autoload (progn (defvar-local copy-file-on-save-dest-dir nil "Path to deployment directory or convert (mapping) function.") (put 'copy-file-on-save-dest-dir 'safe-local-variable #'stringp))
It is not necessary to use
setq-local for variables defined in this way. Please use
setq with confidence.
Do not forget the definition of
safe-local-variable when you provide variables that you can customize for per directory/project. Directory Variables a better idea than
...It is the worst that the notation
defcustom :type is different.
Replacing the strange twins with
setq-local means dropping support for versions below Emacs 24.2.
Emacs 24.3 was released on March 10, 2013, but I ceased to pay for the rotten milks.