質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

2回答

1307閲覧

Emacsのモードラインを propertizeで色を付けた文字列でも非アクティブ時に暗くしたい

yaxavr

総合スコア39

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

0グッド

0クリップ

投稿2022/01/11 02:25

編集2022/01/12 07:40

Stack Overflow やr/emacsを何度探しても見つけられなかったので、質問させていただきます。

Emacsのモードラインをいじっています。

Emacsのモードラインはアクティブなウィンドウを切り替えるとそれに応じて色が変わります。

アクティブなモードラインには mode-lineフェイス、そうでない方はmode-line-inactiveフェイスが使われるようですが、これらは単純にpropertizeで色を付けた文字列には適用されず、アクティブかどうかに関わらずpropertizeした色で表示されます。

これをpropertizeした文字列でもモードラインが非アクティブになると暗い色に切り替えたいと思っています。

例えば、現状のflycheckのインジケータは下のようになっています。

ウィンドウの状態モードライン表示
アクティブアクティブ時
非アクティブインアクティブ時

右側の web-modeのインジケータはpropertizeしてないので非アクティブ時に色が暗くなりますが、左側のflycheckの方はpropertizeしているので非アクティブになっても赤黄緑のままです。

この赤黄緑が非アクティブになったときに暗い色にしたいというのが、今回の質問の内容となります。

以下は現状の init.el の抜粋です。

lisp

1(defun my-flycheck-mode-line () 2 (let-alist (flycheck-count-errors flycheck-current-errors) 3 (let* ((status flycheck-last-status-change) 4 (info (or .info 0)) 5 (warnings (or .warning 0)) 6 (errors (or .error 0))) 7 (when status 8 (concat 9 (propertize (int-to-string errors) 'face 'flycheck-error-list-error) " " 10 (propertize (int-to-string warnings) 'face 'flycheck-error-list-warning) " " 11 (propertize (int-to-string info) 'face 'flycheck-error-list-info)))))) 12 13(defun my-mode-line--form () 14 (let* ((left-part (concat 15 evil-mode-line-tag 16 ;;;;; snip ;;;;;;;;;;;;; 17 " ")) 18 (right-part (concat 19 (my-coding-system-name-mnemonic) 20 ;;;;; snip ;;;;;;;;;;;;; 21 (flycheck-mode (my-flycheck-mode-line)) ;; <--!!! 22 " " 23 mode-name 24 )) 25 ;;;;; snip ;;;;;;;;;;;;; 26 (margin 27 (propertize " " 28 'display `(space :align-to (- (+ scroll-bar scroll-bar) ,(string-width right-part) ,margin-env))))) 29 (concat left-part margin right-part))) 30 31(setq-default mode-line-format '(:eval (my-mode-line--form)))

もう長いことこのまま使っており、暇を見てはwindow-state-change-hook等に何か仕込んでみたりするのですが自力では解決まで至っておりません。

細かなことで恐縮なのですが、最近特に目が悪くなってきたのか、他のバッファに一生懸命タイピングしていることが多くなり、ちょっとしんどくなってきました。

もしご存じの方がおられましたら、ヒントだけでも頂けますと助かります。
よろしくお願いします。

環境

  • Emacs: 27.2 (Emacs Mac Port)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

斜め上な回答ですみません。

mode-line-inactiveのfaceの:backgoundの色を
思いきって白とかにして
mode-lineの背景色と全然違う色に設定すれば
そちらの方が分かりやすいのではないでしょうか?

投稿2022/01/11 08:35

ujimushi_sradjp

総合スコア2096

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yaxavr

2022/01/11 13:20

回答ありがとうございます。 逆転の発想ですね。 面白そうだったので、普段使っているダーク系のテーマのままやってみました。 インアクティブなモードラインが白いと、そっちを脳がアクティブと認識するようで、逆に混乱しました。 おおよそ想定していた結果でしたが、ひょっとすると色の選び方によっては面白いことができるかもしれません。ちょっといじくってみます。
guest

0

自己解決

Stack Exchange にヒントがありました。
ここの3番目の回答を参考にしてなんとか自力で解決したのでその方法を残します。

lisp

1(defvar mode-line-selected-window nil) 2 3(defun mode-line-record-selected-window () 4 (unless (string-match-p " \*Minibuf" (buffer-name (window-buffer (car (window-list))))) 5 (setq mode-line-selected-window (selected-window)))) 6 7(add-hook 'window-configuration-change-hook #'mode-line-record-selected-window) 8 9(defun mode-line-update-all () 10 (force-mode-line-update t)) 11 12(add-hook 'buffer-list-update-hook #'mode-line-update-all) 13 14(defun mode-line-choose-face (prior-face) 15 (if (eq mode-line-selected-window (selected-window)) 16 prior-face 17 'mode-line-inactive)) 18 19(defun my-flycheck-mode-line () 20 (let-alist (flycheck-count-errors flycheck-current-errors) 21 (let* ((status flycheck-last-status-change) 22 (info (or .info 0)) 23 (warnings (or .warning 0)) 24 (errors (or .error 0))) 25 (when status 26 (concat 27 (propertize (int-to-string errors) 'face (mode-line-choose-face 'flycheck-error-list-error)) " " 28 (propertize (int-to-string warnings) 'face (mode-line-choose-face 'flycheck-error-list-warning)) " " 29 (propertize (int-to-string info) 'face (mode-line-choose-face 'flycheck-error-list-info)))))))

質問で示したmy-flycheck-mode-line関数をウィンドウがアクティブかどうかによってfaceを変えるように変更しました。

flycheckの他にもEvilのステートインジケータなど、propertizeしたものがたくさんあるので、そっちもこの方法で対応したいと思います

対応しました

お騒がせしました。

投稿2022/01/14 00:19

編集2022/01/14 01:52
yaxavr

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問