66 lines
2.1 KiB
EmacsLisp
66 lines
2.1 KiB
EmacsLisp
|
;;; +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
|