2015-09-14 02:53:15 +00:00
|
|
|
;;; core-keybindings.el --- Spacemacs Core File
|
|
|
|
;;
|
2020-09-16 21:34:40 +00:00
|
|
|
;; Copyright (c) 2012-2020 Sylvain Benner & Contributors
|
2015-09-14 02:53:15 +00:00
|
|
|
;;
|
|
|
|
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
|
|
|
|
;; URL: https://github.com/syl20bnr/spacemacs
|
|
|
|
;;
|
|
|
|
;; This file is not part of GNU Emacs.
|
|
|
|
;;
|
|
|
|
;;; License: GPLv3
|
2015-11-18 00:35:32 +00:00
|
|
|
|
|
|
|
(require 'core-funcs)
|
|
|
|
|
2015-09-14 02:53:15 +00:00
|
|
|
(defvar spacemacs/prefix-titles nil
|
|
|
|
"alist for mapping command prefixes to long names.")
|
|
|
|
|
2015-11-18 00:35:32 +00:00
|
|
|
(defvar spacemacs-default-map (make-sparse-keymap)
|
|
|
|
"Base keymap for all spacemacs leader key commands.")
|
|
|
|
|
2015-12-02 00:25:37 +00:00
|
|
|
(defun spacemacs/translate-C-i (_)
|
2015-12-04 14:37:14 +00:00
|
|
|
"If `dotspacemacs-distinguish-gui-tab' is non nil, the raw key
|
|
|
|
sequence does not include <tab> or <kp-tab>, and we are in the
|
|
|
|
gui, translate to [C-i]. Otherwise, [9] (TAB)."
|
2015-12-02 00:25:37 +00:00
|
|
|
(interactive)
|
2015-12-04 14:37:14 +00:00
|
|
|
(if (and (not (cl-position 'tab (this-single-command-raw-keys)))
|
|
|
|
(not (cl-position 'kp-tab (this-single-command-raw-keys)))
|
|
|
|
dotspacemacs-distinguish-gui-tab
|
|
|
|
(display-graphic-p))
|
|
|
|
[C-i] [?\C-i]))
|
2015-12-02 00:25:37 +00:00
|
|
|
(define-key key-translation-map [?\C-i] 'spacemacs/translate-C-i)
|
|
|
|
|
|
|
|
;; (defun spacemacs/translate-C-m (_)
|
2015-12-04 14:37:14 +00:00
|
|
|
;; "If `dotspacemacs-distinguish-gui-ret' is non nil, the raw key
|
|
|
|
;; sequence does not include <ret>, and we are in the gui, translate
|
|
|
|
;; to [C-m]. Otherwise, [9] (TAB)."
|
2015-12-02 00:25:37 +00:00
|
|
|
;; (interactive)
|
2015-12-04 14:37:14 +00:00
|
|
|
;; (if (and
|
|
|
|
;; (not (cl-position 'return (this-single-command-raw-keys)))
|
|
|
|
;; (not (cl-position 'kp-enter (this-single-command-raw-keys)))
|
|
|
|
;; dotspacemacs-distinguish-gui-ret
|
|
|
|
;; (display-graphic-p))
|
|
|
|
;; [C-m] [?\C-m]))
|
2015-12-02 00:25:37 +00:00
|
|
|
;; (define-key key-translation-map [?\C-m] 'spacemacs/translate-C-m)
|
|
|
|
|
2015-09-14 02:53:15 +00:00
|
|
|
(defun spacemacs/declare-prefix (prefix name &optional long-name)
|
|
|
|
"Declare a prefix PREFIX. PREFIX is a string describing a key
|
2015-09-16 14:39:01 +00:00
|
|
|
sequence. NAME is a string used as the prefix command.
|
2015-09-14 02:53:15 +00:00
|
|
|
LONG-NAME if given is stored in `spacemacs/prefix-titles'."
|
|
|
|
(let* ((command name)
|
|
|
|
(full-prefix (concat dotspacemacs-leader-key " " prefix))
|
|
|
|
(full-prefix-emacs (concat dotspacemacs-emacs-leader-key " " prefix))
|
|
|
|
(full-prefix-lst (listify-key-sequence (kbd full-prefix)))
|
|
|
|
(full-prefix-emacs-lst (listify-key-sequence
|
|
|
|
(kbd full-prefix-emacs))))
|
|
|
|
;; define the prefix command only if it does not already exist
|
|
|
|
(unless long-name (setq long-name name))
|
2017-06-14 15:58:43 +00:00
|
|
|
(which-key-add-key-based-replacements
|
2015-11-19 02:05:03 +00:00
|
|
|
full-prefix-emacs (cons name long-name)
|
|
|
|
full-prefix (cons name long-name))))
|
2017-02-13 04:44:52 +00:00
|
|
|
(put 'spacemacs/declare-prefix 'lisp-indent-function 'defun)
|
2015-09-14 02:53:15 +00:00
|
|
|
|
|
|
|
(defun spacemacs/declare-prefix-for-mode (mode prefix name &optional long-name)
|
|
|
|
"Declare a prefix PREFIX. MODE is the mode in which this prefix command should
|
|
|
|
be added. PREFIX is a string describing a key sequence. NAME is a symbol name
|
|
|
|
used as the prefix command."
|
|
|
|
(let ((command (intern (concat (symbol-name mode) name)))
|
|
|
|
(full-prefix (concat dotspacemacs-leader-key " " prefix))
|
2015-09-14 05:47:36 +00:00
|
|
|
(full-prefix-emacs (concat dotspacemacs-emacs-leader-key " " prefix))
|
|
|
|
(is-major-mode-prefix (string-prefix-p "m" prefix))
|
2015-11-28 05:13:31 +00:00
|
|
|
(major-mode-prefix (concat dotspacemacs-major-mode-leader-key
|
|
|
|
" " (substring prefix 1)))
|
|
|
|
(major-mode-prefix-emacs
|
|
|
|
(concat dotspacemacs-major-mode-emacs-leader-key
|
|
|
|
" " (substring prefix 1))))
|
2015-09-14 02:53:15 +00:00
|
|
|
(unless long-name (setq long-name name))
|
2015-09-14 05:47:36 +00:00
|
|
|
(let ((prefix-name (cons name long-name)))
|
2017-06-14 15:58:43 +00:00
|
|
|
(which-key-add-major-mode-key-based-replacements mode
|
2015-11-19 02:05:03 +00:00
|
|
|
full-prefix-emacs prefix-name
|
|
|
|
full-prefix prefix-name)
|
|
|
|
(when (and is-major-mode-prefix dotspacemacs-major-mode-leader-key)
|
2017-06-14 15:58:43 +00:00
|
|
|
(which-key-add-major-mode-key-based-replacements mode major-mode-prefix prefix-name))
|
2015-11-19 02:05:03 +00:00
|
|
|
(when (and is-major-mode-prefix dotspacemacs-major-mode-emacs-leader-key)
|
2017-06-14 15:58:43 +00:00
|
|
|
(which-key-add-major-mode-key-based-replacements
|
2015-11-28 05:13:31 +00:00
|
|
|
mode major-mode-prefix-emacs prefix-name)))))
|
2017-02-13 04:44:52 +00:00
|
|
|
(put 'spacemacs/declare-prefix-for-mode 'lisp-indent-function 'defun)
|
2015-11-28 05:13:31 +00:00
|
|
|
|
2015-11-18 00:35:32 +00:00
|
|
|
(defun spacemacs/set-leader-keys (key def &rest bindings)
|
|
|
|
"Add KEY and DEF as key bindings under
|
|
|
|
`dotspacemacs-leader-key' and `dotspacemacs-emacs-leader-key'.
|
|
|
|
KEY should be a string suitable for passing to `kbd', and it
|
|
|
|
should not include the leaders. DEF is most likely a quoted
|
|
|
|
command. See `define-key' for more information about the possible
|
|
|
|
choices for DEF. This function simply uses `define-key' to add
|
|
|
|
the bindings.
|
|
|
|
|
|
|
|
For convenience, this function will accept additional KEY DEF
|
|
|
|
pairs. For example,
|
|
|
|
|
|
|
|
\(spacemacs/set-leader-keys
|
|
|
|
\"a\" 'command1
|
|
|
|
\"C-c\" 'command2
|
|
|
|
\"bb\" 'command3\)"
|
|
|
|
(while key
|
2015-11-29 04:08:30 +00:00
|
|
|
(define-key spacemacs-default-map (kbd key) def)
|
2015-11-18 00:35:32 +00:00
|
|
|
(setq key (pop bindings) def (pop bindings))))
|
2015-11-21 17:32:53 +00:00
|
|
|
(put 'spacemacs/set-leader-keys 'lisp-indent-function 'defun)
|
2015-11-18 00:35:32 +00:00
|
|
|
|
|
|
|
(defalias 'evil-leader/set-key 'spacemacs/set-leader-keys)
|
|
|
|
|
2015-12-17 16:06:37 +00:00
|
|
|
(defun spacemacs//acceptable-leader-p (key)
|
|
|
|
"Return t if key is a string and non-empty."
|
|
|
|
(and (stringp key) (not (string= key ""))))
|
|
|
|
|
2015-11-18 00:35:32 +00:00
|
|
|
(defun spacemacs//init-leader-mode-map (mode map &optional minor)
|
|
|
|
"Check for MAP-prefix. If it doesn't exist yet, use `bind-map'
|
|
|
|
to create it and bind it to `dotspacemacs-major-mode-leader-key'
|
|
|
|
and `dotspacemacs-major-mode-emacs-leader-key'. If MODE is a
|
|
|
|
minor-mode, the third argument should be non nil."
|
2015-12-17 16:06:37 +00:00
|
|
|
(let* ((prefix (intern (format "%s-prefix" map)))
|
|
|
|
(leader1 (when (spacemacs//acceptable-leader-p
|
|
|
|
dotspacemacs-major-mode-leader-key)
|
|
|
|
dotspacemacs-major-mode-leader-key))
|
|
|
|
(leader2 (when (spacemacs//acceptable-leader-p
|
|
|
|
dotspacemacs-leader-key)
|
2016-12-16 13:52:32 +00:00
|
|
|
(concat dotspacemacs-leader-key " m")))
|
2015-12-17 16:06:37 +00:00
|
|
|
(emacs-leader1 (when (spacemacs//acceptable-leader-p
|
|
|
|
dotspacemacs-major-mode-emacs-leader-key)
|
|
|
|
dotspacemacs-major-mode-emacs-leader-key))
|
|
|
|
(emacs-leader2 (when (spacemacs//acceptable-leader-p
|
|
|
|
dotspacemacs-emacs-leader-key)
|
2016-12-16 13:52:32 +00:00
|
|
|
(concat dotspacemacs-emacs-leader-key " m")))
|
2015-12-21 06:30:48 +00:00
|
|
|
(leaders (delq nil (list leader1 leader2)))
|
|
|
|
(emacs-leaders (delq nil (list emacs-leader1 emacs-leader2))))
|
2015-11-18 00:35:32 +00:00
|
|
|
(or (boundp prefix)
|
|
|
|
(progn
|
|
|
|
(eval
|
|
|
|
`(bind-map ,map
|
|
|
|
:prefix-cmd ,prefix
|
|
|
|
,(if minor :minor-modes :major-modes) (,mode)
|
2015-12-17 16:06:37 +00:00
|
|
|
:keys ,emacs-leaders
|
2016-01-08 19:07:00 +00:00
|
|
|
:evil-keys ,leaders
|
|
|
|
:evil-states (normal motion visual evilified)))
|
2015-11-18 00:35:32 +00:00
|
|
|
(boundp prefix)))))
|
|
|
|
|
|
|
|
(defun spacemacs/set-leader-keys-for-major-mode (mode key def &rest bindings)
|
|
|
|
"Add KEY and DEF as key bindings under
|
|
|
|
`dotspacemacs-major-mode-leader-key' and
|
|
|
|
`dotspacemacs-major-mode-emacs-leader-key' for the major-mode
|
|
|
|
MODE. MODE should be a quoted symbol corresponding to a valid
|
|
|
|
major mode. The rest of the arguments are treated exactly like
|
|
|
|
they are in `spacemacs/set-leader-keys'."
|
|
|
|
(let* ((map (intern (format "spacemacs-%s-map" mode))))
|
|
|
|
(when (spacemacs//init-leader-mode-map mode map)
|
|
|
|
(while key
|
|
|
|
(define-key (symbol-value map) (kbd key) def)
|
|
|
|
(setq key (pop bindings) def (pop bindings))))))
|
2015-11-21 17:32:53 +00:00
|
|
|
(put 'spacemacs/set-leader-keys-for-major-mode 'lisp-indent-function 'defun)
|
2015-11-18 00:35:32 +00:00
|
|
|
|
2015-11-28 05:13:31 +00:00
|
|
|
(defalias
|
|
|
|
'evil-leader/set-key-for-mode
|
|
|
|
'spacemacs/set-leader-keys-for-major-mode)
|
2015-09-14 02:53:15 +00:00
|
|
|
|
2015-11-18 00:35:32 +00:00
|
|
|
(defun spacemacs/set-leader-keys-for-minor-mode (mode key def &rest bindings)
|
|
|
|
"Add KEY and DEF as key bindings under
|
|
|
|
`dotspacemacs-major-mode-leader-key' and
|
|
|
|
`dotspacemacs-major-mode-emacs-leader-key' for the minor-mode
|
|
|
|
MODE. MODE should be a quoted symbol corresponding to a valid
|
|
|
|
minor mode. The rest of the arguments are treated exactly like
|
2020-11-21 06:34:55 +00:00
|
|
|
they are in `spacemacs/set-leader-keys'. If DEF is string, then
|
|
|
|
it is treated as a prefix not a command."
|
2015-11-18 00:35:32 +00:00
|
|
|
(let* ((map (intern (format "spacemacs-%s-map" mode))))
|
|
|
|
(when (spacemacs//init-leader-mode-map mode map t)
|
2020-11-21 06:34:55 +00:00
|
|
|
(let ((map-value (symbol-value map)))
|
|
|
|
(while key
|
|
|
|
(if (stringp def)
|
|
|
|
(which-key-add-keymap-based-replacements map-value key def)
|
|
|
|
(define-key map-value (kbd key) def))
|
|
|
|
(setq key (pop bindings) def (pop bindings)))))))
|
2015-11-21 17:32:53 +00:00
|
|
|
(put 'spacemacs/set-leader-keys-for-minor-mode 'lisp-indent-function 'defun)
|
2015-09-14 02:53:15 +00:00
|
|
|
|
2020-11-21 06:34:55 +00:00
|
|
|
(defun spacemacs/declare-prefix-for-minor-mode (mode prefix name)
|
|
|
|
"Declare a prefix PREFIX. MODE is the mode in which this prefix command should
|
|
|
|
be added. PREFIX is a string describing a key sequence. NAME is a symbol name
|
|
|
|
used as the prefix command.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
\(spacemacs/declare-prefix-for-minor-mode 'tide-mode \"E\" \"errors\"\)"
|
|
|
|
|
|
|
|
(let* ((map (intern (format "spacemacs-%s-map" mode))))
|
|
|
|
(when (spacemacs//init-leader-mode-map mode map t)
|
|
|
|
(which-key-add-keymap-based-replacements (symbol-value map) prefix name))))
|
|
|
|
|
2015-09-14 02:53:15 +00:00
|
|
|
(provide 'core-keybindings)
|