Определить клавиши Control + Shift без kbd

11

Я пытаюсь добавить некоторые функциональные возможности в чужой пакет, и поэтому я хотел бы уважать их шаблоны. К сожалению, один из этих шаблонов не использовать kbd.

Мне нужно привязать функцию C-S-b, но я не могу понять, как это сделать. Я знаю, как сделать это с одним модификатором (например "\S-b"), но я не могу заставить его работать с несколькими модификаторами. Я знаю, что могу просто оценить (kbd "C-S-b")и использовать его выходные данные ( [33554434]), но мне хотелось бы, чтобы что-то было легче читать.

Вот несколько вещей, которые я пробовал:

(define-key emacs-lisp-mode-map
  "\C-\S-b" 'test-command)
;;; Invalid modifier

(define-key emacs-lisp-mode-map
  [C-S-b] 'test-command)
;;; Does nothing

(define-key emacs-lisp-mode-map
  "\C-B" 'test-command)
;;; Binds C-b
Malabarba
источник

Ответы:

15

Вам не хватает ?обратной косой черты a и двух в векторном представлении:

(global-set-key [?\C-\S-b] 'test-command)

Раздел о ключевых последовательностях в руководстве Elisp гласит:

Последовательности клавиш, содержащие функциональные клавиши, события кнопок мыши, системные события или символы не ASCII, такие как C-=или H-aне могут быть представлены в виде строк; они должны быть представлены как векторы.

В векторном представлении каждый элемент вектора представляет входное событие в форме Lisp . Например, вектор [?\C-x ?l]представляет последовательность клавиш C-x l.

А под битами модификаторов других персонажей написано:

Синтаксис Lisp для бита сдвига \S-: таким образом, ?\C-\S-oили ?\C-\S-Oпредставляет символ сдвига-контроля-о.

itsjeyd
источник
1
Я пытался понять, что означают знаки вопроса. Благодаря вашему ответу я нашел следующие: Синтаксис Ctl-Char? \ C- и Синтаксис Meta-Char? \ M-
Kaushal Modi
И да, на вопрос Малабарбы дан ответ на этой странице о других битах модификаторов .
Каушал Моди
@kaushalmodi Спасибо за ссылки! Они очень полезны для более глубокого понимания происходящего.
itjeyd