Emacs中ESS命令C-M-x(ess-eval-region-...)无响应问题求助
C-M-x(ess-eval-region-or-function-or-paragraph)失效的问题 你遇到的这个情况挺典型的——菜单能触发命令、其他ESS快捷键正常,说明命令本身没问题,问题大概率出在键绑定的层面。结合Ubuntu 16.04的环境,我给你梳理几个排查方向:
先确认当前
C-M-x的实际绑定
首先在ESS的代码缓冲区里按下C-h k C-M-x,这个命令会显示当前快捷键对应的绑定。如果结果不是ess-eval-region-or-function-or-paragraph,那肯定是有其他局部或全局绑定抢占了它。
如果是局部绑定被覆盖,你可以在配置文件里强制给ESS模式加上这个绑定:(add-hook 'ess-mode-hook (lambda () (local-set-key (kbd "C-M-x") 'ess-eval-region-or-function-or-paragraph)))检查ESS版本与配置冲突
老版本的ESS可能存在绑定遗漏的bug,或者你的配置文件里有代码无意中解绑了C-M-x。你可以搜一下自己的.emacs或init.el,看看有没有类似(global-unset-key (kbd "C-M-x"))或者针对ESS模式的解绑语句。
如果是版本问题,建议通过Melpa更新到最新的稳定版ESS,很多旧版本的绑定问题在新版本里都修复了。输入法或键盘布局的隐性干扰
虽然你排除了系统快捷键冲突,但某些输入法(比如fcitx、ibus)在中文输入状态下可能会拦截C-M-x这类组合键。你可以切换到英文输入法再试试。另外,确认一下Emacs的Meta键映射——默认是Alt键,如果你把Win键设成了Meta,也要确保这个映射没有出错(可以用C-h v meta-key查看当前设置)。全局插件的绑定覆盖
有些全局加载的插件(比如某些代码导航或编辑工具)可能会全局替换C-M-x的绑定。你可以按下C-h b打开全局键绑定列表,搜索C-M-x看看全局绑定的是什么命令。如果全局绑定已经不是Emacs默认的eval-defun,那说明全局插件的绑定优先级更高,干扰了ESS的局部绑定。
解决办法要么调整插件的加载顺序(让ESS的钩子后执行),要么像前面说的那样,在ESS模式钩子中强制设置局部绑定。
内容的提问来源于stack exchange,提问作者javekki

