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

View file

@ -17,6 +17,14 @@
(funcall runner 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
(defun +eval/buffer-or-region ()
"Evaluate the whole buffer."