![使 emacs 框架/窗口不受 emacs 自动更改的影响](https://linux22.com/image/1228646/%E4%BD%BF%20emacs%20%E6%A1%86%E6%9E%B6%2F%E7%AA%97%E5%8F%A3%E4%B8%8D%E5%8F%97%20emacs%20%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%94%B9%E7%9A%84%E5%BD%B1%E5%93%8D.png)
我想知道是否有办法将分割窗口 emacs 会话中的某些框架标记为不可更改。我通常有 4 个框架用于源文件,2-3 个框架用于其他视图,例如编译/grep-find/等。
我想以某种方式标记后者的框架,以便它们永远不会被分割或被 emacs 更改其内容。这样,如果我单击搜索结果,我的编译窗口就不会被分割,也不会插入源文件。
我希望任何源文件都进入我的源窗口,并远离我的杂项视图窗口。有办法做到这一点吗?
答案1
是的,有办法做到这一点,但我认为这并不容易。快速浏览与框架相关的函数和变量证实了我的信念,这里没有简单的解决办法。问题是,一旦这些框架成为仅存的框架,Emacs 就不知道该怎么做,需要对它们做些什么。
我认为可以编写一个包来告知所有低级帧操作函数,这样某些帧将不受任何操作的影响,但这需要识别和解释每个低级函数。我认为更好的方法(除非您是 elisp 专家)是识别出您使用的让您烦恼的函数,并查看它们是否使用一个或一组通用函数来确定在哪个帧中显示输出,然后着手改变这种行为。
我可能会使用框架参数(frame-parameter
和modify-frame-parameters
)来存储给定框架是否不可侵犯。这可以由您手动设置,或者可以在使用任何数据填充框架的函数末尾设置(通过使用包装函数或(更可能)defadvice)。然后找到更改其中一个的函数并查看其源代码。它调用了哪些函数来确定要使用哪个框架?修改和/或建议这些函数(或可能是这些函数调用的某些函数)不要考虑具有此特定参数集的框架。作为特殊情况,如果没有其他可用的框架,则创建一个新框架并返回它。
您还可以拥有多个框架类(例如源框架、编译/错误框架),并允许某些函数重用其中一些,但不允许其他函数重用。实际上,您将其复杂化到何种程度取决于您和您的想象力。
无论如何,乍一看它是可行的,但却并非易事。
现在,说了这么多,有一个软件包可以帮助你更接近你想要的东西:一对一 Emacs。但它不知道它是否以您想要的方式保护框架。从描述来看,它似乎重新定义了许多核心功能,而不是建议它们,这可能会使其极其特定于版本(这只是我阅读他的描述时的感觉;我没有查看代码以查看是否确实发生了这种情况)。
祝你好运!
答案2
一个选择可能是研究 gdb-many-windows 的工作原理 - 此模式对于保留特定窗口布局非常积极。
此外,可以将框架/窗口配置保存到寄存器,然后从寄存器中检索该配置。
第三种选择:这是 elisp 中的一个解决方案(您可以在临时缓冲区中对其进行评估以尝试它,如果您喜欢它,则可以将其添加到您的 .emacs 中)
(define-key global-map "\C-cs"
(lambda ()
(interactive)
(message "saving current frame and window layout")
(setq my-favorite-frame-setup (current-frame-configuration))))
(define-key global-map "\C-cf"
(lambda ()
(interactive)
(message "restoring frame and window layout")
(set-frame-configuration my-favorite-frame-setup))))
按照您喜欢的方式设置所有框架和窗口大小和位置,然后键入 Control-c s,您的布局就会被保存。然后键入 Control-c f 以在布局发生变化时恢复它。这包括所有窗口大小、窗口分割数、每个窗口中的缓冲区以及每个窗口在桌面上的位置。我刚才制作这些键绑定只是为了回答这个问题,但我非常喜欢它们,我现在实际上要将它们保留在我的 .emacs 中,感谢您提出的好问题。