Есть ли способ изменить цвет окантовки активного окна?

14

Чтобы лучше отличать сфокусированное окно от остального, я бы хотел изменить цвет окантовки этого окна. Обнаружив настройку с помощью ключевого слова fringe, я нашел только то, как изменить его цвет bg без возможности устанавливать разные цвета для активных и не активных. Это вообще возможно? Спасибо.

sandric
источник
Я не уверен насчет края, но вы можете изменить строку режима для неактивных окон. попробуй M-x customize-face mode-line-inactive.
Тайлер
3
Похоже, что это локальный фрейм, поэтому похоже, что ответ - нет. Я попытался, (face-remap-add-relative 'fringe '((:background "yellow")))что для других лиц достаточно для локального использования буфера, но это затрагивает все окна в кадре, насколько fringeэто касается. В дополнение к предложению @Tyler, вы также можете настроить курсор так, чтобы он cursor-in-non-selected-windows
появлялся
Я думаю, что это то, что вам нужно: http://stackoverflow.com/questions/9446673/asking-emacs-to-highlight-more-clearly-which-window-pane-has-the-focus-cursor
Педро Луз
Я знаю о моделине, спасибо. Я просто хотел сделать это более понятным для меня.
Сандрик
Вот несколько дополнительных идей, которые помогут активному окну привлечь больше визуального внимания: (1) приведение фона строки режима неактивных окон в соответствие с цветом буфера, чтобы неактивная строка режима стала менее заметной: stackoverflow.com/ a / 20936397/2112489 и (2) изменение цвета некоторых текстовых компонентов mode-line-formatв активном и неактивном окнах: emacs.stackexchange.com/a/22682/2287
юрист

Ответы:

6

Поскольку вы хотите «Чтобы лучше различать сфокусированное окно», вы можете использовать другие способы сделать это, вместо того, чтобы просто изменить цвет рамки активного окна.

Я комбинирую три способа, чтобы лучше различать активные и неактивные окна.

  1. Используйте разные цвета строки режима для активных и неактивных окон.
  2. Выделите текущую линию, где точка находится в активном окне.
  3. Используйте разные цвета фона для активных и неактивных окон.

Обратите внимание, что все выбранные цвета, упомянутые выше, должны хорошо работать с вашей темой Emacs.

Вот все три способа:

  1. Используйте разные цвета строки режима для активных и неактивных окон:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. Выделите текущую линию, где точка находится в активном окне:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. Используйте разные цвета фона для активных и неактивных окон:

    (defun highlight-selected-window ()
      "Highlight selected window with a different background color."
      (walk-windows (lambda (w)
                      (unless (eq w (selected-window))
                        (with-current-buffer (window-buffer w)
                          (buffer-face-set '(:background "#111"))))))
      (buffer-face-set 'default))
    (add-hook 'buffer-list-update-hook 'highlight-selected-window)
    

Вы можете изменить цвета в фрагментах кода, чтобы они хорошо работали с вашей темой Emacs.

Это последний скриншот:

Скриншот трех способов вместе

И есть еще одна функция, которую вы можете использовать вручную, чтобы прошить активное окно:

(global-set-key (kbd "<f12>") 'flash-active-buffer)
(make-face 'flash-active-buffer-face)
(set-face-attribute 'flash-active-buffer-face nil
                    :background "blue" :foreground nil)
(defun flash-active-buffer ()
  (interactive)
  (run-at-time "100 millisec" nil
               (lambda (remap-cookie)
                 (face-remap-remove-relative remap-cookie))
               (face-remap-add-relative 'default 'flash-active-buffer-face)))

Вы можете изменить привязку клавиш во фрагменте кода, когда вы хотите показать активное окно, нажмите клавишу, активное окно станет синим, после того, как вы переместите указатель, цвет исчезнет.

CodyChan
источник
0

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

введите описание изображения здесь

Убедитесь, что вам требуется smart-mode-line перед использованием этого кода. Я рекомендую вам настроить его под нужные вам цвета:

(deftheme smart-mode-line-dmg "dmg theme for smart-mode-line.")
(custom-theme-set-faces
 'smart-mode-line-dmg
                                        ; '(mode-line-inactive ((t :inverse-video nil)))
                                        ; '(mode-line     ((t :inverse-video nil)))
 '(mode-line     ((t :foreground "grey70" :background "black" :inverse-video nil)))
 '(mode-line-inactive  ((t :foreground "black" :background "white" :inverse-video nil)))
 '(sml/global    ((t :inherit font-lock-preprocessor-face)))
 '(sml/filename  ((t :inherit sml/global :foreground "gold" :weight bold)))
 '(sml/prefix    ((t :inherit (font-lock-variable-name-face sml/global))))
 '(sml/read-only ((t :inherit (font-lock-type-face sml/not-modified))))
 '(sml/modes     ((t :foreground nil :inherit sml/filename :weight normal))))

(sml/setup)
DMG
источник
0

Вы можете попробовать сделать что-то вроде следующего, чтобы выделить текущее выбранное окно. Помните, что это не работает, если буферы в нескольких окнах одинаковы. Это затемняет все остальные окна, кроме выбранного.

(defvar dim-window-face
  '((t  (:background "grey40")))
  "Face for a dimmed window in the current frame.")

(defvar current-window-face
  '((t  (:background "black")))
  "Face for a dimmed window in the current frame.")

(defvar window->overlay (make-hash-table)
  "A hash table of window to dimmed overlay.")

(defun dim-windows ()
  "Dim all windows except the `selected-window' in current frame."
  (interactive)
  (walk-windows (lambda (w)
                  ;; Delete existing overlay on window W
                  (when-let ((ol (gethash w window->overlay)))
                    (delete-overlay ol))
                  (let ((ol (make-overlay (window-start w)
                                          (window-end w)
                                          (window-buffer w))))
                    (overlay-put ol 'face (if (eql (selected-window) w)
                                              current-window-face
                                            dim-window-face))
                    (puthash w ol window->overlay)))))
narendraj9
источник