我正在使用
使窗口变成“弱”专用确实可以做到我想要的效果:grep和其他弹出缓冲区不会替换弱专用窗口中的缓冲区。然而,在该弱专用窗口中,find-file似乎将window-dedicated-p重置为nil,经过我的dedicated-status函数测试得知,因此我仍然没有一种技术可以防止弹出缓冲区使用或分割窗口,并允许find-file等在该窗口内正常工作。
澄清:
非常抱歉没有表达清楚。这是我想发生的事情:
1. 我将一个窗口标记为[弱]专用(或任何等效物) 2. 我调用grep、编译等操作,它们不会拆分那个窗口,也不会替换那个窗口中的缓冲区(相反,会拆分未标记为专用的其他窗口) 3. 在弱专用窗口中,我调用find-file,它将替换窗口中的缓冲区但使窗口保持弱专用状态以适应更改后的缓冲区
正是最后这一点没有按照我所希望的方式发挥作用:在find-file之后,窗口不再是弱专用的(window-dedicated-p为nil)。由于相关属性与窗口关联,因此我认为改变缓冲区会影响到该窗口的属性,这让我感到惊讶,但事实确实如此。
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等在该窗口内正常工作。
澄清:
非常抱歉没有表达清楚。这是我想发生的事情:
1. 我将一个窗口标记为[弱]专用(或任何等效物) 2. 我调用grep、编译等操作,它们不会拆分那个窗口,也不会替换那个窗口中的缓冲区(相反,会拆分未标记为专用的其他窗口) 3. 在弱专用窗口中,我调用find-file,它将替换窗口中的缓冲区但使窗口保持弱专用状态以适应更改后的缓冲区
正是最后这一点没有按照我所希望的方式发挥作用:在find-file之后,窗口不再是弱专用的(window-dedicated-p为nil)。由于相关属性与窗口关联,因此我认为改变缓冲区会影响到该窗口的属性,这让我感到惊讶,但事实确实如此。