Emacs窗口可以“部分”专用吗?

5
我正在使用dedicated.el,它与dedicate-windows-manually.el非常相似,可以将某些窗口手动标记为“专用”,并且不会被各种打开新缓冲区的命令(grep、编译等)分割。

但我只想要第二部分。

换句话说,我希望find-filekill-bufferswitch-buffer等命令能够像当前窗口没有被“专用”一样工作。但我希望其他命令(例如grepcompile)尊重窗口的“专用”状态,不要将其分割。

我尝试了一下,但它不能正常工作,而且似乎是一种错误的方法,可能会忽略许多情况。

(其中一个问题是,“专用”小模式与缓冲区关联,而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)。由于相关属性与窗口关联,因此我认为改变缓冲区会影响到该窗口的属性,这让我感到惊讶,但事实确实如此。

"find-file" 会替换当前窗口的缓冲区。我不知道您所说的“在该窗口内正常工作”的含义。请尝试描述您想要的行为 - 例如:您这样做,然后这样做...... 您想看到这个,然后那个...... 的结果。 - Drew
1个回答

2
请参阅Elisp手册,节点Dedicated Windows。如果您使用函数set-window-dedicated-p为窗口分配非nil和非t值,则函数set-window-buffer将将其视为弱独立窗口。这可能是您正在寻找的内容。

window-dedicated-p 设置为字符串似乎有效,谢谢。唯一的问题是在 find-file 之后,该值会恢复为 nil - Patrick
不太明白你的意思 - 请给出一个示例(配方),展示问题。也许你是在说弱化的专用并不是强化的专用(?),因此你可以在同一个窗口中访问另一个缓冲区(例如文件)。 - Drew
我在原问题中添加了一些示例代码。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接