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

Вопрос:

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

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

(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 "") . "a"))
      :global 1
)

Когда я совершил нападки "1" на цифровой клавиатуре после вызова моего пользовательского незначительного режима, "цифрового режима" и проверки, что это идет в мини-буфере, я получаю ошибку is undefined. То, что я хочу произойти, a распечатывается, где указатель - когда я совершил нападки . (просто тест)

Контекст:

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

По умолчанию ключи на моей цифровой клавиатуре не определены. Я использую кому: определить привязки клавиш для ключей цифровой клавиатуры.

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

Спасибо за любую справку!

11
задан Gilles 'SO- stop being evil' 18 September 2012 в 12:31
поделиться

3 ответа

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

Строка проблемы:

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

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

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

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

define-minor-mode макрос позволяет вам относительно легко создавать второстепенные режимы (насколько это возможно в 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
)

Альтернативный способ, если вы хотите использовать переменную для раскладки клавиатуры, чтобы определить переменную раскладки клавиатуры и раскладку перед объявлением второстепенного режима примерно так:

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

А затем, в определении второстепенного режима, просто укажите имя переменной для вашей раскладки клавиатуры вместо 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

Как все это работает

Сверху вниз, сразу после define-minor-mode мы определяем имя команды для переключения второстепенного режима. custom-mode в этом случае ( M-x custom-mode для переключения режима). Это также определяет переменную с тем же именем.

Сразу после имени команды мы перечисляем строку документации для второстепенного режима в кавычках. Это может быть сколько угодно долго.

Далее у нас есть несколько вариантов. Самый простой выбор - просто перечислить три вещи, а затем любые дополнительные параметры. Эти три вещи должны быть перечислены в указанном ниже порядке. Вот эти три вещи:

  1. Значение инициализации для переменной второстепенного режима. nil по умолчанию режим отключен. Что-то кроме nil будет включать его по умолчанию.

  2. Зажигалка. Зажигалка - это просто то, что отображается в строке режима внизу, когда ваш второстепенный режим включен. Он должен быть коротким, и часто помогает с точки зрения форматирования начинать его с пробела.

  3. Раскладка клавиатуры. Раскладку клавиатуры можно определить как переменную или список (список ассоциаций).Поскольку использование списка alist проще и короче, я использовал его в примере. Список должен иметь вид (последовательность ключей. Определение) .

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

Раскладка не будет работать с макросами kbd, если вы не принудительно оцените макросы kbd с помощью комбинации обратной кавычки и запятой. Примерно так:

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

Наконец, вы можете добавить дополнительные параметры, используя аргументы ключевого слова в форме : blah . В примере я использовал : global . Мы могли бы определить весь режим с помощью keyword-args, но это короче, чтобы просто перечислить значение инициализации, светлее и раскладку клавиатуры в правильном порядке.

20
ответ дан 3 December 2019 в 04:12
поделиться

Вам нужно иметь такой код в определении минорного режима:

(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 для справки.

3
ответ дан 3 December 2019 в 04:12
поделиться

Взгляните на это (только для информации о привязках клавиш):

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

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

2
ответ дан 3 December 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: