diff --git a/README.md b/README.md
index 1eea6b1e..ba66ff9d 100644
--- a/README.md
+++ b/README.md
@@ -124,6 +124,8 @@ See the [Customization](#customization) section below for more details.
## Keymap
+Exordium uses `bind-key` to set up key bindings, which keeps track of all bindings made. You can display a comprehensive list using M-x describe-personal-keybindings.
+
General:
Keybinding | Description
@@ -139,20 +141,20 @@ Keybinding | Description
Editing:
-Keybinding | Description
---------------------|----------------------------------------------------------
-RETURN | Return and indent by default; use S-RETURN for just return.
-M-BCKSP | `backward-kill-word` (e.g. the opposite of M-d `kill-word`).
-C-\\ | Delete spaces after cursor (`delete-horizontal-space-forward`).
-C-BCKSP | Delete spaces before cursor (`delete-horizontal-space-backward`).
-M-\\ | Delete all spaces around cursor.
-M-LEFT and M-RIGHT | Move cursor by semantic units (use C-LEFT and C-RIGHT to move by words).
-C-c d | Duplicate line.
-C-= | Expand region by semantic units.
-M-C-= | Contract region by semantic units.
-M- | Move region one line up
-M- | Move region one line down
-C-| | Toggle the 80-column ruler (fill column indicator).
+Keybinding | Description
+--------------------------|----------------------------------------------------------
+RET | Return and indent by default; use S-RET for just return.
+M- | `backward-kill-word` (e.g. the opposite of M-d `kill-word`).
+C-\\ | Delete spaces after cursor (`delete-horizontal-space-forward`).
+C- | Delete spaces before cursor (`delete-horizontal-space-backward`).
+M-\\ | Delete all spaces around cursor.
+M- and M- | Move cursor by semantic units (use C- and C- to move by words).
+C-c d | Duplicate line.
+C-= | Expand region by semantic units.
+M-C-= | Contract region by semantic units.
+M- | Move region one line up
+M- | Move region one line down
+C-| | Toggle the 80-column ruler (fill column indicator).
Navigation:
@@ -343,7 +345,7 @@ Treemacs displays the git status of files (added, modified, ignored etc.) using
different faces.
With the cursor in the Treemacs window, you can use TAB to
-open/close directories, RETURN to open a file, and q to
+open/close directories, RET to open a file, and q to
quit. Use ? to view all the available keys. See the documentation of
Treemacs for details.
@@ -465,7 +467,7 @@ and auto-complete/company-complete. You can easily use a function key if you pre
by adding this in your `after-init.el`:
```lisp
-(define-key yas-minor-mode-map (kbd "") 'yas-expand)
+(bind-key "" #'yas-expand yas-minor-mode-map)
```
Snippets are stored in `~/.emacs.d/snippets/c++-mode`. Here are
@@ -714,8 +716,8 @@ Any navigation is recorded onto a stack, so it is easy to go back and forth:
Keybinding | Description
---------------------------------------------|---------------------------------
-C-c r LEFT or C-c r [ | Go back to previous location.
-C-c r RIGHT or C-c r ] | Go forward to next location.
+C-c r or C-c r [ | Go back to previous location.
+C-c r or C-c r ] | Go forward to next location.
Refactoring:
diff --git a/modules/init-autocomplete.el b/modules/init-autocomplete.el
index 9bc6ad3f..0f3ba921 100644
--- a/modules/init-autocomplete.el
+++ b/modules/init-autocomplete.el
@@ -29,8 +29,8 @@
(;; Key to force trigger auto-complete (useful if ac-auto-start is set to nil)
("C-." . #'auto-complete)
:map ac-completing-map
- ("" . #'ac-stop)
- ([return] . #'ac-complete)))
+ ("ESC" . #'ac-stop)
+ ("RET" . #'ac-complete)))
(provide 'init-autocomplete)
diff --git a/modules/init-bde-style.el b/modules/init-bde-style.el
index 5d9e5ffc..10384ecf 100644
--- a/modules/init-bde-style.el
+++ b/modules/init-bde-style.el
@@ -388,8 +388,8 @@ backspace, delete, left or right."
(bde-insert-class-header ?-))
;;; Ctrl-C = and Ctrl-C - for class header
-(keymap-set c-mode-base-map "C-c =" #'bde-insert-define-class-header)
-(keymap-set c-mode-base-map "C-c -" #'bde-insert-declare-class-header)
+(bind-key "C-c =" #'bde-insert-define-class-header c-mode-base-map)
+(bind-key "C-c -" #'bde-insert-declare-class-header c-mode-base-map)
;;; BDE's right style comments such as // RETURN or // LOCK
@@ -418,7 +418,7 @@ works even if point is in a C++ comment."
(message "Sorry, not enough space...")))
(move-end-of-line nil))
;;; Ctrl-> to right-aligh the text after point
-(keymap-set c-mode-base-map "C->" #'bde-align-right)
+(bind-key "C->" #'bde-align-right c-mode-base-map)
;;; Insert redundant include guards
@@ -478,7 +478,7 @@ guard around it."
;; No region: just insert one guard for the current line
(bde-insert-redundant-include-guard))))
-(keymap-set c-mode-base-map "C-c i" #'bde-insert-redundant-include-guard-region)
+(bind-key "C-c i" #'bde-insert-redundant-include-guard-region c-mode-base-map)
;;; Align stuff
@@ -809,7 +809,7 @@ declaration or definition."
(when (looking-at "\\s\(")
(end-of-thing 'arglist)))))
-(keymap-set c-mode-base-map "C-c a" #'bde-align-fundecl)
+(bind-key "C-c a" #'bde-align-fundecl c-mode-base-map)
;;; Align arguments in a function call
@@ -882,7 +882,7 @@ call. It puts one argument per line and aligns to the right."
(when (looking-at "\\s\(")
(forward-list 1))))
-(keymap-set c-mode-base-map "C-c f" #'bde-align-funcall)
+(bind-key "C-c f" #'bde-align-funcall c-mode-base-map)
;;; Align members in a class
@@ -1032,7 +1032,7 @@ all comments start at column 40."
(t
(message "No region"))))
-(keymap-set c-mode-base-map "C-c m" #'bde-align-class-members)
+(bind-key "C-c m" #'bde-align-class-members c-mode-base-map)
;;; Repunctuate: the BDE comment style requires 2 spaces at the end of each
diff --git a/modules/init-company.el b/modules/init-company.el
index 95a1fe2f..edb9ff77 100644
--- a/modules/init-company.el
+++ b/modules/init-company.el
@@ -77,7 +77,7 @@
:bind
(("C-." . #'company-complete)
:map company-active-map
- ("" . #'company-abort)))
+ ("ESC" . #'company-abort)))
(use-package company-statistics
diff --git a/modules/init-cpp.el b/modules/init-cpp.el
index 4d0f6594..4c860a9b 100644
--- a/modules/init-cpp.el
+++ b/modules/init-cpp.el
@@ -167,7 +167,7 @@ With argument, switch to the second choice. For example, from a
(t (message "This is not a C/C++ file"))))))
;;; Ctrl-Tab to switch between .h and .cpp
-(define-key c-mode-base-map [(control tab)] 'cpp-switch-h-cpp)
+(bind-key "C-TAB" #'cpp-switch-h-cpp c-mode-base-map)
;;; C++11 keywords
diff --git a/modules/init-gdb.el b/modules/init-gdb.el
index d08389c4..166c772f 100644
--- a/modules/init-gdb.el
+++ b/modules/init-gdb.el
@@ -111,10 +111,10 @@ Windows created are gdb command line, source code, and program IO."
(declare-function gud-cont "gud" (arg))
(declare-function gud-next "gud" (arg))
(declare-function gud-step "gud" (arg)))
-(keymap-set gud-minor-mode-map "" #'gud-step)
-(keymap-set gud-minor-mode-map "" #'gud-next)
-(keymap-set gud-minor-mode-map "" #'gud-finish)
-(keymap-set gud-minor-mode-map "" #'gud-cont)
+(bind-key "" #'gud-step gud-minor-mode-map)
+(bind-key "" #'gud-next gud-minor-mode-map)
+(bind-key "" #'gud-finish gud-minor-mode-map)
+(bind-key "" #'gud-cont gud-minor-mode-map)
(provide 'init-gdb)
diff --git a/modules/init-git.el b/modules/init-git.el
index f5003812..c650aca0 100644
--- a/modules/init-git.el
+++ b/modules/init-git.el
@@ -32,8 +32,8 @@
(require 'vc-git)
(defvar exordium-git-map nil)
-(define-prefix-command 'exordium-git-map)
-(global-set-key (kbd "C-c g") 'exordium-git-map)
+
+(bind-key "C-c g" (define-prefix-command 'exordium-git-map))
(defvar-local exordium--magit-fullscreen-configuration nil
"A screen configuration and a point marker.
@@ -296,14 +296,17 @@ with `exordium-magit-quit-session'."
;;; Git Grep
+(defun exordium-helm-do-git-grep ()
+ "Call `helm-grep-do-git-grep' with prefix ARG to git-grep whole repository."
+ (interactive)
+ (let ((current-prefix-arg '(4)))
+ (call-interactively #'helm-grep-do-git-grep)))
-(define-key exordium-git-map (kbd "g")
- (if exordium-helm-everywhere
- (lambda()
- (interactive)
- (setq current-prefix-arg '(4))
- (call-interactively 'helm-grep-do-git-grep))
- (function vc-git-grep)))
+(bind-key "g"
+ (if exordium-helm-everywhere
+ #'exordium-helm-do-git-grep
+ #'vc-git-grep)
+ exordium-git-map)
;;; Make backtick an electric pair
@@ -337,14 +340,16 @@ http://stackoverflow.com/questions/9656311/conflict-resolution-with-emacs-ediff-
(defun exordium--add-copy-both-to-ediff-mode-map ()
(when ediff-merge-job
- (define-key ediff-mode-map "A"
- (lambda ()
- (interactive)
- (exordium-ediff-copy-both-to-C "A" "B")))
- (define-key ediff-mode-map "B"
- (lambda ()
- (interactive)
- (exordium-ediff-copy-both-to-C "B" "A")))))
+ (bind-key "A"
+ (lambda ()
+ (interactive)
+ (exordium-ediff-copy-both-to-C "A" "B"))
+ ediff-mode-map)
+ (bind-key "B"
+ (lambda ()
+ (interactive)
+ (exordium-ediff-copy-both-to-C "B" "A"))
+ ediff-mode-map)))
(defconst exordium--ediff-long-help-message-merge
"
diff --git a/modules/init-highlight.el b/modules/init-highlight.el
index 0a8343b1..4d80f07c 100644
--- a/modules/init-highlight.el
+++ b/modules/init-highlight.el
@@ -15,8 +15,8 @@
;; may be highlighted at one time, using different colors. Feel free to rebind
;; function `exordium-highlight-symbol-at-point' to a better key, like for example:
;;
-;; (global-set-key [(control return)] #'exordium-highlight-symbol-at-point)
-;; (global-set-key [(f6)] #'exordium-highlight-symbol-at-point)
+;; (bind-key "C-RET" #'exordium-highlight-symbol-at-point)
+;; (bind-key "" #'exordium-highlight-symbol-at-point)
;;
;; Notes: Exordium uses 2 packages for highlighting the symbol under
;; point. One is "highlight-symbol" used for automatic highlighting after a
diff --git a/modules/init-ido.el b/modules/init-ido.el
index d086b70e..95d23611 100644
--- a/modules/init-ido.el
+++ b/modules/init-ido.el
@@ -54,7 +54,7 @@
(mapcar 'abbreviate-file-name recentf-list)
nil t)))
-(define-key global-map [(control x)(control r)] 'ido-find-recentf)
+(bind-key "C-x C-r" #'ido-find-recentf)
diff --git a/modules/init-look-and-feel.el b/modules/init-look-and-feel.el
index f446b713..717e4073 100644
--- a/modules/init-look-and-feel.el
+++ b/modules/init-look-and-feel.el
@@ -163,7 +163,7 @@ Set FONT and SIZE if they are passed as arguments."
;; Use ESC as Control-G
(when exordium-keyboard-escape
- (global-set-key (kbd "") 'keyboard-quit))
+ (bind-key "ESC" #'keyboard-quit))
;;; Use "y or n" answers instead of full words "yes or no"
(when exordium-enable-y-or-n
@@ -197,16 +197,15 @@ Set FONT and SIZE if they are passed as arguments."
(insert-for-yank text)))))
(when exordium-enable-insert-gui-primary-selection
- (global-set-key [(meta insert)] #'insert-gui-primary-selection))
+ (bind-key "M-" #'insert-gui-primary-selection))
;;; Shortcut keys
-(global-set-key [(meta g)] (function goto-line))
+(bind-key "M-g" #'goto-line)
(when exordium-keyboard-ctrl-z-undo
- (define-key global-map [(control z)] (function undo)))
-(global-set-key [(control ?`)] (function kill-this-buffer))
-
+ (bind-key "C-z" #'undo))
+(bind-key "C-`" #'kill-this-buffer)
;;; Meta-Control-L = switch to last buffer
(defun switch-to-other-buffer ()
@@ -214,10 +213,10 @@ Set FONT and SIZE if they are passed as arguments."
(interactive)
(switch-to-buffer (other-buffer)))
-(define-key global-map [(meta control l)] (function switch-to-other-buffer))
+(bind-key "M-C-l" #'switch-to-other-buffer)
;;; C-x C-b = ibuffer (better than list-buffers)
-(define-key global-map [(control x)(control b)] (function ibuffer))
+(bind-key "C-x C-b" #'ibuffer)
;;; Zoom
(use-package default-text-scale
@@ -267,8 +266,8 @@ Set FONT and SIZE if they are passed as arguments."
(interactive "r\np")
(move-region start end (if (null n) 1 n)))
-(global-set-key (kbd "M-") 'move-region-up)
-(global-set-key (kbd "M-") 'move-region-down)
+(bind-key "M-" #'move-region-up)
+(bind-key "M-" #'move-region-down)
;;; File saving and opening
diff --git a/modules/init-prog-mode.el b/modules/init-prog-mode.el
index 8651aba2..7b0741a9 100644
--- a/modules/init-prog-mode.el
+++ b/modules/init-prog-mode.el
@@ -48,19 +48,19 @@
;;; The return key
(cond (exordium-enable-newline-and-indent
- (define-key prog-mode-map (kbd "") (function newline-and-indent))
- (define-key prog-mode-map (kbd "") (function newline)))
+ (bind-key "RET" #'newline-and-indent prog-mode-map)
+ (bind-key "S-RET" #'newline prog-mode-map))
(t
- (define-key prog-mode-map (kbd "") (function newline-and-indent))))
+ (bind-key "S-RET" #'newline-and-indent prog-mode-map)))
;;; Fill comments, comment regions
(setq comment-auto-fill-only-comments 1)
-(define-key prog-mode-map (kbd "\C-c\C-c") (function comment-region))
+(bind-key "C-c C-c" #'comment-dwim prog-mode-map)
;;; Step through compile errors
-(global-set-key (quote [f10]) (quote next-error))
-(global-set-key (quote [(control f10)]) (quote previous-error))
+(bind-key "" #'next-error)
+(bind-key "C-" #'previous-error)
;;; Font lock changes
diff --git a/modules/init-rtags-helm.el b/modules/init-rtags-helm.el
index 7858573f..31b322e3 100644
--- a/modules/init-rtags-helm.el
+++ b/modules/init-rtags-helm.el
@@ -188,7 +188,7 @@ For example: classes, functions, variables, enums and other."
(candidates . ,(rtags-helm-sort-list macros))
(action . rtags-helm-jump-to-line))))))
-(define-key c-mode-base-map [(meta control g)] 'rtags-helm-select-taglist)
+(bind-key "M-C-g" #'rtags-helm-select-taglist c-mode-base-map)
(provide 'init-rtags-helm)
diff --git a/modules/init-rtags.el b/modules/init-rtags.el
index b742aa5d..7b05e9a4 100644
--- a/modules/init-rtags.el
+++ b/modules/init-rtags.el
@@ -172,29 +172,30 @@
;; "Ctrl-c r" is not defined by default, so we get the whole keyboard.
(rtags-enable-standard-keybindings c-mode-base-map "\C-cr")
+;; Disable "M-." and "M-," as they conflict with standard `xref'
;; Alias for C-c r . This key recenters the buffer if needed.
-(define-key c-mode-base-map "\M-."
- (lambda (other-window)
- (interactive "P")
- (let ((rtags-after-find-file-hook rtags-after-find-file-hook))
- (add-hook 'rtags-after-find-file-hook (lambda () (recenter)))
- (rtags-find-symbol-at-point other-window))))
-
+;; (bind-key "M-."
+;; (lambda (other-window)
+;; (interactive "P")
+;; (let ((rtags-after-find-file-hook rtags-after-find-file-hook))
+;; (add-hook 'rtags-after-find-file-hook (lambda () (recenter)))
+;; (rtags-find-symbol-at-point other-window)))
+;; c-mode-base-map)
;; Alias for C-c r ,
-(define-key c-mode-base-map "\M-," (function rtags-find-references-at-point))
+;; (bind-key "M-," #'rtags-find-references-at-point c-mode-base-map)
;; Alias for C-c r [
-(define-key c-mode-base-map [(control c) (r) (left)] (function rtags-location-stack-back))
+(bind-key "C-c r " #'rtags-location-stack-back c-mode-base-map)
;; Alias for C-c r [
-(define-key c-mode-base-map [(control c) (r) (right)] (function rtags-location-stack-forward))
+(bind-key "C-c r " #'rtags-location-stack-forward c-mode-base-map)
-(define-key c-mode-base-map [(meta control g)] (function rtags-imenu))
+(bind-key "M-C-g" #'rtags-imenu c-mode-base-map)
-(define-key c-mode-base-map [(control c) (r) (down)] (function rtags-next-diag))
-(define-key c-mode-base-map [(control c) (r) (up)] (function rtags-previous-diag))
-(define-key c-mode-base-map [(control c) (r) (c)] (function rtags-clear-diagnostics))
+(bind-key "C-c r " #'rtags-next-diag c-mode-base-map)
+(bind-key "C-c r " #'rtags-previous-diag c-mode-base-map)
+(bind-key "C-c r c" #'rtags-clear-diagnostics c-mode-base-map)
-(define-key c-mode-base-map "\C-crQ" (function rtags-stop-diagnostics))
+(bind-key "C-c r S-q" #'rtags-stop-diagnostics c-mode-base-map)
;;; Start rdm as a subprocess, with output in a buffer
@@ -283,7 +284,7 @@ Redirect output to *RTags Diagnostics*. Also start the RTag diagostics mode."
(t
(message "Rtags rdm is not running (use M-x rtags-start)")))))
-(define-key c-mode-base-map [(control c)(r)(l)] 'rtags-show-rdm-buffer)
+(bind-key "C-c r l" #'rtags-show-rdm-buffer c-mode-base-map)
;;; Mode for rdm log output
@@ -369,7 +370,7 @@ Similar to `rtags-diagnostics' but without reparsing."
(other-window -1))))
(message "Rtags diagnostics is not running (use C-c r D)")))
-(define-key c-mode-base-map [(control c)(r)(d)] 'rtags-show-diagnostics-buffer)
+(bind-key "C-c r d" #'rtags-show-diagnostics-buffer c-mode-base-map)
;; Used in powerline:
(defun rtags-diagnostics-has-errors ()
@@ -473,8 +474,7 @@ Similar to `rtags-diagnostics' but without reparsing."
;; ;; )))))
-;; (define-key c-mode-base-map [(control c)(r)(A)]
-;; 'rtags-diagnostics-auto-complete))
+;; (bind-key "C-c r S-A" #'rtags-diagnostics-auto-complete c-mode-base-map)
diff --git a/modules/init-util.el b/modules/init-util.el
index 8c273adc..58a80b56 100644
--- a/modules/init-util.el
+++ b/modules/init-util.el
@@ -89,7 +89,7 @@ insert the char that many times."
((looking-at "\\s\)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))
-(global-set-key [(control %)] #'goto-match-paren-or-up)
+(bind-key "C-%" #'goto-match-paren-or-up)
;;; Bookmark position stack
@@ -126,8 +126,8 @@ insert the char that many times."
(t
(message "Invalid position in stack")))))
-(global-set-key [(control c)(s)] #'postack-push)
-(global-set-key [(control c)(b)] #'postack-pop)
+(bind-key "C-c s" #'postack-push)
+(bind-key "C-c b" #'postack-pop)
;;; Goto last change
@@ -208,7 +208,7 @@ When called with ARG, do this that many times."
;; Leave the cursor an the same column if we duplicated 1 line
(move-to-column col))))
-(global-set-key [(control c)(d)] #'duplicate-line-or-region)
+(bind-key "C-c d" #'duplicate-line-or-region)
;;; Deleting Spaces
@@ -218,14 +218,14 @@ When called with ARG, do this that many times."
(interactive "*")
(delete-region (point) (progn (skip-chars-forward " \t") (point))))
-(global-set-key [(control \\)] 'delete-horizontal-space-forward)
+(bind-key "C-\\" #'delete-horizontal-space-forward)
(defun delete-horizontal-space-backward ()
"Delete all spaces and tabs before point."
(interactive "*")
(delete-region (point) (progn (skip-chars-backward " \t") (point))))
-(global-set-key [(control backspace)] #'delete-horizontal-space-backward)
+(bind-key "C-" #'delete-horizontal-space-backward)
;;; Deleting Words
@@ -242,7 +242,7 @@ When called with ARG, do this that many times."
(interactive "p")
(delete-region (point) (progn (forward-word arg) (point))))
-(define-key global-map [(meta d)] 'delete-word)
+(bind-key "M-d" #'delete-word)
(defun backward-delete-word (arg)
"Delete characters backward until encountering the end of a word.
@@ -250,7 +250,7 @@ When called with ARG, do this that many times."
(interactive "p")
(delete-word (- arg)))
-(define-key global-map [(meta backspace)] #'backward-delete-word)
+(bind-key "M-" #'backward-delete-word)
;;; Moving between words
@@ -263,12 +263,12 @@ When called with ARG, do this that many times."
;;; and M-right to move following the syntax: the motion is slower but
;;; symetrical. C-Left and C-Right are left unchanged (move by words).
-(define-key global-map [(meta right)]
+(bind-key "M-"
(lambda (arg)
(interactive "p")
(forward-same-syntax arg)))
-(define-key global-map [(meta left)]
+(bind-key "M-"
(lambda (arg)
(interactive "p")
(forward-same-syntax (- arg))))
@@ -333,9 +333,10 @@ When called with ARG, do this that many times."
;;; Avy - go to any word on the screen in just 2 or 3 keystrokes.
;;; C-c j => asks for a character, then one or 2 keys to jump.
;;; Note: Avy has other commands, this is the most useful.
-
-(global-set-key [(control c)(j)] #'avy-goto-word-or-subword-1)
-(global-set-key [(control ?\')] #'avy-goto-word-or-subword-1)
+(use-package avy
+ :bind
+ (("C-c j" . #'avy-goto-word-or-subword-1)
+ ("C-'" . #'avy-goto-word-or-subword-1)))
;;; Finding lines that are too long (according to some code styles).
@@ -404,7 +405,7 @@ REGION is t when called interactively and is passed to
(emacs-lisp-docstring-fill-column t))
(fill-paragraph nil region)))
-(define-key global-map "\M-Q" #'unfill-paragraph)
+(bind-key "M-S-q" #'unfill-paragraph)
;;; Config management
diff --git a/modules/init-window-manager.el b/modules/init-window-manager.el
index 3847db0e..7a240dc4 100644
--- a/modules/init-window-manager.el
+++ b/modules/init-window-manager.el
@@ -109,7 +109,7 @@
(current-buffer))))
;;; Note: apparently there is no Pause key on an Apple keyboard...
-(define-key global-map [pause] 'exordium-toggle-window-dedicated)
+(bind-key "" #'exordium-toggle-window-dedicated)
;;; Ace-window