سؤال

سؤال:

كيف أقوم بإنشاء مفاتيح مخصصة لأوضاع بسيطة؟ شيء من هذا القبيل.

هذا ما لدي حتى الآن. أحاول الحصول على مفتاح واحد فقط للعمل:

(define-minor-mode num-mode
       "Toggle the Num pad keys.
     With no argument, this command toggles the mode.
     Non-null prefix argument turns on the mode.
     Null prefix argument turns off the mode.

     When Num mode is enabled, the num pad inserts the
     keys you see on the pad. This may over ried existing
     definitions, and is probably only usefule if you aref
     running Emacs through a terminal."
      ;; The initial value.
      nil
      ;; The indicator for the mode line.
      " NumPad"
      ;; The minor mode bindings.
      ;; This doesn't work right now!!!!
       '(((kbd "<kp-1>") . "a"))
      :global 1
)

عندما أضغط على "1" على لوحة NUM بعد استدعاء وضعي الثانوية المخصص ، "NUM-Mode" والتحقق منه في المخزن المؤقت المصغر ، أحصل على الخطأ <kp-1> is undefined. ما أريد أن يحدث هو a يطبع مكان المؤشر عندما ضربت <kp-1>. (مجرد اختبار)

سياق:

لذلك ، عادةً ما أستخدم لوحة NUM للتحرك بين المخازن المؤقتة (مفاتيح السهم تحركني إلى الاتجاهات المناسبة). تم تعيين هذا على مستوى العالم. أرغب في إنشاء وضع ثانوي يمكنني الاتصال به عندما أرغب في استخدام Num-Pad لإدخال الأرقام ببساطة.

بشكل افتراضي ، فإن المفاتيح الموجودة على num-pad غير محددة. أنا أستعمل <kp-0> إلى <kp-9> لتحديد المفاتيح لمفاتيح Numpad.

يمكنني إنشاء وضع ثانوي يمكنني الاتصال به ، لكن لا يمكنني إرفاق أي مفاتيح. هذا صحيح بالنسبة لجميع المشاركات ، بما في ذلك واحدة غير محددة في أي مكان آخر.

شكرا على اي مساعدة!

هل كانت مفيدة؟

المحلول

اجابة قصيرة

خط المشكلة:

'(((kbd "<kp-1>") . "a"))

الحل (فرض تقييم الماكرو):

;; Single quote changed to back-quote and added a comma
`((,(kbd "<kp-1>") . "a"))

اجابة طويلة

ال تعريف وضع minor يسمح لك الماكرو بإنشاء أوضاع بسيطة بسهولة نسبيًا (بقدر ما يذهب Emacs).

أولاً ، سأوضح كيف يتم ذلك ، ثم سأشرح كيف يعمل:

في الشكل العام:

(define-minor-mode NAME-mode
  "DOCUMENTATION"
  INIT-VALUE
  "LIGHTER"
  ;; keymap
  '(
    (KEY-SEQUENCE . DEFINITION)
    (KEY-SEQUENCE . DEFINITION)
    ... ETC ...
   )
  ;; other options
  :KEYWORD-ARG VALUE
  :KEYWORD-ARG VALUE
  ... ETC ...       
)

مثال محدد مع التقييم القسري لأجهزة الماكرو في Alist:

;; Custom Minor Mode
(define-minor-mode custom-mode
  "Doc description, yada yada yada."
  ;; The initial value - Set to 1 to enable by default
  nil
  ;; The indicator for the mode line.
  " CustomMode"
  ;; The minor mode keymap
  `(
    (,(kbd "C-c C-a") . some-command)
    (,(kbd "C-c C-b") . other-command)
    ("\C-c\C-c" . "This works too")
   )
   ;; Make mode global rather than buffer local
   :global 1
)

هناك طريقة بديلة ، إذا كنت ترغب في استخدام متغير للمفوضين هو تحديد متغير Keymap و Keymap قبل إعلان الوضع الصغير شيء من هذا القبيل:

(defvar custom-mode-keymap (make-keymap) "num-mode keymap.")
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command)

وبعد ذلك ، في تعريف الوضع البسيط الخاص بك ، سرد اسمًا بسيطًا للاسم المتغير لك KEYMAP ، بدلاً من Alist

