- 终端?
- 用了 Evil?
不是终端, 是在windows下面用的, 没有用evil呢
php-mode确实比较神奇,我也碰到过按键丢失的问题,是自己defun自己define-key的一个按键。。。这个问题我忍了一年多直到现在不写php了……
试试(add-hook 'php-mode-hook '(lambda () (define-key ...)) t)
吧,注意最后一个t
声明把这个hook放在hook列表最后。再不行就只能手动对(define-key ...)
C-x C-e了。。
你的问题听起来有些怪,估计是你自己设置的问题,别人不太可能「猜」得出怎么回事,尽量自己先搞清楚如何重现。
M-x is undefined
说明 M-x
未绑定或者绑定到了 undefined
,下面两句分别对应这两种情况:
(global-unset-key "\M-x")
(define-key php-mode-map "\M-x" #'undefined)
我找到原因了,这是我的ac-php配置文件,里面 我绑定了一个跳转到函数定义处的键 C-] 和返回的键 C-t , 后来因为 C-t是上下行交换的快捷键,我就把返回绑定到了C-[ 上,然后就出现这个问题了。改回C-t 就好了,但我没想明白为什么会影响到M-x 。。。
确实是我设置的问题,上面是我找到的“原因”,但我并没想明白为什么会这样。。。
Emacs 有几个特殊的键:C-[ 等同于 ESC,C-i 等同于 TAB,更多见 Basic keys (GNU Emacs FAQ)
绑定 C-[ 为什么会影响 M-x 而不是 ESC,这里边的逻辑我也不太清楚,可能要深度扒一扒 Emacs 的黑历史。
不过这个问题其实也是有解的:
(when window-system
(define-key input-decode-map [?\C-\[] (kbd "<C-[>"))
(define-key php-mode-map (kbd "<C-[>") 'ac-php-location-stack-back))
参考:
可能是因为覆盖了 ESC-prefix
的缘故:M-x
即 ESC x
,如果你修改了 C-[
也就相当于 ESC
,然后 M-x
找不到定义了。比如,你修改了 C-h
后,C-h v
就没有原来的功能了:
(key-binding "\C-h")
=> help-command
(key-binding "\C-hv")
=> describe-variable
(global-set-key "\C-h" #'emacs-version)
=> emacs-version
(key-binding "\C-hv")
=> nil
我前面乌龙了,其实也会 ESC
,但是由于我启用了 evil
:
;; evil-maps.el
(define-key evil-insert-state-map [escape] 'evil-normal-state)
此时按 ESC
立即调用了evil-normal-state
函数,所以看起来不受影响。如果禁用 evil
,则按 ESC
加任何键都是 undefined 了。
之所以会有不同的表现,是因为默认情况下 ESC
(即 C-[
) 会被翻译成 <escape>
和 <meta>
,如果明确绑定 <escape>
它就跟 ESC
没有关联了:
;; (define-key php-mode-map (kbd "C-[") 'foo) ;; 同时影响三个键
;; (define-key php-mode-map (kbd "ESC") 'foo) ;; 同上
;; (define-key php-mode-map (kbd "<escape>") 'foo) ;; 只影响 ESC-x 键,C-[-x 和 M-x 正常