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

时间:2014-12-31 22:29:42

标签: emacs

我正在使用与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等在该窗口内正常工作。

澄清

很抱歉不清楚。这就是我想要发生的事情:

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

这是最后一点无法实现的方式:在find-file之后,窗口不再是弱专用的(window-dedicated-pnil)。由于有问题的属性与窗口相关联,因此我发现更改缓冲区会影响该窗口属性,这是令人惊讶的,但事实确实如此。

1 个答案:

答案 0 :(得分:2)

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