Привязка helm-toggle-visible-mark-forward к ключу в helm-map
Настроить
У меня есть следующие ключевые привязки команд Helm:
(define-key helm-map (kbd "C-a") #'helm-select-action)
(define-key helm-map (kbd "C-n") #'helm-next-page)
(define-key helm-map (kbd "C-p") #'helm-previous-page)
(define-key helm-map (kbd "TAB") #'helm-next-line)
(define-key helm-map (kbd "<backtab>") #'helm-previous-line)
(define-key helm-map (kbd "C-TAB") #'helm-toggle-visible-mark-forward)
Проблема
Все это работает, кроме последней строки, helm-toggle-visible-mark-forward
. Когда я нажимаю C-TAB в окне завершения Helm, я получаю сообщение об ошибке:<C-tab> is undefined
.
Что я пробовал
С помощью \t
(define-key helm-map (kbd "C-\t") #'helm-toggle-visible-mark-forward)
- результат тот же, <C-tab> is undefined
С помощью <C-tab>
(define-key helm-map (kbd "<C-tab>") #'helm-toggle-visible-mark-forward)
- wrong type argument, commandp
Удаление #
(define-key helm-map (kbd "C-TAB") 'helm-toggle-visible-mark-forward)
- результат тот же, <C-tab> is undefined
С помощью M-TAB
(define-key helm-map (kbd "M-TAB") #'helm-toggle-visible-mark-forward)
- wrong type argument, commandp
Использование лямбды
(define-key helm-map (kbd "M-TAB") (lambda () (interactive) (helm-toggle-visible-mark-forward)))
- symbol's function definition is void: helm-toggle-visible-mark-forward
Вопрос
Можно ли перепинтить helm-toggle-visible-mark-forward
? Если да, то что я делаю не так?
2 ответа
helm-toggle-visible-mark-forward
а также helm-toggle-visible-mark-backward
были добавлены в v3.6.1. Последняя версия (по состоянию на 2020-04-25) является v3.6.0. Следовательно, вам нужно будет установить из исходного кода, если вы хотите использовать эти функции. В противном случае они не будут определены.
В качестве обходного пути вы можете добавить их прямо в свои конфигурации перед привязкой клавиш, например:
;; Adding these functions here until they become available in the main source in version 3.6.1
(defun helm-toggle-visible-mark-forward ()
(interactive)
(helm-toggle-visible-mark 1))
(defun helm-toggle-visible-mark-backward ()
(interactive)
(helm-toggle-visible-mark -1))
(define-key helm-map (kbd "<C-tab>") #'helm-toggle-visible-mark-forward)
Используйте вместо этого:
(define-key helm-map (kbd "<C-tab>") #'helm-toggle-visible-mark-forward)
Передайте форму, которую справка Emacs возвращает для последовательности клавиш, которую вы нажимаете для kbd
. C-h k
с последующим Control
с Tab
говорит тебе:
<C-tab>
запускает команду...
См. Руководство Elisp, узел Функциональные клавиши, в котором говорится следующее:
backspace
,tab
,newline
,return
,delete
Эти клавиши соответствуют обычным управляющим символам ASCII, которые имеют специальные клавиши на большинстве клавиатур.
В ASCII,
C-i
а также<TAB>
один и тот же персонаж. Если терминал может различать их, Emacs передает различие программам на Лиспе, представляя первое как целое число 9, а второе как символtab
.В большинстве случаев различать их нецелесообразно. Так обычно
local-function-key-map
(* обратите внимание: Translation Keymaps::) настроен на картуtab
в 9. Таким образом, привязка клавиш для кода символа 9 (символC-i
) также относится кtab
. То же самое и с другими символами в этой группе. Функцияread-char
аналогично превращает эти события в персонажей.
Но вы говорите, что уже пробовали
(define-key helm-map (kbd "<C-tab>") #'helm-toggle-visible-mark-forward)
и Emacs сказал вам это - и он сказал вам то же самое, когда вы попытались привязать его к M-TAB
(что то же самое, что и C-M-i
):
-- wrong type argument, commandp
Что означает, что helm-toggle-visible-mark-forward
не определяется как команда. Вы загрузили файл, определяющий эту функцию? И есть ли в определении этой функцииinteractive
spec (так что это на самом деле команда)?
И эта попытка также предполагает, что вы не загрузили файл, определяющий функцию:
(define-key helm-map (kbd "M-TAB") (lambda () (interactive) (helm-toggle-visible-mark-forward)))
-- symbol's function definition is void: helm-toggle-visible-mark-forward
(Другая возможность заключается в том, что вы загрузили файл, в котором есть команда с почти таким же именем, и вы неправильно написали имя команды.)