2021-12-07 01:58:46 +00:00
|
|
|
;;; +key.el --- minor mode for keymaps -*- lexical-binding: t; -*-
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
;; Much of the code here was cribbed from https://emacs.stackexchange.com/a/358,
|
|
|
|
;; which in turn was cribbed in part from
|
|
|
|
;; https://github.com/kaushalmodi/.emacs.d/blob/master/elisp/modi-mode.el,
|
|
|
|
;; https://github.com/jwiegley/use-package/blob/master/bind-key.el and
|
|
|
|
;; elsewhere.
|
|
|
|
|
|
|
|
;; The basic idea is to have a minor-mode for my personal key customizations,
|
|
|
|
;; especially a "leader key" set up à la vim. In Emacs, I use `C-z' for this
|
|
|
|
;; leader key, because of its easy location and relative uselessness by default.
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
2021-12-13 16:29:50 +00:00
|
|
|
(require 'easy-mmode)
|
|
|
|
(require 'setup nil t)
|
|
|
|
|
2021-12-07 01:58:46 +00:00
|
|
|
;; I need to define this map before the proper mode map.
|
|
|
|
(defvar +key-leader-map (let ((map (make-sparse-keymap))
|
|
|
|
(c-z (global-key-binding "\C-z")))
|
|
|
|
(define-key map "\C-z" c-z)
|
|
|
|
map)
|
|
|
|
"A leader keymap under the \"C-z\" bind.")
|
|
|
|
|
|
|
|
(defvar +key-mode-map (let ((map (make-sparse-keymap)))
|
|
|
|
(define-key map "\C-z" +key-leader-map)
|
|
|
|
map)
|
|
|
|
"Keymap for `+key-mode'.")
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(define-minor-mode +key-mode
|
|
|
|
"A minor mode with keybindings that will override every other mode."
|
|
|
|
:init-value t
|
2021-12-13 16:29:50 +00:00
|
|
|
:lighter " +")
|
|
|
|
(add-to-list 'emulation-mode-map-alists `((+key-mode . ,+key-mode-map)))
|
2021-12-07 01:58:46 +00:00
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(define-globalized-minor-mode +key-global-mode +key-mode +key-mode)
|
|
|
|
|
2021-12-13 16:29:50 +00:00
|
|
|
;;;###autoload
|
|
|
|
(defun +key-setup ()
|
|
|
|
"Setup `+key-mode' after everything else."
|
|
|
|
(if after-init-time
|
|
|
|
(+key-global-mode +1)
|
|
|
|
(add-hook 'after-init-hook '+key-global-mode)))
|
2021-12-07 01:58:46 +00:00
|
|
|
|
|
|
|
(defun turn-off-+key-mode ()
|
|
|
|
"Turn off `+key-mode'."
|
|
|
|
(+key-mode -1))
|
|
|
|
(add-hook 'minibuffer-setup-hook 'turn-off-+key-mode)
|
|
|
|
|
|
|
|
;; Extras for `setup'
|
|
|
|
(with-eval-after-load 'setup
|
|
|
|
(setup-define :+key
|
|
|
|
(lambda (key command)
|
|
|
|
`(define-key +key-mode-map ,key ,command))
|
|
|
|
:documentation "Bind KEY to COMMAND in `+key-mode-map'."
|
|
|
|
:debug '(form sexp)
|
|
|
|
:ensure '(kbd func)
|
|
|
|
:repeatable t)
|
|
|
|
|
|
|
|
(setup-define :+leader
|
|
|
|
(lambda (key command)
|
|
|
|
`(define-key +key-leader-map ,key ,command))
|
|
|
|
:documentation "Bind KEY to COMMAND in `+key-leader-map'."
|
|
|
|
:debug '(form sexp)
|
|
|
|
:ensure '(kbd func)
|
|
|
|
:repeatable t))
|
|
|
|
|
|
|
|
(provide '+key)
|
|
|
|
;;; +key.el ends here
|