ウィンドウがフォーカスされていないときにハイライトの色を変更しますか?


13

巧妙なマイナーモードとしてhlモードを使用しています。巧妙なウィンドウが現在のウィンドウではない場合、ハイライトされた行の色を変更して(たとえば灰色に)、巧妙なウィンドウが再び現在のウィンドウになったときにデフォルトのハイライト色に戻すにはどうすればよいですか?


これにはオプションがあります。emacs.stackexchange.com/ a / 15141/780を参照してください。
グルーカス

回答:


5

hl-line-mode使用するためにこれを実装しましたbuffer-list-update-hook。コードは次のとおりです。

(defface hl-line-inactive
  '((t nil))
  "Inactive variant of `hl-line'."
  :group 'hl-line)

(defun hl-line-update-face (window)
  "Update the `hl-line' face in WINDOW to indicate whether the window is selected."
  (with-current-buffer (window-buffer window)
    (when hl-line-mode
      (if (eq (current-buffer) (window-buffer (selected-window)))
          (face-remap-reset-base 'hl-line)
        (face-remap-set-base 'hl-line (face-all-attributes 'hl-line-inactive))))))

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

このコードがしていること:

  • hl-line-inactive非アクティブなウィンドウで使用する新しい顔を定義します。M-x customize-faceこの顔の属性を好みに合わせて変更できます。
  • 非アクティブなウィンドウで強調表示面を一時的に再マップする関数を定義します。現在選択されているウィンドウと同じバッファを表示していないウィンドウは、非アクティブと見なされます。
  • すべての表示ウィンドウbuffer-list-update-hookを呼び出すフックを追加しhl-line-update-faceます。

古い答え

上記のコード(自分のinitファイルで使用しています)は、最初に投稿したコードよりもはるかに単純です。@Drewを使用する提案をありがとうwalk-windows。私はまた、顔の再マッピングについての続きを読む(参照フェイス再マッピングを手動Emacs Lispの)と私は多くのコードを削除する可能性が実現しました。

後世のために、私が最初に投稿したものは次のとおりです。

;; Define a face for the inactive highlight line.
(defface hl-line-inactive
  '((t nil))
  "Inactive variant of `hl-line'."
  :group 'local)

(defun toggle-active-window-highlighting ()
  "Update the `hl-line' face in any visible buffers to indicate which window is active."
  (let ((dups))
    (mapc
     (lambda (frame)
       (mapc
        (lambda (window)
          (with-current-buffer (window-buffer window)
            (when hl-line-mode
              (make-local-variable 'face-remapping-alist)
              (let ((inactive (rassoc '(hl-line-inactive) face-remapping-alist)))
                (if (eq window (selected-window))
                    (progn
                      (setq dups (get-buffer-window-list nil nil 'visible))
                      (setq face-remapping-alist (delq inactive face-remapping-alist)))
                  (unless (or inactive (memq window dups))
                    (add-to-list 'face-remapping-alist '(hl-line hl-line-inactive))))))))
        (window-list frame)))
     (visible-frame-list))))

(add-hook 'buffer-list-update-hook #'toggle-active-window-highlighting)

また、機能を参照してください。walk-windowsあなたが目に見えるフレームの窓を反復するために使用できる、などの(そして1のためbuffer-list-update-hookにより呼び出されます、select-window。)
ドリュー

+1 特定のhl-lineについてはそれほどではありませんが、フレーム内の非アクティブなウィンドウの背景をシェーディングする信頼性の高い方法を見つけるために、私は何年も期待しています。これは動作します!ありがとう!
アーロンミラー

ありがとう、これはすごい!残念ながら、を使用すると問題があるようglobal-hl-line-modeです。バッファごとにglobal-hl-line-mode読み込まhl-line-modeれないようです。hl-line顔を使用する代わりにオーバーレイを使用します。私はしばらく運が悪かった。助言がありますか?別の質問を開く必要がありますか?
ロレムイプサム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.