未检测到某些具有德语键盘布局的字符的电对模式
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)它决定采用此解决方案:
(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)
启用电对模式时,它与 ( ) 和 " " 一起工作正常,但与 [ ]、{ } 和 ' ' 一起工作。
然后我通过使用此代码交换密钥尝试了不同的方法:
(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
不同,它不需要参数来插入字符。你必须跳过一些障碍,但你可以尝试以下方法:
(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
本地设置为"fake"一个击键
要使花括号和引号起作用,您必须做两件事:首先,将相应的 (global-set-key ...)
定义添加到您的 .emacs 文件中,类似于上面的那些。然后让 electric-pair-mode
知道您希望通过将以下行添加到您的 .emacs 文件来处理引号和卷曲:
(setq electric-pair-pairs '((?\' . ?\') (?\" . ?\") (?\{ . ?\}))) –
所以我试图在 Mac Os 10.10.4.
上掌握 Emacs 24.5 运行
我有一个德语键盘,并决定将 alt 键保留为 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)
启用电对模式时,它与 ( ) 和 " " 一起工作正常,但与 [ ]、{ } 和 ' ' 一起工作。
然后我通过使用此代码交换密钥尝试了不同的方法:
(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
不同,它不需要参数来插入字符。你必须跳过一些障碍,但你可以尝试以下方法:
(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
本地设置为"fake"一个击键
要使花括号和引号起作用,您必须做两件事:首先,将相应的 (global-set-key ...)
定义添加到您的 .emacs 文件中,类似于上面的那些。然后让 electric-pair-mode
知道您希望通过将以下行添加到您的 .emacs 文件来处理引号和卷曲:
(setq electric-pair-pairs '((?\' . ?\') (?\" . ?\") (?\{ . ?\}))) –