Emacs:是否可以将一个特定窗口设置为始终用作“其他窗口”?

时间:2014-03-04 23:35:47

标签: emacs

有许多有用的emacs命令可以在“其他窗口”中执行操作(例如C-x C-b查看缓冲区列表,或C-h a查看可用命令,或许多其他命令)。

我的问题:在一帧中使用一些精心布置的窗口似乎不太合适,每个窗口都显示特定的内容。

无论何时我使用其中一个“其他窗口”命令,它都会替换其他窗口的内容,其中(1)可能太窄而无法清楚地显示正在显示的信息,(2)可能需要手动“之后,通过将其设置回正确的缓冲区来清理。 (最好不要在执行此操作时检查缓冲区列表,否则您将陷入另一个窗口!)

(即使从同一窗口发出命令,Emacs也不会总是使用相同的“其他窗口”。例如,C-x C-b输出可能会进入一个“其他”窗口而{{1在不同的“其他”窗口中显示其结果。同样,C-h a有时会滚动与输出刚出现的窗口不同的“其他”窗口。)

我想解决或解决此问题,例如:

  1. 我真的希望能够指定一个特定的窗口,以便始终用作该帧中任何窗口的“其他窗口”。

  2. 如果失败了,或许有一种方法可以重新排列窗口顺序和/或使用不可见的窗口(如果存在的话)通过进行大量的幕后窗口改组来获得解决方案1的效果,可能需要在写入“其他窗口”的命令之前或之后输入额外的命令。

  3. 如果没有这些,我想要一个命令来撤消任何窗口中最近的缓冲区更改,因此无论使用什么窗口都会回到它在使用之前显示的内容。

  4. (目前我使用的是workgroups.el,我使用一个单独的工作组来检查文档,但这显然不是最理想的。“更新”工作组没有实现解决方案3,因为它似乎只是改变了缓冲区,如果它是一个普通的文件。)

    编辑:我看到这个问题与this similar question非常相似,但是这个问题没有得到它正在寻找的答案。由于理想的解决方案可能不存在,我也明确对解决方案感兴趣。

3 个答案:

答案 0 :(得分:2)

  

失败的那些,我想要一个命令来撤消任何窗口中最近的缓冲区更改,所以无论使用什么窗口都会回到   它在使用之前显示的是什么。

可能的解决方案是使用winner-mode。通过添加

激活它
(winner-mode 1)

它提供了两个命令winner-undowinner-redo分别用于撤消和重做窗口配置。

此外,由于您提到workgroups.el尝试workgroups2,一个workgroups.el的分支。它提供了类似的命令(wg-undo-wconfig-changewg-redo-wconfig-change),用于恢复窗口配置

答案 1 :(得分:0)

所有人都不同意我的回答。但有人可能会认为这很有效。

每帧都做一个窗口。

;;Disable split-window
(defun split-window-below ()
  (interactive)
  ;;do nothing
)

(defun split-window-right ()
  (interactive)
  ;;do nothing
)

然后你不能拆分窗口了。如果需要显示另一个缓冲区,请使用另一个帧( C-x 5 2 )。

答案 2 :(得分:0)

上周我找到了#1的解决方案。这个想法是专注于所有的窗户,但你的关注。通过这种方式,您可以锁定窗口。听起来有点相反。

(defvar window-locked-p nil)
(defun lockon-window ()
  "Set a target window to be used when calls `other-window'.
To set the target window, first put point to the window, then
call this.  Technically this sets all window dedicated but the
target window.  Call again to free windows."
  (interactive)
  (walk-windows
   (lambda (win)
     (set-window-dedicated-p win (not window-locked-p))))
  (if window-locked-p
      (message "All windows are free")
    (set-window-dedicated-p (selected-window) nil)
    (message "Window is locked on"))
  (setq window-locked-p (not window-locked-p)))

当我听Stevie Ray Vaughan& amp;双重麻烦。弹出缓冲区位于其他缓冲区之上一层。

(winner-mode 1)
(defun slide-window ()
  "This slides a buffer, in an unexpected window, to next-window.
Call this with point on the window.  This only works soon after a
buffer was popped by `other-window' to an unexpected window.
Technically this recalls previous buffer-set by (winner-undo)
then shows the buffer to next-window.  This is complementary to
`lockon-window'."
  (interactive)
  (let ((buf (buffer-name)))
    (winner-undo)
    (set-window-buffer (next-window) buf)
    (message "Window is slided")
    (other-window 1)))