失去焦点时更改Emacs窗口外观

时间:2011-09-01 13:50:54

标签: linux emacs lisp elisp dot-emacs

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

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

我在Ubuntu 11.04和Gnome 2.32.1上使用Emacs 23.2.1可能也是相关的。

PS:问题How to automatically save files on lose focus in Emacs是在一个不同的目标之后但是与“失去焦点的窗口”相同的原始事件。

4 个答案:

答案 0 :(得分:3)

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

我将按键C-o映射到帧之间,这有助于你想要转到另一帧但是一个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
  )

您还可以尝试添加一些建议来提升帧和低帧但没有尝试过但是值得一试。

答案 1 :(得分: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)

答案 2 :(得分:1)

我真的很喜欢@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)))

答案 3 :(得分:0)

我不知道它是否只能用Emacs完成,但是一个可能的替代方法是在shell脚本中运行wmctrl,该脚本以perodically方式检查哪个窗口具有焦点,如果有更改则允许Emacs知道通过emacsclient可以将lisp代码发送到正在运行的Emacs进行评估:

  

-e' - EVAL”        告诉Emacs评估一些Emacs Lisp代码,而不是访问        一些文件。给出此选项时,参数为        `emacsclient'被解释为表达式列表        评估,作为要访问的文件列表。