【问题标题】:Custom background for active window活动窗口的自定义背景
【发布时间】:2010-12-03 18:17:21
【问题描述】:

如何在 Emacs 中为活动窗口配置不同的背景颜色?

【问题讨论】:

  • 按照建议的here尝试hiwin-mode

标签: emacs text-editor


【解决方案1】:

试试吉田的hiwin-mode(可见活动窗口模式):https://github.com/yoshida-mediba/hiwin-mode

【讨论】:

    【解决方案2】:

    如果“窗口”是指 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)
    

    【讨论】:

    • 如果他想要每个窗口,我会推荐一个反向视频模式。如果您需要更多的视觉提示,请打开更少的窗口。
    • 呃,活动模式行,也就是。
    • 我的意思是 Emacs 窗口。模式线的亮点对我来说还不够。我使用大屏幕,打开了很多窗口......而且我经常开始编辑而不是我想要编辑的窗口。我会尝试反向视频模式是否会有一些改进
    • 好吧,Emacs 源代码总是被黑客入侵。
    【解决方案3】:

    这里是使用与背景匹配的模式行非活动颜色的替代方法,因此唯一具有颜色的模式行是活动窗口。我有一个用于 minibuffer 进入和退出的钩子,以及切换窗口时的钩子。我对某些模式行使用粗体,例如只读和文件名,以便在切换窗口时不同的颜色不会突出。当我进入 minibuffer 时,活动窗口模式行变为非活动状态,直到我退出 minibuffer,或者当我从活动 minibuffer(保持打开状态)切换到另一个窗口时。我还必须设置模式行背景框来匹配。

    (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-attributeredisplay 期间换脸太慢。在这种情况下调整面的首选方法是使用函数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】:

    Crosshairs 模式是你最好的选择,我认为。它不仅会引起对活动窗口的注意,而且还会以明显的方式立即向您显示光标所在的位置。您可以轻松地打开/关闭它(我将它绑定到C-+。)

    您也可以使用crosshairs-toggle-when-idle 作为替代方案。在延迟过去之前,它不会显示十字准线。它也是一个切换开关。

    您当然可以将十字准线与面对面的mode-line 脸一起使用。

    【讨论】:

      【解决方案6】:

      我按照本主题中的建议使用hiwin-mode,但有一个带有外壳缓冲区的open issue(当不活动时,文本变得不可见)。

      因此,到目前为止我喜欢的另一个选项是auto-dim-other-buffers mode

      【讨论】:

        猜你喜欢
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 1970-01-01
        相关资源
        最近更新 更多