非アクティブウィンドウのmode-line-buffer-idフェイスを変更する


8

非アクティブなバッファー名の色を制御するために使用できるEmacsフェイスはありますか?

通常、面を設定すると、mode-line-buffer-idすべてのウィンドウが影響を受けます。

この例でmode-lineは、の背景が明るいためmode-line-buffer-id、はるかに暗いに設定し#333ます。

明るい背景に暗いバッファーIDを持つモード行

の色の組み合わせを反転させるのが目的ですmode-line-inactive

これは、非アクティブウィンドウのモードラインのほとんどのテキストで可能ですが、バッファ名はまだmode-line-buffer-id顔によって制御されているため、読み込めなくなります。

暗い背景上に暗いバッファーIDがあるモード行非アクティブ

mode-line-inactive明るい背景に設定すると問題を回避できると思いますが、それは私が達成したい結果ではありません。

themes 

:ここで、モードラインの様々な態様をカスタマイズ例にリンクされて amitp.blogspot.com/2011/08/emacs-custom-mode-line.html
lawlist

ここで説明するように、アクティブなバッファーが変更されたときにフェイスを再マップできます:emacs.stackexchange.com/a/14658/780
glucas

回答:


3

あなたがまだ答えを探しているかどうかはわかりませんが、これを自分で試してみたときにGoogleで得た唯一の結果でした。

とにかく、何らかの理由でEmacsはこれを呼び出すdistant-foregroundので、あなたが本当にする必要があるのは:distant-foreground $colour-of-choiceあなたの顔に追加することだけです。


1

ここに役立つかもしれない別の答えのバリエーションがあります。この例では、再マッピングmode-line-buffer-id、非アクティブバッファに緑色にします。

(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)))

更新: コメントで述べたように、これは問題を完全に解決するわけではありません。同じバッファにアクセスする複数の可視ウィンドウがある場合、それらはすべて同じ面を共有します。


残念ながら、バッファは複数のウィンドウに表示される場合があり、1つはアクティブで、もう1つは非アクティブです。
Lindydancer 2016年

確かに、顔の再マッピングはウィンドウではなくバッファに適用されます。
glucas

1

これは他の回答のバリエーションで、アクティブなウィンドウと非アクティブなウィンドウを区別します。バッファが複数のウィンドウで表示されている場合、アクティブなウィンドウのみが表示されml-active-window-face、他のウィンドウはすべて表示されます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")))

例


0

それが可能かどうかはわかりません。モードラインは、ウィンドウが選択されている場合にのみ更新されるようです(呼び出しを使用してテストすると、messageこれが発生します)。そして、これを行うコードはCコードであり、Lispではありません。

の定義で条件式を使用して、使用するmode-line-buffer-identification面が動的に計算されるようにすることができます。しかし、特定のウィンドウに非アクティブなモードラインがあるかどうかをテストするために使用できる関数や変数については知りません。

selected-windowたとえば、は常にアクティブなモードラインのウィンドウを指すため、を使用することはできません。

これは、バッファ名に基づく動的更新の例です。それはあなたが望むものではありませんが、少なくともあなたが何ができるかを示しています。更新中のウィンドウが選択されているかどうかをテストする方法を考え出すことができる場合は、それをバッファー名テストの代わりに使用できます。(しかし、私の印象は、選択されたウィンドウだけがモードラインを更新するということです。)

(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))))

あなたが試みるかもしれないもう一つは機能に助言することformat-mode-lineです。それは明らかにアクティブなモードラインを持つウィンドウと非アクティブなモードラインを持つウィンドウを区別します。しかし、それもCでコーディングされているので、アドバイスするのが難しいかもしれません。C変数Qmode_line_inactive、FWIWをテストします。

help-gnu-emacs@gnu.orgここで十分な回答が得られない場合は、Emacsメーリングリスト(例:)のいずれかでこの質問をすることをお勧めします。あなたが要求したことを実行できるのは良いことのようです。いずれの場合も、質問の+1。


1
Drewの回答を完了するために、アクティブバッファーの検出と、アクティブバッファーと非アクティブバッファーの特定のmode-line-buffer-idフェイスはpowerlineで実行されます。あなたがコードを調査したい場合は、良い出発点は、関数内で定義された電力線-デフォルトのテーマである電力線-themes.el
deb0ch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.