From 2e82f297f6ced1b8161714861a4b1e35fac0376d Mon Sep 17 00:00:00 2001 From: Janfel <33464477+Janfel@users.noreply.github.com> Date: Sun, 19 Jan 2020 02:50:44 +0100 Subject: [PATCH] Fix #2036: Copy local variables into formatting buffer. Make +format-buffer copy all buffer-local variables from the original buffer into the temporary buffer. When resolving a symbol inside of a formatter, the value it is bound to in the formatted buffer will now be used instead of the default value. Fixes #2036. --- modules/editor/format/autoload/format.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 49345bf5c..77eb0c24c 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -131,6 +131,7 @@ See `+format/buffer' for the interactive version of this function, and ;; like `gofmt') widen the buffer, in order to only format a region of ;; text, we must make a copy of the buffer to apply formatting to. (let ((output (buffer-substring-no-properties (point-min) (point-max))) + (origin-buffer (or (buffer-base-buffer) (current-buffer))) (origin-buffer-file-name (buffer-file-name (buffer-base-buffer))) (origin-default-directory default-directory)) (with-temp-buffer @@ -138,8 +139,12 @@ See `+format/buffer' for the interactive version of this function, and (insert output) ;; Ensure this temp buffer _seems_ as much like the origin ;; buffer as possible. - (setq default-directory origin-default-directory - buffer-file-name origin-buffer-file-name) + (cl-loop for (var . val) in (buffer-local-variables origin-buffer) + ;; Making enable-multibyte-characters buffer-local + ;; causes an error. + unless (eq var 'enable-multibyte-characters) + ;; Using setq-local would quote var. + do (set (make-local-variable var) val)) ;; Since we're piping a region of text to the formatter, remove ;; any leading indentation to make it look like a file. (when preserve-indent-p