;;; keybindings.el --- Centralizing my keybindings -*- lexical-binding: t -*- ;; Author: William Carroll ;;; Commentary: ;; Attempting to centralize my keybindings to simplify my configuration. ;;; Code: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Dependencies ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require 'clipboard) (require 'screen-brightness) (require 'chrome) (require 'scrot) (require 'ivy-clipmenu) (require 'general) (require 'window-manager) (require 'vterm-mgt) (require 'buffer) (require 'display) (require 'device) (require 'evil-ex) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Configuration ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defmacro keybinding/exwm (c fn) "Bind C to FN using `exwm-input-set-key' with `kbd' applied to C." `(exwm-input-set-key (kbd ,c) ,fn)) (keybinding/exwm "C-M-v" #'ivy-clipmenu/copy) (keybinding/exwm "" #'screen-brightness/increase) (keybinding/exwm "" #'screen-brightness/decrease) (keybinding/exwm "" #'pulse-audio/toggle-mute) (keybinding/exwm "" #'pulse-audio/decrease-volume) (keybinding/exwm "" #'pulse-audio/increase-volume) (keybinding/exwm "" #'pulse-audio/toggle-microphone) (keybinding/exwm "C-M-c" #'chrome/browse) (keybinding/exwm (kbd/raw 'x11 "s") #'scrot/select) (keybinding/exwm "" #'exwm/switch-to-exwm-buffer) (general-define-key :prefix "" :states '(normal) "." #'ffap) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Vterm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Show or hide a vterm buffer. I'm intentionally not defining this in ;; vterm-mgt.el because it consumes `buffer/show-previous', and I'd like to ;; avoid bloating vterm-mgt.el with dependencies that others may not want. (general-define-key (kbd/raw 'x11 "t") (lambda () (interactive) (if (vterm-mgt--instance? (current-buffer)) (switch-to-buffer (first (buffer/source-code-buffers))) (call-interactively #'vterm-mgt-find-or-create)))) (general-define-key :keymaps '(vterm-mode-map) "C-S-n" #'vterm-mgt-instantiate "C-S-w" #'vterm-mgt-kill "" #'vterm-mgt-next "" #'vterm-mgt-prev "" #'vterm-mgt-rename-buffer) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Displays ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (when (device/work-laptop?) (keybinding/exwm "" #'display/cycle-display-states) (general-define-key :prefix "" :states '(normal) "d0" #'display/disable-laptop "d1" #'display/enable-laptop) (general-define-key :prefix "" :states '(normal) "D0" #'display/disable-4k "D1" #'display/enable-4k)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; notmuch ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; evil-collection adds many KBDs to notmuch modes. Some of these I find ;; disruptive. (general-define-key :states '(normal) :keymaps '(notmuch-show-mode-map) "M-j" nil "M-k" nil "" #'notmuch-show-previous-thread-show "" #'notmuch-show-next-thread-show "e" #'notmuch-show-archive-message-then-next-or-next-thread) ;; TODO(wpcarro): Consider moving this to a separate module (defun evil-ex-define-cmd-local (cmd f) "Define CMD to F locally to a buffer." (unless (local-variable-p 'evil-ex-commands) (setq-local evil-ex-commands (copy-alist evil-ex-commands))) (evil-ex-define-cmd cmd f)) ;; TODO(wpcarro): Support a macro that can easily define evil-ex commands for a ;; particular mode. ;; Consumption: ;; (evil-ex-for-mode 'notmuch-message-mode ;; "x" #'notmuch-mua-send-and-exit) (add-hook 'notmuch-message-mode-hook (lambda () (evil-ex-define-cmd-local "x" #'notmuch-mua-send-and-exit))) ;; For now, I'm mimmicking Gmail KBDs that I have memorized and enjoy (general-define-key :states '(normal visual) :keymaps '(notmuch-search-mode-map) "M" (lambda () (interactive) (notmuch-search-tag '("-inbox" "+muted"))) "mi" (lambda () (interactive) (notmuch-search-tag '("+inbox" "-action" "-review" "-waiting" "-muted"))) "ma" (lambda () (interactive) (notmuch-search-tag '("-inbox" "+action" "-review" "-waiting"))) "mr" (lambda () (interactive) (notmuch-search-tag '("-inbox" "-action" "+review" "-waiting"))) "mw" (lambda () (interactive) (notmuch-search-tag '("-inbox" "-action" "-review" "+waiting"))) "e" #'notmuch-search-archive-thread) (general-define-key :states '(normal) :prefix "" "gn" #'notmuch) (provide 'keybindings) ;;; keybindings.el ends here