所以我试图控制Emacs24.5在MacOS10.10.4上运行。
我有一个德国键盘,并决定保留alt -key作为Meta。由于我仍然需要将它用于一些基本字符,如[、\x和}(类似于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)在init文件中启用电子对模式时,它可以很好地处理()和“",但不适用于{}和‘’。
然后,通过使用以下代码交换密钥,我尝试了一个不同的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键访问的),但它根本不起作用。
自动空气包装的结果也是一样的。
拜托,有人吗?非常感谢!
发布于 2015-08-20 17:00:14
electric-pair-mode的工作方式是安装一个名为electric-pair-post-self-insert-function的回调函数(“钩子”)。顾名思义,Emacs在函数self-insert-command运行后调用这个钩子--这是在您键入一个键之后。
这就是您的问题所在:调用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设置为在调用self-insert-command之前“伪造”键笔画。
要使大括号和引号起作用,您必须做两件事:首先,将相应的(global-set-key ...)定义添加到.emacs文件中,类似于上面的定义。然后,通过在electric-pair-mode文件中添加以下行,让.emacs知道您希望它处理引号和曲线:
(setq electric-pair-pairs '((?\' . ?\') (?\" . ?\") (?\{ . ?\}))) – https://stackoverflow.com/questions/32106180
复制相似问题