有许多有用的emacs命令可以在"其他窗口"中执行任务(如C-x C-b
查看缓冲区列表,C-h a
查看可用命令,或许多其他命令)。
我的问题是:在一个框架中使用许多精心排列的窗口,每个窗口都显示特定的内容,这似乎不太好。
每当我使用其中一个"其他窗口"命令时,它都会替换其他窗口的内容,这些窗口(1)可能太窄,无法清楚地显示所显示的信息,(2)之后可能需要手动"清理",方法是将其设置回正确的缓冲区。(这样做的时候最好不要查看缓冲区列表,否则会弄乱另一个窗口!)
(Emacs甚至不总是使用同一个"其他窗口",即使命令是从同一个窗口发出的。例如,C-x C-b
输出可能会进入一个"另一个"窗口,而C-h a
则在不同的"其他"窗口中显示其结果。同样,C-M-v
有时会滚动一个与刚出现输出的窗口不同的"另一"窗口。)
我想要一种解决或解决这个问题的方法,例如:
-
我真的希望能够指定一个特定的窗口,始终用作该帧中任何窗口的"其他窗口"。
-
如果做不到这一点,也许有一种方法可以重新排列窗口顺序和/或使用不可见的窗口(如果存在的话),通过进行大量的幕后窗口洗牌来获得解决方案1的效果,也许需要在写入"其他窗口"的命令之前或之后输入额外的命令。
-
如果不能做到这一点,我想要一个命令来撤销任何窗口中最近的缓冲区更改,这样无论使用什么窗口,都会回到使用前的状态。
(目前我使用workgroups.el,并使用一个单独的工作组来检查文档,但这显然是次优。"更新"工作组并不能实现解决方案3,因为它似乎只会在缓冲区是常规文件的情况下更改回缓冲区。)
编辑:我看到这个问题和这个类似的问题非常相似,但那个问题没有得到它想要的答案。由于理想的解决方案可能不存在,我也明确地对解决方案感兴趣。
如果不能做到这一点,我想要一个命令来撤销任何窗口中最近的缓冲区更改,这样无论使用什么窗口都可以返回它在使用前显示的内容。
一个可能的解决方案是使用winner-mode
。通过添加激活它
(winner-mode 1)
它提供了两个命令winner-undo
和winner-redo
,分别用于撤消和重做窗口配置。
此外,由于您提到了workgroups.el
,请尝试workgroups2
,它是workgroups.el的一个分支。它提供了类似的命令(wg-undo-wconfig-change
和wg-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)))