আপনার কীগুলি কী-ম্যাপগুলিতে আবদ্ধ করা হয়নি যা এখনও লোড হয়নি?


9

আমি use-packageইনস্টলড প্যাকেজগুলি পরিচালনা করতে এবং bind-keyআমার পছন্দ মতো কাস্টম কীগুলিতে ক্রিয়া বরাদ্দ করতে ব্যবহার করি।

আমি বেশিরভাগ ডিফল্ট ইমাস কি-বাইন্ডিংকে ওভাররাইড করে (যেমন C-nহয়ে যায় M-k, C-pহয়ে যায় M-i), তবে আমি আমার কী-বাইন্ডিং স্কিমকে ওভাররাইড করে অন্যান্য মোডগুলির সাথে ঠিক আছি। যাইহোক, কখনও কখনও আমি চাই আমার কী-বাইন্ডিংটি অবিচল থাকে। আমি M-kডিফল্ট জ্ঞানস বা হেলমের চেয়ে অন্য কিছু বোঝাতে চাই।

তবে এ্যাম্যাকস স্টার্টআপে এগুলি একে অপরের সাথে দ্বন্দ্ব বোধ করে, কারণ আমি যদি কোনও কীম্যাপে কোনও বাঁধাই যুক্ত করতে পারি না, যদি এটি উপস্থিত না থাকে (কারণ use-packageকখনও কখনও প্যাকেজ লোডিং স্থগিত করে)। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডগুলি ত্রুটিগুলি ফেলে দেয় (উদাঃ (void-variable helm-map)), কারণ হেলম এবং জ্নুস এখনও পুরোপুরি লোড হয়নি।

