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

Pat*_*ick 5 emacs

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

编辑

执行以下操作来测试 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))))
Run Code Online (Sandbox Code Playgroud)

使窗口“弱”专用确实可以满足我的要求:grep 和其他弹出缓冲区不会替换弱专用窗口中的缓冲区。然而,在弱专用窗口,find-file似乎重置window-dedicated-pnil通过我的测试dedicated-status功能,所以我还没有一种技术来防止弹出式缓冲器使用或分割窗口,并允许find-file等工作作为窗口内正常。

澄清

抱歉没说清楚。这是我想要发生的事情:

  • 我将一个窗口标记为 [弱] 专用(或可能存在的任何等效项)
  • 我调用了 grep、编译等,它们不拆分该窗口,也不替换该窗口中的缓冲区(而是拆分未标记为专用的其他窗口)
  • 在弱专用窗口中,我调用find-file,它替换了窗口中的缓冲区,但将窗口弱专用给现在更改的缓冲区

最后一点没有像我希望的那样工作:在 之后find-file,窗口不再是弱专用(window-dedicated-pnil)。由于所讨论的属性与窗口相关联,我发现更改缓冲区会影响该窗口属性令人惊讶,但事实确实如此。

Dre*_*rew 2

请参阅 Elisp 手册,节点Dedicated Windows。如果您使用函数set-window-dedicated-p为窗口赋予非值nil和非t值,则函数set-window-buffer会将其视为弱专用窗口。这可能就是您正在寻找的。