Emacs এ বিশ্বব্যাপী ওভাররাইড কী বাঁধাই


100

কীভাবে আমি একটি কী বাঁধাই সেট করতে পারি যা বিশ্বব্যাপী ওভাররাইড হয় এবং কীটির জন্য অন্যান্য সমস্ত বাইন্ডিংয়ের চেয়ে অগ্রাধিকার গ্রহণ করে? আমি সমস্ত বড় / গৌণ মোড মানচিত্রকে ওভাররাইড করতে চাই এবং আমার বাঁধাই সর্বদা কার্যকর হয় তা নিশ্চিত করতে চাই।

এটি অবশ্যই কাজ করে না:

(global-set-key "\C-i" 'some-function)

এটা কাজ করে text-mode, কিন্তু আমি ব্যবহার lisp-mode, C-iথেকে রিবাউন্ড হয় lisp-indent-line

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

আমি এটি করতে চাই কারণ আমি ইতিমধ্যে অন্যান্য সম্পাদকদের কাছ থেকে শিখেছি এবং অন্তর্নিহিত বাইন্ডিংগুলি অনুকরণ করতে চাই।

উত্তর:


150

আমি আমার সমস্ত "ওভাররাইড" কী বাইন্ডিংগুলির জন্য একটি ছোটখাটো মোড ব্যবহার করি:

(defvar my-keys-minor-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "C-i") 'some-function)
    map)
  "my-keys-minor-mode keymap.")

(define-minor-mode my-keys-minor-mode
  "A minor mode so that my key settings override annoying major modes."
  :init-value t
  :lighter " my-keys")

(my-keys-minor-mode 1)

অন্য কেউ কীবোর্ড চালাচ্ছে বা আমার যদি ডিফল্ট কী বাঁধাইয়ের কাজটি দেখার দরকার হয় সে ক্ষেত্রে যদি আমার সমস্ত পরিবর্তনগুলি একসাথে বন্ধ হয়ে যায় (কেবলমাত্র ছোটখাট মোডটি অক্ষম করুন) তবে এটির অতিরিক্ত সুবিধা রয়েছে।

নোট করুন যে আপনাকে মিনিবাসে এটি বন্ধ করার প্রয়োজন হতে পারে:

(defun my-minibuffer-setup-hook ()
  (my-keys-minor-mode 0))

(add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)

4
এটি একটি ভাল ধারণা মত মনে হচ্ছে। আপনার গৌণ মোডটি অন্যান্য ছোট মোডের সাথে লড়াই না করে তা নিশ্চিত করার কোনও উপায় আছে কি?
ব্রায়ান কার্পার

4
আপনার গৌণ মোড তালিকার প্রথমটিতে মাইনর-মোড-মানচিত্র-তালিকাভুক্ত রয়েছে তা নিশ্চিত করুন।
ট্রে জ্যাকসন

4
ট্রে ঠিক আছে। সাধারণত এটি আপনার .emacs এর শেষের কাছে রাখা যথেষ্ট। এছাড়াও, বেশিরভাগ বাঁধা যা আপনি ওভাররাইড করবেন সেগুলি হ'ল প্রধান মোডগুলি সেট করছে ... ছোটখাটো মোডগুলি সাধারণত উপায় থেকে দূরে থাকে।
স্কটফ্রেজার

আমি এই পদ্ধতির অনুসরণ করেছিলাম, কিন্তু তখন আমি বুঝতে পেরেছিলাম যে সিআইয়ের সাথে আমি যে কোনও কিছু আবদ্ধ করি তাও ট্যাব কী-তে আবদ্ধ হয়। কোনও পরামর্শ?
স্টিভ

4
ব্রায়ান ছিদ্রান্বেষণকারী: এখানে পরবর্তীকালে লোড ছোটখাট মোড সঙ্গে মোকাবিলা করার জন্য একটি বর্ধিতকরণ আছে: stackoverflow.com/questions/683425/...
phils

30

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

