[英]Change Emacs window appearance when it loses focus
當我編程時,我使用帶有Emacs的兩個屏幕,兩個緩沖區在每個窗口中分開,在任何時候在屏幕上共計4個開源文件。
我在具有Cx b
緩沖區之間以及在使用Alt-TAB
Windows之間切換。 當我通過為mode-line
和mode-line-inactive
定義不同的面來切換它們時,我改變了緩沖區的外觀。 但是當我通過Alt-TAB
從Emacs窗口完全切換到另一個Emacs窗口時,如何禁用緩沖區?
我在Ubuntu 11.04和Gnome 2.32.1上使用Emacs 23.2.1可能也是相關的。
PS: 如何在Emacs中自動保存失去焦點的文件的問題是在一個不同的目標之后,但是具有相同的原始事件“窗口失去焦點”。
它可能取決於您的窗口管理器以及它如何管理多個窗口或框架,用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
)
您還可以嘗試添加一些建議來提升幀和低幀沒有嘗試過,但它值得一試。
在Emacs 24.4及更高版本中,您可以使用focus-in-hook
和focus-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)
我真的很喜歡@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)))
我不知道它是否只能用Emacs完成,但是一個可能的替代方法是在shell腳本中運行wmctrl ,它可以永久地檢查哪個窗口具有焦點,如果有更改,那么它可以通過emacsclient知道Emacs可以發送lisp用於評估的正在運行的Emacs的代碼:
-e'
eval'告訴Emacs評估一些Emacs Lisp代碼,而不是訪問某些文件。 當給出這個選項時,`emacsclient'的參數被解釋為要評估的表達式列表, 而不是要訪問的文件列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.