Emacs 有些自定义快捷键不生效的问题

Vim、Emacs配置和使用
回复
闪电大虾
帖子: 3
注册时间: 2012-08-04 21:44

Emacs 有些自定义快捷键不生效的问题

#1

帖子 闪电大虾 » 2012-08-04 21:50

ctrl + m 这个快捷键貌似在emacs里面被等同于enter了,在.emacs里定义:
(global-set-key (kbd "C-m") 'next-line)
之后,没什么作用,ctrl+m依然是换行

类似的,ctrl + [ 被等同于ESC了

而且在C-h b 的 binding表里找不到这两组键的绑定,难道被隐式映射了?

我现在想用ctrl + m 和 ctrl + [ 来做快捷键,有啥办法不?
坐等高人.....

:em06
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: Emacs 有些自定义快捷键不生效的问题

#2

帖子 kardinal » 2012-08-04 23:06

[lisp]
(if window-system
(progn
(mapc
(lambda(x)(define-key input-decode-map (eval `(kbd ,(car x)))(cdr x)))
'(
("C-m" . [?\C-7]) ("C-7" . [?\C-m])
("C-i" . [?\C-8]) ("C-8" . [?\C-i])
("C-[" . [?\C-9]) ("C-9" . [?\C-\[])
; C-7 C-8 C-9 分别与 C-m C-i C-[ 互换
))
(def-k-s xxx-map
"C-7" xxx ; C-m
"C-8" yyy ; C-i
"C-9" zzz ; C-[
)
))
[/lisp]
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: Emacs 有些自定义快捷键不生效的问题

#3

帖子 kardinal » 2012-08-05 0:48

弄了个小函数
[lisp]
(defun bind-key (map &rest kd)
(let* ((k (lambda (l)
(if l (cons
(list (nth 0 l) `[,(random)] (nth 1 l))
(funcall k (nthcdr 2 l))))))
(l (funcall k kd))
(m (or map (current-global-map))))
(mapc
(lambda(x)
(define-key input-decode-map (eval `(kbd ,(nth 0 x)))(nth 1 x))
(define-key m (nth 1 x) (nth 2 x)))
l)))

(bind-key ()
"C-m" 'eshell
"C-i" 'undo-tree-visualize
"C-[" 'magit-status)
[lisp]
闪电大虾
帖子: 3
注册时间: 2012-08-04 21:44

Re: Emacs 有些自定义快捷键不生效的问题

#4

帖子 闪电大虾 » 2012-08-05 21:16

kardinal 写了:弄了个小函数
[lisp]
(defun bind-key (map &rest kd)
(let* ((k (lambda (l)
(if l (cons
(list (nth 0 l) `[,(random)] (nth 1 l))
(funcall k (nthcdr 2 l))))))
(l (funcall k kd))
(m (or map (current-global-map))))
(mapc
(lambda(x)
(define-key input-decode-map (eval `(kbd ,(nth 0 x)))(nth 1 x))
(define-key m (nth 1 x) (nth 2 x)))
l)))

(bind-key ()
"C-m" 'eshell
"C-i" 'undo-tree-visualize
"C-[" 'magit-status)
[lisp]
成功解决 C-i C-[ C-] 的绑定了~~~谢谢kardinal的帮助!! ^_^
闪电大虾
帖子: 3
注册时间: 2012-08-04 21:44

Re: Emacs 有些自定义快捷键不生效的问题

#5

帖子 闪电大虾 » 2012-08-05 21:24

kardinal 写了:[lisp]
(if window-system
(progn
(mapc
(lambda(x)(define-key input-decode-map (eval `(kbd ,(car x)))(cdr x)))
'(
("C-m" . [?\C-7]) ("C-7" . [?\C-m])
("C-i" . [?\C-8]) ("C-8" . [?\C-i])
("C-[" . [?\C-9]) ("C-9" . [?\C-\[])
; C-7 C-8 C-9 分别与 C-m C-i C-[ 互换
))
(def-k-s xxx-map
"C-7" xxx ; C-m
"C-8" yyy ; C-i
"C-9" zzz ; C-[
)
))
[/lisp]

我在网上一些英文论坛里有看到别的解决方案的,用了keyboard-translate这个函数
(keyboard-translate ?\C-i ?\H-i)
(global-set-key [?\H-i] 'previous-line)
以上2行绑定C-i到 prev-line,类似的C-m的也可以解决了,但是 C-[不知道怎么写,这个key-trans函数参数的语法、、、
——不过3楼的方法是可以解决的 .

查了emacs的helper也只是对函数进行描述而已,没有说明参数的格式——难道是lisp语法?
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: Emacs 有些自定义快捷键不生效的问题

#6

帖子 kardinal » 2012-08-06 0:49

keyboard-translate 封装成函数
[lisp]
(defun def-keys-low (map &rest kd)
"bind some key like \"C-m\" \"C-i\" \"C-[\""
(if window-system
(let* ((k (lambda (l)
(if l (cons
(list (nth 0 l) (random) (nth 1 l))
(funcall k (nthcdr 2 l))))))
(l (funcall k kd))
(m (or map (current-global-map))))
(mapc
(lambda(x)
(keyboard-translate (nth 0 x) (nth 1 x))
(define-key m `[,(nth 1 x)] (nth 2 x)))
l))))
[/lisp]
这样调用,一次绑定多组
[lisp]
(def-keys-low
() ;; nil => 第一个参数表示 keymap,nil 时为 global map
;; 剩下的两个一组
?\C-m 'eshell
?\C-i 'undo-tree-visualize
?\C-\[ 'magit-status)
[/lisp]
不过字符界面下无效
回复