আমি কীভাবে "গ্রুপ" হুক করব?


14

এখানে শ্বেত স্পেস প্রদর্শন, বাফার সীমানা প্রদর্শন, রংধনু বর্ণযুক্ত ডিলিমিটার এবং আরও অনেক কিছু সক্রিয় করতে আমি বেশিরভাগ মোডে বা বরং সমস্ত প্রোগ্রামিং- এবং পাঠ্য-সম্পর্কিত বিষয়গুলিতে সক্ষম করতে চাইছি (কারণ এতে পিছনের স্থানগুলি প্রদর্শন করা, বলুন ediff-mode, ব্যতিক্রমী বিধিগুলি সহ বিশ্বব্যাপী নাবালিক মোড ব্যবহার করার পরিবর্তে মেজর মোডের সাথে সংঘর্ষ হবে)। যেহেতু অধিকাংশ মোড পারেন থেকে উদ্ভূত হয় prog-modeবা text-modeউভয় প্রশ্নে ফাংশন যোগ prog-mode-hookএবং text-mode-hookকাজ করে, তবে সেখানে যথেষ্ট মোড এই স্পেসিফিকেশন অনুসরণ করছেন না, যেমন হয় css-modeবা LaTeX-mode

আমি একটি হুক সংজ্ঞায়িত করতে চাই যা এই মুহূর্তগুলিকে কেবল একটি হুকের সাথে ফাংশন যুক্ত করার জন্য অন্তর্ভুক্ত করে। আসুন একে কল করুন non-special-mode-hook(এটি থেকে আলাদা করতে special-mode-hook)। আমি কীভাবে এমন হুক তৈরি করতে সক্ষম হবো যা এর জন্য তৈরি সমস্ত বড় মোডের জন্য চালিত হয়?


উত্তর:


19

কেবলমাত্র সেটিংগুলিকে কেবল একটি ফাংশনে গ্রুপ করুন এবং সেই ফাংশনটিকে প্রাসঙ্গিক সমস্ত হুক ফাংশনে যুক্ত করুন:

(defun my-non-special-mode-setup ()
  (setq show-trailing-whitespace t)
  ...)
