编写Elisp EXWM工作区切换函数遇按键绑定问题求助
问题排查与解决方案
1. 检查按键是否被其他绑定抢占
你的S-M-<left>/S-M-<right>组合键可能被系统桌面环境(如GNOME/KDE)或Emacs其他全局绑定截获,导致EXWM无法接收:
- 按下
C-h k,再按S-M-<left>,查看当前该按键绑定的函数。如果不是你的exwm-workspace-switch-left,说明绑定被覆盖。 - 临时更换一个测试按键,比如
C-M-<left>,修改绑定代码后重启EXWM测试:
如果新绑定生效,说明原按键组合被抢占,需要更换按键或关闭系统层面的对应快捷键。(setq exwm-input-global-keys `((,(kbd "C-M-<left>") . exwm-workspace-switch-left) (,(kbd "C-M-<right>") . exwm-workspace-switch-right)))
2. 确保工作区索引获取正确
部分EXWM版本中,exwm-current-workspace返回的是工作区对象而非索引数字,虽然你M-x调用正常,但可能存在版本兼容问题。建议替换为更可靠的exwm-workspace-current-index:
(defun exwm-workspace-switch-left () (interactive) (let* ((ws (exwm-workspace-current-index)) (new-ws (if (= ws 0) (- (length exwm-workspace--list) 1) (- ws 1)))) (exwm-workspace-switch new-ws))) (defun exwm-workspace-switch-right () (interactive) (let* ((ws (exwm-workspace-current-index)) (new-ws (if (>= (+ ws 1) (length exwm-workspace--list)) 0 (+ ws 1)))) (exwm-workspace-switch new-ws)))
3. 避免绑定被EXWM初始化覆盖
如果你的exwm-input-global-keys设置是在EXWM启动前执行的,可能会被EXWM的初始化代码重置为默认值。建议将绑定放在exwm-init-hook中,确保在EXWM完全启动后再设置:
(add-hook 'exwm-init-hook (lambda () (setq exwm-input-global-keys `((,(kbd "S-M-<left>") . exwm-workspace-switch-left) (,(kbd "S-M-<right>") . exwm-workspace-switch-right)))))
4. 验证EXWM全局按键模式是否激活
确保exwm-input-mode处于激活状态,该模式负责处理EXWM的全局按键绑定。可以通过M-x exwm-input-mode手动激活,或确认它在EXWM启动时自动开启。
内容的提问来源于stack exchange,提问作者xpusostomos
相关产品推荐
相关产品推荐

