Пользовательский фон для активного окна - PullRequest
15 голосов
/ 04 октября 2009

Как мне настроить другой цвет фона для активного окна в Emacs?

Ответы [ 6 ]

9 голосов
/ 20 июля 2014

Попробуйте Йошида hiwin-mode (видимый активный режим окна): https://github.com/yoshida-mediba/hiwin-mode

9 голосов
/ 04 октября 2009

Если под "окном" вы подразумеваете определение окон в 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)
6 голосов
/ 05 января 2014

Вот альтернатива, использующая неактивный цвет модельной линии, соответствующий фону, поэтому единственная модельная линия с цветом - это активное окно. У меня есть крюки для входа и выхода из минибуфера, а также при переключении окон. Я использую жирный шрифт для некоторых модельных вещей, таких как только чтение и имя файла, чтобы другой цвет не выделялся при переключении окон. Когда я вхожу в минибуфер, активная оконная модельная линия становится неактивной до тех пор, пока я не выйду из минибуфера или когда я переключусь с активного минибуфера (оставив его открытым) в другое окно. Я должен был установить фоновое поле для моделинов так же.

(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 вручную (что, по общему признанию, не является предпочтительным методом в соответствии с руководством). / doc-string).

(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

Пример http://www.lawlist.com/images/modeline-example.png

3 голосов
/ 23 декабря 2016

Я использовал hiwin-mode, как предложено в этом разделе, но существует открытый выпуск с буферами оболочки (когда неактивно, текст становится невидимым).

Поэтому еще одна опция, которой я наслаждаюсь, это режим auto-dim-other-buffers .

3 голосов
/ 09 января 2014

Перекрестие * Режим 1004 * - ваш лучший выбор, я думаю. Он не только привлекает внимание к активному окну, но и сразу показывает вам, где курсор находится в очевидной форме. Вы можете легко включить / выключить его (я связываю его с C-+.)

Вы также можете использовать crosshairs-toggle-when-idle в качестве альтернативы. Это не показывает перекрестие, пока не прошла задержка. Это тоже переключение.

Конечно, вы можете использовать перекрестие вместе с лицом mode-line.

3 голосов
/ 05 октября 2009

Если то, что вы пытаетесь достичь, это выделить текущий буфер / кадр, то, как я это делаю, это через Highlight-Current-Line . Он показывает вам строку, где находится курсор, но побочным эффектом этого является то, что он также показывает, в каком буфере / кадре вы находитесь. Вы можете настроить его так, чтобы он выделил весь буфер, или посмотрите код, чтобы увидеть, как они работают. это.

...