Привязка 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не определяется как команда. Вы загрузили файл, определяющий эту функцию? И есть ли в определении этой функцииinteractivespec (так что это на самом деле команда)?

И эта попытка также предполагает, что вы не загрузили файл, определяющий функцию:

(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

(Другая возможность заключается в том, что вы загрузили файл, в котором есть команда с почти таким же именем, и вы неправильно написали имя команды.)

Другие вопросы по тегам