💥 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,307 +1,350 @@
;;; 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))
(which-key-add-key-based-replacements "C-c !" "checking") (after! which-key
(which-key-add-key-based-replacements "C-c e" "perspective") (which-key-add-key-based-replacements "C-c !" "checking")
(which-key-add-key-based-replacements "C-c p" "projectile") (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! ;;
;; Text scaling ;;; Global keybinds
"<C-mouse-4>" #'text-scale-increase
"<C-mouse-5>" #'text-scale-decrease
"<C-down-mouse-2>" (λ! (text-scale-set 0))
"M-+" (λ! (text-scale-set 0))
"M-=" #'text-scale-increase
"M--" #'text-scale-decrease
;; Editor related bindings
[remap newline] #'newline-and-indent
"C-j" #'+default/newline
(:when (featurep! :completion ivy)
"C-S-s" #'swiper
"C-S-r" #'ivy-resume)
(:when (featurep! :completion helm)
"C-S-s" #'swiper-helm
"C-S-r" #'helm-resume)
;; Buffer related bindings
"C-x b" #'persp-switch-to-buffer
(:when (featurep! :completion ivy)
"C-x 4 b" #'+ivy/switch-workspace-buffer-other-window)
"C-x C-b" #'ibuffer-list-buffers
"C-x B" #'switch-to-buffer
"C-x 4 B" #'switch-to-buffer-other-window
"C-x k" #'doom/kill-this-buffer-in-all-windows
;; 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
"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
:desc "Sync org caldav" "s" #'org-caldav-sync
(:prefix ("a" . "org agenda")
:desc "Agenda" "a" #'org-agenda
:desc "Todo list" "t" #'org-todo-list
:desc "Tags view" "m" #'org-tags-view
:desc "View search" "v" #'org-search-view)
:desc "Capture" "c" #'org-capture
:desc "Goto capture" "C" (λ! (require 'org-capture) (call-interactively #'org-capture-goto-target))
:desc "Switch org buffers" "b" #'org-switchb
(:prefix ("e" . "org export")
:desc "Export beamer to latex" "l b" #'org-beamer-export-to-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 "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
(:when (featurep! :feature workspaces)
: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")
: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 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 "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 "Autosave session" "a" #'doom/quicksave-session
:desc "Display workspaces" "d" #'+workspace/display
:desc "Rename workspace" "r" #'+workspace/rename
:desc "Create workspace" "c" #'+workspace/new
:desc "Delete workspace" "k" #'+workspace/delete
:desc "Save session" "s" #'doom/save-session
:desc "Save workspace" "S" #'+workspace/save
:desc "Load session" "l" #'doom/load-session
:desc "Load last autosaved session" "L" #'doom/quickload-session
:desc "Kill other buffers" "o" #'doom/kill-other-buffers
:desc "Undo window config" "u" #'winner-undo
:desc "Redo window config" "U" #'winner-redo
:desc "Switch to left workspace" "p" #'+workspace/switch-left
:desc "Switch to right workspace" "n" #'+workspace/switch-right
:desc "Switch to" "w" #'+workspace/switch-to
:desc "Switch to workspace 1" "1" (λ! (+workspace/switch-to 0))
:desc "Switch to workspace 2" "2" (λ! (+workspace/switch-to 1))
:desc "Switch to workspace 3" "3" (λ! (+workspace/switch-to 2))
:desc "Switch to workspace 4" "4" (λ! (+workspace/switch-to 3))
:desc "Switch to workspace 5" "5" (λ! (+workspace/switch-to 4))
:desc "Switch to workspace 6" "6" (λ! (+workspace/switch-to 5))
:desc "Switch to workspace 7" "7" (λ! (+workspace/switch-to 6))
: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
:desc "Mark next" "n" #'mc/mark-next-like-this
:desc "Unmark next" "N" #'mc/unmark-next-like-this
:desc "Mark previous" "p" #'mc/mark-previous-like-this
:desc "Unmark previous" "P" #'mc/unmark-previous-like-this
:desc "Mark all" "t" #'mc/mark-all-like-this
:desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim
:desc "Edit line endings" "e" #'mc/edit-ends-of-lines
:desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines
:desc "Mark tag" "s" #'mc/mark-sgml-tag-pair
:desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun
:desc "Add cursor w/mouse" "<mouse-1>" #'mc/add-cursor-on-click))
;; APPs (map! "C-'" #'imenu
;; Text scaling
"<C-mouse-4>" #'text-scale-increase
"<C-mouse-5>" #'text-scale-decrease
"<C-down-mouse-2>" (λ! (text-scale-set 0))
"M-+" (λ! (text-scale-set 0))
"M-=" #'text-scale-increase
"M--" #'text-scale-decrease
;; Editor related bindings
[remap newline] #'newline-and-indent
"C-j" #'+default/newline
(:when (featurep! :completion ivy)
"C-S-s" #'swiper
"C-S-r" #'ivy-resume)
(:when (featurep! :completion helm)
"C-S-s" #'swiper-helm
"C-S-r" #'helm-resume)
;; Buffer related bindings
"C-x b" #'persp-switch-to-buffer
(:when (featurep! :completion ivy)
"C-x 4 b" #'+ivy/switch-workspace-buffer-other-window)
"C-x C-b" #'ibuffer-list-buffers
"C-x B" #'switch-to-buffer
"C-x 4 B" #'switch-to-buffer-other-window
"C-x k" #'doom/kill-this-buffer-in-all-windows
;; Popup bindigns
"C-x p" #'+popup/other
"C-`" #'+popup/toggle
"C-~" #'+popup/raise)
;; Email
(:when (featurep! :app email)
(:prefix ("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 "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 "Quit twitter" "q" #'+twitter/quit
:desc "Rerender twits" "r" #'+twitter/rerender-all
:desc "Ace link" "l" #'+twitter/ace-link)))
;; Plugins ;;
;;; Leader keys
;; misc plugins (map! :leader
(:when (featurep! :ui neotree) :desc "Find file in project" "C-f" #'projectile-find-file
"<f9>" #'+neotree/open) :desc "Evaluate line/region" "e" #'+eval/line-or-region
(:when (featurep! :ui treemacs) :desc "Pop up scratch buffer" "x" #'doom/open-to-scratch-buffer
"<f9>" #'+treemacs/toggle) :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer
"C-=" #'er/expand-region
"C--" #'er/contract-region (:when (featurep! :emacs term)
;; smartparens :desc "Terminal" "`" #'+term/open
(:after smartparens :desc "Terminal in popup" "~" #'+term/open-popup-in-project)
(:map smartparens-mode-map (:when (featurep! :tools vterm)
"C-M-a" #'sp-beginning-of-sexp :desc "Terminal" "`" #'+vterm/open
"C-M-e" #'sp-end-of-sexp :desc "Terminal in popup" "~" #'+vterm/open-popup-in-project)
"C-M-f" #'sp-forward-sexp (:when (featurep! :emacs eshell)
"C-M-b" #'sp-backward-sexp :desc "Eshell" "`" #'+eshell/open
"C-M-d" #'sp-splice-sexp :desc "Eshell in popup" "~" #'+eshell/open-popup)
"C-M-k" #'sp-kill-sexp
"C-M-t" #'sp-transpose-sexp ;; Add labels to prefixes defined elsewhere
"C-<right>" #'sp-forward-slurp-sexp :desc "project" "p" nil
"M-<right>" #'sp-forward-barf-sexp
"C-<left>" #'sp-backward-slurp-sexp (:prefix ("f" . "file")
"M-<left>" #'sp-backward-barf-sexp)) :desc "Find other file" "a" #'projectile-find-other-file
;; company mode :desc "Browse private config" "c" #'doom/open-private-config
"C-;" #'+company/complete :desc "Find file in private config" "C" #'doom/find-file-in-private-config
;; Counsel :desc "Open project editorconfig" "." #'editorconfig-find-current-editorconfig
(:when (featurep! :completion ivy) :desc "Find directory" "d" #'dired
(:after counsel :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd
(:map counsel-ag-map :desc "Browse emacs.d" "E" #'+default/browse-emacsd
[backtab] #'+ivy/wgrep-occur ; search/replace on results :desc "Find file from here" "f" (if (fboundp 'counsel-file-jump) #'counsel-file-jump #'find-file)
"C-SPC" #'ivy-call-and-recenter ; preview :desc "Find file in other project" "F" #'doom/browse-in-other-project
"M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action)) :desc "Find file in project" "p" #'projectile-find-file
"C-h b" #'counsel-descbinds :desc "Find file in other project" "P" #'doom/find-file-in-other-project
"C-M-y" #'counsel-yank-pop :desc "Recent files" "r" #'recentf-open-files
"C-h F" #'counsel-faces :desc "Recent project files" "R" #'projectile-recentf
"C-h p" #'counsel-package :desc "Sudo this file" "s" #'doom/sudo-this-file
"C-h a" #'counsel-apropos :desc "Sudo find file" "S" #'doom/sudo-find-file
"C-h V" #'counsel-set-variable :desc "Delete this file" "X" #'doom/delete-this-file
"C-'" #'counsel-imenu)) :desc "Yank filename" "y" #'+default/yank-buffer-filename)
;; repl toggle
"C-c C-z" #'+eval/open-repl-other-window "o" nil ; we need to unbind it first as Org claims this
;; company mode (:prefix ("o". "org")
(:after company :desc "Do what I mean" "o" #'+org/dwim-at-point
(:map company-active-map :desc "Sync org caldav" "s" #'org-caldav-sync
"C-o" #'company-search-kill-others (:prefix ("a" . "org agenda")
"C-n" #'company-select-next :desc "Agenda" "a" #'org-agenda
"C-p" #'company-select-previous :desc "Todo list" "t" #'org-todo-list
"C-h" #'company-quickhelp-manual-begin :desc "Tags view" "m" #'org-tags-view
"C-S-h" #'company-show-doc-buffer :desc "View search" "v" #'org-search-view)
"C-s" #'company-search-candidates :desc "Capture" "c" #'org-capture
"M-s" #'company-filter-candidates :desc "Goto capture" "C" (λ! (require 'org-capture) (call-interactively #'org-capture-goto-target))
"<C-tab>" #'company-complete-common-or-cycle :desc "Switch org buffers" "b" #'org-switchb
[tab] #'company-complete-common-or-cycle (:prefix ("e" . "org export")
[backtab] #'company-select-previous :desc "Export beamer to latex" "l b" #'org-beamer-export-to-latex
"C-RET" #'counsel-company) :desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex
(:map company-search-map :desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf)
"C-n" #'company-search-repeat-forward :desc "Link store" "l" #'org-store-link)
"C-p" #'company-search-repeat-backward
"C-s" (λ! (company-search-abort) (company-filter-candidates)))) (:prefix ("q" . "quit/restart")
;; neotree bindings :desc "Quit Emacs" "q" #'kill-emacs
(:after neotree :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal
:map neotree-mode-map (:when (featurep! :feature workspaces)
"q" #'neotree-hide :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit)
[return] #'neotree-enter :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore
"RET" #'neotree-enter :desc "Restart Emacs" "R" #'doom/restart)
"SPC" #'neotree-quick-look
"v" #'neotree-enter-vertical-split (:prefix ("&" . "snippets")
"s" #'neotree-enter-horizontal-split :desc "New snippet" "n" #'yas-new-snippet
"c" #'neotree-create-node :desc "Insert snippet" "i" #'yas-insert-snippet
"D" #'neotree-delete-node :desc "Find global snippet" "/" #'yas-visit-snippet-file
"g" #'neotree-refresh :desc "Reload snippets" "r" #'yas-reload-all
"r" #'neotree-rename-node :desc "Create Temp Template" "c" #'aya-create
"R" #'neotree-refresh :desc "Use Temp Template" "e" #'aya-expand)
"h" #'+neotree/collapse-or-up
"l" #'+neotree/expand-or-open (:prefix ("v" . "versioning")
"n" #'neotree-next-line :desc "Git revert file" "R" #'vc-revert
"p" #'neotree-previous-line (:when (featurep! :ui vc-gutter)
"N" #'neotree-select-next-sibling-node :desc "Git revert hunk" "r" #'git-gutter:revert-hunk
"P" #'neotree-select-previous-sibling-node) :desc "Git stage hunk" "s" #'git-gutter:stage-hunk
;; help and info :desc "Git time machine" "t" #'git-timemachine-toggle
(:after help-mode :desc "Jump to next hunk" "n" #'git-gutter:next-hunk
(:map help-mode-map :desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk)
"o" #'ace-link-help (:when (featurep! :tools magit)
">" #'help-go-forward :desc "Magit dispatch" "/" #'magit-dispatch
"<" #'help-go-back)) :desc "Forge dispatch" "'" #'forge-dispatch
(:after helpful-mode :desc "Magit status" "g" #'magit-status
(:map helpful-mode-map :desc "Magit file delete" "x" #'magit-file-delete
"o" #'ace-link-help)) :desc "Magit blame" "B" #'magit-blame-addition
(:after info :desc "Magit clone" "C" #'+magit/clone
(:map Info-mode-map :desc "Magit fetch" "F" #'magit-fetch
"o" #'ace-link-info)) :desc "Magit buffer log" "L" #'magit-log
;; yasnippet :desc "Git stage file" "S" #'magit-stage-file
(:after yasnippet :desc "Git unstage file" "U" #'magit-unstage-file
;; keymap while editing an inserted snippet (:prefix ("f" . "find")
(:map yas-keymap :desc "Find file" "f" #'magit-find-file
"C-e" #'+snippets/goto-end-of-field :desc "Find gitconfig file" "g" #'magit-find-git-config-file
"C-a" #'+snippets/goto-start-of-field :desc "Find commit" "c" #'magit-show-commit
"<S-tab>" #'yas-prev-field :desc "Find issue" "i" #'forge-visit-issue
"<M-backspace>" #'+snippets/delete-to-start-of-field :desc "Find pull request" "p" #'forge-visit-pullreq)
[backspace] #'+snippets/delete-backward-char (:prefix ("o" . "open in browser")
[delete] #'+snippets/delete-forward-char-or-field)) :desc "Browse region or line" "." #'+vc/git-browse-region-or-line
;; flycheck :desc "Browse remote" "r" #'forge-browse-remote
(:after flycheck :desc "Browse commit" "c" #'forge-browse-commit
(:map flycheck-error-list-mode-map :desc "Browse an issue" "i" #'forge-browse-issue
"C-n" #'flycheck-error-list-next-error :desc "Browse a pull request" "p" #'forge-browse-pullreq
"C-p" #'flycheck-error-list-previous-error :desc "Browse issues" "I" #'forge-browse-issues
"RET" #'flycheck-error-list-goto-error)) :desc "Browse pull requests" "P" #'forge-browse-pullreqs)
;; ivy (:prefix ("l" . "list")
(:after ivy (:when (featurep! :tools gist)
(:map ivy-minibuffer-map :desc "List gists" "g" #'+gist:list)
"TAB" #'ivy-alt-done :desc "List repositories" "r" #'magit-list-repositories
"C-g" #'keyboard-escape-quit)) :desc "List submodules" "s" #'magit-list-submodules
;; ein notebokks :desc "List issues" "i" #'forge-list-issues
(:after ein:notebook-multilang :desc "List pull requests" "p" #'forge-list-pullreqs
(:map ein:notebook-multilang-mode-map :desc "List notifications" "n" #'forge-list-notifications)
"C-c h" #'+ein/hydra/body))) (: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
:desc "Create workspace" "c" #'+workspace/new
:desc "Delete workspace" "k" #'+workspace/delete
:desc "Save session" "s" #'doom/save-session
:desc "Save workspace" "S" #'+workspace/save
:desc "Load session" "l" #'doom/load-session
:desc "Load last autosaved session" "L" #'doom/quickload-session
:desc "Kill other buffers" "o" #'doom/kill-other-buffers
:desc "Undo window config" "u" #'winner-undo
:desc "Redo window config" "U" #'winner-redo
:desc "Switch to left workspace" "p" #'+workspace/switch-left
:desc "Switch to right workspace" "n" #'+workspace/switch-right
:desc "Switch to" "w" #'+workspace/switch-to
:desc "Switch to workspace 1" "1" (λ! (+workspace/switch-to 0))
:desc "Switch to workspace 2" "2" (λ! (+workspace/switch-to 1))
:desc "Switch to workspace 3" "3" (λ! (+workspace/switch-to 2))
:desc "Switch to workspace 4" "4" (λ! (+workspace/switch-to 3))
:desc "Switch to workspace 5" "5" (λ! (+workspace/switch-to 4))
:desc "Switch to workspace 6" "6" (λ! (+workspace/switch-to 5))
:desc "Switch to workspace 7" "7" (λ! (+workspace/switch-to 6))
: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)
(:when (featurep! :editor multiple-cursors)
(:prefix ("m" . "multiple cursors")
:desc "Edit lines" "l" #'mc/edit-lines
:desc "Mark next" "n" #'mc/mark-next-like-this
:desc "Unmark next" "N" #'mc/unmark-next-like-this
:desc "Mark previous" "p" #'mc/mark-previous-like-this
:desc "Unmark previous" "P" #'mc/unmark-previous-like-this
:desc "Mark all" "t" #'mc/mark-all-like-this
:desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim
:desc "Edit line endings" "e" #'mc/edit-ends-of-lines
:desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines
:desc "Mark tag" "s" #'mc/mark-sgml-tag-pair
:desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun
:desc "Add cursor w/mouse" "<mouse-1>" #'mc/add-cursor-on-click))
;; APPs
(:when (featurep! :app email)
(:prefix ("M" . "email")
:desc "Open email app" "M" #'=email
:desc "Compose email" "c" #'+email/compose))
(:when (featurep! :app irc)
(:prefix ("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)))
(:when (featurep! :app twitter)
(:prefix ("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
(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
"C-M-a" #'sp-beginning-of-sexp
"C-M-e" #'sp-end-of-sexp
"C-M-f" #'sp-forward-sexp
"C-M-b" #'sp-backward-sexp
"C-M-d" #'sp-splice-sexp
"C-M-k" #'sp-kill-sexp
"C-M-t" #'sp-transpose-sexp
"C-<right>" #'sp-forward-slurp-sexp
"M-<right>" #'sp-forward-barf-sexp
"C-<left>" #'sp-backward-slurp-sexp
"M-<left>" #'sp-backward-barf-sexp)
;; company mode
"C-;" #'+company/complete
;; Counsel
(:when (featurep! :completion ivy)
(:after counsel
: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-M-y" #'counsel-yank-pop)
;; repl toggle
"C-c C-z" #'+eval/open-repl-other-window
;; company mode
(:after company
:map company-active-map
"C-o" #'company-search-kill-others
"C-n" #'company-select-next
"C-p" #'company-select-previous
"C-h" #'company-quickhelp-manual-begin
"C-S-h" #'company-show-doc-buffer
"C-s" #'company-search-candidates
"M-s" #'company-filter-candidates
"<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-n" #'company-search-repeat-forward
"C-p" #'company-search-repeat-backward
"C-s" (λ! (company-search-abort) (company-filter-candidates)))
;; neotree bindings
(:after neotree
:map neotree-mode-map
"q" #'neotree-hide
"RET" #'neotree-enter
"SPC" #'neotree-quick-look
"v" #'neotree-enter-vertical-split
"s" #'neotree-enter-horizontal-split
"c" #'neotree-create-node
"D" #'neotree-delete-node
"g" #'neotree-refresh
"r" #'neotree-rename-node
"R" #'neotree-refresh
"h" #'+neotree/collapse-or-up
"l" #'+neotree/expand-or-open
"n" #'neotree-next-line
"p" #'neotree-previous-line
"N" #'neotree-select-next-sibling-node
"P" #'neotree-select-previous-sibling-node)
;; help and info
(:after help-mode
:map help-mode-map
"o" #'ace-link-help
">" #'help-go-forward
"<" #'help-go-back)
(:after helpful-mode
:map helpful-mode-map
"o" #'ace-link-help)
(:after info
:map Info-mode-map
"o" #'ace-link-info)
;; yasnippet
(:after yasnippet
;; keymap while editing an inserted snippet
: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)
;; flycheck
(:after flycheck
: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)
;; ivy
(:after ivy
:map ivy-minibuffer-map
"TAB" #'ivy-alt-done
"C-g" #'keyboard-escape-quit)
;; ein notebokks
(:after ein:notebook-multilang
:map ein:notebook-multilang-mode-map
"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."