所以我试图抓住在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包相同的结果,顺便说一句。
拜托,有人吗?非常感谢!
答案 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 '((?\' . ?\') (?\" . ?\") (?\{ . ?\}))) –