在php模式下,M-x 不能用

在别的模式下可以用的。 我记得之前在php模式下好像是能用的,跟我安装的的ac-php有关系么? google下,没找到什么思路。 有没有了解的大神给个思路

  1. 终端?
  2. 用了 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 。。。

确实是我设置的问题,上面是我找到的“原因”,但我并没想明白为什么会这样。。。:grinning:

Emacs 有几个特殊的键:C-[ 等同于 ESCC-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))

参考:

4 个赞

可能是因为覆盖了 ESC-prefix 的缘故:M-xESC 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
2 个赞

我前面乌龙了,其实也会 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 正常
1 个赞