(dolist (hook '(prog-mode-hook text-mode-hook css-mode-hook ...))
  (add-hook hook 'my-non-special-mode-setup))

এটি করার মতো অন্য কোনও উপায় আরও সংক্ষিপ্ত হবে না: যাই ঘটুক না কেন কোথাও আপনার কোনও শ্বেত তালিকা বা মোডের কালো তালিকাভুক্ত হতে চলেছে। অনুশীলনে, আপনি কেবল কয়েকটি মোড পাবেন যা তালিকায় যুক্ত হওয়া দরকার, তাই আমি কেবল জিনিসগুলি সহজ রাখার পরামর্শ দেব।

আমার নিজের কনফিগারেশনে, বেশ কয়েকটি লিস্প-ওরিয়েন্টেড মোডগুলির কনফিগারেশনটি একীকরণ করতে আমি ঠিক এই কৌশলটি ব্যবহার করি ।


আপনাকে ধন্যবাদ, আমি মনে করি আমি এই সমাধানটি অন্যান্য দরকারী গ্রুপগুলির জন্যও গ্রহণ করব (যেমন লিসিগুলি)।
wasamasa

1
আমি নিজেই ঠিক এটাই করি: github.com/purcell/emacs.d/blob/…
স্যানিটিইঙ্কে

1
দুর্দান্ত, আপনি কি নিজের উত্তরের URL টি যুক্ত করতে পারেন? আমি বিশ্বাস করি যে হাইলাইট করা স্নিপেট প্রকৃত ব্যবহারকে খুব ভালভাবে ব্যাখ্যা করে না, পাশাপাশি আরও ব্যবহারও প্রদর্শন করে যেমন বড় আকারের "হুক" এর উপসেট হিসাবে ইমাক লিস্প সম্পর্কিত "হুক" ব্যবহার করা এবং কীভাবে কোনও ব্যক্তি স্বয়ংক্রিয়ভাবে বড় বড় মোডগুলি থেকে হুকের নাম তৈরি করতে পারে সঙ্গে derived-mode-hook-name
wasamasa

আমি আমার চেয়ে এটি আরও পছন্দ করি, কেবল (dolist ...)বনাম (add-hook ...)<রিপিট> এর জন্য। মোড-সুনির্দিষ্ট পরিবর্তনগুলি পৃথক রাখলে (ফাইল-প্রতি-মোড use-package,, el-get) কেবলমাত্র আমার সাথে থাকতাম । উভয়ই এক-এক-স্থান-সমাধান, তবে বিভিন্ন দৃষ্টিকোণ থেকে।
জোনাথন লেচ-পেপিন

সচেতন হন যে আপনি যদি এখানে কোনও শূন্য APPENDতর্ক সরবরাহ না add-hookকরেন তবে আপনার সরবরাহিত তালিকার ক্রম থেকে হুকগুলি বিপরীত ক্রমে ডাকা হবে। এতে কোনও ভুল নেই; অর্ডার বিষয়টি বিবেচনা করে কেবল এটি সম্পর্কে সচেতন হন।
ড্র হয়েছে

5

আপনি একটি ফাংশন যোগ করতে পারে after-change-major-mode-hook, যে কিনা তা পরীক্ষা নতুন মোড একটি আকর্ষণীয় এক (সম্ভবত মাধ্যমে হয় (not (derived-mode-p 'special-mode))), এবং তাই চালায় তাহলে non-special-mode-hook


এটি বেশ নিফটি শোনাচ্ছে (একবারে সমস্ত "অযৌক্তিক" পদ্ধতিগুলি বের করে ফেলেছে যেহেতু কেবলমাত্র কয়েকটি ব্যবহার করে fundamental-modeতবে কেবল পাঠ্য প্রদর্শন না করেই আরও কিছু করে) তবে আমার স্বাদে কিছুটা জাদুও রয়েছে। অতএব upvote।
wasamasa

4

আমি নিজেকে প্রায়শই @ স্যানিটিনিকের প্যাটার্নগুলি আমার সেটিংস এবং গৌণ মোডের ক্রিয়াকলাপগুলিকে একটি ডিফুনে মোড়ানো এবং কল করার জন্য হুকের সাহায্যে লুপিং করতে দেখেছি, তবে আমি একটি ক্লিয়ার অ্যাপ্রোচ চেয়েছিলাম তাই আমি এই ম্যাক্রোটি লিখেছিলাম:

(defmacro hook-modes (modes &rest body)
  (declare (indent 1))
  `(--each ,modes
     (add-hook (intern (format "%s-hook" it))
               (lambda () ,@body))))

দ্রষ্টব্য: আমি dash.elপরিচ্ছন্নতার জন্য আছি তবে এটি সহজেই ব্যবহারের সাথে মানিয়ে নেওয়া যেতে পারে (dolist)

তারপরে আপনি তালিকাবদ্ধ ভেরিয়েবল হিসাবে গোষ্ঠীযুক্ত মোডগুলি সংজ্ঞায়িত করতে পারেন এবং এটির মতো ব্যবহার করতে পারেন:

(defvar progish-modes
  '(prog-mode css-mode sgml-mode))

(hook-modes progish-modes
  (highlight-symbol-mode)
  (highlight-symbol-nav-mode))

1
নোট করুন যে এখানে আপনি derived-mode-hook-nameমোডের হুক ভেরিয়েবলের নাম পেতে ব্যবহার করতে পারেন , যার মাধ্যমে internকৌশলটি এড়ানো হবে ।
sanityinc

@sanityinc তিল derived-mode-hook-name। সুন্দর টিপ!
ওয়েইমন্ডো

1

এমন কোনও নতুন হুক সংজ্ঞায়িত করার পরিবর্তে যা এই সমস্ত অ-উদ্ভুত মোডের জন্য কাজ করে আপনি নিম্নলিখিতটি করতে পারেন।

(defun run-my-hooks ()
  "Run all the following functions in the hook"
  (smartparens-mode 1)
  (whitespace-mode 1)
  (my-needed-mode 1)
  ...)

(add-hook 'specific-mode-hook 'run-my-hooks)
(add-hook 'another-mode-hook 'run-my-hooks)

আপনার এটিকে এখনও সমস্ত মোডে যুক্ত করতে হবে তবে সমস্ত ফাংশন অন্তর্ভুক্ত করার জন্য আপনার ফাংশনটি সংজ্ঞায়িত করে আপনাকে অ্যাডশনাল বৈশিষ্ট্যগুলি যুক্ত / অপসারণ করার সময় কেবল একটি সংজ্ঞা পরিবর্তন করতে হবে।


-2

আপনি এটি চেষ্টা করতে পারেন:

(setq lisp-dialects-mode-hook '(lisp-mode-hook
                            lisp-interaction-mode-hook
                            emacs-lisp-mode-hook
                            ;; common-lisp-mode-hook
                            scheme-mode-hook
                            clojure-mode-hook
                            cider-repl-mode-hook
                            ))

(add-hook 'lisp-dialects-mode-hook 'func)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.