(bind-key "M-Y" 'helm-end-of-buffer helm-map)
(bind-key "M-k" 'helm-next-line helm-find-files-map)
(bind-key "M-s" 'other-window gnus-summary-mode-map)

আমার কাছে আমার সমস্ত অনুরোধ use-packageএকটি ফাইলে এবং bind-keyঅন্য ফাইলে কাস্টম কী-বাইন্ডিংগুলির জন্য রয়েছে। আমি use-packageকলগুলিতে বাইন্ডিংগুলি রাখতে চাই না , কারণ সম্ভবত আমি আমার কাস্টম কী-বাইন্ডিং স্কিমটি স্ট্যান্ডেলোন প্যাকেজ হিসাবে প্রকাশ করতে চাই। যদি আমি চাই যে আমার স্কিমটি ইনস্টল করার কারও হেলম এবং গনাসের স্থানীয় কীবাইন্ডিংগুলিও ওভার্রাইড হয়ে গেছে?

আমি কীভাবে মোড-লোকাল bind-keyকী -বাইন্ডিংগুলি ব্যবহার করে পরিচালনা করব , যাতে প্যাকেজগুলি দেরীতে লোড করা সত্ত্বেও সমস্ত কীগুলি সেট করা থাকে এবং সমস্ত কী সেটিংস একটি ফাইলের অভ্যন্তরে থাকে?

উত্তর:


20

with-eval-after-loadনির্দিষ্ট মডিউলটি লোড হওয়ার পরে এবং কী-ম্যাপটি সংজ্ঞায়িত করা না হওয়া পর্যন্ত আপনি কী বাইন্ডিং স্থগিত করতে ব্যবহার করতে পারেন :

(with-eval-after-load "helm"
  (bind-key "M-Y" #'helm-end-of-buffer helm-map))

C-h v helm-mapকোন মডিউলটি কী ম্যাপে সংজ্ঞায়িত করা হয়েছে তা অনুসন্ধান করতে ব্যবহার করুন এবং এভাবে প্রথম লাইনে স্ট্রিংয়ে কী রাখবেন।


with-eval-after-loadইমাস 24.4 এ চালু হয়েছিল। আপনার যদি পূর্ববর্তী ইমাস সংস্করণ থাকে তবে তার eval-after-loadপরিবর্তে আপনাকে ব্যবহার করতে হবে এবং bind-keyকলটির সামনে একটি একক উদ্ধৃতি রাখবেন :

(eval-after-load "helm"
  '(bind-key "M-Y" #'helm-end-of-buffer helm-map))

আপনি যদি bind-keyএই ফর্মটিতে বেশ কয়েকটি কল রাখতে চান তবে with-eval-after-loadকেবল একটির পরের eval-after-loadএকগুলি রেখেছেন , তবে আপনার সমস্তগুলি একটিতে মুড়ে ফেলতে হবে progn:

(eval-after-load "helm"
  '(progn
     (bind-key "M-Y" #'helm-end-of-buffer helm-map)
     (bind-key "M-k" #'helm-next-line helm-find-files-map)))

9

সমাধান

প্রদত্ত প্যাকেজটি লোড হওয়ার পরে স্টাফ চালানোর জন্য, আপনাকে এটি পরে :configরাখা দরকার use-package

আপনার প্রশ্নের স্নিপেট ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হল:

স্নিপেট # 1

(use-package helm
  :config
  (progn
    (bind-key "M-Y" #'helm-end-of-buffer helm-map)
    (bind-key "M-k" #'helm-next-line helm-find-files-map)))

(use-package gnus
  :config
  (bind-key "M-s" #'other-window gnus-summary-mode-map))

ব্যাখ্যা

আপনার ইমাসে বিভিন্ন স্থানে init.elবা নেস্টেড ফাইলগুলির মধ্যে যে কোনও লোড / প্রয়োজনীয় ফাইলের নীচে নীচে দুটি স্নিপেট থাকা ঠিক আছে ।

স্নিপেট # 2

(use-package gnus)

স্নিপেট # 3

(use-package gnus
  :config
  (bind-key "M-s" #'other-window gnus-summary-mode-map))

কারণটি হ'ল উপরের 2 টি স্নিপেটের মধ্যে প্রথমে কোনটি কার্যকর করা হয় তা বিবেচ্য নয়।

এখানে কেন .. নীচে স্নিপেট # 3 এ প্রসারিত।

আপনি M-x pp-macroexpand-last-sexpযখন পয়েন্টটি (কার্সার) সেই স্নিপেটের শেষ সমাপনী বন্ধনীর পরে করবেন তখন আপনি নীচে পাবেন ।

স্নিপেট # 4

(if (not (require 'gnus nil t))
    (ignore (message (format "Could not load %s" 'gnus)))
  (condition-case-unless-debug err
      (bind-key "M-s" #'other-window gnus-summary-mode-map)
    (error
     (ignore
      (display-warning 'use-package
                       (format "%s %s: %s" "gnus" ":config"
                               (error-message-string err))
                       :error))))
  t)

উপরের স্নিপেটটি মূলত এর অর্থ

  • gnusপ্রথমে প্রয়োজনীয় এবং তারপরে bind-keyফর্মটি কার্যকর করা হয়।
  • যদি gnusএটি না পাওয়া যায় তবে আপনি * বার্তাগুলি * বাফারে একটি বার্তা দেখতে পাবেন যে প্যাকেজটি লোড করা যায়নি couldn't
  • এক্সিকিউটিভে কোনও সমস্যা হলে এটি ত্রুটি ছুঁড়ে দেবে (bind-key "M-s" #'other-window gnus-summary-mode-map)

এছাড়াও উপরের স্নিপেট যদি gnusইতিমধ্যে # 2 দ্বারা প্রয়োজনীয় হয় এবং এটি স্নিপেট # 3 দ্বারা আবার প্রয়োজন হয় তবে এটি কোনও ব্যাপার নয় কারণ requireএটি ইতিমধ্যে লোড হয়ে থাকলে আবার কোনও প্যাকেজ লোড করে না।


উল্লেখ

গিথুবের use-packageমূল বিষয়গুলি থেকে ,

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

স্নিপেট # 5

(use-package foo
  :init
  (setq foo-variable t)
  :config
  (foo-mode 1))

প্যাকেজ লোড হওয়ার আগে উপরের :initঅংশটি ( (setq foo-variable t)) প্রয়োগ করে । কিন্তু এ অধ্যায় কার্যকর পর লোড করা হয়। foo(foo-mode 1):config foo


3

অন্যান্য উত্তরের বিপরীতে, আমি সর্বদা এর জন্য হুক ব্যবহার করেছি:

(defun my-company-maps()
  (define-key company-active-map "\C-x\M-h" 'company-show-doc-buffer)
  (define-key company-active-map "\C-n" 'company-select-next)
  (define-key company-active-map "\C-p" 'company-select-previous)
  (define-key company-active-map "\C-h" 'delete-backward-char))

(add-hook 'company-mode-hook 'my-company-maps)

আমিও, আমি ভেবেছিলাম এটি এটি করার পছন্দসই উপায়।
অর্থবহ ব্যবহারকারীর নাম

2

যেহেতু আপনি ইতিমধ্যে দস্তাবেজ থেকে বাইন্ড-কী ব্যবহার করছেন bind-key.el:

যদি আপনি চান যে কী-বাইন্ডিংটি সমস্ত ক্ষুদ্র মোডগুলিকে ওভাররাইড করতে পারে যা একই কীটি বাঁধতে পারে তবে `বাইন্ড-কী * 'ফর্মটি ব্যবহার করুন:

(bind-key* "<C-return>" 'other-window)

কী-ম্যাপের মধ্যে একটি কী আনবাইন্ড করতে (উদাহরণস্বরূপ, আপনার পছন্দসই মেজর মোডটিকে আপনি যে কোনও জায়গায় বাঁধাই করতে চান না এমন বাইন্ডিং পরিবর্তন করা থেকে বিরত রাখতে), আনবাইন্ড-কী ব্যবহার করুন:

(unbind-key "C-c x" some-other-mode-map)

কীম্যাপটি বর্তমানে অপরিজ্ঞাত থাকলে শেষ ফর্মটি ভেঙে যায় কারণ সংজ্ঞায়িত ফাইলটি some-other-mode-mapএখনও লোড হয়নি। তাই আপনি যদি একটি এ এই করা হতে পারে use-packageজন্য some-other-mode(প্যাকেজ সংজ্ঞা some-other-mode-map), অথবা ব্যবহার with-eval-after-load:

(with-eval-after-load 'some-other-mode
  (unbind-key "C-c x" some-other-mode-map))

অন্য একটি বিকল্প হ'ল আপনার নিজের গৌণিক মোডের সংজ্ঞা দেওয়া হবে যা সমস্ত বাইন্ডিংগুলিকে ধারণ করে যা বড় মোডগুলিতে ওভাররাইড করা উচিত নয়:

(defvar my-very-own-keymap (make-keymap) "my very own keymap.")

(define-key my-very-own-keymap (kbd "M-i") 'my-foo)

(define-minor-mode my-very-own-keys-minor-mode
  "Minor mode with my very own keybindings."
  t " my-own-keys" my-very-own-keymap)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.