First, we define a global prefix key:
(general-create-definer global-definer
:keymaps 'override
:states '(insert emacs normal hybrid motion visual operator)
:prefix "SPC"
:non-normal-prefix "S-SPC")
Bind top level, global commands like so:
(global-definer
"!" 'shell-command
":" 'eval-expression)
To ease the creation of nested menus, we define a macro:
(defmacro +general-global-menu! (name infix-key &rest body)
"Create a definer named +general-global-NAME wrapping global-definer.
Create prefix map: +general-global-NAME. Prefix bindings in BODY with INFIX-KEY."
(declare (indent 2))
`(progn
(general-create-definer ,(intern (concat "+general-global-" name))
:wrapping global-definer
:prefix-map (quote ,(intern (concat "+general-global-" name "-map")))
:infix ,infix-key
:wk-full-keys nil
"" '(:ignore t :which-key ,name))
(,(intern (concat "+general-global-" name))
,@body)))
This macro defines top-level nested menus. e.g. a menu for “buffer” bindings:
(+general-global-menu! "buffer" "b"
"d" 'kill-current-buffer
"o" '((lambda () (interactive) (switch-to-buffer nil))
:which-key "other-buffer")
"p" 'previous-buffer
"r" 'rename-buffer
"M" '((lambda () (interactive) (switch-to-buffer "*Messages*"))
:which-key "messages-buffer")
"n" 'next-buffer
"s" '((lambda () (interactive) (switch-to-buffer "*scratch*"))
:which-key "scratch-buffer")
"TAB" '((lambda () (interactive) (switch-to-buffer nil))
:which-key "other-buffer"))
You can specify per-package keybindings with the :general
use-package keyword.
For example, here’s a minimal helm configuration that binds SPC bb
to helm-mini
:
(use-package helm
:init (require 'helm-config)
:defer 1
:config
(helm-mode)
:general
(+general-global-buffer
"b" 'helm-mini))
We define a global-leader definer to access major-mode specific bindings:
(general-create-definer global-leader
:keymaps 'override
:states '(emacs normal hybrid motion visual operator)
:prefix "SPC m"
"" '(:ignore t :which-key (lambda (arg) `(,(cadr (split-string (car arg) " ")) . ,(replace-regexp-in-string "-mode$" "" (symbol-name major-mode))))))
Again, we use the :general
keyword to bind mode-specific bindings.
For example, with the following, we can eval-buffer
when in emacs-lisp-mode
or lisp-interaction-mode
by pressing SPC m e b
:
(use-package elisp-mode
;;this is a built in package, so we don't want to try and install it
:ensure nil
:general
(global-leader
;;specify the major modes these should apply to:
:major-modes
'(emacs-lisp-mode lisp-interaction-mode t)
;;and the keymaps:
:keymaps
'(emacs-lisp-mode-map lisp-interaction-mode-map)
"e" '(:ignore t :which-key "eval")
"eb" 'eval-buffer
"ed" 'eval-defun
"ee" 'eval-expression
"ep" 'pp-eval-last-sexp
"es" 'eval-last-sexp
"i" 'elisp-index-search))
Hope this helps. ~ Nicholas Vollmer
So this line should be deleted from the testing configuration used by me. I've taken it for granted that all the stuff in your linked comment is generated by
yodel
automatically, which makes me lost the opportunity to check its content further exhaustively.