Как настроить другой цвет фона для активного окна в Emacs?
Пользовательский фон для активного окна
Ответ 1
Если под "окном" вы подразумеваете определение окон Emacs, т.е. панелей, на самом деле.
Если под "окном" вы подразумеваете все остальные концепции окон, которые Emacs вызывает фреймы, тогда да. Вот пример:
(defadvice handle-switch-frame (around switch-frame-set-background)
(set-background-color "white")
ad-do-it
(set-background-color "yellow"))
(ad-activate 'handle-switch-frame)
(defadvice delete-frame (after delete-frame-set-background)
(set-background-color "yellow"))
(ad-activate 'delete-frame)
Ответ 2
Попробуйте Yoshida hiwin-mode (режим активного активного окна): https://github.com/yoshida-mediba/hiwin-mode
Ответ 3
Вот альтернативный вариант использования неактивного цвета моделинов, соответствующего фону, поэтому единственная моделин с цветом - это активное окно. У меня есть крюки для входа и выхода из минибуфера, а также при переключении окон. Я использую жирный шрифт для некоторых модельных вещей, таких как только чтение и имя файла, чтобы другой цвет не выделялся при переключении окон. Когда я вхожу в минибуфер, активная оконная модельная линия становится неактивной до тех пор, пока я не выйду из минибуфера или когда я переключусь с активного минибуфера (оставив его открытым) в другое окно. Я должен был установить фоновое поле modeline, чтобы соответствовать также.
(set-face-attribute 'default nil :background "black" :foreground "white"
:font "Courier" :height 180)
(set-face-attribute 'mode-line nil
:height 160 ;; affects everything
:foreground "black" :background "gray70")
(set-face-attribute 'mode-line-inactive nil
:foreground "gray70" :background "black" :box '(:line-width 1 :color "black"))
(defun enter-minibuffer-setup ()
(whitespace-mode t)
(set-face-attribute 'mode-line nil
:height 160 :foreground "gray70" :background "black" :box '(:line-width 1 :color "black"))
(set-face-attribute 'minibuffer-prompt nil :background "black" :foreground "cyan")
(set (make-local-variable 'face-remapping-alist)
'((default :background "black" :foreground "yellow"))) )
(defun exit-minibuffer-setup ()
(cond
((or save-as-variable multi-extract-variable multi-attach-variable)
(set-face-attribute 'mode-line nil :height 160 :foreground "black" :background "#eab700"))
(t (set-face-attribute 'mode-line nil :height 160 :foreground "black" :background "gray70" :box nil)))
(set-face-attribute 'minibuffer-prompt nil :background "black" :foreground "cyan"))
(add-hook 'minibuffer-setup-hook 'enter-minibuffer-setup)
(add-hook 'minibuffer-exit-hook 'exit-minibuffer-setup)
(defun lawlist-minibuffer-conditions ()
(cond
((minibufferp)
(set-face-attribute 'mode-line nil
:height 160 :foreground "gray70" :background "black" :box '(:line-width 1 :color "black"))
(set-face-attribute 'minibuffer-prompt nil :background "black" :foreground "cyan"))
(t
(set-face-attribute 'mode-line nil
:height 160 :foreground "black" :background "gray70")
(set-face-attribute 'minibuffer-prompt nil :background "black" :foreground "gray70")) ))
(defun lawlist-forward-window ()
(interactive)
(other-window 1)
(lawlist-minibuffer-conditions))
(defun lawlist-backward-window ()
(interactive)
(other-window -1)
(lawlist-minibuffer-conditions))
АЛЬТЕРНАТИВНЫЙ ОТВЕТ (похожая концепция): set-face-attribute
слишком медленный для смены лица во время redisplay
. Предпочтительный метод настройки граней в этом контексте - функция face-remap-add-relative
; однако эту функцию немного сложно использовать, потому что грани складываются одна за другой и затеняются. Итак, мне нужно будет изменить следующий черновой вариант ответа (в будущем), чтобы включить в него face-remap-add-relative
- тем временем я устанавливаю face-remapping-alist
вручную (что, правда, не является предпочтительный метод в соответствии с руководством/документ-строка).
(defvar modeline-selected-window nil)
(let ((default-background (face-background 'default nil 'default)))
(set-face-attribute 'mode-line-inactive nil :background default-background :box nil))
(defun modeline-record-selected-window ()
(setq modeline-selected-window (selected-window)))
(defun modeline-update-function ()
(cond
((minibufferp)
(let ((default-background (face-background 'default nil 'default)))
(with-selected-window (minibuffer-window)
(setq-local face-remapping-alist '(
(default :foreground "blue")
(minibuffer-prompt :foreground "red"))))
(setq-default face-remapping-alist '((mode-line ,'mode-line-inactive)))))
(t
(with-selected-window (minibuffer-window)
(when (local-variable-p 'face-remapping-alist)
(kill-local-variable 'face-remapping-alist)))
(setq-default face-remapping-alist nil))))
(defun modeline-set-format ()
(setq mode-line-format '(
(:eval
(if (eq modeline-selected-window (selected-window))
(propertize "SELECTED WINDOW" 'face 'font-lock-warning-face)
(propertize "NOT-SELECTED WINDOW" 'face 'font-lock-keyword-face)))))
;; next two lines make the affect immediately apparent
(setq modeline-selected-window (selected-window))
(force-mode-line-update))
(define-minor-mode modeline-mode
"This is a minor-mode for 'modeline-mode'."
:init-value nil
:lighter " ML"
:keymap nil
:global t
:group nil
(cond
(modeline-mode
(add-hook 'post-command-hook 'modeline-record-selected-window)
(add-hook 'buffer-list-update-hook 'modeline-update-function)
(add-hook 'text-mode-hook 'modeline-set-format)
(when (called-interactively-p 'any)
(message "Globally turned ON 'modeline-mode'.")))
(t
(remove-hook 'post-command-hook 'modeline-record-selected-window)
(remove-hook 'buffer-list-update-hook 'modeline-update-function)
(remove-hook 'text-mode-hook 'modeline-set-format)
(when (called-interactively-p 'any)
(message "Globally turned OFF 'modeline-mode'.") ))))
(modeline-mode 1) ;; globally turn on minor-mode
Ответ 4
Если то, что вы пытаетесь достичь, состоит в том, чтобы выделить текущий буфер/фрейм, как я это делаю, Highlight-Current-Line. Он показывает вам строку, в которой находится курсор, но побочным эффектом этого является то, что он также показывает вам, какой буфер/фрейм вы находитесь. Вы можете настроить его, чтобы выделить весь буфер, или просмотреть код, чтобы увидеть, как они это делают он.
Ответ 5
Перекрестие - ваш лучший выбор, я думаю. Он не только привлекает внимание к активному окну, но и сразу показывает, где курсор явно. Вы можете легко переключать его вкл/выкл (привязываю его к C-+
.)
Вы также можете использовать crosshairs-toggle-when-idle
в качестве альтернативы. Он не показывает перекрестие до тех пор, пока не пройдет задержка. Это тоже переключатель.
Конечно, вы можете использовать перекрестье вместе с лицом mode-line
.
Ответ 6
Я использовал hiwin-mode
, как было предложено в этом разделе, но есть открытая проблема с оболочными буферами (когда неактивно, текст становится невидимый).
Поэтому другой вариант, который мне доставляет до сих пор, - это режим авто-dim-other-buffers.