Thay đổi khuôn mặt mode-line-buffer-id cho các cửa sổ không hoạt động


8

Có một khuôn mặt Emacs có thể được sử dụng để kiểm soát màu sắc của tên bộ đệm không hoạt động?

Thông thường khi thiết lập khuôn mặt mode-line-buffer-idtất cả các cửa sổ đều bị ảnh hưởng.

Trong ví dụ mode-linenày có nền sáng, vì vậy tôi đặt thành mode-line-buffer-idtối hơn nhiều #333.

chế độ dòng với id đệm tối trên nền sáng

Ý tưởng là đảo ngược sự kết hợp màu sắc cho mode-line-inactive.

Mặc dù điều này có thể đối với hầu hết các văn bản trong dòng chế độ của các cửa sổ không hoạt động, các tên bộ đệm trở nên không thể đọc được vì nó vẫn được điều khiển bởi mode-line-buffer-idkhuôn mặt.

mode-line-inactive with dark buffer-id trên nền tối

Tôi tin rằng cài đặt mode-line-inactiveở chế độ nền nhẹ hơn sẽ giải quyết được vấn đề, nhưng đó không phải là kết quả tôi muốn đạt được.

themes 

Đây là một liên kết đến một ví dụ tùy chỉnh các khía cạnh khác nhau của dòng chế độ: amitp.blogspot.com/2011/08/emacs-custom-mode-line.html
luật pháp 15/03/2015

Bạn có thể ánh xạ lại khuôn mặt khi bộ đệm hoạt động thay đổi như được mô tả ở đây: emacs.stackexchange.com/a/14658/780
glucas

Câu trả lời:


3

Tôi không chắc liệu bạn có còn tìm kiếm câu trả lời hay không nhưng đây là kết quả duy nhất tôi có được trên Google khi cố gắng tự mình làm điều này.

Dù sao vì bất cứ lý do gì Emacs gọi điều này distant-foregroundvì vậy điều duy nhất bạn thực sự cần làm là thêm :distant-foreground $colour-of-choicevào khuôn mặt của bạn.


1

Đây là một biến thể trên một câu trả lời khác có thể giúp đỡ. Ví dụ này mode-line-buffer-idtái hiện màu xanh lục trong bộ đệm không hoạt động.

(defun toggle-mode-line-buffer-id-face (window)
  "Update the `mode-line-buffer-id' face in WINDOW dependening on
whether the window is selected."
  (with-current-buffer (window-buffer window)
(if (eq (current-buffer) (window-buffer (selected-window)))
    (face-remap-reset-base 'mode-line-buffer-id)
  (face-remap-set-base 'mode-line-buffer-id '(:foreground "green")))))

(add-hook 'buffer-list-update-hook (lambda () (walk-windows #'toggle-mode-line-buffer-id-face nil t)))

Cập nhật: Như đã lưu ý trong các bình luận, điều này không hoàn toàn giải quyết vấn đề. Khi bạn có một số cửa sổ hiển thị truy cập vào cùng một bộ đệm, tất cả chúng sẽ chia sẻ cùng một khuôn mặt.


Thật không may, một bộ đệm có thể được nhìn thấy trong nhiều cửa sổ, trong đó một cửa sổ có thể hoạt động và một không hoạt động.
Lindydancer

Đúng, ánh xạ lại khuôn mặt áp dụng cho bộ đệm chứ không phải cửa sổ.
glucas

1

Đây là một biến thể của các câu trả lời khác, với câu trả lời này phân biệt giữa các cửa sổ hoạt động và không hoạt động. Nếu một bộ đệm được hiển thị trong nhiều hơn một cửa sổ, chỉ có cửa sổ hoạt động sẽ có ml-active-window-facevà tất cả các cửa sổ khác sẽ có ml-inactive-window-face.

(defvar ml-selected-window nil)

(defun ml-record-selected-window ()
  (setq ml-selected-window (selected-window)))

(defun ml-update-all ()
  (force-mode-line-update t))

(add-hook 'post-command-hook 'ml-record-selected-window)

(add-hook 'buffer-list-update-hook 'ml-update-all)

