Pencere odakta değilken vurgu rengini değiştir?


13

Hl-mode'u usta için küçük bir mod olarak kullanıyorum. Vaka penceresi geçerli pencere olmadığında vurgulanan çizginin rengini (ör. Griye) nasıl değiştirebilirim ve daha sonra beceri penceresi tekrar geçerli pencere olduğunda varsayılan vurgu rengine nasıl geri dönebilirim?


Bunun için bir seçenek olduğu ortaya çıktı, bkz. Emacs.stackexchange.com/a/15141/780 .
glucas

Yanıtlar:


5

Bunu hl-line-modekullanmak için uyguladım buffer-list-update-hook. İşte kod:

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

Bu kod ne yapıyor:

  • hl-line-inactiveEtkin olmayan pencerelerde kullanılacak yeni bir yüz tanımlayın . M-x customize-faceBu yüzün özelliklerini zevkinize göre değiştirmek için kullanabilirsiniz .
  • Etkin olmayan pencerelerde vurgulama yüzünü geçici olarak yeniden eşleştirmek için bir işlev tanımlayın. Bir pencere, seçili olan pencereyle aynı arabelleği görüntülemiyorsa etkin değil olarak kabul edilir.
  • Görünür tüm pencereleri buffer-list-update-hookçağırmak hl-line-update-faceiçin bir kanca ekleyin .

Eski cevap

Yukarıdaki kodu (kendi dosyamda kullanıyorum init), aslında gönderdiğimden çok daha basit. @ Öneriyi kullanmanız için teşekkürler walk-windows. Ayrıca yüz yeniden eşleme hakkında daha fazla bilgi edindim (bkz . Emacs Lisp El Kitabında Yüz Eşleme ) ve bir çok kodu kaldırabileceğimi fark ettim.

Gelecek nesiller için, aslen yayınladım:

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

Ayrıca walk-windows, görünür çerçevelerin pencereleri üzerinde yineleme yapmak için kullanabileceğiniz işleve de bakın . (Ve +1 için buffer-list-update-hookçağrılır select-window.)
Drew

Bunun için +1! Özellikle hl-line şeyler için çok fazla değil, ama yıllardır aktif olmayan pencerelerin arka planlarını bir çerçevede gölgelendirmenin güvenilir bir yolunu bulmak için bakıyorum. Bu çalışıyor! Teşekkürler!
Aaron Miller

Teşekkür ederim, bu harika! Ne yazık ki, kullanırken problemleri var gibi görünüyor global-hl-line-mode. O görünüyor global-hl-line-modeyüklemez hl-line-modeher tampon için. hl-lineYüzü kullanmak yerine bir kaplama kullanır . Bir süredir şanssızlıkla uğraşıyorum. Herhangi bir öneri? Ayrı bir soru açmalı mıyım?
Lorem Ipsum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.