aboutsummaryrefslogtreecommitdiff
path: root/evil-core.el
diff options
context:
space:
mode:
authorJustin Burkett <justin@burkett.cc>2017-01-25 12:44:07 -0500
committerEivind Fonn <evfonn@gmail.com>2019-11-29 13:34:19 +0100
commitfa54bb984d73f08422d22545e166fc95c5c70876 (patch)
tree71bb1aa98455ab52943966693c75f51ad9b00da2 /evil-core.el
parent29a29e56046b9b5ec7cab268528851ceb21e4b07 (diff)
evil-core.el: Add <leader> functionality
Add evil-send-leader and evil-send-localleader which will push the symbol <leader> or <localleader> into the unread-command-events list. This allows one to bind a key to evil-send-leader to make it a leader key and activate bindings like the following. (defun hi () (interactive) (message "hi")) (define-key evil-normal-state-map (kbd "<leader> h") 'hi) For convenience, evil-set-leader can be used as follows (evil-set-leader 'normal (kbd "C-c")) An optional argument makes it a localleader.
Diffstat (limited to 'evil-core.el')
-rw-r--r--evil-core.el30
1 files changed, 30 insertions, 0 deletions
diff --git a/evil-core.el b/evil-core.el
index 4cac4a5..92c9402 100644
--- a/evil-core.el
+++ b/evil-core.el
@@ -972,6 +972,36 @@ A return value of t means all states."
(t
state))))
+(defun evil-send-leader ()
+ "Put symbol leader in `unread-command-events' to trigger any
+<leader> bindings."
+ (interactive)
+ (setq prefix-arg current-prefix-arg)
+ (push '(t . leader) unread-command-events))
+
+(defun evil-send-localleader ()
+ "Put symbol localleader in `unread-command-events' to trigger any
+<localleader> bindings."
+ (interactive)
+ (setq prefix-arg current-prefix-arg)
+ (push '(t. localleader) unread-command-events))
+
+(defun evil-set-leader (state key &optional localleader)
+ "Set KEY to trigger <leader> bindings in STATE.
+KEY should be in the form produced by `kbd'. STATE is one of
+`normal', `insert', `visual', `replace', `operator', `motion',
+`emacs', a list of one or more of these, or nil. nil means all of
+the above. If LOCAL is non-nil, set localleader instead."
+ (let* ((all-states '(normal insert visual replace operator motion emacs))
+ (states (cond ((listp state) state)
+ ((member state all-states) (list state))
+ ((null state) all-states)
+ ;; Maybe throw error here
+ (t (list state))))
+ (binding (if localleader 'evil-send-localleader 'evil-send-leader)))
+ (dolist (state states)
+ (evil-global-set-key state key binding))))
+
(defmacro evil-define-key (state keymap key def &rest bindings)
"Create a STATE binding from KEY to DEF for KEYMAP.
STATE is one of normal, insert, visual, replace, operator,