about summary refs log tree commit diff stats
path: root/lisp/+key.el
blob: 5b4f4674e284374c699971fd31d9b5d671f51678 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
;;; +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:

;; 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
  :lighter " +"
  :keymap +key-mode-map)

;;;###autoload
(define-globalized-minor-mode +key-global-mode +key-mode +key-mode)

(add-to-list 'emulation-mode-map-alists `((+key-mode . ,+key-mode-map)))

(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