Files
sydnix/users/crumb/programs/emacs/modules/syd-keybinds.el
2025-01-17 16:28:45 -07:00

129 lines
5.0 KiB
EmacsLisp

;;; syd-keybinds.el -*- lexical-binding: t; -*-
;;; Universal keybindings, not /too/ tied to any particular packages.
(use-package general
:custom (general-use-package-emit-autoloads t))
(require 'general)
(defvar syd-leader-key "SPC"
"A prefix key akin to Vim's <Leader>.")
(defvar syd-localleader-key "SPC m"
"A prefix key akin to Vim's <LocalLeader>.")
(defvar syd-alt-leader-key "M-SPC"
"`syd-leader', but for the states specified in `syd-alt-leader-key-states'.
Often, your \"usual\" leader key will be something unavailable in the Insert
state. This key exists as a fallback for when you need your Leader, but must
remain in the Insert state. Substitute \"Insert state\" for your states of
choice with `syd-alt-leader-key-states'.")
(defvar syd-alt-localleader-key "M-SPC m"
"`syd-localleader', but for the states specified in `syd-alt-leader-key-states'.
See `syd-alt-leader-key' for rationale.")
(defvar syd-leader-key-states '(normal visual motion)
"States for which the Leader keys (`syd-leader-key', `syd-localleader-key')
are active.")
(defvar syd-alt-leader-key-states '(emacs insert)
"States for which the alternative Leader keys are active. See
`syd-alt-leader-key' and `syd-alt-localleader-key'.")
(defvar-keymap syd-leader-map
:doc "Leader-prefixed commands")
(defun syd--initialise-leader ()
"Set up the (empty) keymap associated with `syd-leader-key',
`syd-localleader-key', `syd-alt-leader-key', and `syd-alt-localleader-key'."
(require 'evil)
;; Define `syd/leader' as a command corresponding to the prefix map
;; `syd-leader-map'.
(define-prefix-command 'syd/leader 'syd-leader-map)
;; This should help make the Leader key close to universally available.
;; Ideally, *nothing* takes precedence over Leader — it's an incredibly
;; important key!
;; https://github.com/noctuid/evil-guide?tab=readme-ov-file#undoprevent-overridingintercept-maps
;; Really, we do this because Doom does. I'm honestly not entirely sure what
;; it does. I can't find anything useful online.
(define-key syd-leader-map [override-state] 'all)
;; Finally, we shall bind the damned keys. }:)
(let ((map general-override-mode-map))
(evil-define-key* syd-leader-key-states map (kbd syd-leader-key) 'syd/leader)
(evil-define-key* syd-alt-leader-key-states map (kbd syd-alt-leader-key) 'syd/leader))
(general-override-mode 1))
(defun syd-keybinds-initialise ()
(syd--initialise-leader)
;;; Buffer
(require 'syd-buffers)
(general-def
:prefix-map 'syd-leader-buffer-map
"k" `("Kill buffer" . ,#'kill-current-buffer)
"K" `("Kill all buffers" . ,#'syd/kill-all-buffers)
"O" `("Kill other buffers" . ,#'syd/kill-other-buffers)
"i" `("IBuffer" . ,#'ibuffer)
"Z" `("Kill burried buffers" . ,#'syd/kill-burried-buffers)
"C" `("Clone (indirect) buffer O/W" . ,#'clone-indirect-buffer-other-window)
"c" `("Clone (indirect) buffer" . ,#'clone-indirect-buffer)
"u" `("Save buffer as root" . ,#'syd/save-buffer-as-root)
"r" `("Revert buffer" . ,#'revert-buffer))
;;; File
(require 'syd-file)
(general-def
:prefix-map 'syd-leader-file-map
"D" `("Delete file" . ,#'syd/delete-this-file)
"R" `("Move file" . ,#'syd/move-this-file)
"C" `("Copy file" . ,#'syd/copy-this-file)
"F" `("Find file under current" . ,#'syd/find-file-under-here)
"p" `("Find under Emacs config" . ,#'syd/find-file-under-emacs-user-directory)
"P" `("Browse Emacs config" . ,#'syd/find-file-in-emacs-user-directory)
"u" `("Find file as root" . ,#'syd/find-file-as-root)
"U" `("Open this file as root" . ,#'syd/open-this-file-as-root)
"y" `("Yank buffer path" . ,#'syd/yank-buffer-path))
;;; Window
(require 'syd-window)
(general-def
:prefix-map 'syd-leader-window-maximise-map
"m" `("Maximise" . ,#'syd/window-maximise))
(general-def
:prefix-map 'syd-leader-window-map
"h" `("Select window left" . ,#'evil-window-left)
"j" `("Select window below" . ,#'evil-window-down)
"k" `("Select window above" . ,#'evil-window-up)
"l" `("Select window right" . ,#'evil-window-right)
"H" `("Swap window left" . ,#'syd/window-swap-left)
"J" `("Swap window below" . ,#'syd/window-swap-down)
"K" `("Swap window above" . ,#'syd/window-swap-up)
"L" `("Swap window right" . ,#'syd/window-swap-right)
"T" `("Tear off window" . ,#'tear-off-window)
"=" `("Balance windows" . ,#'balance-windows)
"m" `("Maximise" . ,syd-leader-window-maximise-map))
;;; Leader
(general-def
:keymaps 'syd-leader-map
"." #'find-file
"b" `("Buffer" . ,syd-leader-buffer-map)
"w" `("Window" . ,syd-leader-window-map)
"f" `("File" . ,syd-leader-file-map)
"h" `("Help" . ,help-map)))
(syd-keybinds-initialise)
;; Show possible completions for a partially-entered key sequence.
(use-package which-key
;; BUG: (#4) If the first input is a prefix key, `which-key-mode' won't be
;; activated in time.
:hook (on-first-input . which-key-mode)
:custom ((which-key-allow-evil-operators t)
(which-key-show-operator-state-maps t)))
(provide 'syd-keybinds)