มีวิธีการเปลี่ยนสีของหน้าต่างที่ใช้งานอยู่หรือไม่?


15

เพื่อแยกความแตกต่างระหว่างหน้าต่างที่โฟกัสกับส่วนที่เหลือที่ไม่ใช่ฉันอยากจะเปลี่ยนสีของหน้าต่างนี้ การค้นพบการปรับแต่งด้วยคำสำคัญที่ขอบฉันพบเฉพาะวิธีการเปลี่ยนสี bg ของมันโดยไม่สามารถตั้งค่าสีที่แตกต่างสำหรับคนที่ใช้งานและไม่ได้ใช้งาน เป็นไปได้หรือไม่ ขอบคุณ.


ฉันไม่แน่ใจเกี่ยวกับขอบ แต่คุณสามารถเปลี่ยนโหมดบรรทัดสำหรับหน้าต่างที่ไม่ได้ใช้งาน M-x customize-face mode-line-inactiveความพยายาม
ไทเลอร์

3
ดูเหมือนว่าจะเป็นเฟรมภายในจึงดูเหมือนคำตอบคือไม่ ฉันพยายาม(face-remap-add-relative 'fringe '((:background "yellow")))ที่ใบหน้าอื่น ๆ นั้นเพียงพอสำหรับการใช้บัฟเฟอร์ในพื้นที่ แต่มันมีผลกับหน้าต่างทั้งหมดในกรอบเท่าที่fringeเกี่ยวข้อง นอกจากคำแนะนำของ @Tyler แล้วคุณยังสามารถปรับแต่งเคอร์เซอร์เพื่อให้ปรากฏในหน้าต่างที่ใช้งานเท่านั้น - ดูตัวแปรcursor-in-non-selected-windows
ลิสต์กฎหมาย

ฉันคิดว่านี่คือสิ่งที่คุณต้องการ: http://stackoverflow.com/questions/9446673/asking-emacs-to-highlight-more-clearly-which-window-pane-has-the-focus-cursor
Pedro Luz

ฉันรู้เกี่ยวกับ modeline, ขอบคุณ ฉันแค่ต้องการทำให้ชัดเจนมากขึ้นสำหรับฉัน
sandric

ต่อไปนี้เป็นแนวคิดเพิ่มเติมสองสามข้อที่จะช่วยให้หน้าต่างที่ใช้งานดึงดูดความสนใจมากขึ้น: (1) การทำให้พื้นหลังบรรทัดโหมดของหน้าต่างที่ไม่ได้ใช้งานจับคู่สีบัฟเฟอร์เพื่อให้บรรทัดโหมดที่ไม่ใช้งานสังเกตได้น้อยลง: stackoverflow.com/ a / 20936397/2112489และ (2) การเปลี่ยนสีของส่วนประกอบที่เป็นข้อความบางอย่างของmode-line-formatภายในหน้าต่างที่ใช้งานและไม่ใช้งาน: emacs.stackexchange.com/a/22682/2287
ลิสต์

คำตอบ:


6

เนื่องจากคุณต้องการ "เพื่อแยกความแตกต่างระหว่างหน้าต่างโฟกัส" ให้ดีขึ้นคุณสามารถใช้วิธีอื่นแทนการเปลี่ยนสีขอบของหน้าต่างที่ใช้งานอยู่

ฉันรวมสามวิธีเพื่อแยกความแตกต่างระหว่างหน้าต่างที่ใช้งานและไม่ใช้งานได้ดีขึ้น

  1. ใช้สีของโหมดบรรทัดต่างกันสำหรับหน้าต่างที่แอ็คทีฟและไม่ทำงาน
  2. เน้นบรรทัดปัจจุบันที่มีจุดอยู่ในหน้าต่างที่ใช้งานอยู่
  3. ใช้สีพื้นหลังที่แตกต่างกันสำหรับหน้าต่างที่ทำงานและไม่ทำงาน

โปรดทราบว่าสีที่เลือกทั้งหมดที่กล่าวถึงข้างต้นควรทำงานได้ดีกับธีม Emacs ของคุณ