(defface ml-active-window-face
   '((t (:foreground "red")))
   "Face for active buffer identification.")

(defface ml-inactive-window-face
   '((t (:foreground "green")))
   "Face for inactive buffer identification.")

(defun ml-propertized-buffer-identification (fmt)
  "Return a list suitable for `mode-line-buffer-identification'.
FMT is a format specifier such as \"%12b\".  This function adds
text properties for face, help-echo, and local-map to it."
  (list (propertize fmt
        'face
          (if (eq ml-selected-window (selected-window))
            'ml-active-window-face
            'ml-inactive-window-face)
        'help-echo
        (purecopy "Buffer name
mouse-1: Previous buffer\nmouse-3: Next buffer")
        'mouse-face 'mode-line-highlight
        'local-map mode-line-buffer-identification-keymap)))

(setq-default mode-line-buffer-identification
  '(:eval (ml-propertized-buffer-identification "%12b")))

Thí dụ


0

Tôi không chắc là có thể. Có vẻ như dòng chế độ chỉ được cập nhật khi cửa sổ của nó được chọn (kiểm tra bằng cách sử dụng các lệnh gọi để thực messagehiện điều này). Và mã thực hiện điều này là mã C, không phải Lisp.

Bạn có thể sử dụng biểu thức điều kiện trong định nghĩa mode-line-buffer-identification, để khuôn mặt được sử dụng được tính toán linh hoạt. Nhưng tôi không biết bất kỳ chức năng hoặc biến nào mà bạn có thể sử dụng để kiểm tra xem một cửa sổ đã cho có dòng chế độ không hoạt động hay không.

Bạn không thể sử dụng selected-window, ví dụ, bởi vì điều đó luôn trỏ đến cửa sổ với dòng chế độ hoạt động.

Dưới đây là một ví dụ về cập nhật động dựa trên tên bộ đệm. Đó không phải là những gì bạn muốn, nhưng ít nhất nó cho bạn thấy những gì bạn có thể làm. Nếu bạn có thể đưa ra một cách để kiểm tra xem cửa sổ đang được cập nhật có được chọn hay không thì bạn có thể thay thế cho kiểm tra tên bộ đệm. (Nhưng ấn tượng của tôi là chỉ có cửa sổ được chọn mới được cập nhật dòng chế độ.)

(setq-default mode-line-buffer-identification
              '(:eval
                (list (propertize "%b"
                       'face (if ;; NOPE (eq (selected-window) (get-buffer-window (current-buffer)))
                                 (eq (current-buffer) (get-buffer "some-buffer"))
                                 'mode-line-buffer-id
                               'some-other-face)
                       'help-echo "Buffer name mouse-1: Previous buffer\nmouse-3: Next buffer"
                       'mouse-face 'mode-line-highlight
                       'local-map mode-line-buffer-identification-keymap))))

Một điều khác bạn có thể thử là tư vấn chức năng format-mode-line. Nó rõ ràng phân biệt một cửa sổ với một dòng chế độ hoạt động với một dòng chế độ không hoạt động. Nhưng nó cũng được mã hóa bằng C, vì vậy tôi nghi ngờ bạn sẽ đi rất xa với việc tư vấn cho nó. Nó kiểm tra biến C Qmode_line_inactive, FWIW.

Tôi khuyên bạn nên hỏi câu hỏi này trên một trong các danh sách gửi thư của Emacs (ví dụ help-gnu-emacs@gnu.org), nếu bạn không nhận được câu trả lời thỏa đáng ở đây. Có vẻ như nó có thể là tốt để có thể làm những gì bạn yêu cầu. +1 cho câu hỏi, trong mọi trường hợp.


1
Chỉ cần hoàn thành câu trả lời của Drew, phát hiện bộ đệm hoạt động và các mặt id-line-đệm-id cụ thể cho bộ đệm hoạt động và không hoạt động được thực hiện trong powerline . Nếu bạn muốn điều tra mã, điểm khởi đầu tốt là chức năng powerline-default-theme được xác định trong powerline-
Themes.el
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.