关于macos:使用德语键盘布局的某些字符未检测到电子对模式

Electric-pair-mode not detected for some characters with German keyboard layout

因此,我试图掌握在Mac Os 10.10.4上运行的Emacs 24.5。
我有一个德语键盘,并决定将alt-键保留为Meta。 由于我仍然必须将其用于某些基本字符,例如[,| | 和}(类似于alt-5,alt-6和alt-9),它决定采用此解决方案:

1
2
3
4
(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)在init文件中启用电对模式时,它与()和""可以很好地工作,但与[],{}和''则不能。
然后,通过使用以下代码交换密钥,我尝试了另一种方法:

1
2
3
4
5
6
(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键访问),但是它根本不起作用。 自动配对包的结果相同,顺便说一句。

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


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

这就是您的问题:调用insert与键入键不同。 它不会调用self-insert-command,因此,上述钩子函数永远不会被调用。 更糟糕的是,您不能简单地以编程方式调用self-insert-command,因为与insert不同,它不需要字符参数即可插入。 您必须略过一圈,但是您可以尝试以下操作:

1
2
3
4
5
6
7
8
(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)))

在这里,我们在调用self-insert-command之前在本地将特殊变量last-command-event设置为"伪造"击键。

为了使花括号和引号生效,您必须做两件事:首先,将各自的(global-set-key ...)定义添加到您的.emacs文件中,类似于上面的定义。 然后通过将以下行添加到.emacs文件中,让electric-pair-mode知道您希望用引号和curl来处理它:

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