যেহেতু সংকলনের সময় কীম্যাপগুলি উত্পন্ন করা যেতে পারে, loadএটি করার জন্য সেরা জায়গার মতো মনে হয়েছিল।

(add-hook 'after-load-functions 'my-keys-have-priority)

(defun my-keys-have-priority (_file)
  "Try to ensure that my keybindings retain priority over other minor modes.

Called via the `after-load-functions' special hook."
  (unless (eq (caar minor-mode-map-alist) 'my-keys-minor-mode)
    (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
      (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
      (add-to-list 'minor-mode-map-alist mykeys))))

আমি আপনার স্ক্রিপ্টটি আটকানো কিন্তু এটা কোন প্রভাব ফেলে না :(
Alper

@ আল্পার আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি যে কোডটি ব্যবহার করছেন তা সহ প্রাসঙ্গিক সমস্ত বিবরণ দিয়ে একটি সমস্যা পোস্ট করুন এবং সমস্যার পুনরুত্পাদন করার জন্য একটি নির্দিষ্ট উদাহরণ / রেসিপি।
ফিল্ডস

23

ইনস্টল করুন use-package, eval এবং আপনি সম্পন্ন করেছেন:

(require 'bind-key)
(bind-key* "C-i" 'some-function)

5
ব্যবহারের ক্ষেত্রে কেবলমাত্র বাইন্ড-কি ইনস্টল করা যথেষ্ট, যদিও ব্যবহার-প্যাকেজটি বাইন্ড-কি-র উপর নির্ভর করে।
xuchunyang

4
এটি ('বাইন্ড-কী' প্যাকেজ) সবচেয়ে সুবিধাজনক সমাধান বলে মনে হচ্ছে; ভাগ করে নেওয়ার জন্য ধন্যবাদ.
অলিগিলো

আমি এর জন্য ম্যাচটি সন্ধান করতে সক্ষম হইনি use-package:Install package: use-package [No Match]
আল্পার

15

"ইমাস আনফাইন সংঘবদ্ধ মোড কী-বাইন্ডিংস" অনুসন্ধান করার সময় আমি এই প্রশ্নটি পেয়েছি কারণ আমার বিশ্বব্যাপী মানচিত্রটি একটি org বাফারে কাজ করতে বাফার করতে বাছাই করার জন্য আমি বিদ্যমান সিসি সিবি আচরণটি আবদ্ধ করতে চেয়েছিলাম।

এটি আমার পক্ষে সহজ সমাধান হিসাবে শেষ হয়েছে:

(add-hook 'org-mode-hook
      (lambda ()
        (local-unset-key (kbd "C-c C-b"))))

4
এটি মোড-সুনির্দিষ্ট এবং এটি আপনার একক ব্যবহারের ক্ষেত্রে কাজ করলেও বড় ছবিটিকে সম্বোধন করে না।
রিচিএইচএইচ

12

যদিও স্কটফ্রেজারের উত্তরটি আপনি যা চেয়েছিলেন ঠিক তেমনই, তবে আমি উত্তরোত্তর জন্য আরও একটি সমাধান উল্লেখ করব।

থেকে এ গিয়ে Emacs ম্যানুয়াল :

"লিসপ প্রোগ্রামগুলিতে সিসি বর্ণকে কী হিসাবে চিহ্নিত করবেন না। সিসি এবং একটি চিঠি (উচ্চতর বা নিম্নতর কেস) নিয়ে সিকোয়েন্সগুলি ব্যবহারকারীদের জন্য সংরক্ষিত; সেগুলি কেবল ব্যবহারকারীদের জন্য সংরক্ষিত অনুক্রম, সুতরাং এগুলি অবরুদ্ধ করবেন না।"

আপনি যদি সিসি প্লাস কোনও চিঠির সাথে আপনার ব্যক্তিগত বিশ্বব্যাপী বাইন্ডিংগুলি আবদ্ধ করেন তবে আপনার "নিরাপদ" থাকা উচিত। তবে এটি নিছক একটি সম্মেলন এবং যে কোনও মোড এখনও আপনার বাইন্ডিংগুলিকে ওভাররাইড করতে সক্ষম।


4
এই নিয়মটি ভেঙে ফেলার জন্য আমি সমস্ত মোডের org- মোডের আশা করিনি। `সিসি চ 'আমাকে বলেছে যে সিসি এ, বি, সি, এবং এল যথাক্রমে org- এজেন্ডা, org-iswitchb, org- ক্যাপচার এবং org- স্টোর-লিঙ্কে আবদ্ধ।
নাট পার্সনস

8
আফাইক, এটিকে আবদ্ধ করার জন্য এটি প্রথম ধাপে org- মোডটি ব্যবহার করার পরামর্শ দেয় তবে ব্যবহারকারীকে সেগুলি নিজেরাই সংজ্ঞায়িত করতে হয় (যেমন এটি ডিফল্টরূপে করা হয়নি), এবং এটি করার সময় অন্য কোনওটি বেছে নিতে পারে। (এছাড়াও, কারণ এই বাইন্ডিংগুলি বৈশ্বিক বলে মনে করা হয়, org মেজর মোডের সাথে আবদ্ধ নয়)
নিকানা রেকলভিক্স


3

আপনি যদি "সর্বদা মানচিত্রে কী-বাইন্ডগুলি ব্যবহার করতে চান, যদি না আমি স্পষ্টভাবে একটি নির্দিষ্ট মোড-মানচিত্রের জন্য সেগুলি ওভাররাইড করি", এবং ধরে নিই যে আপনি স্কটফ্রেজিয়ার ব্যবহার করছেন , আপনি চান:

(defun locally-override (key cmd)
  (unless (local-variable-p 'my-keys-minor-mode-map)
    (set (make-variable-buffer-local 'my-keys-minor-mode-map)
         (make-sparse-keymap))
    (set-keymap-parent my-keys-minor-mode-map 
                       (default-value 'my-keys-minor-mode-map)))
  (define-key my-keys-minor-mode-map key cmd))

তাই

(locally-override "\C-i" nil)

"buff সিআই" বাইন্ডিংটি কেবলমাত্র বর্তমান বাফারে গৌণ মোড থেকে অপসারণ করা উচিত। সতর্কতা: এটি সম্পূর্ণরূপে অনির্ধারিত, তবে সঠিক পদ্ধতির মতো বলে মনে হচ্ছে। মাই-কি-মাইনর-মোড-ম্যাপের গ্লোবাল মানটি কপি করার পরিবর্তে পিতামাতাকে নির্ধারণের বিষয়টিটি তাই বিশ্বব্যাপী মানটিতে পরবর্তী কোনও পরিবর্তনগুলি স্থানীয় মানটিতে স্বয়ংক্রিয়ভাবে প্রতিফলিত হয়।


2

আমি মনে করি না আপনি পারবেন। এটি মোটামুটি এই বলার সমতুল্য যে আপনি একটি বিশ্বব্যাপী পরিবর্তনশীল সংজ্ঞায়িত করতে চান যা ফাংশনগুলিতে স্থানীয় ভেরিয়েবল ঘোষণার দ্বারা আড়াল করা যায় না। ব্যাপ্তি ঠিক সেভাবে কাজ করে না।

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


স্কোপিংয়ের এই ধারণাটি প্রযুক্তিগতভাবে সঠিক তবে overriding-local-mapএটি অন্য সমস্ত মানচিত্রকে ওভাররাইড করার জন্য বিশেষভাবে তৈরি করা হয়েছে। তবে এটি ব্যবহার করা বিপজ্জনক।
ইভেন্ট_জেআর

2

আপনি যদি সত্যিই এটি নিজে করতে না চান তবে আপনার চারপাশে যাচাই করা উচিত এবং অন্য কেউ ইতিমধ্যে এটি করেছেন কিনা তা দেখতে হবে।

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


4
আপনি যে প্যাকেজটির কথা ভাবছেন তা সম্ভবত cua-mode
ড্র হয়েছে

4
হ্যাঁ, এটি প্যাকেজ।
জেস্পের ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.