💥 Redesign vanilla Emacs keybind scheme

The leader keys have been redesigned a) for consistency, b) to reduce
collisions with packages, and c) to improve command coverage. However,
much of it still comes from a vim user, so it needs more testing.
This commit is contained in:
Henrik Lissner 2019-03-09 03:28:00 -05:00
parent b6fcd59a01
commit 1a6f0c2f1d
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
2 changed files with 344 additions and 293 deletions

View file

@ -1,21 +1,23 @@
;;; config/default/+emacs-bindings.el -*- lexical-binding: t; -*- ;;; config/default/+emacs-bindings.el -*- lexical-binding: t; -*-
;; Sensible deafult key bindings for non-evil users ;; Sensible deafult key bindings for non-evil users
(setq doom-leader-alt-key "C-c"
doom-localleader-alt-key "C-c l")
;; persp-mode and projectile in different prefixes ;; persp-mode and projectile in different prefixes
(setq persp-keymap-prefix (kbd "C-c e")) (setq persp-keymap-prefix (kbd "C-c w"))
(after! projectile (after! projectile
(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)) (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map))
(after! which-key
(which-key-add-key-based-replacements "C-c !" "checking") (which-key-add-key-based-replacements "C-c !" "checking")
(which-key-add-key-based-replacements "C-c e" "perspective") (which-key-add-key-based-replacements "C-c l" "<localleader>"))
(which-key-add-key-based-replacements "C-c p" "projectile")
;; Prefix key to invoke doom related commands
(setq doom-leader-alt-key "C-c")
(setq doom-localleader-alt-key "C-c l")
(map! ;;
;;; Global keybinds
(map! "C-'" #'imenu
;; Text scaling ;; Text scaling
"<C-mouse-4>" #'text-scale-increase "<C-mouse-4>" #'text-scale-increase
"<C-mouse-5>" #'text-scale-decrease "<C-mouse-5>" #'text-scale-decrease
@ -43,32 +45,50 @@
;; Popup bindigns ;; Popup bindigns
"C-x p" #'+popup/other "C-x p" #'+popup/other
"C-`" #'+popup/toggle "C-`" #'+popup/toggle
"C-~" #'+popup/raise "C-~" #'+popup/raise)
;; Doom emacs bindings
(:leader
(:prefix ("d" . "doom") ;;
:desc "Dashboard" "d" #'+doom-dashboard/open ;;; Leader keys
:desc "Recent files" "f" #'recentf-open-files
(:when (featurep! :ui neotree) (map! :leader
:desc "Open neotree" "n" #'+neotree/open :desc "Find file in project" "C-f" #'projectile-find-file
:desc "File in neotree" "N" #'neotree/find-this-file) :desc "Evaluate line/region" "e" #'+eval/line-or-region
(:when (featurep! :ui treemacs) :desc "Pop up scratch buffer" "x" #'doom/open-to-scratch-buffer
:desc "Toggle treemacs" "n" #'+treemacs/toggle :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer
:desc "File in treemacs" "N" #'+treemacs/find-file)
:desc "Popup other" "o" #'+popup/other (:when (featurep! :emacs term)
:desc "Popup toggle" "t" #'+popup/toggle :desc "Terminal" "`" #'+term/open
:desc "Popup close" "c" #'+popup/close :desc "Terminal in popup" "~" #'+term/open-popup-in-project)
:desc "Popup close all" "C" #'+popup/close-all (:when (featurep! :tools vterm)
:desc "Popup raise" "r" #'+popup/raise :desc "Terminal" "`" #'+vterm/open
:desc "Popup restore" "R" #'+popup/restore :desc "Terminal in popup" "~" #'+vterm/open-popup-in-project)
:desc "Scratch buffer" "s" #'doom/open-scratch-buffer (:when (featurep! :emacs eshell)
:desc "Switch to scratch buffer" "S" #'doom/switch-to-scratch-buffer :desc "Eshell" "`" #'+eshell/open
:desc "Sudo this file" "u" #'doom/sudo-this-file :desc "Eshell in popup" "~" #'+eshell/open-popup)
:desc "Sudo find file" "U" #'doom/sudo-find-file
:desc "Eshell popup" "e" #'+eshell/open-popup ;; Add labels to prefixes defined elsewhere
:desc "Eshell open" "E" #'+eshell/open :desc "project" "p" nil
:desc "Reload Private Config" "R" #'doom/reload)
;; Org related bindings (:prefix ("f" . "file")
:desc "Find other file" "a" #'projectile-find-other-file
:desc "Browse private config" "c" #'doom/open-private-config
:desc "Find file in private config" "C" #'doom/find-file-in-private-config
:desc "Open project editorconfig" "." #'editorconfig-find-current-editorconfig
:desc "Find directory" "d" #'dired
:desc "Find file in emacs.d" "e" #'+default/find-in-emacsd
:desc "Browse emacs.d" "E" #'+default/browse-emacsd
:desc "Find file from here" "f" (if (fboundp 'counsel-file-jump) #'counsel-file-jump #'find-file)
:desc "Find file in other project" "F" #'doom/browse-in-other-project
:desc "Find file in project" "p" #'projectile-find-file
:desc "Find file in other project" "P" #'doom/find-file-in-other-project
:desc "Recent files" "r" #'recentf-open-files
:desc "Recent project files" "R" #'projectile-recentf
:desc "Sudo this file" "s" #'doom/sudo-this-file
:desc "Sudo find file" "S" #'doom/sudo-find-file
:desc "Delete this file" "X" #'doom/delete-this-file
:desc "Yank filename" "y" #'+default/yank-buffer-filename)
"o" nil ; we need to unbind it first as Org claims this "o" nil ; we need to unbind it first as Org claims this
(:prefix ("o". "org") (:prefix ("o". "org")
:desc "Do what I mean" "o" #'+org/dwim-at-point :desc "Do what I mean" "o" #'+org/dwim-at-point
@ -86,7 +106,7 @@
:desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex :desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex
:desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf) :desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf)
:desc "Link store" "l" #'org-store-link) :desc "Link store" "l" #'org-store-link)
;; Quit/Restart
(:prefix ("q" . "quit/restart") (:prefix ("q" . "quit/restart")
:desc "Quit Emacs" "q" #'kill-emacs :desc "Quit Emacs" "q" #'kill-emacs
:desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal
@ -94,35 +114,64 @@
:desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit) :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit)
:desc "Restart & restore Emacs" "r" #'doom/restart-and-restore :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore
:desc "Restart Emacs" "R" #'doom/restart) :desc "Restart Emacs" "R" #'doom/restart)
;; Snippets
"&" nil ; yasnippet creates this prefix, we use a different one (:prefix ("&" . "snippets")
(:prefix ("s" . "snippets")
:desc "New snippet" "n" #'yas-new-snippet :desc "New snippet" "n" #'yas-new-snippet
:desc "Insert snippet" "i" #'yas-insert-snippet :desc "Insert snippet" "i" #'yas-insert-snippet
:desc "Find global snippet" "/" #'yas-visit-snippet-file :desc "Find global snippet" "/" #'yas-visit-snippet-file
:desc "Reload snippets" "r" #'yas-reload-all :desc "Reload snippets" "r" #'yas-reload-all
:desc "Create Temp Template" "c" #'aya-create :desc "Create Temp Template" "c" #'aya-create
:desc "Use Temp Template" "e" #'aya-expand) :desc "Use Temp Template" "e" #'aya-expand)
;; Version control bindings
(:prefix ("v" . "versioning") (:prefix ("v" . "versioning")
:desc "Browse issues tracker" "i" #'forge-browse-issues :desc "Git revert file" "R" #'vc-revert
:desc "Browse remote" "o" #'forge-browse-remote (:when (featurep! :ui vc-gutter)
:desc "Diff current file" "d" #'magit-diff-buffer-file
:desc "Git revert hunk" "r" #'git-gutter:revert-hunk :desc "Git revert hunk" "r" #'git-gutter:revert-hunk
:desc "Git stage file" "S" #'magit-stage-file
:desc "Git stage hunk" "s" #'git-gutter:stage-hunk :desc "Git stage hunk" "s" #'git-gutter:stage-hunk
:desc "Git time machine" "t" #'git-timemachine-toggle :desc "Git time machine" "t" #'git-timemachine-toggle
:desc "Git unstage file" "U" #'magit-unstage-file :desc "Jump to next hunk" "n" #'git-gutter:next-hunk
:desc "Initialize repo" "I" #'magit-init :desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk)
:desc "List repositories" "L" #'magit-list-repositories (:when (featurep! :tools magit)
:desc "Magit blame" "b" #'magit-blame-addition :desc "Magit dispatch" "/" #'magit-dispatch
:desc "Magit buffer log" "l" #'magit-log-buffer-file :desc "Forge dispatch" "'" #'forge-dispatch
:desc "Magit commit" "c" #'magit-commit-create
:desc "Magit status" "g" #'magit-status :desc "Magit status" "g" #'magit-status
:desc "Next hunk" "]" #'git-gutter:next-hunk :desc "Magit file delete" "x" #'magit-file-delete
:desc "Previous hunk" "[" #'git-gutter:previous-hunk) :desc "Magit blame" "B" #'magit-blame-addition
;; Worspace and window management bindings :desc "Magit clone" "C" #'+magit/clone
(:prefix ("w". "workspaces") :desc "Magit fetch" "F" #'magit-fetch
:desc "Magit buffer log" "L" #'magit-log
:desc "Git stage file" "S" #'magit-stage-file
:desc "Git unstage file" "U" #'magit-unstage-file
(:prefix ("f" . "find")
:desc "Find file" "f" #'magit-find-file
:desc "Find gitconfig file" "g" #'magit-find-git-config-file
:desc "Find commit" "c" #'magit-show-commit
:desc "Find issue" "i" #'forge-visit-issue
:desc "Find pull request" "p" #'forge-visit-pullreq)
(:prefix ("o" . "open in browser")
:desc "Browse region or line" "." #'+vc/git-browse-region-or-line
:desc "Browse remote" "r" #'forge-browse-remote
:desc "Browse commit" "c" #'forge-browse-commit
:desc "Browse an issue" "i" #'forge-browse-issue
:desc "Browse a pull request" "p" #'forge-browse-pullreq
:desc "Browse issues" "I" #'forge-browse-issues
:desc "Browse pull requests" "P" #'forge-browse-pullreqs)
(:prefix ("l" . "list")
(:when (featurep! :tools gist)
:desc "List gists" "g" #'+gist:list)
:desc "List repositories" "r" #'magit-list-repositories
:desc "List submodules" "s" #'magit-list-submodules
:desc "List issues" "i" #'forge-list-issues
:desc "List pull requests" "p" #'forge-list-pullreqs
:desc "List notifications" "n" #'forge-list-notifications)
(:prefix ("c" . "create")
:desc "Initialize repo" "r" #'magit-init
:desc "Clone repo" "R" #'+magit/clone
:desc "Commit" "c" #'magit-commit-create
:desc "Issue" "i" #'forge-create-issue
:desc "Pull request" "p" #'forge-create-pullreq)))
(:prefix ("w" . "workspaces/windows")
:desc "Autosave session" "a" #'doom/quicksave-session :desc "Autosave session" "a" #'doom/quicksave-session
:desc "Display workspaces" "d" #'+workspace/display :desc "Display workspaces" "d" #'+workspace/display
:desc "Rename workspace" "r" #'+workspace/rename :desc "Rename workspace" "r" #'+workspace/rename
@ -148,7 +197,7 @@
:desc "Switch to workspace 8" "8" (λ! (+workspace/switch-to 7)) :desc "Switch to workspace 8" "8" (λ! (+workspace/switch-to 7))
:desc "Switch to workspace 9" "9" (λ! (+workspace/switch-to 8)) :desc "Switch to workspace 9" "9" (λ! (+workspace/switch-to 8))
:desc "Switch to last workspace" "0" #'+workspace/switch-to-last) :desc "Switch to last workspace" "0" #'+workspace/switch-to-last)
;; Multiple Cursors
(:when (featurep! :editor multiple-cursors) (:when (featurep! :editor multiple-cursors)
(:prefix ("m" . "multiple cursors") (:prefix ("m" . "multiple cursors")
:desc "Edit lines" "l" #'mc/edit-lines :desc "Edit lines" "l" #'mc/edit-lines
@ -165,42 +214,43 @@
:desc "Add cursor w/mouse" "<mouse-1>" #'mc/add-cursor-on-click)) :desc "Add cursor w/mouse" "<mouse-1>" #'mc/add-cursor-on-click))
;; APPs ;; APPs
;; Email
(:when (featurep! :app email) (:when (featurep! :app email)
(:prefix ("M" . "email") (:prefix ("M" . "email")
:desc "Open email app" "m" #'=email :desc "Open email app" "M" #'=email
:desc "Compose email" "c" #'+email/compose)) :desc "Compose email" "c" #'+email/compose))
;; IRC
(:when (featurep! :app irc) (:when (featurep! :app irc)
(:prefix ("I" . "irc") (:prefix ("I" . "irc")
:desc "Open irc app" "i" #'=irc :desc "Open irc app" "I" #'=irc
:desc "Next unread buffer" "a" #'tracking-next-buffer :desc "Next unread buffer" "a" #'tracking-next-buffer
:desc "Quit irc" "q" #'+irc/quit :desc "Quit irc" "q" #'+irc/quit
:desc "Reconnect all" "r" #'circe-reconnect-all :desc "Reconnect all" "r" #'circe-reconnect-all
:desc "Send message" "s" #'+irc/send-message :desc "Send message" "s" #'+irc/send-message
(:when (featurep! :completion ivy) (:when (featurep! :completion ivy)
:desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel)))
;; Twitter
(:when (featurep! :app twitter) (:when (featurep! :app twitter)
(:prefix ("T" . "twitter") (:prefix ("T" . "twitter")
:desc "Open twitter app" "t" #'=twitter :desc "Open twitter app" "T" #'=twitter
:desc "Quit twitter" "q" #'+twitter/quit :desc "Quit twitter" "q" #'+twitter/quit
:desc "Rerender twits" "r" #'+twitter/rerender-all :desc "Rerender twits" "r" #'+twitter/rerender-all
:desc "Ace link" "l" #'+twitter/ace-link))) :desc "Ace link" "l" #'+twitter/ace-link)))
;; Plugins
;; misc plugins ;;
(:when (featurep! :ui neotree) ;;; Plugins
"<f9>" #'+neotree/open)
(:when (featurep! :ui treemacs) (map! "C-=" #'er/expand-region
"<f9>" #'+treemacs/toggle)
"C-=" #'er/expand-region
"C--" #'er/contract-region "C--" #'er/contract-region
(:when (featurep! :ui neotree)
"<f9>" #'+neotree/open
"<F-f9>" #'+neotree/find-this-file)
(:when (featurep! :ui treemacs)
"<f9>" #'+treemacs/open
"<F-f9>" #'+treemacs/find-file)
;; smartparens ;; smartparens
(:after smartparens (:after smartparens
(:map smartparens-mode-map :map smartparens-mode-map
"C-M-a" #'sp-beginning-of-sexp "C-M-a" #'sp-beginning-of-sexp
"C-M-e" #'sp-end-of-sexp "C-M-e" #'sp-end-of-sexp
"C-M-f" #'sp-forward-sexp "C-M-f" #'sp-forward-sexp
@ -211,28 +261,22 @@
"C-<right>" #'sp-forward-slurp-sexp "C-<right>" #'sp-forward-slurp-sexp
"M-<right>" #'sp-forward-barf-sexp "M-<right>" #'sp-forward-barf-sexp
"C-<left>" #'sp-backward-slurp-sexp "C-<left>" #'sp-backward-slurp-sexp
"M-<left>" #'sp-backward-barf-sexp)) "M-<left>" #'sp-backward-barf-sexp)
;; company mode ;; company mode
"C-;" #'+company/complete "C-;" #'+company/complete
;; Counsel ;; Counsel
(:when (featurep! :completion ivy) (:when (featurep! :completion ivy)
(:after counsel (:after counsel
(:map counsel-ag-map :map counsel-ag-map
[backtab] #'+ivy/wgrep-occur ; search/replace on results [backtab] #'+ivy/wgrep-occur ; search/replace on results
"C-SPC" #'ivy-call-and-recenter ; preview "C-SPC" #'ivy-call-and-recenter ; preview
"M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action)) "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action))
"C-h b" #'counsel-descbinds "C-M-y" #'counsel-yank-pop)
"C-M-y" #'counsel-yank-pop
"C-h F" #'counsel-faces
"C-h p" #'counsel-package
"C-h a" #'counsel-apropos
"C-h V" #'counsel-set-variable
"C-'" #'counsel-imenu))
;; repl toggle ;; repl toggle
"C-c C-z" #'+eval/open-repl-other-window "C-c C-z" #'+eval/open-repl-other-window
;; company mode ;; company mode
(:after company (:after company
(:map company-active-map :map company-active-map
"C-o" #'company-search-kill-others "C-o" #'company-search-kill-others
"C-n" #'company-select-next "C-n" #'company-select-next
"C-p" #'company-select-previous "C-p" #'company-select-previous
@ -243,16 +287,15 @@
"<C-tab>" #'company-complete-common-or-cycle "<C-tab>" #'company-complete-common-or-cycle
[tab] #'company-complete-common-or-cycle [tab] #'company-complete-common-or-cycle
[backtab] #'company-select-previous [backtab] #'company-select-previous
"C-RET" #'counsel-company) "C-RET" #'counsel-company
(:map company-search-map :map company-search-map
"C-n" #'company-search-repeat-forward "C-n" #'company-search-repeat-forward
"C-p" #'company-search-repeat-backward "C-p" #'company-search-repeat-backward
"C-s" (λ! (company-search-abort) (company-filter-candidates)))) "C-s" (λ! (company-search-abort) (company-filter-candidates)))
;; neotree bindings ;; neotree bindings
(:after neotree (:after neotree
:map neotree-mode-map :map neotree-mode-map
"q" #'neotree-hide "q" #'neotree-hide
[return] #'neotree-enter
"RET" #'neotree-enter "RET" #'neotree-enter
"SPC" #'neotree-quick-look "SPC" #'neotree-quick-look
"v" #'neotree-enter-vertical-split "v" #'neotree-enter-vertical-split
@ -270,38 +313,38 @@
"P" #'neotree-select-previous-sibling-node) "P" #'neotree-select-previous-sibling-node)
;; help and info ;; help and info
(:after help-mode (:after help-mode
(:map help-mode-map :map help-mode-map
"o" #'ace-link-help "o" #'ace-link-help
">" #'help-go-forward ">" #'help-go-forward
"<" #'help-go-back)) "<" #'help-go-back)
(:after helpful-mode (:after helpful-mode
(:map helpful-mode-map :map helpful-mode-map
"o" #'ace-link-help)) "o" #'ace-link-help)
(:after info (:after info
(:map Info-mode-map :map Info-mode-map
"o" #'ace-link-info)) "o" #'ace-link-info)
;; yasnippet ;; yasnippet
(:after yasnippet (:after yasnippet
;; keymap while editing an inserted snippet ;; keymap while editing an inserted snippet
(:map yas-keymap :map yas-keymap
"C-e" #'+snippets/goto-end-of-field "C-e" #'+snippets/goto-end-of-field
"C-a" #'+snippets/goto-start-of-field "C-a" #'+snippets/goto-start-of-field
"<S-tab>" #'yas-prev-field "<S-tab>" #'yas-prev-field
"<M-backspace>" #'+snippets/delete-to-start-of-field "<M-backspace>" #'+snippets/delete-to-start-of-field
[backspace] #'+snippets/delete-backward-char [backspace] #'+snippets/delete-backward-char
[delete] #'+snippets/delete-forward-char-or-field)) [delete] #'+snippets/delete-forward-char-or-field)
;; flycheck ;; flycheck
(:after flycheck (:after flycheck
(:map flycheck-error-list-mode-map :map flycheck-error-list-mode-map
"C-n" #'flycheck-error-list-next-error "C-n" #'flycheck-error-list-next-error
"C-p" #'flycheck-error-list-previous-error "C-p" #'flycheck-error-list-previous-error
"RET" #'flycheck-error-list-goto-error)) "RET" #'flycheck-error-list-goto-error)
;; ivy ;; ivy
(:after ivy (:after ivy
(:map ivy-minibuffer-map :map ivy-minibuffer-map
"TAB" #'ivy-alt-done "TAB" #'ivy-alt-done
"C-g" #'keyboard-escape-quit)) "C-g" #'keyboard-escape-quit)
;; ein notebokks ;; ein notebokks
(:after ein:notebook-multilang (:after ein:notebook-multilang
(:map ein:notebook-multilang-mode-map :map ein:notebook-multilang-mode-map
"C-c h" #'+ein/hydra/body))) "C-c h" #'+ein/hydra/body))

View file

@ -17,6 +17,14 @@
(funcall runner beg end) (funcall runner beg end)
(quickrun-region beg end)))) (quickrun-region beg end))))
;;;###autoload
(defun +eval/line-or-region ()
"Evaluate the current line or selected region."
(interactive)
(if (use-region-p)
(call-interactively #'+eval/region)
(+eval/region (line-beginning-position) (line-end-position))))
;;;###autoload ;;;###autoload
(defun +eval/buffer-or-region () (defun +eval/buffer-or-region ()
"Evaluate the whole buffer." "Evaluate the whole buffer."