Изменить внешний вид окна Emacs, когда оно теряет фокус - PullRequest
3 голосов
/ 01 сентября 2011

Когда я программирую, я использую два экрана с Emacs на обоих, с двумя буферами, разделенными в каждом окне, в общей сложности 4 открытых исходных файла на экране одновременно.

Я переключаюсь между буферами с C-x b и между Windows с Alt-TAB. Я изменяю вид буферов, когда переключаюсь между ними, определяя разные грани для mode-line и mode-line-inactive. Но как мне деактивировать буфер, когда я полностью переключаюсь из окна Emacs в другое окно Emacs через Alt-TAB?

Вероятно, также уместно, что я использую Emacs 23.2.1 в Ubuntu 11.04 с Gnome 2.32.1.

PS: Вопрос Как автоматически сохранять файлы при потере фокуса в Emacs преследует другую цель, но с тем же исходным событием «окно теряет фокус».

Ответы [ 4 ]

3 голосов
/ 01 сентября 2011

Это может зависеть от вашего оконного менеджера и от того, как он управляет несколькими окнами или фреймами, на языке 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
  )

Вы также можете попробовать добавить несколько советов для повышения и уменьшениякадр не пробовал, но стоит попробовать.

2 голосов
/ 21 февраля 2014

В 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)
1 голос
/ 05 июня 2015

Мне очень понравился ответ @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)))
0 голосов
/ 01 сентября 2011

Я не знаю, может ли это быть сделано только с Emacs, но возможной альтернативой является запуск wmctrl в сценарии оболочки, который периодически проверяет, какое окно имеет фокус, и если есть изменение, то оно сообщает Emacs через emacsclient , который может отправить код lisp работающему Emacs для оценки:

-e' - Eval» Скажите Emacs для оценки кода Emacs Lisp вместо посещения некоторые файлы. Когда эта опция задана, аргументы «emacsclient» интерпретируется как список выражений оцените , а не как список файлов для посещения.

...