Emacs:是否可以将一个特定的窗口设置为始终用作"other window"?



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

我的问题是:在一个框架中使用许多精心排列的窗口,每个窗口都显示特定的内容,这似乎不太好。

每当我使用其中一个"其他窗口"命令时,它都会替换其他窗口的内容,这些窗口(1)可能太窄,无法清楚地显示所显示的信息,(2)之后可能需要手动"清理",方法是将其设置回正确的缓冲区。(这样做的时候最好不要查看缓冲区列表,否则会弄乱另一个窗口!)

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

我想要一种解决或解决这个问题的方法,例如:

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

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

  3. 如果不能做到这一点,我想要一个命令来撤销任何窗口中最近的缓冲区更改,这样无论使用什么窗口,都会回到使用前的状态。

(目前我使用workgroups.el,并使用一个单独的工作组来检查文档,但这显然是次优。"更新"工作组并不能实现解决方案3,因为它似乎只会在缓冲区是常规文件的情况下更改回缓冲区。)

编辑:我看到这个问题和这个类似的问题非常相似,但那个问题没有得到它想要的答案。由于理想的解决方案可能不存在,我也明确地对解决方案感兴趣。

如果不能做到这一点,我想要一个命令来撤销任何窗口中最近的缓冲区更改,这样无论使用什么窗口都可以返回它在使用前显示的内容。

一个可能的解决方案是使用winner-mode。通过添加激活它

(winner-mode 1)

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

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

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

每帧一个窗口。

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

那个么你们就不能再拆分窗口了。如果需要显示另一个缓冲区,请使用另一个帧(C-x52)。

上周我收到了#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&双重麻烦。弹出的缓冲区位于其他缓冲区之上一层。

(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)))

最新更新