Herman Nurlygayanov
Herman Nurlygayanov

Reputation: 104

In Emacs, how to prevent org-babel-detangle from changing my frame/window/buffer configuration?

What I want:

What happens:

before detangle after detangle

What I've tried:

(defmacro save-frame-excursion (&rest body)
   "Eval BODY and return to the currently selected frame."
   (let ((frame-var (gensym "FRAME")))
     `(let ((,frame-var (selected-frame)))
        (unwind-protect
            (progn ,@body)
          (select-frame-set-input-focus ,frame-var)))))

(defun org-babel-detangle-no-buffer-pop-up (orig-fun &rest args)
  (save-window-excursion
    (save-frame-excursion
     (apply orig-fun args))))
(advice-add 'org-babel-detangle :around #'org-babel-detangle-no-buffer-pop-up)

Upvotes: 1

Views: 69

Answers (1)

Herman Nurlygayanov
Herman Nurlygayanov

Reputation: 104

Found a solution. Turns out, display-buffer-alist '((".*" (display-buffer-no-window))) doesn't work without an additional argument - (allow-no-window . t). This was very contrintuitive, and that threw me off.

Full working solution below:

(defun org-babel-detangle-no-buffer-pop-up (orig-fun &rest args)
  (save-excursion
    (let ((display-buffer-alist
           '((".*" (display-buffer-no-window) (allow-no-window . t)))))
      (apply orig-fun args))))

(advice-add 'org-babel-detangle :around #'org-babel-detangle-no-buffer-pop-up)

Upvotes: 2

Related Questions