3

当我编程时,我使用两个带有 Emacs 的屏幕,两个缓冲区在每个窗口中拆分,任何时候屏幕上总共有 4 个开源文件。

我在缓冲区之间切换C-x b,在 Windows之间切换Alt-TAB。当我在缓冲区之间切换时,我通过为mode-line和定义不同的面来更改缓冲区的外观mode-line-inactive。但是,当我从 Emacs 窗口完全切换到另一个 Emacs 窗口时,如何停用缓冲区Alt-TAB

我在带有 Gnome 2.32.1 的 Ubuntu 11.04 上使用 Emacs 23.2.1 可能也很重要。

PS:如何在 Emacs 中自动保存文件失去焦点的问题是在不同的目标之后,但具有相同的原始事件“窗口失去焦点”。

4

4 回答 4

3

它可能取决于您的窗口管理器以及它如何管理多个窗口或框架,用 emacs 的说法。下面的代码在 fvwm 中像冠军一样工作,但在 gnome 中并不总是如此。

我映射了一个键击 Co 以在帧之间移动,这在您想要转到另一个帧时会有所帮助,但 alt-tab 会在途中带您浏览许多多余的应用程序。

如果您正在运行具有两个帧的单个 emacs 实例,则可以使用以下内容:

(defun pgr-previous-frame ()
  "go to the previous frame"
  (interactive)
  (pgr-switch-frame (previous-frame)))

(defun pgr-next-frame ()
  "go to the next frame"
  (interactive)
  (pgr-switch-frame (next-frame)))

(defun pgr-switch-frame (frame)
  "go to the specified frame and raise it"
  ;; reset the frame properties here
  (select-frame frame)     
  (raise-frame frame)
  ;;change the display in some manner here
  )

您也可以尝试添加一些建议以提高框架和较低框架尚未尝试过但值得一试。

于 2011-09-01T18:55:31.223 回答
2

在 Emacs 24.4 及更高版本中,您可以使用focus-in-hookfocus-out-hook。这段代码似乎可以工作,使得非活动框架的活动窗口与非活动窗口具有相同的颜色:

(defvar my-mode-line-active-background "gray75")
(defvar my-mode-line-inactive-background "gray40")

(defun my-unhighlight-mode-line ()
  (set-face-attribute 'mode-line nil
                      :background my-mode-line-inactive-background))

(add-hook 'focus-out-hook 'my-unhighlight-mode-line)

(defun my-highlight-mode-line ()
  (set-face-attribute 'mode-line nil
                      :background my-mode-line-active-background))

(add-hook 'focus-in-hook 'my-highlight-mode-line)
于 2014-02-21T16:58:20.803 回答
2

我真的很喜欢@logoscia 的回答,这让我可以做这个更通用的版本。它mode-line-inactive在没有焦点时使用面部。

(add-hook 'focus-out-hook
      (lambda ()
        (copy-face 'mode-line '--mode-line-backup)
        (copy-face 'mode-line-inactive 'mode-line)))
(add-hook 'focus-in-hook
      (lambda ()
        (copy-face '--mode-line-backup 'mode-line)))
于 2015-06-05T11:43:39.893 回答
0

我不知道它是否只能使用 Emacs 来完成,但一种可能的替代方法是在 shell 脚本中运行wmctrl,它会定期检查哪个窗口具有焦点,如果有变化,那么它会通过emacsclient让 Emacs 知道它可以发送 lisp代码到正在运行的 Emacs 进行评估:

-e'--eval' 告诉 Emacs 评估一些 Emacs Lisp 代码,而不是访问一些文件。当给出这个选项时,“emacsclient”的参数被解释为要计算的表达式列表,而不是要访问的文件列表。

于 2011-09-01T14:07:45.607 回答