我正在使用与dedicated.el
非常相似的dedicate-windows-manually.el
来手动将某些窗口标记为“专用”到它们的缓冲区,并且通过打开新缓冲区的各种命令也无法分割(grep,编译)等等。)。
但我真的只想要第二部分。
换句话说,我希望find-file
,kill-buffer
,switch-buffer
等工作,好像当前窗口不专用。但我希望其他命令(grep
,compile
)能够尊重专用状态,而不是拆分该窗口。
我对此做了一个小小的尝试,但它没有正常工作,似乎是一种误入歧途的方式,很可能错过很多案例。
(其中一个问题是“专用”次要模式与缓冲区相关联,set-window-dedicated-p
适用于窗口;这可以克服,但我仍然觉得必须是一个更好的方式来实现我想要的......)
(defun with-undedicated (f)
(interactive)
(let ((was-dedicated (bound-and-true-p dedicated-mode)))
(progn
(if was-dedicated (dedicated-mode))
(command-execute f)
(if was-dedicated (dedicated-mode)))))
(defun undedicated-find-file ()
(interactive)
(with-undedicated 'ido-find-file))
(defun undedicated-kill-buffer ()
(interactive)
(with-undedicated 'ido-kill-buffer))
(defun undedicated-switch-buffer ()
(interactive)
(with-undedicated 'ido-switch-buffer))
(global-set-key (kbd "C-x C-f") 'undedicated-find-file)
(global-set-key (kbd "C-x k") 'undedicated-kill-buffer)
(global-set-key (kbd "C-x b") 'undedicated-switch-buffer)
修改
以下是为了测试Drew的答案:
(defun make-weak-dedicated ()
(interactive)
(set-window-dedicated-p (selected-window) "weak"))
(defun dedicated-status ()
(interactive)
(minibuffer-message "window-dedicated-p: %s" (window-dedicated-p (selected-window))))
使窗口“弱”专用确实做我想要的:grep和其他弹出缓冲区不替换弱专用窗口中的缓冲区。但是,在那个弱专用窗口中,我find-file
函数测试window-dedicated-p
似乎会将nil
重置为dedicated-status
,所以我仍然没有阻止弹出缓冲区使用或拆分窗口和,允许find-file
等在该窗口内正常工作。
澄清
很抱歉不清楚。这就是我想要发生的事情:
find-file
,它取代窗口中的缓冲区,但将窗口弱专用留给现在更改的缓冲区这是最后一点无法实现的方式:在find-file
之后,窗口不再是弱专用的(window-dedicated-p
是nil
)。由于有问题的属性与窗口相关联,因此我发现更改缓冲区会影响该窗口属性,这是令人惊讶的,但事实确实如此。
答案 0 :(得分:2)
请参阅Elisp手册,节点Dedicated Windows
。如果您使用函数set-window-dedicated-p
为窗口提供非nil
和非t
值,则函数set-window-buffer
会将其视为弱专用窗口。这可能就是你要找的东西。