উইন্ডো ফোকাসে না থাকলে হাইলাইটের রঙ পরিবর্তন করবেন?


13

আমি এইচএল-মোডকে বুদ্ধির জন্য একটি ছোটখাট মোড হিসাবে ব্যবহার করছি। ডিফল্ট উইন্ডোটি যদি বর্তমান উইন্ডোটি না থাকে তখন আমি কীভাবে হাইলাইট করা লাইন পরিবর্তন রঙ (যেমন ধূসর করতে) করব এবং ডিফল্ট উইন্ডোটি আবার বর্তমান উইন্ডোতে পরিণত হলে ডিফল্ট হাইলাইট রঙে ফিরে আসব?


এটির জন্য একটি বিকল্প রয়েছে তা দেখা যাচ্ছে, 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! এইচএল-লাইনের স্টাফগুলিতে সুনির্দিষ্টভাবে এতটা নয়, তবে ফ্রেমে নিষ্ক্রিয় উইন্ডোজের ব্যাকগ্রাউন্ডগুলি ছাঁটাই করার একটি নির্ভরযোগ্য উপায় খুঁজতে আমি বছরের পর বছর ধরে সন্ধান করে যাচ্ছি। এইটা কাজ করে! ধন্যবাদ!
অ্যারন মিলার

আপনাকে ধন্যবাদ, এটি দুর্দান্ত! দুর্ভাগ্যক্রমে, ব্যবহার করার সময় এটির সমস্যা হয়েছে বলে মনে হয় 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.