1

设置

我有 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。当我在 Helm 完成窗口中点击 C-TAB 时,我收到错误消息,<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

使用 lambda

(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吗?如果是这样,我做错了什么?

4

2 回答 2

1

改用这个:

(define-key helm-map (kbd "<C-tab>")     #'helm-toggle-visible-mark-forward)

将 Emacs 帮助为您按下的键序列返回的表单传递给kbd. C-h k跟着ControlwithTab告诉你:

<C-tab>运行命令...

请参阅 Elisp 手册 node Function Keys,其中说:

backspace, tab, newline, return,delete

这些键对应于在大多数键盘上具有特殊键的常见 ASCII 控制字符。

在 ASCII 中,C-i<TAB>是相同的字符。如果终端可以区分它们,Emacs 通过将前者表示为整数 9,将 后者表示为符号tab,将这种区别传达给 Lisp 程序。

大多数情况下,区分这两者是没有用的。所以通常local-function-key-map(*note 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规范(所以它实际上是一个命令)?

而这个尝试也表明你没有加载定义函数的文件:

(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

(另一种可能性是您加载的文件具有几乎相同名称的命令,并且您拼错了命令名称。)

于 2020-04-25T20:46:07.660 回答
0

helm-toggle-visible-mark-forward并在 v3.6.1helm-toggle-visible-mark-backward 中添加。最新版本(截至 2020 年 4 月 25 日)是 v3.6.0。因此,如果您想使用这些功能,则需要从源代码安装。否则,它们将是undefined

作为一种解决方法,您可以在键绑定之前将它们直接添加到配置中,如下所示:

  ;; 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)
于 2020-04-26T00:37:37.770 回答