有没有一种方法可以更改活动窗口边缘的颜色?


14

为了更好地区分聚焦窗口和非聚焦窗口,我想更改此窗口的边缘颜色。发现带有fringe关键字的custom时,我只发现了如何更改其bg颜色,而不能为活动和非活动颜色设置不同的颜色。有可能吗?谢谢。


我不确定边缘,但是您可以更改非活动窗口的模式行。尝试一下M-x customize-face mode-line-inactive
泰勒

3
它似乎是局部于帧的,因此看起来答案是否定的。我尝试(face-remap-add-relative 'fringe '((:background "yellow")))了其他方面的哪一个足以用于缓冲区本地使用,但是就fringe涉及而言,它会影响框架中的所有窗口。除了@Tyler的建议外,您还可以自定义光标,使其仅出现在活动窗口中–请参见变量cursor-in-non-selected-windows
lawlist

我认为这就是您所需要的:http
Pedro Luz

我了解Modeline,谢谢。我只是想让我更清楚。
sandric '16

以下是一些其他想法,可以帮助使活动窗口吸引更多的视觉注意:(1)使不活动窗口的模式行背景与缓冲区颜色匹配,以使不活动模式行变得不太引人注意: stackoverflow.com/ a / 20936397/2112489和(2)更改mode-line-format活动窗口和非活动窗口中的某些文本组件的颜色: emacs.stackexchange.com/a/22682/2287
律师名单

Answers:


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)))

您可以在代码片段中更改键绑定,当您想显示活动窗口时,按一下键,活动窗口将变为蓝色,移动指针后,颜色将消失。


0

我有同样的问题。我求助于使用智能线模式并对其进行自定义,以便在活动窗口中获得非常独特的颜色。这是一个示例框架。活动窗口是带有金色字母的黑色模式行的窗口。

在此处输入图片说明

使用此代码之前,请确保您需要智能模式行。我建议您根据需要的颜色对其进行自定义:

(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)

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)))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.