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

时间:2014-02-13 17:59:50

标签: 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的解决方案。

2 个答案:

答案 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))))