2013-10-11 3 views
2

Я бы хотел определить пользовательский режим для улучшений, которые подходят для любого программного режима. И мне нужно определить привязки клавиш для всех этих режимов. Я хочу использовать define-minor-mode с :keymap, чтобы объявить привязки клавиш с минимальными усилиями.Как правильно определить карту клавиатуры для второстепенного режима

Я хочу связать comment-or-uncomment-region с "C-;" Макрос kbd дал мне [67108923] магическое число для этой последовательности клавиш.

Я написал образец, который не работает

(define-minor-mode 
    my-mode 
    nil nil 
:keymap '(
    ([67108923] . comment-or-uncomment-region) 
) 
) 

Я режим регистрации переключены его, но нажатие С-; производит уведомления о том, что последовательность клавиш не определен

После этого я 'написал в буфере нуля и оценил простой global-set-key, который выполнялся ожидаемым образом.

(global-set-key [67108923] 'comment-or-uncomment-region) 

C-; Теперь нажатие производит ожидается comment-or-oncomment-region поведение.

Я попытался отладить проблему с помощью поиска информации о функции через C-h f. Он производит странный вывод, comment-or-oncomment-region связан дважды к различным ключевым последовательностям:

It is bound to C - ;, C-; 

Сначала один появляется и исчезает с минорным режимом переключени, другие возникают из global-set-key вызова.

Как это может быть, если я использовал одно и то же определение ключа для обеих карт? Какие подробности я пропустил?

ответ

3
  1. Просто создайте раскладку обычно, используя make-sparse-keymap, и назовите его my-mode-map --- вы сделали. Нет необходимости в :keymap arg до define-minor-mode.

  2. Или используйте карту памяти, которую вы создаете, используя make-sparse-keymap как значение :keymap, если хотите. (Но не нужно, поскольку он назван в качестве второстепенного режима: my-mode-map.)

  3. Но почему бы просто не использовать глобальную привязку, используя global-set-key? Почему вам даже нужно, чтобы это было привязкой к второстепенному режиму?

+0

make-sparse-keymap работал отлично, но я до сих пор не понимаю, что не так с оригинальным подходом, основанным на http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Minor -Modes.html – ayvango

+0

ayvango: ваш код работает в Emacs 24.3. Я подозреваю, что ваша проблема в том, что вы сначала ошибались, после чего была определена «my-mode-map».Любые последующие оценки не могли бы заглушить существующую карту; вам нужно было бы сначала отвязать «my-mode-map». – phils

3

Не используйте магическое число. IOW использует [?\C-\;], поэтому его могут понять люди. И я согласен с Дрю:

(defvar my-mode-map 
    (let ((map (make-sparse-keymap))) 
    (define-key map [?\C-\;] 'comment-or-uncomment-region) 
    map)) 

(define-minor-mode my-mode 
    "blabla" 
    nil nil nil 
    <add code, if any>) 

Да, и еще одна вещь: почему вы бы предпочли C-; по сравнению со стандартной M-; связывания?

 Смежные вопросы

  • Нет связанных вопросов^_^