2013-04-09 34 views
6

Tôi muốn xem liệu có cách nào để thay đổi chế độ nền trước và nền màu chế độ trên chế độ chính,Thay đổi màu chế độ dòng Emacs dựa trên chế độ chính

Tôi đã suy nghĩ để thêm logic trong số

(add-hook 'after-change-major-mode-hook 

Nhưng, tôi không có tất cả các emacs lisp kinh nghiệm để thực hiện thay đổi đó. Đây là logic:

switch major-mode: 
case "emacs-lisp-mode": 
    (set-face-foreground 'mode-line "ivory") 
    (set-face-background 'mode-line "DarkOrange2") 
case "ruby-mode": 
    (set-face-foreground 'mode-line "white") 
    (set-face-background 'mode-line "red") 
... 
default: 
    (set-face-foreground 'mode-line "black") 
    (set-face-background 'mode-line "white") 
end switch 

Rất cám ơn trước !.

Trả lời

9

Bạn có thể muốn một cái gì đó như:

(add-hook 'emacs-lisp-mode-hook 
      (lambda() 
      (face-remap-add-relative 
      'mode-line '((:foreground "ivory" :background "DarkOrange2") mode-line)))) 

Bạn có thể muốn sử dụng mặt remap cho khuôn mặt mode-line-inactive là tốt.

+0

THANK YOU VERY MUCH. Điều này làm việc đẹp :) Bạn cũng có thể tử tế để giúp tôi kết hợp add-hook của bạn bằng cách sử dụng một danh sách được xác định trước? Tương tự như gợi ý "sds" nhưng thêm móc cho tất cả các chế độ trong danh sách được xác định trước với màu sắc? Cảm ơn! –

+0

Bạn có nghĩa là như '(dolist (x '((emacs-lisp-mode: foreground" ngà ": background" DarkOrange2 ") (ruby-mode: foreground" white ": background" red "))) (add-hook (intern (concat (ký hiệu-tên (car x)) "-mode")) (lambda() (dòng-remap-add-relative 'mode-line (khuyết điểm (cdr x)' (mode-line))))))) 'tho hãy cẩn thận rằng nó sẽ chỉ hoạt động trong bộ đệm' lexical-binding: t'. – Stefan

3

"Logic" bạn đang nói về cái gì đó như thế này:

(add-hook 'after-change-major-mode-hook 'my-set-mode-line-colors) 
(defvar my-mode-line-colors 
    '((emacs-lisp-mode :foreground "ivory" :background "DarkOrange2") 
    (ruby-mode :foreground "white" :background "red"))) 
(defun my-set-mode-line-colors() 
    (face-remap-add-relative 
    'mode-line (list (or (cdr (assq major-mode my-mode-line-colors)) 
         '(:foreground "black" :background "white")) 
        'mode-line))) 

Ngoài ra, bạn có thể làm điều đó từ móc chế độ cụ thể, theo đề nghị của Stefan.

+0

Tôi thực sự đã thêm móc vào mỗi chế độ. Nhưng khi tôi chuyển bộ đệm từ ruby ​​sang lisp, vv, mode-line không nhận được cập nhật .. Do đó tôi nghĩ về "change-major-mode-hook" và bạn nói đúng, không làm việc ... buffer-switch-hook? Tôi đã cố gắng tìm một thứ gì đó giống như nó nhưng không có kết quả. Cảm ơn! –

+0

Vấn đề, như tôi đã viết, là các khuôn mặt emacs không phải là bộ đệm cục bộ, do đó, các cuộc gọi thiết lập mặt trước trên nền trước sẽ ảnh hưởng đến tất cả các cửa sổ và tất cả các dòng chế độ. Không có cách nào để làm cho chế độ dòng bộ đệm cụ thể xuất hiện – sds

+0

thiết lập mặt trước có thể được đặt cho mỗi khung hình. ngay cả khi tôi có nhiều khung hình lên, tôi có thể thay đổi chế độ dòng chỉ cho khung đó ... miễn là tôi có thể biết khi nào bộ đệm được chuyển vào và ra và thay đổi chế độ dòng, nó sẽ hoạt động .. –

Các vấn đề liên quan