เปลี่ยนสีไฮไลต์เมื่อหน้าต่างไม่ได้โฟกัส?


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

+1 สำหรับสิ่งนี้! ไม่มากสำหรับสิ่ง hl-line โดยเฉพาะ แต่ฉันได้รับการมองออกไปและปีที่ผ่านมาเพื่อหาวิธีที่เชื่อถือได้ในการแรเงาพื้นหลังของหน้าต่างที่ไม่ได้ใช้งานในกรอบ มันใช้งานได้! ขอบคุณ!
Aaron Miller

ขอบคุณนี่ยอดเยี่ยมมาก! global-hl-line-modeแต่น่าเสียดายที่มันดูเหมือนว่าจะมีปัญหาเมื่อใช้ ดูเหมือนว่าglobal-hl-line-modeจะไม่โหลดhl-line-modeสำหรับแต่ละบัฟเฟอร์ มันใช้การซ้อนทับแทนที่จะใช้hl-lineใบหน้า ฉันเล่นซอไปนานแล้วโดยไม่มีโชค ข้อเสนอแนะใด ๆ ฉันควรเปิดคำถามแยกต่างหาก
Lorem Ipsum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.