阻止emacs命令在其他窗口中显示新缓冲区

Ale*_*tro 5 svn emacs

我在控制台模式下使用emacs(即没有鼠标,一帧),具有固定的四窗口配置:

+------+------+
| win  | win  |
|  1   |   3  |
+------+------+
| win  | win  |
|  2   |   4  |
+------+------+

窗口3是我的主要编辑窗口,我大部分时间都在那个窗口.Windows 1和2始终保持相同的两个缓冲区,我很少更改为这些窗口,因为缓冲区自动更新它们并且它们包含只读信息.Windows 4是我的卫星窗口,很高兴大多数打开新缓冲区的emacs命令(例如grep,编译命令等)都显示新的缓冲区总是在Window 4中.这让生活变得非常简单,因为我将F12绑定到了窗口3和窗口4和后面.

坏人是psvn.el. 根据需要,svn-status缓冲区始终在Window 3中打开.
但是所有其他缓冲区(*svn-diff*,*svn-log*,...)在窗口1,2或3中随机打开,我无法预测它们将打开哪一个.有时,同一个缓冲区甚至同时显示在其中两个窗口上,这让我很生气!

我如何告诉emacs/psvn停止这样做?我尝试了所有常用的措施(调整相同的窗口缓冲区名称,分裂高度阈值,分割宽度阈值,...),但到目前为止没有任何工作:-(

请不要涉及ecb的解决方案.

Jor*_*ndo 5

基于@lawlist所说的,这里是一个如何display-buffer通过编写自己的display-buffer函数并添加元素来覆盖功能的示例display-buffer-alist.

这里我们有一个交互式功能,将当前选择的窗口标记为"卫星"窗口:

(defun mark-this-window-as-satellite ()
  "Mark the current window as the satellite window."
  (interactive)
  (mapc (lambda (win) (set-window-parameter win 'satellite nil))
    (window-list))
  (set-window-parameter nil 'satellite t)
  (message "Window: %s is now the satellite window." (selected-window)))
Run Code Online (Sandbox Code Playgroud)

这是一个帮助我们扫描和找到卫星窗口的帮手:

(defun get-satellite-window ()
  "Find and return the satellite window or nil if non exists."
  (find-if (lambda (win) (window-parameter win 'satellite)) (window-list)))
Run Code Online (Sandbox Code Playgroud)

然后我们编写一个将覆盖其display-buffer行为的函数.此功能将查找卫星窗​​口并在那里显示缓冲区:

(defun display-buffer-in-satellite (buffer ignore)
  "Display the buffer in the satellite window, or the first window \
    it finds if there is no satellite."
  (let ((satellite-window (or (get-satellite-window)
                              (first (window-list)))))
    (select-window satellite-window)
    (display-buffer-same-window buffer nil)
    (display-buffer-record-window 'reuse satellite-window buffer)
    satellite-window))
Run Code Online (Sandbox Code Playgroud)

最后,你需要添加一个正则表达式/函数对,display-buffer-alist这将使你所有的SVN缓冲区使用新的卫星函数:

(push '("\\*svn-" display-buffer-in-satellite) display-buffer-alist)
Run Code Online (Sandbox Code Playgroud)

您也可以为其他麻烦的模式添加类似的元素.