我使用非常类似于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
函数的测试将window-dedicated-p
重置为nil
,因此我仍然没有一种技术来防止弹出缓冲区使用或拆分窗口,并允许find-file
等在该窗口内正常工作。
clarification
抱歉没说清楚。我想要发生的事情如下:
find-file
,它替换了窗口中的缓冲区,但将窗口留给现在更改的缓冲区。这是我所希望的最后一点不起作用的地方:在find-file
之后,窗口不再是弱专用的(window-dedicated-p
是nil
)。由于所讨论的属性与窗口相关联,因此,更改缓冲区会影响该窗口属性,这是令人惊讶的。
发布于 2014-12-31 23:05:34
参见Elisp手册,节点Dedicated Windows
。如果您使用函数set-window-dedicated-p
为窗口提供一个非nil
和非t
值,那么函数set-window-buffer
将把它视为一个弱专用窗口。这可能就是你要找的。
https://stackoverflow.com/questions/27726897
复制相似问题