I run auctex with the latex source on the left half buffer and corresponding pdf on the right half (using C-x 3 to split the buffer). I then split the left half buffer into 2 so as two work on different parts of the latex source file. Similarly I split the right hand buffer into two so as to view the two corresponding pdf parts. Is there some way of doing forward/reverse search between the top left latex source and top right pdf; and a forward/reverse search between the bottom left latex source and bottom right pdf? This would help a lot when working on a large latex document. Right now, the top left and bottom left latex source do forward/backward search with the top right pdf; the bottom right pdf seems to be ignored.
1 Answer
The solution at the bottom of this answer does not work anymore after https://github.com/emacs-mirror/emacs/commit/f646675cd1637948b2df2351a9666792ea8251ea
The extra argument DEDICATE
of window--display-buffer
has been removed by that commit.
Since window--display-buffer
does consider display-buffer-mark-dedicated
anyway maybe Emacs does like the OP wanted out-of-the-box.
Otherwise you can use the following modified code:
(defun display-buffer-beside-selected (buffer alist)
"Try displaying BUFFER in a window beside the selected window.
If there is a window below the selected one and that window
already displays BUFFER, use that window.
If that attempt fails and there is a non-dedicated window
beside the selected one, use that window.
The left or right hand side is chosen if ALIST contains
the cons (side . left) or (side . right), respectively."
(let (window)
(or (and (setq window (window-in-direction (cdr (assq 'side alist))))
(eq buffer (window-buffer window))
(window--display-buffer buffer window 'reuse alist))
(and (setq window (window-in-direction (cdr (assq 'side alist))))
(not (window-dedicated-p window))
(window--display-buffer
buffer window 'reuse alist)))))
(defun my-display-buffer-right (fun &rest args)
"Use `display-buffer-in-side-window' as `display-buffer-overriding-action'.
Then run FUN with ARGS."
(let ((display-buffer-overriding-action '(display-buffer-beside-selected (side . right))))
(apply fun args)))
(defun my-display-buffer-left (fun &rest args)
"Use `display-buffer-in-side-window' as `display-buffer-overriding-action'.
Then run FUN with ARGS."
(let ((display-buffer-overriding-action '(display-buffer-beside-selected (side . left))))
(apply fun args)))
(advice-add 'TeX-pdf-tools-sync-view :around #'my-display-buffer-right)
(advice-add 'pdf-sync-backward-search-mouse :around #'my-display-buffer-left)
You can set the preferred window via the ACTION
for display-buffer
, which see. That also works for commands that use display-buffer
.
From all the possibilities for setting the ACTION
the variable display-buffer-overriding-action
has the highest priority.
The following code shows how to define the action you want and how to set display-buffer-overriding-action
for the commands you need.
(defun display-buffer-beside-selected (buffer alist)
"Try displaying BUFFER in a window beside the selected window.
If there is a window below the selected one and that window
already displays BUFFER, use that window.
If that attempt fails and there is a non-dedicated window
beside the selected one, use that window.
The left or right hand side is chosen if ALIST contains
the cons (side . left) or (side . right), respectively."
(let (window)
(or (and (setq window (window-in-direction (cdr (assq 'side alist))))
(eq buffer (window-buffer window))
(window--display-buffer buffer window 'reuse alist))
(and (setq window (window-in-direction (cdr (assq 'side alist))))
(not (window-dedicated-p window))
(window--display-buffer
buffer window 'reuse alist display-buffer-mark-dedicated)))))
(defun my-display-buffer-right (fun &rest args)
"Use `display-buffer-in-side-window' as `display-buffer-overriding-action'.
Then run FUN with ARGS."
(let ((display-buffer-overriding-action '(display-buffer-beside-selected (side . right))))
(apply fun args)))
(defun my-display-buffer-left (fun &rest args)
"Use `display-buffer-in-side-window' as `display-buffer-overriding-action'.
Then run FUN with ARGS."
(let ((display-buffer-overriding-action '(display-buffer-beside-selected (side . left))))
(apply fun args)))
(advice-add 'TeX-pdf-tools-sync-view :around #'my-display-buffer-right)
(advice-add 'pdf-sync-backward-search-mouse :around #'my-display-buffer-left)
-
Thank you sir! That works perfectly! I have a related new question which I will post.– VikramCommented Feb 4, 2020 at 2:04