diff --git a/.emacs.d/lisp/init-exwm.el b/.emacs.d/lisp/init-exwm.el index 5e240a83..db55360e 100644 --- a/.emacs.d/lisp/init-exwm.el +++ b/.emacs.d/lisp/init-exwm.el @@ -12,6 +12,15 @@ ;;; See https://github.com/ch11ng/exwm/issues/285 ;;; and https://gitlab.com/interception/linux/plugins/caps2esc/issues/2. +;; Looks like there is a bug between Helm and EXWM global keys which leads Helm +;; to display nothing when only `exwm-input-set-key' is used. +;; https://github.com/ch11ng/exwm/issues/816 +(defun ambrevar/exwm-global-set-key (keys command) + "Bind KEYS to COMMAND. +KEYS is passed to `kbd'." + (define-key exwm-mode-map (kbd keys) command) + (global-set-key (kbd keys) command)) + ;;; Rename buffer to window title. (defun ambrevar/exwm-rename-buffer-to-title () (exwm-workspace-rename-buffer exwm-title)) (add-hook 'exwm-update-title-hook 'ambrevar/exwm-rename-buffer-to-title) @@ -38,12 +47,8 @@ (exwm-input-set-key (kbd "s-k") #'windmove-up) (exwm-input-set-key (kbd "s-l") #'windmove-right) (exwm-input-set-key (kbd "s-D") #'kill-this-buffer) -;; WARNING: helm-mini and helm-find-files sometimes display nothing when bound -;; with `exwm-input-set-key'. See below. -(define-key exwm-mode-map (kbd "s-b") #'list-buffers) -(global-set-key (kbd "s-b") #'list-buffers) -(define-key exwm-mode-map (kbd "s-f") #'find-file) -(global-set-key (kbd "s-f") #'find-file) +(ambrevar/exwm-global-set-key "s-b" #'list-buffers) +(ambrevar/exwm-global-set-key "s-f" #'find-file) (when (require 'windower nil 'noerror) (exwm-input-set-key (kbd "s-") 'windower-switch-to-last-buffer) @@ -65,21 +70,16 @@ ;; Need `with-eval-after-load' here since 'helm-map is not defined in 'helm-config. (ambrevar/define-keys helm-map "s-\\" 'helm-toggle-resplit-and-swap-windows) - (exwm-input-set-key (kbd "s-c") #'helm-resume) - ;; WARNING: helm-mini and helm-find-files sometimes display nothing when bound - ;; with `exwm-input-set-key'. - (define-key exwm-mode-map (kbd "s-b") #'helm-mini) - (global-set-key (kbd "s-b") #'helm-mini) - (define-key exwm-mode-map (kbd "s-f") #'helm-find-files) - (global-set-key (kbd "s-f") #'helm-find-files) - ;; (push `(,(kbd "s-f") . helm-find-files) exwm-input-global-keys) - (exwm-input-set-key (kbd "s-F") #'helm-locate) + (ambrevar/exwm-global-set-key "s-c" #'helm-resume) + (ambrevar/exwm-global-set-key "s-b" #'helm-mini) + (ambrevar/exwm-global-set-key "s-f" #'helm-find-files) + (ambrevar/exwm-global-set-key "s-F" #'helm-locate) (when (fboundp 'ambrevar/helm-locate-meta) - (exwm-input-set-key (kbd "s-F") #'ambrevar/helm-locate-meta)) - (exwm-input-set-key (kbd "s-g") 'ambrevar/helm-grep-git-or-ag) - (exwm-input-set-key (kbd "s-G") 'ambrevar/helm-grep-git-all-or-ag) + (ambrevar/exwm-global-set-key "s-F" #'ambrevar/helm-locate-meta)) + (ambrevar/exwm-global-set-key "s-g" 'ambrevar/helm-grep-git-or-ag) + (ambrevar/exwm-global-set-key "s-G" 'ambrevar/helm-grep-git-all-or-ag) ;; Launcher - (exwm-input-set-key (kbd "s-r") 'helm-run-external-command)) + (ambrevar/exwm-global-set-key "s-r" 'helm-run-external-command)) (when (require 'evil nil t) (exwm-input-set-key (kbd "s-") #'evil-switch-to-windows-last-buffer) @@ -92,60 +92,61 @@ (exwm-input-set-key (kbd "s-t") (lambda () (interactive) (find-file (car org-agenda-files)))) - (exwm-input-set-key (kbd "s-") #'eshell) - (exwm-input-set-key (kbd "s-m") #'notmuch-hello) - (exwm-input-set-key (kbd "s-n") #'elfeed) - (exwm-input-set-key (kbd "s-e") #'eww)) - (exwm-input-set-key (kbd "s-t") 'helm-selector-org) - (exwm-input-set-key (kbd "s-T") 'helm-selector-org-other-window) - (exwm-input-set-key (kbd "s-") 'ambrevar/helm-selector-sly) - (exwm-input-set-key (kbd "S-s-") 'ambrevar/helm-selector-sly-other-window) - (exwm-input-set-key (kbd "s-m") #'helm-selector-notmuch) - (exwm-input-set-key (kbd "s-M") #'helm-selector-notmuch-other-window) - (exwm-input-set-key (kbd "s-n") #'helm-selector-elfeed) - (exwm-input-set-key (kbd "s-N") #'helm-selector-elfeed-other-window) ; "n" for "news" - (exwm-input-set-key (kbd "s-e") #'helm-selector-eww) - (exwm-input-set-key (kbd "s-E") #'helm-selector-eww-other-window)) + (exwm-input-set-key (kbd "s-") 'eshell) + (exwm-input-set-key (kbd "s-m") 'notmuch-hello) + (exwm-input-set-key (kbd "s-n") 'elfeed) + (exwm-input-set-key (kbd "s-e") 'eww)) + (ambrevar/exwm-global-set-key "s-t" 'helm-selector-org) + (ambrevar/exwm-global-set-key "s-T" 'helm-selector-org-other-window) + (ambrevar/exwm-global-set-key "s-" 'ambrevar/helm-selector-sly) + (ambrevar/exwm-global-set-key "S-s-" 'ambrevar/helm-selector-sly-other-window) + (ambrevar/exwm-global-set-key "s-m" 'helm-selector-notmuch) + (ambrevar/exwm-global-set-key "s-M" 'helm-selector-notmuch-other-window) + (ambrevar/exwm-global-set-key "s-n" 'helm-selector-elfeed) + (ambrevar/exwm-global-set-key "s-N" 'helm-selector-elfeed-other-window) ; "n" for "news" + (ambrevar/exwm-global-set-key "s-e" 'helm-selector-eww) + (ambrevar/exwm-global-set-key "s-E" 'helm-selector-eww-other-window)) (when (fboundp 'magit-status) (if (require 'helm-selector-magit nil :noerror) (progn - (exwm-input-set-key (kbd "s-v") #'helm-selector-magit) + (ambrevar/exwm-global-set-key "s-v" #'helm-selector-magit) (exwm-input-set-key (kbd "s-V") #'magit-status)) (exwm-input-set-key (kbd "s-v") #'magit-status))) (when (fboundp 'emms-all) (exwm-input-set-key (kbd "s-a") #'emms-smart-browse) (exwm-input-set-key (kbd "S-s-") #'emms-pause) (if (fboundp 'helm-emms) - (exwm-input-set-key (kbd "s-A") #'helm-emms) + (ambrevar/exwm-global-set-key "s-A" #'helm-emms) (exwm-input-set-key (kbd "s-A") #'emms))) (when (fboundp 'helm-pass) - (exwm-input-set-key (kbd "s-p") #'helm-pass)) + (ambrevar/exwm-global-set-key "s-p" #'helm-pass)) (autoload 'ambrevar/slime-to-repl "lisp") -(exwm-input-set-key (kbd "s-") #'helm-selector-sly) +(ambrevar/exwm-global-set-key "s-" #'ambrevar/helm-selector-sly-non-ambrevar) +;; TODO: Apparently, S-s- is not recognized. +(ambrevar/exwm-global-set-key "M-s-" #'ambrevar/helm-selector-sly-non-ambrevar-other-window) (defun ambrevar/repl-switcher () "Switch between Geiser and SLIME REPLs." (interactive) - ;; TODO: Apparently, S-s- is not recognized. (pcase (completing-read "Lisp: " '(cider geiser slime sly racket)) ("cider" - (exwm-input-set-key (kbd "s-") 'helm-selector-cider) - (exwm-input-set-key (kbd "M-s-") 'helm-selector-cider-other-window)) + (ambrevar/exwm-global-set-key "s-" 'helm-selector-cider) + (ambrevar/exwm-global-set-key "M-s-" 'helm-selector-cider-other-window)) ("geiser" (autoload 'helm-geiser-repl-switch "init-scheme") - (exwm-input-set-key (kbd "s-") 'helm-selector-geiser) - (exwm-input-set-key (kbd "M-s-") 'helm-selector-geiser-other-window)) + (ambrevar/exwm-global-set-key "s-" 'helm-selector-geiser) + (ambrevar/exwm-global-set-key "M-s-" 'helm-selector-geiser-other-window)) ("slime" - (exwm-input-set-key (kbd "s-") 'helm-selector-slime) - (exwm-input-set-key (kbd "M-s-") 'helm-selector-slime-other-window)) + (ambrevar/exwm-global-set-key "s-" 'helm-selector-slime) + (ambrevar/exwm-global-set-key "M-s-" 'helm-selector-slime-other-window)) ("sly" - (exwm-input-set-key (kbd "s-") 'helm-selector-sly) - (exwm-input-set-key (kbd "") 'helm-selector-sly-other-window)) + (ambrevar/exwm-global-set-key "s-" 'helm-selector-sly) + (ambrevar/exwm-global-set-key "" 'helm-selector-sly-other-window)) ("racket" - (exwm-input-set-key (kbd "s-") #'racket-repl)))) + (ambrevar/exwm-global-set-key "s-" #'racket-repl)))) (exwm-input-set-key (kbd "s-C-") #'ambrevar/repl-switcher) ;;; External application shortcuts. @@ -170,8 +171,8 @@ "M-d" 'helm-buffer-run-kill-persistent "S-" 'helm-buffer-switch-other-window) ;; Web browser - (exwm-input-set-key (kbd "s-w") #'helm-exwm-switch-browser) - (exwm-input-set-key (kbd "s-W") #'helm-exwm-switch-browser-other-window)) + (ambrevar/exwm-global-set-key "s-w" #'helm-exwm-switch-browser) + (ambrevar/exwm-global-set-key "s-W" #'helm-exwm-switch-browser-other-window)) (when (require 'desktop-environment nil 'noerror) ;; REVIEW: Remove the override on next version release: