প্রধান মোড বাইন্ডিংগুলি কীভাবে ওভাররাইড করা যায়


38

কখনও কখনও আমার বৈশ্বিক কীবাইন্ডিংগুলি একটি প্রধান মোড দ্বারা ওভাররাইড করা হয়। একটি সহজ উদাহরণ আমার init ফাইলে নিম্নলিখিত সেটিংস

(global-set-key (kbd "C-j") 'newline-and-indent)

তবে বিরক্তিকরভাবে এই কী-বাইন্ডিংটি "লিস্প ইন্টারঅ্যাকশন" মেজর মোড দ্বারা গোপন করা হয় যা স্ক্র্যাচ বাফারের ডিফল্ট মোড।

যখন আমি নিজেকে এমন পরিস্থিতিতে দেখতে পাই যেখানে কোনও মেজর মোড (বা মাইনর মোড) আমার গ্লোবাল কী-বাইন্ডিংটি আড়াল করে চলেছে, আমি কীভাবে এটি ফিরে পেতে পারি?

নোট: আমার প্রশ্ন নয় "কীভাবে আমি বেঁধে C-jকরার newline-and-indent"? মোড "মধ্যে" পাতার মর্মর মিথস্ক্রিয়া আমি কী-ম্যাপগুলির সাথে কীভাবে মোকাবেলা করতে পারি সে সম্পর্কে কী কী ম্যাপগুলি ব্যবহার করতে হয় সে সম্পর্কে আরও সাধারণ জবাব পেতে আগ্রহী বা ব্যবহারকারী কী-বাইন্ডিংগুলি যে কোনও বড় / অপ্রধান মোড দ্বারা আড়াল হয়ে যায়।


উত্তর:


39

আপনি যদি নিজের নিজের ছোটখাট মোডটি নির্ধারণ করতে না চান (তবে আমি আমার প্রথম উত্তরের বিষয়ে কথা বলি) একই সমাধানের জন্য একটি "শর্টকাট" পদ্ধতিরও রয়েছে।

আপনি ইনস্টল করতে পারেন use-packageMelpa, থেকে প্যাকেজ উপলব্ধ এবং এর ব্যবহার করতে bind-key*বা bind-keys*ম্যাক্রো যে অংশ bind-keyপ্যাকেজ যে জাহাজ সঙ্গে use-package

এর ডকুমেন্টেশন থেকে bind-key.el:

;; If you want the keybinding to override all minor modes that may also bind
;; the same key, use the `bind-key*' form:
;;
;;   (bind-key* "<C-return>" 'other-window)

;; To bind multiple keys in a `bind-key*' way (to be sure that your bindings
;; will not be overridden by other modes), you may use `bind-keys*' macro:
;;
;;    (bind-keys*
;;     ("C-o" . other-window)
;;     ("C-M-n" . forward-page)
;;     ("C-M-p" . backward-page))

যদি কেউ আগ্রহী হন তবে মনে রাখবেন যে এটি কেবল পর্দার পিছনে একটি ছোটখাটো মোড ব্যবহার করে। emulation-mode-map-alistsঅগ্রাধিকার প্রয়োগের মাধ্যমে অন্যান্য ছোটখাটো মোডের সাথে দ্বন্দ্বের ক্ষেত্রে এটি আলাদা পদ্ধতি গ্রহণ করে )।
21

এর সরলতার কারণে আমি এটি উত্তর হিসাবে চিহ্নিত করেছি। এটি মূলত এই উত্তরটির মতো একই জিনিস করছে তবে পর্দার আড়ালে এটি আপনার পক্ষে বেশিরভাগ কাজ সুবিধামত করছে।
নিসপিও

@ স্প্যানিও আপনি ঠিক বলেছেন আমার অভিজ্ঞতা থেকে একমাত্র পার্থক্য হ'ল পদ্ধতিটি যা নাবালক মোড বাইন্ডিংগুলি বিশ্বব্যাপী অন্যান্য মোডগুলিকে ওভাররাইড করতে ব্যবহৃত হয়। তবে অন্য পদ্ধতির (আপনার নিজের ছোটখাটো মোড থাকার) সুবিধাটি হ'ল আপনি যদি প্রয়োজন হয় তবে আসল ইম্যাক্স বাইন্ডিংগুলি চেষ্টা করার জন্য আপনি মুহূর্তের জন্য এটি বন্ধ করতে পারেন (আমার কয়েকবার এটি করা দরকার ছিল)।
দক্ষ মোদী

1
যোগ (bind-key* "C-M-&" 'override-global-mode)আপনার Init করতে, এবং আপনি সাধারণতঃ আপনি প্রয়োজন দ্রুত আপনার পথ থেকে সরে বাইন্ডিং পেতে পারেন। যেহেতু override-global-modeকোনও "গ্লোবাল" গৌণ মোড নয়, আপনার এখনও এটি প্রতি বাফার ভিত্তিতে নিষ্ক্রিয় করতে হবে। সুতরাং আপনি যদি নিজেকে বিশ্বব্যাপী ওভাররাইড কীগুলি প্রায়শই নিষ্ক্রিয় করতে দেখেন তবে এই সমাধানটি সুবিধাজনক নয়।
নিসপিও

25

আপনি আপনার নিজের গৌণ মোড এবং এর মূল মানচিত্রটি সংজ্ঞায়িত করতে পারেন এবং অন্য সমস্ত মোডগুলিকে (মাইনর + মেজর) ওভাররাইড করতে পারেন। ঠিক এই কারণেই আমি আমার নিজের ছোটখাটো মোড লিখতে পছন্দ করেছি।

আপনার কী বাইন্ডিংগুলি সমস্ত বাইন্ডিংকে ওভাররাইড করার পদক্ষেপ:

  • নীচে প্রদর্শিত হিসাবে আপনার নিজের গৌণ মোড এবং কী মানচিত্র সংজ্ঞায়িত।
  • আপনার গৌণ মোডটি বিশ্বব্যাপী সক্রিয় করুন
  • (define-key my-mode-map (kbd "C-j") #'newline-and-indent)

একইভাবে আপনার অপ্রাপ্তবয়স্ক মোডে সেট করা আপনার অন্যান্য কী বাইন্ডিংগুলি অন্যান্য মোডগুলিতে ওভাররাইড করবে।

ক্রিস্টোফার ওয়েলনসের ব্লগ পোস্টটি কীভাবে অপ্রাপ্তবয়স্ক মোডে লিখতে হয় সে সম্পর্কে আমি উচ্চ প্রস্তাব দিয়েছি । সেই ব্লগটি nilএকাধিক বড় এবং ছোটখাটো মোডে একাধিক কী বাইন্ডিং সেট করার বিরক্তি আমাকে নিজের ছোটখাটো মোড লেখার জন্য অনুপ্রাণিত করেছিল।

এই পদ্ধতির ব্যবহারের সর্বোত্তম অংশটি হ'ল যখন আপনি ইমাক্সের ডিফল্ট কনফিগারেশনে কী বাইন্ডিংগুলি কী করে তা পরীক্ষা করতে চান, আপনি কেবল নিজের ছোটখাট মোডটি বন্ধ করে দেন; তারপরে আপনি এটিকে আবার চালু করুন এবং আপনার কাস্টম কী বাইন্ডিংগুলি ফিরে পাবেন।

;; Main use is to have my key bindings have the highest priority
;; https://github.com/kaushalmodi/.emacs.d/blob/master/elisp/modi-mode.el

(defvar my-mode-map (make-sparse-keymap)
  "Keymap for `my-mode'.")

