德语键盘布局的某些字符未检测到电子对模式

时间:2015-08-19 21:46:18

标签: macos emacs autocomplete keyboard

所以我试图抓住在Mac Os 10.10.4上运行的Emacs 24.5 我有一个德国键盘,并决定将alt-key保留为Meta。因为我仍然需要将它用于某些基本字符,例如[,|和}(类似于alt-5,alt-6和alt-9)它决定采用这种解决方案:

(global-set-key "\M-5" (lambda () (interactive) (insert “[“)))
(global-set-key "\M-6" (lambda () (interactive) (insert “]”)))
(global-set-key "\M-7" (lambda () (interactive) (insert “|”)))
...

当我在带有(electric-pair-mode 1)的初始文件中启用电子对模式时,它可以正常使用()和“”,但不适用于[],{}和''。登记/> 然后,我使用此代码交换密钥尝试了另一个appraoch:

(defun redefine-key (key char)
  (define-key function-key-map key char)
  (global-unset-key key))
(redefine-key "\M-5" "[")
(redefine-key "\M-6" "]")
...

有趣的是,对特征现在适用于方括号[],但不适用于卷曲的{}。虽然德国键盘上的'键甚至与alt键无关(它可以通过shift键访问),但它根本不起作用。
与autopair包相同的结果,顺便说一句。

拜托,有人吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

electric-pair-mode的工作方式是安装一个名为electric-pair-post-self-insert-function的回调函数(" hook")。顾名思义,这个钩子在函数self-insert-command运行后由Emacs调用 - 这是在你键入一个键之后。

这就是你的问题:调用insert与键入密钥不同。它不会调用self-insert-command,因此,上面的钩子函数永远不会被调用。更糟糕的是,您不能简单地以编程方式调用self-insert-command,因为与insert不同,它不会为要插入的字符采用参数。你必须跳过一些箍,但你可以尝试以下方法:

(global-set-key "\M-5" (lambda (&optional N) (interactive "P") (insert-as-self ?\[ N)))
(global-set-key "\M-6" (lambda (&optional N) (interactive "P") (insert-as-self ?\] N)))
(global-set-key "\M-7" (lambda (&optional N) (interactive "P") (insert-as-self ?\| N)))

(defun insert-as-self (CHAR N)
  (let ((last-command-event CHAR)
        (repeat (if N N 1)))
    (self-insert-command repeat)))

在这里,我们在本地将特殊变量last-command-event设置为" fake"在致电self-insert-command之前一键击中。

要使大括号和引号起作用,您必须做两件事:首先,将相应的(global-set-key ...)定义添加到.emacs文件中,类似于上面的定义。然后让electric-pair-mode知道您希望通过在.emacs文件中添加以下行来处理引号和curlies:

(setq electric-pair-pairs '((?\' . ?\') (?\" . ?\") (?\{ . ?\}))) –