Bad-ptr / persp-mode.el

named perspectives(set of buffers/window configs) for emacs
394 stars 44 forks source link

Fix lexical binding for funcall. #137

Closed roife closed 1 year ago

roife commented 1 year ago

Using :after-load-function in persp-def-buffer-save/load causes error Symbol’s value as variable is void: persp-after-load-function, as what happened in this issue (and doomemacs turned to :load-function to avoid this error).

This bug was introduced in af24502de46eb3b11d14761d2eff44ac7c024a38. In the function perps-def-buffer-save/load, the interpreter won't capture outside local variable persp-after-load-function for quoted expression persp-after-load-lambda in add-hook.

(cl-defun persp-def-buffer-save/load (...)
  ;; ...
  (setq load-fun
        '(lambda (savelist)
            ;; ...
            (let ((persp-after-load-function (with-no-warnings
                                                    ',after-load-function))
                   persp-after-load-lambda)
              (setq persp-after-load-λ
                    #'(λ (...)
                         ;; `persp-after-load-function' cannot be captured here
                         (apply persp-after-load-function persp-loaded-buffer pall-args)
              ))
              (add-hook 'persp-after-load-state-functions persp-after-load-lambda t))))
    ;; ...
    (funcall load-fun ...))

So when the hook is triggered, the interpreter cannot find persp-after-load-function.

This is because Emacs Lisp won't capture outside local variables for quoted expressions (as data), even though lexical-binding was turned on globally. So I wrapped default-load-fun with (eval ... t), in which the second argument means using lexical binding for evaluation.

Bad-ptr commented 1 year ago

OK, thanks