কী কী ম্যাপে কী কী আবদ্ধ তা আমি কীভাবে জানতে পারি?


63

আমি একটি 'ডি' কীটি রিবাউন্ড করেছি gnus-article-mode, তবে পয়েন্টটি কোনও সংযুক্তিতে থাকলে তার পুরানো আচরণটি এখনও সক্রিয় থাকে। আমি দেখতে পাচ্ছি যে রিব্যান্ডিংটি সেখানে করার মাধ্যমে কার্যকর হয়নি C-h k d, তবে কী-ম্যাপটি সেই সময়ে কার্যকর তা আমাকে বলছে না, যাতে আমি এটি পুনরায় ফিরিয়ে দিতে পারি।

এটি খুঁজে বের করার কোনও উপায় আছে?

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

(evil-mode 1)
(add-to-list 'evil-motion-state-modes 'gnus-article-mode)
(setq evil-emacs-state-modes (remove 'gnus-article-mode evil-emacs-state-modes))
(define-key evil-motion-state-map "d" 'evil-previous-line)

দুষ্ট কীগুলি আমলে নেওয়া হয়েছে তা নিশ্চিত করার জন্য, আমি স্থানীয় মানচিত্রে জিনস কীটি আনসেট করেছি:

(defun as/alter-article-evil-map ()
  (local-unset-key "d"))
(add-hook 'gnus-article-mode-hook 'as/alter-article-evil-map)

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

ব্যবহৃত keymaps-at-pointনীচে থাকা কী-ম্যাপটি অনুসন্ধান করার জন্য নীচের সমাধানটি একটি পাঠ্য সম্পত্তি থেকে ছিল। আমি তখন কী-ম্যাপটির নাম খুঁজতে বাউন্ড ফাংশনের কোডটি দেখলাম gnus-mime-button-map। নিম্নলিখিত কোডটি আমি যা চাই তা করে:

(defun as/alter-article-evil-map ()
  (define-key gnus-mime-button-map "d" nil))
(add-hook 'gnus-article-mode-hook 'as/alter-article-evil-map)

3
এই সিউডো কোড লিস্প এবং বিবরণটি আপনার উচ্চ-স্তরের গাইড হিসাবে ইমাক্স কী কী দেখায় তা ব্যবহার করুন : এলিসপ ম্যানুয়াল, নোডSearching Keymaps । নোড Functions for Key Lookupএবং Active Keymaps
ড্র

দ্বিতীয় ফাংশনে আমার প্রাথমিক উত্তর সহ একটি দুর্দান্ত বিগ ছিল। আমি এখনই এটি ঠিক করেছি, সুতরাং এটি আপনার কী-বাইন্ডটি সনাক্ত করতে সক্ষম হবে। আপনি আবার চেষ্টা করতে পারেন?
মালবারবা

উত্তর:


61

ইমাস 25

মন্তব্যগুলিতে @ ইয়ংফ্রোগের উল্লেখ অনুসারে, ইমাস 25.1.1 দিয়ে শুরু করে , C-h kকী- বাইন্ডগুলি বর্ণনা করার ভাল-পুরাতন পদ্ধতিটি আপনাকে কী কী ম্যাপটি পাওয়া গেছে তা জানিয়ে দেবে।

ইমাস 25 এর আগে

এটিতে এখানে কিছু কোড রয়েছে তবে এটি অসম্পূর্ণ কারণ এটি সমস্ত কিছু আবরণ করে না। নীচে এটির একটি উন্নত সংস্করণ রয়েছে।

কীগুলি 9 (!) উপায়ে আবদ্ধ হতে পারে। জন্য ধন্যবাদ @Drew করতে এই লিঙ্কে (এছাড়াও দ্বারা supplemented এই ) সম্পূর্ণ তালিকা সঙ্গে। অগ্রাধিকারের আদেশ অনুসারে তারা হলেন:

  1. কীগুলির একটি টার্মিনাল-নির্দিষ্ট সেট overriding-terminal-local-map,। এটি set-transient-mapফাংশন দ্বারা সংজ্ঞায়িত করা হয় ।
  2. একটি বাফার-লোকাল ওভাররাইড মানচিত্র overriding-local-map,। যদি এটি সেট করা থাকে তবে আইটেমগুলি 3-8 এড়িয়ে যায় (সম্ভবত আপনি কেন এগুলি দেখতে পান না)।
  3. keymapপাঠ্য-প্রপটির মাধ্যমে বিন্দুতে (যা প্রকৃত পাঠ্যে বা ওভারলেতে যেতে পারে)।
  4. একটি ভেরিয়েবল যা সক্ষমভাবে ন্যূনতম মোডগুলির বিভিন্ন সম্ভাব্য সেটগুলি সিমুলেট করে emulation-mode-map-alists
  5. একটি পরিবর্তনশীল, যেখানে প্রধান-মোড ছোটখাট-মোড keybinds ওভাররাইড করতে পারে minor-mode-overriding-map-alist
  6. প্রকৃত ছোটখাটো মোডস, যার কীবাইন্ডগুলি এতে সঞ্চিত minor-mode-map-alist
  7. বিন্দুতে (আবার), local-mapপাঠ্য সম্পত্তিটির মাধ্যমে । এটি উপস্থিত থাকলে 8 আইটেম এড়িয়ে যায়।
  8. স্ট্যান্ডার্ড বাফার-লোকাল কীম্যাপ (যেখানে মেজর-মোড বা বাফার-লোকাল কীবাইন্ডগুলি যায়), ফাংশন দিয়ে ফিরে আসে current-local-map
  9. বিশ্বব্যাপী কীম্যাপ , দ্বারা ফিরে current-global-map

একটি আধা-আইটেমও রয়েছে 10. উপরোক্ত পদ্ধতির মাধ্যমে যা কিছু আদেশ পাওয়া গেছে তাও পুনরায় করা যেতে পারে।

নিম্নলিখিত ফাংশন জিজ্ঞাস্য কিছু এই সম্ভাবনার (সম্ভবত বেশী), এবং আয় বা কপি করে প্রিন্ট ফলাফল।

(defun locate-key-binding (key)
  "Determine in which keymap KEY is defined."
  (interactive "kPress key: ")
  (let ((ret
         (list
          (key-binding-at-point key)
          (minor-mode-key-binding key)
          (local-key-binding key)
          (global-key-binding key))))
    (when (called-interactively-p 'any)
      (message "At Point: %s\nMinor-mode: %s\nLocal: %s\nGlobal: %s"
               (or (nth 0 ret) "") 
               (or (mapconcat (lambda (x) (format "%s: %s" (car x) (cdr x)))
                              (nth 1 ret) "\n             ")
                   "")
               (or (nth 2 ret) "")
               (or (nth 3 ret) "")))
    ret))

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

(defun key-binding-at-point (key)
  (mapcar (lambda (keymap) (when (keymapp keymap)
                             (lookup-key keymap key)))
          (list
           ;; More likely
           (get-text-property (point) 'keymap)
           (mapcar (lambda (overlay)
                     (overlay-get overlay 'keymap))
                   (overlays-at (point)))
           ;; Less likely
           (get-text-property (point) 'local-map)
           (mapcar (lambda (overlay)
                     (overlay-get overlay 'local-map))
                   (overlays-at (point))))))

যেহেতু আপনি বলছেন যে আচরণটি সক্রিয় রয়েছে যখন পয়েন্টটি কোনও সংযুক্তিতে থাকে, তাই কী-বাইন্ডটি কোনও ওভারলে বা পাঠ্য-সম্পত্তির উপর জায়গা করে নেওয়ার ভাল সুযোগ রয়েছে।

যদি এটি কাজ না করে তবে নীচের কমান্ডটিও চেষ্টা করে দেখুন। সংযুক্তিতে কেবল কার্সারটি রাখুন এবং করুন M-x keymaps-at-point

(defun keymaps-at-point ()
  "List entire keymaps present at point."
  (interactive)
  (let ((map-list
         (list
          (mapcar (lambda (overlay)
                    (overlay-get overlay 'keymap))
                  (overlays-at (point)))
          (mapcar (lambda (overlay)
                    (overlay-get overlay 'local-map))
                  (overlays-at (point)))
          (get-text-property (point) 'keymap)
          (get-text-property (point) 'local-map))))
    (apply #'message
           (concat 
            "Overlay keymap: %s\n"
            "Overlay local-map: %s\n"
            "Text-property keymap: %s\n"
            "Text-property local-map: %s")
           map-list)))

এটি আমাকে বলবে যে কীটির স্থানীয় বাঁধাই রয়েছে এবং এটি কোন আদেশের সাথে আবদ্ধ, কিন্তু এটি এখনও কী-ম্যাপটি এসেছে তা আমাকে জানায় না ।
নিসপিও

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

1
@ মালবারবা আপনার অর্থ কি "দুর্ভাগ্যক্রমে, দু'টি কেস আলাদা করার কোনও সহজ উপায় নেই ?" অবশ্যই তথ্য উপস্থিত আছে। এছাড়াও, প্রতিটি বড় মোডে ঠিক এক মোডের মানচিত্র থাকে? যদি তা না হয় তবে কোন প্রধান মোড মানচিত্রটি সক্রিয় রয়েছে তা বলার উপায় আছে?
নিসপিও

1
ইমাস 25 টি প্রকাশিত হতে এখনও শুরু করে, "সিএইচ কে" উইল, কিছুতে (ভাল, "বেশিরভাগ" আশাবাদী) ক্ষেত্রে আপনাকে কী কী ম্যাপে (আরও সুনির্দিষ্টভাবে: একটি চিহ্ন যা সেই কীম্যাপটিকে তার মান হিসাবে ধারণ করে) প্রদত্ত কী-বাইন্ডিংটি বলে সংজ্ঞায়িত। উদাহরণস্বরূপ আউটপুট:k runs the command gnus-summary-kill-same-subject-and-select (found in gnus-summary-mode-map), which is (...)
ইয়ংফ্রোগ

2
আগ্রহী যে কোনও ব্যক্তির জন্য, এখানে প্রাসঙ্গিক প্রতিশ্রুতিটি ইম্যাক্স 25+-এ মূল বাঁধার কিম্যাপটি প্রদর্শন করে।
कौशल মোদী

2

যে সম্পর্কে:

(defun my-lookup-key (key)
  "Search for KEY in all known keymaps."
  (mapatoms (lambda (ob) (when (and (boundp ob) (keymapp (symbol-value ob)))
                      (when (functionp (lookup-key (symbol-value ob) key))
                        (message "%S" ob))))
            obarray))

উদাহরণস্বরূপ (my-lookup-key (kbd "C-c v v"))আমি *Message*বাফার তালিকা পেতে :

global-map
term-pager-break-map
widget-global-map

এই পদ্ধতিটি সাব-কীম্যাপ অনুসন্ধানের জন্য দরকারী যা উচ্চ স্তরের কীম্যাপে অন্তর্ভুক্ত রয়েছে, উদাহরণস্বরূপ আউটপুট থেকে:

(my-lookup-key (kbd "d"))

এর মধ্যে vc-prefix-mapঅন্তর্ভুক্ত রয়েছে global-map:

(eq (lookup-key global-map (kbd "C-x v")) 'vc-prefix-map)

আপনি যদি অন্তর্ভুক্ত করতে ফিল্টারিং শর্তটি পরিবর্তন করেন keymapp- আপনি উপসর্গগুলির জন্য সর্বদা অনুসন্ধান করতে সক্ষম হবেন:

(defun my-lookup-key-prefix (key)
  "Search for KEY as prefix in all known keymaps."
  (mapatoms (lambda (ob) (when (and (boundp ob) (keymapp (symbol-value ob)))
                      (when (let ((m (lookup-key (symbol-value ob) key)))
                              (and m (or (symbolp m) (keymapp m))))
                        (message "%S" ob))))
            obarray))

সুতরাং rst-mode-mapউভয় পাওয়া যাবে:

(my-lookup-key-prefix (kbd "C-c C-t"))
(my-lookup-key-prefix (kbd "C-c C-t C-t"))

1

আমি সচেতন যে নিম্নলিখিত প্রশ্নের উত্তর নেই আছি আমি কিভাবে যা কীম্যাপ খুঁজে বের করতে পারেন , তবে এটি কিভাবে তা নিশ্চিত করার জন্য এই ক্ষেত্রে মূলগত ইস্যু সঙ্গে পুলিশ dকী কি ব্যবহারকারী চায় অনুযায়ী আচরণ করে। যদি পছন্দসই হয় তবে আমি এই উত্তরটি সরাতে এবং সেই সমস্যাটি সম্পর্কিত অন্য প্রশ্ন + উত্তরে রূপান্তর করতে পারি।

text-property/overlayমানচিত্রটি ওভাররাইড করার একটি পদ্ধতি হিসাবে আপনার ব্যবহারের পক্ষে সক্ষম হওয়া উচিত:

(let ((map (make-sparse-keymap)))
  (define-key map "d" 'evil-previous-line)
  (setq overriding-local-map map))

অ্যাক্টিভ মানচিত্র নিয়ন্ত্রণ হিসাবে , overriding-local-mapঅন্যান্য অন্যান্য সক্রিয় মানচিত্রের চেয়ে অগ্রাধিকার নেয় overriding-terminal-local-map


এটি সবকিছু ভেঙে দেয়: আমি আর সংক্ষিপ্ত মোডে কোনও বার্তা খুলতে পারি না, এবং দুষ্ট এবং আইসিকলগুলি কাজ করা বন্ধ করে দেয়।
ব্র্যাব

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

0

ইমাসস-বোতামগুলি সরবরাহ করে buttons-display, যা বর্তমানের বাইন্ডিংগুলির পূর্বনির্ধারিত আর্গুমেন্টের পুনরাবৃত্তিয় ভিজ্যুয়ালাইজেশন প্রদর্শন করে।

(অস্বীকৃতি: আমি প্যাকেজের লেখক)

https://github.com/erjoalgo/emacs-buttons/blob/master/doc/img/sample-visualization.png

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