นี่คือทั้งสามวิธี:

  1. ใช้สีโหมดบรรทัดที่แตกต่างกันสำหรับหน้าต่างที่ทำงานและไม่ทำงาน:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. เน้นบรรทัดปัจจุบันที่มีจุดอยู่ในหน้าต่างที่ใช้งานอยู่:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. ใช้สีพื้นหลังที่แตกต่างกันสำหรับหน้าต่างที่ทำงานและไม่ทำงาน:

    (defun highlight-selected-window ()
      "Highlight selected window with a different background color."
      (walk-windows (lambda (w)
                      (unless (eq w (selected-window))
                        (with-current-buffer (window-buffer w)
                          (buffer-face-set '(:background "#111"))))))
      (buffer-face-set 'default))
    (add-hook 'buffer-list-update-hook 'highlight-selected-window)
    

คุณสามารถเปลี่ยนสีในตัวอย่างโค้ดเพื่อให้ทำงานได้ดีกับธีม Emacs ของคุณ

นี่คือภาพหน้าจอสุดท้าย:

สกรีนช็อตของสามวิธีด้วยกัน

และมีฟังก์ชั่นอื่นที่คุณสามารถใช้เพื่อแฟลชหน้าต่างที่ใช้งานอยู่:

(global-set-key (kbd "<f12>") 'flash-active-buffer)
(make-face 'flash-active-buffer-face)
(set-face-attribute 'flash-active-buffer-face nil
                    :background "blue" :foreground nil)
(defun flash-active-buffer ()
  (interactive)
  (run-at-time "100 millisec" nil
               (lambda (remap-cookie)
                 (face-remap-remove-relative remap-cookie))
               (face-remap-add-relative 'default 'flash-active-buffer-face)))

คุณสามารถเปลี่ยนการเชื่อมโยงคีย์ในโค้ดขนาดเล็กเมื่อคุณต้องการแสดงหน้าต่างที่ใช้งานอยู่กดปุ่มหน้าต่างที่ใช้งานจะเป็นสีฟ้าหลังจากที่คุณเลื่อนคุณชี้สีจะหายไป


0

ผมมีปัญหาเดียวกัน. ฉันใช้โหมดสมาร์ทไลน์และปรับแต่งเพื่อให้ได้สีที่โดดเด่นในหน้าต่างที่ใช้งานอยู่ นี่คือกรอบตัวอย่าง หน้าต่างที่ใช้งานอยู่เป็นหน้าต่างที่มีเส้นโหมดสีดำพร้อมตัวอักษรสีทอง

ป้อนคำอธิบายรูปภาพที่นี่

ตรวจสอบให้แน่ใจว่าคุณต้องการสมาร์ทโหมดบรรทัดก่อนใช้รหัสนี้ ฉันแนะนำให้คุณปรับแต่งมันตามสีที่คุณต้องการ:

(deftheme smart-mode-line-dmg "dmg theme for smart-mode-line.")
(custom-theme-set-faces
 'smart-mode-line-dmg
                                        ; '(mode-line-inactive ((t :inverse-video nil)))
                                        ; '(mode-line     ((t :inverse-video nil)))
 '(mode-line     ((t :foreground "grey70" :background "black" :inverse-video nil)))
 '(mode-line-inactive  ((t :foreground "black" :background "white" :inverse-video nil)))
 '(sml/global    ((t :inherit font-lock-preprocessor-face)))
 '(sml/filename  ((t :inherit sml/global :foreground "gold" :weight bold)))
 '(sml/prefix    ((t :inherit (font-lock-variable-name-face sml/global))))
 '(sml/read-only ((t :inherit (font-lock-type-face sml/not-modified))))
 '(sml/modes     ((t :foreground nil :inherit sml/filename :weight normal))))

(sml/setup)

0

คุณสามารถลองทำสิ่งต่อไปนี้เพื่อเน้นหน้าต่างที่เลือกไว้ในปัจจุบัน ระวังว่ามันจะไม่ทำงานหากบัฟเฟอร์ในหลาย ๆ หน้าต่างเหมือนกัน นี่จะหรี่หน้าต่างอื่นทั้งหมดยกเว้นหน้าต่างที่เลือก

(defvar dim-window-face
  '((t  (:background "grey40")))
  "Face for a dimmed window in the current frame.")

(defvar current-window-face
  '((t  (:background "black")))
  "Face for a dimmed window in the current frame.")

(defvar window->overlay (make-hash-table)
  "A hash table of window to dimmed overlay.")

(defun dim-windows ()
  "Dim all windows except the `selected-window' in current frame."
  (interactive)
  (walk-windows (lambda (w)
                  ;; Delete existing overlay on window W
                  (when-let ((ol (gethash w window->overlay)))
                    (delete-overlay ol))
                  (let ((ol (make-overlay (window-start w)
                                          (window-end w)
                                          (window-buffer w))))
                    (overlay-put ol 'face (if (eql (selected-window) w)
                                              current-window-face
                                            dim-window-face))
                    (puthash w ol window->overlay)))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.