Bad-ptr / persp-mode.el

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

Proper ranger (deer) buffers handling #142

Closed sfavazza closed 9 months ago

sfavazza commented 10 months ago

Hello I am trying to create my own save/load functions to handle buffers in deer-mode (minor mode derived from ranger-mode). The adopted definitions are as follow:

(setq custom/persp-deer-buffer-tag 'def-deer-buffer)

;; disable saving buffers in ranger-mode (not deer-mode)
(add-to-list 'persp-filter-save-buffers-functions (lambda (buffer)
                                                    (with-current-buffer buffer
                                                      (and (eq major-mode 'ranger-mode)
                                                           (not (r--fget ranger-minimal))))))

;; define a record to save the "deer" buffers in a persp layout file
(add-to-list 'persp-save-buffer-functions (lambda (buffer)
                                            (with-current-buffer buffer
                                              (when (and (eq major-mode 'ranger-mode)
                                                         (r--fget ranger-minimal))
                                                `(,custom/persp-deer-buffer-tag
                                                ,(buffer-name)
                                                ,default-directory
                                                ;; not sure this field is needed, but I noticed that w/o this
                                                ;; field, the record here generated sometimes gets deleted from
                                                ;; the saved file under ~/.emacs.d/.cache/layouts/<layout-file>
                                                ranger-mode)))))

(defun custom/persp-load-deer-buffer (savelist)
    (when (eq (car savelist) custom/persp-deer-buffer-tag)
      (let* ((params (cdr savelist))
             (persp-buffer-name (car params))
             (default-directory (cadr params)))
        (with-current-buffer (get-buffer-create persp-buffer-name)
          (r--fset ranger-minimal t)
          (ranger-find-file default-directory)
          ;; (deer default-directory)
          ))))
(add-to-list 'persp-load-buffer-functions #'custom/persp-load-deer-buffer)

The generation of the custom record works, but reloading the layout fails. I get the error message for each deer-mode buffers: Replaced deleted <buffer> buffer with *scratch* (coming from eyebrowse, but I am sure something bad happen already when loading a perspective from file).

Bad-ptr commented 9 months ago

As a first guess make sure that custom/persp-load-deer-buffer returns a valid buffer. Try to return (current-buffer) from your custom/persp-load-deer-buffer. Like

...
(with-current-buffer (get-buffer-create persp-buffer-name)
          (r--fset ranger-minimal t)
          (ranger-find-file default-directory)
          ;; (deer default-directory)
          (current-buffer)))))
...

I don't know how ranger-find-file works. May be it creates another buffer on his own, then you need something like:

...
(with-current-buffer (ranger-find-file default-directory)
  (r--fset ranger-minimal t)
  (rename-buffer persp-buffer-name)
  (current-buffer))
...
sfavazza commented 9 months ago

Hi, thank you for the quick reply.

I just tried your solution but it seems that ranger-mode does not want to cooperate. I guess I have to dig deeper in its implementation. Thanks anyway.