;;;###autoload
(define-minor-mode my-mode
  "A minor mode so that my key settings override annoying major modes."
  ;; If init-value is not set to t, this mode does not get enabled in
  ;; `fundamental-mode' buffers even after doing \"(global-my-mode 1)\".
  ;; More info: http://emacs.stackexchange.com/q/16693/115
  :init-value t
  :lighter " my-mode"
  :keymap my-mode-map)

;;;###autoload
(define-globalized-minor-mode global-my-mode my-mode my-mode)

;; https://github.com/jwiegley/use-package/blob/master/bind-key.el
;; The keymaps in `emulation-mode-map-alists' take precedence over
;; `minor-mode-map-alist'
(add-to-list 'emulation-mode-map-alists `((my-mode . ,my-mode-map)))

;; Turn off the minor mode in the minibuffer
(defun turn-off-my-mode ()
  "Turn off my-mode."
  (my-mode -1))
(add-hook 'minibuffer-setup-hook #'turn-off-my-mode)

(provide 'my-mode)

;; Minor mode tutorial: http://nullprogram.com/blog/2013/02/06/

5

একটি বৈশ্বিক বাঁধাই একটি প্রধান মোড বাঁধাই ওভাররাইড করতে, কেবল মুখ্য মোডে বাঁধাই সেট nilকরুন:

(define-key my-major-mode-map (kbd "C-j") nil)

সাধারণভাবে সমস্ত পদ্ধতিতে গ্লোবাল বাইন্ডিংকে প্রাধান্য দেওয়া সম্ভব নয় (অন্যথায় বড় মোডগুলি রাখার কোনও মানে হবে না), তবে আপনি আপনার সবচেয়ে গুরুত্বপূর্ণ বাইন্ডিংগুলির সাহায্যে নিজের গৌণ মোড তৈরি করে এটিকে ঘিরে ফেলতে পারেন। তারপরে আপনার কমপক্ষে বেশিরভাগ (যদিও সমস্ত প্রয়োজন নয়) মোডগুলির চেয়ে প্রাধান্য পাবেন।


এটি কোনও স্বেচ্ছাচারী মেজর মোডের জন্য কাজ করবে? অন্য কথায়, আমি যদি "foo- মোড" নামে একটি বড় মোড ইনস্টল করি তবে আমি (define-key foo-mode (kbd "C-j") nil)আমার .emacs ফাইলটি রাখতে পারি এবং এটি কাজ করার আশা করে?
নিসপিও

আসলে আপনি এটিটি চাইবেন foo-mode-map(উত্তরে আমার উদাহরণটি খারাপ ছিল), তবে হ্যাঁ, এটি মূল মোডে কী-বাইন্ডিংটিকে অক্ষম করে দেবে যাতে এর পরিবর্তে বিশ্বব্যাপী কী-বাইন্ডিংটি ব্যবহার করা হবে (যদি না এটির ব্যবহারের ভিন্ন ভিন্ন মাইনাল মোড না থাকে)।
shosti

এটি কি মোটামুটি সর্বজনীন যে জন্য কী ম্যাপ foo-modeবলা হবে foo-mode-map?
নিসপিও

@ স্প্যানিও হ্যাঁ, এটি বেশিরভাগ মোডের পক্ষে সত্য (যদিও সেখানে কিছু দুর্বৃত্ত রয়েছে)।
shosti

0

আপনি এই ম্যাক্রোগুলি ব্যবহার করতে পারেন:

(defmacro expose-global-keybinding (binding map)
  `(define-key ,map ,binding (lookup-key (current-global-map) ,binding)))

(defmacro expose-bindings (map bindings)
  `(dolist (bnd ,bindings)
     (expose-global-keybinding (kbd bnd) ,map)))

সম্পাদনা :

উদাহরণটি নমুনা পরীক্ষা করুন:

যদি কীম্যাপ এক্স আপনার গ্লোবাল বাইন্ডিং ওয়াইকে ওভাররাইড করছে, আপনি লিখুন:

(expose-bindings X '("Y"))

এবং তারপরে ওভাররাইডটি হবে 'পূর্বাবস্থায় ফিরে'।


আপনার ম্যাক্রো ব্যাককোটটি ব্যবহার করে আপনি উপকৃত হন: `(সংজ্ঞায়িত-কী, মানচিত্র, বাঁধাই (লুক-কী (বর্তমান-গ্লোবাল-মানচিত্র), বাঁধাই করা))
সিগমা

আপনি ম্যাক্রো কী করছে এবং কীভাবে এটি ব্যবহার করবেন সে সম্পর্কে মন্তব্য করতে পারেন? কোড থেকে এটি আমার কাছে পরিষ্কার নয়।
নিসপিও

প্রথম ম্যাক্রো কেবলমাত্র বৈশ্বিক মানচিত্রে কীটি দেখায় এবং ফলাফলটি নির্ধারিত করে other map, সুতরাং, মাধ্যমে বৈশ্বিক মানচিত্রের বাইন্ডিংকে উন্মুক্ত করে other map। দ্বিতীয়টি কেবল আপনাকে বাইন্ডিংয়ের তালিকার জন্য প্রাক্তনটিকে প্রয়োগ করতে দেয়।
রেনান রানেলি

আমি ঘন হয়ে থাকলে দুঃখিত, তবে আমি এখনও ব্যবহারটি পুরোপুরি বুঝতে পারি না। আমার নিজের বিশেষ গ্লোবাল কীম্যাপটি সংজ্ঞায়িত করা দরকার? এটি কি কোনও ছোটখাটো মোডের অন্তর্ভুক্ত দরকার? আমি কি expose-bindingsপ্রথমে সঞ্চালন করব এবং তারপরে বিশ্বব্যাপী keys কীগুলি আমার যে কমান্ডগুলি চান তা বাঁধাই? এই কাজটি করার জন্য আপনি আমার ডিআইডি ফাইলে কী রেখে যেতে পারেন তার একটি উদাহরণ দেখাতে পারেন।
নিসপিও

2
মনে রাখবেন যে এই ম্যাক্রোর নামগুলি ভুল ব্যবহারকারী। তারা গ্লোবাল বাইন্ডিং "এক্সপোজ" করে না, বরং তারা গ্লোবাল বাইন্ডিংয়ের নকল করে। যদি সত্যিকারের গ্লোবাল বাইন্ডিং পরিবর্তন হয় তবে এই সদৃশ অনুলিপিগুলি তা করবে না।
ফিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.