(define-key custom-mode-keymap (kbd "C-c C-b") 'other-command)
;; Num pad enable
(define-minor-mode custom-mode
...

      ;; The minor mode bindings.
      custom-mode-keymap

كيف يعمل كل شيء

من الأعلى إلى الأسفل ، مباشرة بعد تحديد وضع العرض ، نحدد اسم أمر لتبديل الوضع البسيط. custom-mode في هذه الحالة (M-x custom-mode لتبديل الوضع). هذا يحدد أيضًا متغيرًا يحمل نفس الاسم.

مباشرة بعد اسم الأمر ، نسرد سلسلة التوثيق للوضع الثانوي في عروض الأسعار. هذا يمكن أن يكون إلى حد كبير طالما كنت تريد.

بعد ذلك لدينا عدة خيارات. أبسط خيار هو ببساطة سرد ثلاثة أشياء ثم أي خيارات إضافية. يجب أن يتم سرد الأشياء الثلاثة بالترتيب أدناه. هذه الأشياء الثلاثة هي:

  1. قيمة البدء لمتغير الوضع الثانوي. nil سوف يكون وضع إيقاف افتراضي. شيء آخر غير nil سوف يكون لها افتراضيا.

  2. أخف وزنا. أخف وزنا هو ببساطة ما يتم عرضه في خط الوضع في الأسفل عندما يكون وضعك الصغير قيد التشغيل. يجب أن يكون هذا قصيرًا ، وسيساعد في كثير من الأحيان ، من حيث التنسيق ، لبدءه بمساحة.

  3. Keymap. يمكن تعريف keymap إما على أنه متغير أو قائمة (قائمة ارتباط). منذ استخدام قائمة هو أبسط وأقصر ، هذا ما استخدمته في المثال. يجب أن يكون Alist في الشكل (key-sequence . definition).

إذا قمت بتعريف Keymap على أنه alist ، فهناك بعض الأشياء التي يجب الانتباه إليها ، خاصة إذا كنت معتادًا على تحديد مفاتيح عالمية. أولاً ، لم يتم نقل أسماء الأوامر. ثانياً ، إذا كنت تريد استخدام ماكرو ، عليك أن إجباره على التقييم (وعلى ذلك). يتم ذلك مع مزيج من الكلمة الخلفية (وليس اقتباس واحد) و fama. يمكنك أن ترى كيف يتم ذلك في المثال مع Macro KBD. قمت أيضًا بتضمين تعريف ضغط المفاتيح إذا لم تستخدم ماكرو KBD. إذا كنت ببساطة اقتبس من سلسلة في Keymap ، فسيتم طباعة ذلك عند الضغط على مجموعة المفاتيح المحددة (تمامًا مثل تحديد روابط المفاتيح العالمية).

لن يعمل Keymap مع وحدات الماكرو KBD إذا لم تجبر تقييم وحدات الماكرو KBD مع مزيج من الاقتباس الخلفي والفاصلة. مثله:

`((,(kbd "C-c C-a") . some-command))

أخيرًا ، يمكنك إضافة خيارات إضافية باستخدام args للكلمات الرئيسية للنموذج :blah. في المثال الذي استخدمته :global. كان بإمكاننا تحديد الوضع بأكمله باستخدام كلمات الكلمات الرئيسية ، ولكن من الأقصر فقط سرد قيمة init ، أخف وزنا ، و keymap بالترتيب الصحيح.

نصائح أخرى

يجب أن يكون لديك رمز مثل هذا في تعريف الوضع الثانوي الخاص بك:

(defvar your-mode-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map parent-mode-shared-map)
    (define-key map "\C-c\C-a" 'some-defun)
    (define-key map "\C-c\C-b" 'some-other-sexp)
    map)

(use-local-map your-mode-map)

يمكن أن تلقي نظرة على العديد من الأوضاع المتاحة في emacswiki كمرجع.

ألقِ نظرة على هذا (فقط للحصول على معلومات حول keybindings):

http://www.gnu.org/software/emacs/manual/html_node/emacs/key-bindings.html#key-bindings

http://www.gnu.org/software/emacs/manual/html_node/emacs/local-keymaps.html#local-keymaps

من http://xahlee.org/emacs/recailh_keybindings.html:

سيتم تشغيل أوضاع رئيسية مكتوبة بشكل جيد في النهاية. لذلك ، يمكنك استخدام خطاف لتعريف مفاتيحك. أوضاع بسيطة عادة لا تحتوي على خطافات. في هذه الحالة ، يمكنك استدعاء "(تتطلب‹ رمز ميزة الوضع الصغرى ›)" أولاً ، ثم تحديد مفاتيحك.

كما قد تلقي نظرة على:http://www.cs.utah.edu/dept/old/texinfo/emacs19/emacs_35.html#sec347

ربما الجواب المقبول هنا يساعدك أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top