Как создать связки ключей для пользовательского незначительного режима в Emacs

StackOverflow https://stackoverflow.com/questions/3115104

Вопрос

Вопрос:

Как создать пользовательские килограммы для небольших режимов? Что-то вроде этого.

Вот что у меня есть до сих пор. Я пытаюсь получить только одну пользовательскую связующую клавиши:

(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 Pad после вызова моего пользовательского незначительного режима, «Num-Mode» и проверяю его в мини-буфере, я получаю ошибку <kp-1> is undefined. Анкет Я хочу случиться a распечатано, где указатель, когда я ударил <kp-1>. Анкет (просто тест)

Контекст:

Итак, я обычно использую свою номеру для перемещения между буферами (клавиши со стрелками двигают мне соответствующие направления). Это установлено во всем мире. Я хочу создать незначительный режим, который я могу позвонить, когда хочу использовать свой номерной пакет, чтобы просто ввести номера.

По умолчанию ключи на моем численном плане не определены. я использую <kp-0> к <kp-9> Определить ключи для ключей Numpad.

Я могу создать незначительный режим, который я могу позвонить, но я не могу прикрепить какие -либо связки клавиш. Это верно для всех связей с ключами, в том числе нигде, нигде не определяемого.

Спасибо за любую помощь!

Это было полезно?

Решение

Краткий ответ

Проблемная линия:

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

Решение (подчеркните оценку макроса):

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

Длинный ответ

То Определите-минор-режим Macro позволяет вам относительно легко создавать незначительные моды (насколько 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 ...       
)

Конкретный пример с принудительной оценкой макросов в алисте:

;; 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 и KeyMap до декларация незначительного режима примерно так:

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

И затем, в определении вашего незначительного режима, простой список имени переменной для вашего keymap вместо алиста

(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 можно определить как переменную, либо алист (список ассоциаций). С тех пор, как используется список Проще и короче, это то, что я использовал в примере. Алист должен быть в форме (key-sequence . definition).

Если вы определите Keymap как алист, есть несколько вещей, за которыми нужно следить, особенно если вы привыкли определять глобальные связки ключей. Во -первых, имена команд не цитируются. Во -вторых, если вы хотите использовать макрос, вы должны заставить его оценить (и на так). Анкет Это делается с помощью комбинации обратной кавычки (не отдельная цитата) и запятой. Вы можете увидеть, как это делается в примере с макросом KBD. Я также включил определение клавиши, если вы не используете макрос KBD. Если вы просто процитируете строку в своем KeyMap, это будет распечатать, когда нажата определенная комбинация клавиш (как для определения связей с глобальными клавишами).

KEYMAP не будет работать с KBD Macros, если вы не заставите оценку макросов KBD с комбинацией обратной цитаты и запятой. Как это:

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

Наконец, вы можете добавить дополнительные параметры с помощью ключевых слов-арг формы :blah. Анкет В примере, который я использовал :global. Анкет Мы могли бы определить весь режим с помощью ключевых слов, но это короче, чтобы просто перечислить значение init, Lighter и 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 для справки.

Посмотрите на это (просто для получения информации о связях с ключами):

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/reclaim_keybindings.html:

Хорошо написанные основные режимы будут работать в конце. Таким образом, вы можете использовать крючок, чтобы определить свое связывание клавиш. Незначительные режимы обычно не имеют крючков. В этом случае вы можете назвать «(требуется символ функции незначительного режима›) », а затем определить свое связывание клавиш.

Также вы можете взглянуть на:http://www.cs.utah.edu/dept/old/texinfo/emacs19/emacs_35.html#sec347

Может быть, принятый ответ здесь также помогает вам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top