2009-10-04 73 views
14

如何爲Emacs中的活動窗口配置不同的背景顏色?活動窗口的自定義背景

+0

按照建議嘗試'hiwin-mode' [這裏](https://stackoverflow.com/a/24852800/1845302) – 2017-12-03 14:42:36

回答

9

如果用「窗口」表示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) 
+1

如果他想要每個窗口,我只會推薦一個反向視頻模式行。如果您需要更多的視覺提示,請打開更少的窗口。 – jrockway 2009-10-04 20:38:11

+0

呃,主動模式,也就是說。 – jrockway 2009-10-04 20:38:58

+2

我的意思是Emacs窗口。模式線的亮點對我來說是不夠的。我使用大屏幕,很多窗口是開放的..很多時候我開始編輯,而不是我想編輯的窗口。我會嘗試,如果反向視頻模式將有所改進 – 2010-06-24 11:59:48

3

如果你要實現的目標是要突出當前的緩衝區/幀,我做的方式,是通過Highlight-Current-Line。它向您顯示光標所在的行,但是副作用是它還會顯示您所在的緩衝區/幀。您可以配置它以突出顯示整個緩衝區,或查看代碼以查看它們的工作方式它。

+0

是的,我的意思是「不是真的」,是因爲對緩衝區內容的任何修改都會影響緩衝區的每個視圖,所以無法突出顯示一個窗口,只是一個緩衝區。對我來說,模式線顏色+光標閃爍會很好。 – 2009-10-05 18:03:50

+0

確實緩衝區比窗口更好。我想突出顯示目前的緩衝區:) – 2010-06-24 12:03:21

6

以下是使用與背景相匹配的模式行非活動顏色的替代方法,因此只有具有顏色的模式行是活動窗口。我有一個鉤子,用於進入和退出小型緩衝器,也可以在切換窗口時使用。我使用粗體顯示特定的模式行,如只讀和文件名,以便在切換窗口時不會突出顯示不同的顏色。當我輸入小型緩衝器時,活動窗口模式行將變爲非活動狀態,直到退出小型緩衝器,或者從活動小型緩衝器(將其打開時)切換到另一個窗口時。我不得不將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(根據manual/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 

Example http://www.lawlist.com/images/modeline-example.png

+0

不錯的想法和鼓舞人心的截圖! – katspaugh 2014-01-12 09:22:07

3

Crosshairs模式是最好的選擇,我想。它不僅吸引了對活動窗口的注意,而且它還會立即向您顯示光標所在的位置。您可以輕鬆地將其打開/關閉(我將它綁定到C-+。)

您也可以使用crosshairs-toggle-when-idle作爲替代。在延遲過去之前它不會顯示十字線。它也是一個切換。

您當然可以將十字準線與臉上的mode-line一起使用。

2

我使用hiwin-mode本主題中建議,但有一個open issue殼牌緩衝器(未激活時,文本變得不可見)。

因此,我目前享受的另一種選擇是auto-dim-other-buffers mode