我在控制台模式下使用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的解决方案。
答案 0 :(得分: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)))
这是一个帮助我们扫描和找到卫星窗口的帮助:
(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)))
然后我们编写一个覆盖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))
最后,您需要向display-buffer-alist
添加一个正则表达式/函数对,这将使您的所有SVN缓冲区都使用新的卫星函数:
(push '("\\*svn-" display-buffer-in-satellite) display-buffer-alist)
您也可以为其他令人烦恼的模式添加类似的元素。
答案 1 :(得分:2)
也许您可以将Windows 1和2标记为专用。这样可以防止任何东西改变它们显示的缓冲区(你甚至需要在它们中使用 Cx b )。
如果您安装了dedicated-mode
,只需在相关窗口中运行 M-x dedicated-mode
。
如果没有,您可以定义自己的小功能,将窗口标记为专用:
(defun my-dedicated-window-toggle ()
"Toggle `window-dedicated-p' in the current window"
(interactive)
(set-window-dedicated-p
(selected-window)
(not (window-dedicated-p))))