जब विंडो फ़ोकस में न हो तो हाइलाइट रंग बदलें?


13

मैं hl-mode का उपयोग डीफ़्ट के लिए एक मामूली मोड के रूप में कर रहा हूँ। मैं हाइलाइटेड लाइन चेंज कलर (उदाहरण के लिए ग्रे) को कैसे बनाते हैं जब डेफ विंडो वर्तमान विंडो नहीं होती है, और फिर डिफॉल्ट हाइलाइट रंग में वापस आने पर डेफ विंडो वर्तमान विंडो फिर से बन जाती है?


यह पता चला है कि इसके लिए एक विकल्प है, 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फ़ाइल में उपयोग कर रहा हूं ) मूल रूप से जो मैंने पोस्ट किया है, उससे बहुत सरल है। धन्यवाद @ सुझाव का उपयोग करने के लिए आकर्षित किया walk-windows। मैंने फेस रीमैपिंग के बारे में और अधिक पढ़ा ( इमैक लिस्प मैनुअल में फेस रीमैपिंग देखें ) और महसूस किया कि मैं बहुत सारे कोड निकाल सकता हूं।

पोस्टरिटी के लिए, यहां मैं मूल रूप से क्या पोस्ट कर रहा हूं:

;; 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- लाइन सामान के लिए इतना नहीं है, लेकिन मैं एक फ्रेम में निष्क्रिय खिड़कियों की पृष्ठभूमि को छायांकन करने का एक विश्वसनीय तरीका खोजने के लिए वर्षों से बंद और देख रहा हूं। यह काम! धन्यवाद!
हारून मिलर

धन्यवाद, यह कमाल है! दुर्भाग्य से, इसका उपयोग करते समय समस्याएं होती हैं global-hl-line-mode। ऐसा लगता है कि प्रत्येक बफर के लिए global-hl-line-modeलोड नहीं करता है hl-line-mode। यह hl-lineचेहरे का उपयोग करने के बजाय एक ओवरले का उपयोग करता है। मैं कुछ समय के लिए बिना किसी भाग्य के साथ इसके साथ काम कर रहा हूं। कोई सुझाव? क्या मुझे एक अलग प्रश्न खोलना चाहिए?
लोरम इप्सुम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.