From fbe782df22786d0a012d089da40c68308c3320ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 27 May 2017 14:49:06 +0200 Subject: [PATCH] Heavily redesign keybinding design + SPC and SPC m as leader/localleader (spacemacs-ey) + Move all custom keybindings to private +bindings.el file + Redesign+rearrange keybindings --- core/core-keybinds.el | 8 +- modules/completion/company/config.el | 28 -- modules/completion/ivy/config.el | 18 - modules/feature/debug/config.el | 19 - modules/feature/evil/config.el | 74 +-- modules/feature/snippets/config.el | 17 - modules/feature/spellcheck/config.el | 7 +- modules/feature/syntax-checker/config.el | 7 - modules/feature/version-control/+git.el | 16 +- modules/feature/version-control/config.el | 13 +- modules/private/hlissner/+bindings.el | 525 +++++++++++++++++----- modules/private/hlissner/config.el | 39 -- modules/tools/gist/config.el | 11 - 13 files changed, 425 insertions(+), 357 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 51ed5e1a9..29b2ab06c 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -4,11 +4,11 @@ ;; available keys, and `evil', if it's enabled. All built into one powerful ;; macro: `map!'. -(defvar doom-leader-key "," +(defvar doom-leader-key "SPC" "The leader prefix key, for global commands.") -(defvar doom-localleader-key "\\" - "The leader prefix key, for global commands.") +(defvar doom-localleader-key "SPC m" + "The localleader prefix key, for major-mode specific commands.") (defvar doom-evil-state-alist '(("n" . normal) @@ -25,7 +25,7 @@ (def-package! which-key :demand t :config - (setq which-key-sort-order #'which-key-key-order-alpha + (setq which-key-sort-order #'which-key-prefix-then-key-order which-key-sort-uppercase-first nil which-key-add-column-padding 1 which-key-max-display-columns nil diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 8e308631c..d6736aabf 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -41,34 +41,6 @@ (after! yasnippet (nconc company-backends '(company-yasnippet))) - (map! (:map company-active-map - ;; Don't interfere with `evil-delete-backward-word' in insert mode - "C-w" nil - - "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-s" #'company-search-candidates - "C-s" #'company-filter-candidates - "C-SPC" #'company-complete-common - "C-h" #'company-quickhelp-manual-begin - [tab] #'company-complete-common-or-cycle - [backtab] #'company-select-previous - [escape] (λ! (company-abort) (evil-normal-state 1))) - - ;; Automatically applies to `company-filter-map' - (:map company-search-map - "C-n" #'company-search-repeat-forward - "C-p" #'company-search-repeat-backward - "C-s" (λ! (company-search-abort) (company-filter-candidates)) - [escape] #'company-search-abort)) - - ;; TAB auto-completion in term buffers - (after! comint - (map! :map comint-mode-map [tab] #'company-complete)) - (global-company-mode +1)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 76ec0b56a..d390e38e8 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -40,19 +40,6 @@ session)." (ivy-mode +1) - (map! :map ivy-minibuffer-map - [escape] #'keyboard-escape-quit - "M-v" #'yank - "M-z" #'undo - "C-r" #'evil-paste-from-register - "C-k" #'ivy-previous-line - "C-j" #'ivy-next-line - "C-l" #'ivy-alt-done - "C-w" #'+ivy/backward-kill-word - "C-u" #'doom/minibuffer-kill-line - "C-b" #'backward-word - "C-f" #'forward-word) - (map! :map ivy-mode-map [remap describe-face] #'counsel-describe-face [remap find-file] #'counsel-find-file @@ -99,11 +86,6 @@ session)." cmd '(("O" +ivy-git-grep-other-window-action "open in other window")))) - (map! :map counsel-ag-map - [backtab] #'+ivy/wgrep-occur ; search/replace on results - "C-SPC" #'counsel-git-grep-recenter ; preview - "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action)) - (advice-add #'counsel-ag-function :override #'+ivy*counsel-ag-function)) diff --git a/modules/feature/debug/config.el b/modules/feature/debug/config.el index 293d99e5c..722ee9c18 100644 --- a/modules/feature/debug/config.el +++ b/modules/feature/debug/config.el @@ -1,27 +1,8 @@ ;;; feature/debug/config.el -(after! debug - ;; For elisp debugging - (map! :map debugger-mode-map - :n "RET" #'debug-help-follow - :n "n" #'debugger-step-through - :n "c" #'debugger-continue)) - - (def-package! realgud :commands (realgud:gdb realgud:trepanjs realgud:bashdb realgud:zshdb) :config - (map! :map realgud:shortkey-mode-map - :n "j" #'evil-next-line - :n "k" #'evil-previous-line - :n "h" #'evil-backward-char - :n "l" #'evil-forward-char - :m "n" #'realgud:cmd-next - :m "b" #'realgud:cmd-break - :m "B" #'realgud:cmd-clear - :n "c" #'realgud:cmd-continue) - - ;; Popup rules (set! :popup '("^\\*\\(g\\|zsh\\|bash\\)db.*?\\*$" :size 20 :regexp t) '("^\\*trepanjs.*?\\*$" :size 20 :regexp t)) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e3a1e4913..4f05cf049 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -74,22 +74,12 @@ table))) (add-hook 'minibuffer-inactive-mode-hook #'minibuffer-inactive-mode-hook-setup) - (defsubst +evil--textobj (key inner-fn &optional outer-fn) - "Define a text object." - (declare (indent defun)) - (define-key evil-inner-text-objects-map key inner-fn) - (define-key evil-outer-text-objects-map key (or outer-fn inner-fn))) - ;; --- keybind fixes ---------------------- - (map! ;; undo/redo for visual regions - :v "C-u" #'undo-tree-undo - :v "C-r" #'undo-tree-redo - - (:after wgrep - ;; a wrapper that invokes `wgrep-mark-deletion' across lines - ;; you use `evil-delete' on. - :map wgrep-mode-map [remap evil-delete] #'+evil-delete)) + (after! wgrep + ;; a wrapper that invokes `wgrep-mark-deletion' across lines + ;; you use `evil-delete' on. + (map! :map wgrep-mode-map [remap evil-delete] #'+evil-delete)) ;; --- evil hacks ------------------------- @@ -183,8 +173,7 @@ across windows." (def-package! evil-args :commands (evil-inner-arg evil-outer-arg evil-forward-arg evil-backward-arg - evil-jump-out-args) - :init (+evil--textobj "a" #'evil-inner-arg #'evil-outer-arg)) + evil-jump-out-args)) (def-package! evil-commentary @@ -301,19 +290,15 @@ across windows." evil-indent-plus-i-indent-up evil-indent-plus-a-indent-up evil-indent-plus-i-indent-up-down - evil-indent-plus-a-indent-up-down) - :init - (+evil--textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent) - (+evil--textobj "I" #'evil-indent-plus-i-indent-up #'evil-indent-plus-a-indent-up) - (+evil--textobj "J" #'evil-indent-plus-i-indent-up-down #'evil-indent-plus-a-indent-up-down)) + evil-indent-plus-a-indent-up-down)) (def-package! evil-matchit :commands (evilmi-jump-items evilmi-text-object global-evil-matchit-mode) :config (global-evil-matchit-mode 1) :init - (map! :m "%" #'evilmi-jump-items) - (+evil--textobj "%" #'evilmi-text-object) + (map! [remap evil-jump-item] #'evilmi-jump-items + :textobj "%" #'evilmi-text-object #'evilmi-text-object) :config (defun +evil|simple-matchit () "A hook to force evil-matchit to favor simple bracket jumping. Helpful when @@ -365,10 +350,7 @@ the new algorithm is confusing, like in python or ruby." (def-package! evil-textobj-anyblock - :init - (+evil--textobj "B" - #'evil-textobj-anyblock-inner-block - #'evil-textobj-anyblock-a-block)) + :commands (evil-textobj-anyblock-inner-block evil-textobj-anyblock-a-block)) (def-package! evil-snipe :demand t @@ -381,13 +363,8 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-aliases '((?\[ "[[{(]") (?\] "[]})]") (?\; "[;:]"))) - :config - (evil-snipe-override-mode +1) - ;; Switch to evil-easymotion/avy after a snipe - (map! :map evil-snipe-parent-transient-map - "C-;" (λ! (require 'evil-easymotion) - (call-interactively +evil--snipe-repeat-fn)))) + (evil-snipe-override-mode +1)) (def-package! evil-surround @@ -463,6 +440,7 @@ the new algorithm is confusing, like in python or ruby." neo-confirm-create-file #'off-p neo-confirm-create-directory #'off-p neo-show-hidden-files nil + neo-keymap-style 'concise neo-hidden-regexp-list '(;; vcs folders "^\\.\\(git\\|hg\\|svn\\)$" @@ -475,32 +453,4 @@ the new algorithm is confusing, like in python or ruby." "~$" "^#.*#$")) - (evil-set-initial-state 'neotree-mode 'motion) - - (push neo-buffer-name winner-boring-buffers) - - ;; `neotree-mode-map' are overridden when the neotree buffer is created. So we - ;; bind them in a hook. - (add-hook 'neo-after-create-hook #'+evil|neotree-init-keymap) - (defun +evil|neotree-init-keymap (&rest _) - (map! :Lm "\\\\" 'evil-window-prev - :Lm "RET" 'neotree-enter - :Lm "" 'neotree-enter - :Lm "ESC ESC" 'neotree-hide - :Lm [return] 'neotree-enter - :Lm "q" 'neotree-hide - :Lm "J" 'neotree-select-next-sibling-node - :Lm "K" 'neotree-select-previous-sibling-node - :Lm "H" 'neotree-select-up-node - :Lm "L" 'neotree-select-down-node - :Lm "h" '+evil/neotree-collapse-or-up - :Lm "j" 'neotree-next-line - :Lm "k" 'neotree-previous-line - :Lm "l" '+evil/neotree-expand-or-open - :Lm "v" 'neotree-enter-vertical-split - :Lm "s" 'neotree-enter-horizontal-split - :Lm "c" 'neotree-create-node - :Lm "d" 'neotree-delete-node - :Lm "\C-r" 'neotree-refresh - :Lm "r" 'neotree-rename-node - :Lm "R" 'neotree-change-root))) + (push neo-buffer-name winner-boring-buffers)) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 8f3da9a44..c51db88be 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -40,20 +40,6 @@ (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) (after! evil - (map! (:map yas-keymap - "C-e" #'+snippets/goto-end-of-field - "C-a" #'+snippets/goto-start-of-field - "" #'+snippets/goto-end-of-field - "" #'+snippets/goto-start-of-field - "" #'+snippets/delete-to-start-of-field - [escape] #'evil-normal-state - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field) - - (:map yas-minor-mode-map - :i "" yas-maybe-expand - :v "" #'+snippets/expand-on-region)) - ;; Exit snippets on ESC in normal mode (add-hook '+evil-esc-hook #'yas-exit-all-snippets) ;; Once you're in normal mode, you're out @@ -78,9 +64,6 @@ (def-package! auto-yasnippet :commands (aya-create aya-expand aya-open-line aya-persist-snippet) - :init - (map! :i [C-tab] #'aya-expand - :nv [C-tab] #'aya-create) :config (setq aya-persist-snippets-dir (concat doom-local-dir "auto-snippets/"))) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index 55841dc3f..1879de8a7 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -5,12 +5,7 @@ :config (setq ispell-program-name (executable-find "aspell") ispell-list-command "--list" - ispell-extr-args '("--dont-tex-check-comments")) - - (map! :map flyspell-mode-map - :localleader - :n "s" #'flyspell-correct-word-generic - :n "S" #'flyspell-correct-previous-word-generic)) + ispell-extr-args '("--dont-tex-check-comments"))) (def-package! flyspell-correct diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 26e94810a..90252136f 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -12,13 +12,6 @@ (set! :popup 'flycheck-error-list-mode :select t :autokill t) - (map! :map flycheck-error-list-mode-map - :n "C-n" #'flycheck-error-list-next-error - :n "C-p" #'flycheck-error-list-previous-error - :n "j" #'flycheck-error-list-next-error - :n "k" #'flycheck-error-list-previous-error - :n "RET" #'flycheck-error-list-goto-error) - (after! evil ;; Flycheck buffer on ESC in normal mode. (defun +syntax-checkers|flycheck-buffer () diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 903b99b7c..6f9458565 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -65,15 +65,7 @@ (advice-add #'git-timemachine-show-revision :after #'+vcs*update-header-line) ;; Force evil to rehash keybindings for the current state - (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state) - (map! :map git-timemachine-mode-map - :nv "p" #'git-timemachine-show-previous-revision - :nv "n" #'git-timemachine-show-next-revision - :nv "g" #'git-timemachine-show-nth-revision - :nv "q" #'git-timemachine-quit - :nv "w" #'git-timemachine-kill-abbreviated-revision - :nv "W" #'git-timemachine-kill-revision - :nv "b" #'git-timemachine-blame)) + (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state)) (def-package! magit @@ -87,9 +79,5 @@ (def-package! evil-magit :when (featurep! :feature evil) :after magit - :init (setq evil-magit-want-horizontal-movement t) - :config - (map! :map (magit-status-mode-map magit-revision-mode-map) - :n "C-j" nil - :n "C-k" nil)) + :init (setq evil-magit-want-horizontal-movement t)) diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index 4ec01756a..5dc9c9cc1 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -13,15 +13,4 @@ (set! :evil-state '(vc-annotate-mode . normal) - '(vc-git-log-view-mode . normal)) - - (map! :map vc-annotate-mode-map - :n "q" #'kill-this-buffer - :n "d" #'vc-annotate-show-diff-revision-at-line - :n "D" #'vc-annotate-show-changeset-diff-revision-at-line - :n "SPC" #'vc-annotate-show-log-revision-at-line - :n "]]" #'vc-annotate-next-revision - :n "[[" #'vc-annotate-prev-revision - :n [tab] #'vc-annotate-toggle-annotation-visibility - :n "RET" #'vc-annotate-find-revision-at-line)) - + '(vc-git-log-view-mode . normal))) diff --git a/modules/private/hlissner/+bindings.el b/modules/private/hlissner/+bindings.el index dbea2c372..643f71301 100644 --- a/modules/private/hlissner/+bindings.el +++ b/modules/private/hlissner/+bindings.el @@ -19,6 +19,7 @@ [remap find-tag] #'projectile-find-tag) (map! + ;; --- Global keybindings --------------------------- ;; Make M-x available everywhere :nvime "M-x" #'execute-extended-command :nvime "A-x" #'execute-extended-command @@ -69,49 +70,124 @@ "M-q" #'save-buffers-kill-emacs "M-s" #'save-buffer "M-v" #'clipboard-yank - "M-f" #'+ivy:swiper + "M-f" #'swiper "C-M-f" #'doom/toggle-fullscreen :m "A-j" #'+hlissner:multi-next-line :m "A-k" #'+hlissner:multi-previous-line - ;;; and - :m ";" 'evil-ex - (:leader - ;; Most commonly used - :desc "Switch project buffer" :n "," #'persp-switch-to-buffer - :desc "Switch buffer" :n "<" #'switch-to-buffer - :desc "Browse files" :n "." #'find-file - :desc "Find file from here" :n ">" #'counsel-file-jump - :desc "Find file in project" :n "/" #'projectile-find-file - :desc "Find in file (swiper)" :n "?" #'swiper - :desc "Imenu" :n ";" #'imenu - :desc "Imenu across buffers" :n ":" #'imenu-anywhere - :desc "Find other file" :n "a" #'projectile-find-other-file - :desc "Jump to bookmark" :n "b" #'bookmark-jump - :desc "Delete bookmark" :n "B" #'bookmark-delete - :desc "List errors" :n "e" #'flycheck-list-errors - :desc "View Emacs Log" :n "m" #'doom/popup-toggle-messages - :desc "Recent files" :n "r" #'recentf - :desc "Recent project files" :n "R" #'projectile-recentf - :desc "Insert from kill ring" :n "y" #'counsel-yank-pop - :desc "Switch project" :n "p" #'projectile-switch-project - :desc "Open Neotree" :n "\\" #'+evil/neotree - ;; Since I've remapped C-h... - :desc "help" :n "h" #'help-command + ;; --- ------------------------------------- + (:leader + :desc "Ex command" :nv ";" #'evil-ex + :desc "M-x" :nv ":" #'execute-extended-command + :desc "Org Capture" :nv "RET" #'+org/capture + + ;; Most commonly used + :desc "Switch buffer" :n "," #'persp-switch-to-buffer + :desc "Browse files" :n "." #'find-file + :desc "Find file in project" :n "/" #'projectile-find-file + :desc "Imenu" :n "i" #'imenu + :desc "Imenu across buffers" :n "I" #'imenu-anywhere + :desc "Insert from kill ring" :n "y" #'counsel-yank-pop + + ;; C-u is used by evil + :desc "Universal argument" :n "u" #'universal-argument + :desc "window" :n "w" evil-window-map (:desc "quit" :prefix "q" - :desc "Quit" :n "q" #'evil-save-and-quit - :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) + :desc "Quit" :n "q" #'evil-save-and-quit + :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) + + (:desc "help" + :prefix "h" + :n "h" help-map + :desc "Reload theme" :n "R" #'+doom/reset-theme + :desc "Toggle Emacs log" :n "m" #'doom/popup-toggle-messages + :desc "Find library" :n "l" #'find-library + :desc "Command log" :n "L" #'global-command-log-mode + :desc "Describe function" :n "f" #'describe-function + :desc "Describe key" :n "k" #'describe-key + :desc "Describe char" :n "c" #'describe-char + :desc "Describe mode" :n "m" #'describe-mode + :desc "Describe variable" :n "v" #'describe-variable + :desc "Describe face" :n "F" #'describe-face + :desc "Describe DOOM setting" :n "s" #'doom/describe-setting + :desc "Describe DOOM module" :n "d" #'doom/describe-module + :desc "What face" :n "." #'doom/what-face + :desc "What minor modes" :n "M" #'doom/what-minor-mode + :desc "Info" :n "i" #'info) + + (:desc "buffer" + :prefix "b" + :desc "Switch workspace buffer" :n "b" #'persp-switch-to-buffer + :desc "Switch buffer" :n "B" #'switch-to-buffer + :desc "New empty buffer" :n "c" #'evil-buffer-new + :desc "Kill buffer" :n "k" #'doom/kill-this-buffer + :desc "Save buffer" :n "s" #'save-buffer + :desc "Pop scratch buffer" :n "x" #'+doom:scratch-buffer + :desc "Bury buffer" :n "z" #'bury-buffer + :desc "Next buffer" :n "n" #'doom/next-buffer + :desc "Previous buffer" :n "p" #'doom/previous-buffer + :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) + + (:desc "previous..." + :prefix "[" + :desc "Buffer" :nv "b" #'doom/previous-buffer + :desc "Diff Hunk" :nv "d" #'git-gutter:previous-hunk + :desc "Todo" :nv "t" #'hl-todo-previous + :desc "Error" :nv "e" #'previous-error + :desc "Workspace" :nv "w" #'+workspace/switch-left + :desc "Smart jump" :nv "h" #'smart-backward + :desc "Spelling error" :nv "s" #'evil-prev-flyspell-error + :desc "Spelling correction" :n "S" #'flyspell-correct-previous-word-generic) + + (:desc "next..." + :prefix "]" + :desc "Buffer" :nv "b" #'doom/next-buffer + :desc "Diff Hunk" :nv "d" #'git-gutter:next-hunk + :desc "Todo" :nv "t" #'hl-todo-next + :desc "Error" :nv "e" #'next-error + :desc "Workspace" :nv "w" #'+workspace/switch-right + :desc "Smart jump" :nv "l" #'smart-forward + :desc "Spelling error" :nv "s" #'evil-next-flyspell-error + :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) + + (:desc "jump" + :prefix "SPC" + :desc "Swiper" :n "?" #'swiper + :desc "Imenu" :n ";" #'imenu + :desc "Imenu across buffers" :n ":" #'imenu-anywhere + :desc "Browse mode notes" :n "\"" #'+org/browse-notes-for-major-mode + :desc "Browse notes" :n "'" #'+hlissner/browse-notes + :desc "Browse project notes" :n "`" #'+org/browse-notes-for-project + :desc "File file" :n "." #'find-file + :desc "Sudo find file" :n ">" #'doom/sudo-find-file + :desc "Find file in project" :n "/" #'projectile-find-file + :desc "Find other file" :n "a" #'projectile-find-other-file + :desc "Jump to bookmark" :n "b" #'bookmark-jump + :desc "Delete bookmark" :n "B" #'bookmark-delete + :desc "Find file in dotfiles" :n "d" #'+hlissner/find-in-dotfiles + :desc "Browse dotfiles" :n "D" #'+hlissner/browse-dotfiles + :desc "Find file in emacs.d" :n "e" #'+hlissner/find-in-emacsd + :desc "Browse emacs.d" :n "E" #'+hlissner/browse-emacsd + :desc "Find file from here" :n "F" #'counsel-file-jump + :desc "Find file in notes" :n "O" #'+hlissner/find-in-notes + :desc "Switch project" :n "p" #'projectile-switch-project + :desc "Recent files" :n "r" #'recentf + :desc "Recent project files" :n "R" #'projectile-recentf + :desc "Find snippet for mode" :n "s" #'yas-visit-snippet-file + :desc "Find snippet" :n "S" #'+hlissner/find-in-snippets) (:desc "git" :prefix "g" - :desc "Git status" :n "s" #'magit-status - :desc "Git blame" :n "b" #'magit-blame - :desc "Git time machine" :n "t" #'git-timemachine-toggle - :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk - :desc "List gists" :n "g" #'+gist:list) + :desc "Git status" :n "s" #'magit-status + :desc "Git blame" :n "b" #'magit-blame + :desc "Git time machine" :n "t" #'git-timemachine-toggle + :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk + :desc "List gists" :n "g" #'+gist:list + :desc "Next hunk" :nv "n" #'git-gutter:next-hunk + :desc "Previous hunk" :nv "p" #'git-gutter:previous-hunk) (:desc "session" :prefix "s" @@ -123,11 +199,14 @@ :desc "Delete this workspace" :n "x" #'+workspace/delete :desc "Load session" :n "L" #'+workspace/load-session :desc "Autosave current session" :n "S" #'+workspace/save-session - :desc "Delete session" :n "X" #'+workspace/kill-session) + :desc "Delete session" :n "X" #'+workspace/kill-session + :desc "Next workspace" :n "n" #'+workspace/switch-right + :desc "Previous workspace" :n "p" #'+workspace/switch-left) (:desc "toggle" :prefix "t" - :desc "Spell check" :n "s" #'flyspell-mode + :desc "Flyspell" :n "s" #'flyspell-mode + :desc "Flycheck" :n "f" #'flycheck-mode :desc "Line numbers" :n "l" #'doom/toggle-line-numbers :desc "Fullscreen" :n "f" #'doom/toggle-fullscreen :desc "Indent guides" :n "i" #'highlight-indentation-mode @@ -135,8 +214,20 @@ :desc "Impatient mode" :n "h" #'+present/impatient-mode :desc "Big mode" :n "b" #'+present/big-mode) + (:desc "code" + :prefix "c" + :desc "List errors" :n "x" #'flycheck-list-errors + :desc "Evaluate buffer/region" :n "e" #'+eval/buffer + :v "e" #'+eval/region + :desc "Evaluate & replace region" :v "R" #'+eval:replace-region + :desc "Build tasks" :n "b" #'+eval/build + :desc "Jump to definition" :n "d" #'+jump/definition + :desc "Jump to references" :n "D" #'+jump/references + :desc "Open REPL" :n "r" #'+eval/repl + :v "r" #'+eval:repl) + (:desc "remote" - :prefix "u" + :prefix "r" :desc "Upload local" :n "u" #'+upload/local :desc "Upload local (force)" :n "U" (λ! (+upload/local t)) :desc "Download remote" :n "d" #'+upload/remote-download @@ -146,20 +237,19 @@ (:desc "open" :prefix "o" - :desc "Default browser" :n "o" #'browse-url-of-file - :desc "Debugger" :n "d" #'+debug/open - :desc "Sudo find file" :n "s" #'doom/sudo-this-file - :desc "Sudo edit" :n "S" #'doom/sudo-find-file - :desc "Build tasks" :n "b" #'+eval/build - :desc "Open/Send to REPL" :nv "r" #'+eval:repl - :desc "Terminal" :n "t" #'+term/popup - :desc "Terminal @ project root" :n "T" #'+term/popup-in-project + :desc "Default browser" :n "o" #'browse-url-of-file + :desc "Debugger" :n "d" #'+debug/open + :desc "REPL" :n "r" #'+eval/repl + :v "r" #'+eval:repl + :desc "Neotree" :n "n" #'+evil/neotree + :desc "Terminal" :n "t" #'+term/popup + :desc "Terminal in project" :n "T" #'+term/popup-in-project ;; applications - :desc "APP: elfeed" :n "E" #'=rss - :desc "APP: email" :n "M" #'=email - :desc "APP: twitter" :n "T" #'=twitter - :desc "APP: regex" :n "X" #'=regex + :desc "APP: elfeed" :n "E" #'=rss + :desc "APP: email" :n "M" #'=email + :desc "APP: twitter" :n "T" #'=twitter + :desc "APP: regex" :n "X" #'=regex ;; macos (:when IS-MAC @@ -168,71 +258,26 @@ :desc "Send to Transmit" :n "u" #'+macos/send-to-transmit :desc "Send project to Transmit" :n "U" #'+macos/send-project-to-transmit :desc "Send to Launchbar" :n "l" #'+macos/send-to-launchbar - :desc "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar)) + :desc "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar))) - (:desc "Personal" - :prefix "SPC" - :desc "Browse emacs.d" :n "." #'+hlissner/browse-emacsd - :desc "Find file in emacs.d" :n "/" #'+hlissner/find-in-emacsd - :desc "Browse dotfiles" :n ">" #'+hlissner/browse-dotfiles - :desc "Find file in dotfiles" :n "?" #'+hlissner/find-in-dotfiles - :desc "Reload theme" :n "R" #'+doom/reset-theme - ;; Org notes - :desc "Browse notes" :n "n" #'+hlissner/browse-notes - :desc "Find file in notes" :n "N" #'+hlissner/find-in-notes - :desc "Browse project notes" :n "p" #'+org/browse-notes-for-project - :desc "Browse mode notes" :n "m" #'+org/browse-notes-for-major-mode - :desc "Org Capture" :n "SPC" #'+org/capture - ;; misc - :desc "Find snippet for mode" :n "s" #'yas-visit-snippet-file - :desc "Find snippet" :n "S" #'+hlissner/find-in-snippets - )) - - (:localleader - (:desc "Refactor..." :prefix "r") - - (:desc "Find..." :prefix "f" - :desc "Get type..." :prefix "t") - - (:desc "Unit tests" :prefix "t")) - - ;;; Evil-esque bindings - ;; Buffers + ;; --- Personal vim-esque bindings ------------------ :n "zx" #'doom/kill-this-buffer :n "ZX" #'bury-buffer :n "]b" #'doom/next-buffer :n "[b" #'doom/previous-buffer - ;; Diffs - :m "]d" #'git-gutter:next-hunk - :m "[d" #'git-gutter:previous-hunk - :m "]e" #'next-error - :m "[e" #'previous-error - ;; Switch tabs :n "]w" #'+workspace/switch-right :n "[w" #'+workspace/switch-left :m "gt" #'+workspace/switch-right :m "gT" #'+workspace/switch-left - ;; Increment/decrement number under cursor - :n "g=" #'evil-numbers/inc-at-pt - :n "g-" #'evil-numbers/dec-at-pt - ;; Todos - :m "]t" #'hl-todo-next - :m "[t" #'hl-todo-previous - ;; Navigation - :nv "K" #'smart-up :m "gd" #'+jump/definition :m "gD" #'+jump/references :n "gp" #'+evil/reselect-paste - :n "gc" #'evil-commentary - :n "gx" #'evil-exchange :n "gr" #'+eval:region :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region - :m "g]" #'smart-forward - :m "g[" #'smart-backward :v "@" #'+evil:macro-on-all-lines :n "g@" #'+evil:macro-on-all-lines - ;; repeat in visual mode (buggy) + ;; repeat in visual mode (FIXME buggy) :v "." #'evil-repeat ;; don't leave visual mode after shifting :v "<" #'+evil/visual-dedent ; vnoremap < " #'+snippets/goto-end-of-field + "" #'+snippets/goto-start-of-field + "" #'+snippets/delete-to-start-of-field + [escape] #'evil-normal-state + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field) + (:map yas-minor-mode-map + :i "" yas-maybe-expand + :v "" #'+snippets/expand-on-region)) + + + ;; --- Custom evil text-objects --------------------- + :textobj "a" #'evil-inner-arg #'evil-outer-arg + :textobj "B" #'evil-textobj-anyblock-inner-block #'evil-textobj-anyblock-a-block + :textobj "i" #'evil-indent-plus-i-indent #'evil-indent-plus-a-indent + :textobj "I" #'evil-indent-plus-i-indent-up #'evil-indent-plus-a-indent-up + :textobj "J" #'evil-indent-plus-i-indent-up-down #'evil-indent-plus-a-indent-up-down + + + ;; --- Built-in plugins ----------------------------- + (:after comint + ;; TAB auto-completion in term buffers + :map comint-mode-map [tab] #'company-complete) + + (:after debug + ;; For elisp debugging + :map debugger-mode-map + :n "RET" #'debug-help-follow + :n "n" #'debugger-step-through + :n "c" #'debugger-continue) + + (:map help-mode-map + :n "[[" #'help-go-back + :n "]]" #'help-go-forward + :n "o" #'ace-link-help + :n "q" #'quit-window + :n "Q" #'+ivy-quit-and-resume) + + (:after vc-annotate + :map vc-annotate-mode-map + :n "q" #'kill-this-buffer + :n "d" #'vc-annotate-show-diff-revision-at-line + :n "D" #'vc-annotate-show-changeset-diff-revision-at-line + :n "SPC" #'vc-annotate-show-log-revision-at-line + :n "]]" #'vc-annotate-next-revision + :n "[[" #'vc-annotate-prev-revision + :n [tab] #'vc-annotate-toggle-annotation-visibility + :n "RET" #'vc-annotate-find-revision-at-line)) + + +;; --- Custom key functionality --------------------- +(defmacro do-repeat! (command next-func prev-func) + "Repeat motions with ;/," + (let ((fn-sym (intern (format "+evil*repeat-%s" command)))) + `(progn + (defun ,fn-sym (&rest _) + (define-key evil-motion-state-map (kbd ";") ',next-func) + (define-key evil-motion-state-map (kbd ",") ',prev-func)) + (advice-add #',command :before #',fn-sym)))) + +;; n/N +(do-repeat! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) +(do-repeat! evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) +(do-repeat! evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) +(do-repeat! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) + +;; f/F/t/T/s/S +(after! evil-snipe + (setq evil-snipe-repeat-keys nil + evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; + + (do-repeat! evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) + (do-repeat! evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) + +;; */# +(after! evil-visualstar + (do-repeat! evil-visualstar/begin-search-forward + evil-ex-search-next evil-ex-search-previous) + (do-repeat! evil-visualstar/begin-search-backward + evil-ex-search-previous evil-ex-search-next)) ;; @@ -393,4 +679,3 @@ (:after view (:map view-mode-map "" #'View-quit-all))) - diff --git a/modules/private/hlissner/config.el b/modules/private/hlissner/config.el index cdd9011e3..9631a1499 100644 --- a/modules/private/hlissner/config.el +++ b/modules/private/hlissner/config.el @@ -28,45 +28,6 @@ (delete 'yas-installed-snippets-dir yas-snippet-dirs)))) -;; Repeat all sorts of motion and searches with SPC & C-SPC -(defmacro +my!repeat-with-spc (command next-func prev-func) - "Repeat motions with SPC/S-SPC" - (let ((fn-sym (intern (format "+evil*repeat-%s" command)))) - `(progn - (defun ,fn-sym (&rest _) - (define-key evil-motion-state-map (kbd "SPC") ',next-func) - (define-key evil-motion-state-map (kbd "S-SPC") ',prev-func)) - (advice-add #',command :before #',fn-sym)))) - -(after! evil - ;; n/N - (+my!repeat-with-spc evil-ex-search-next evil-ex-search-next evil-ex-search-previous) - (+my!repeat-with-spc evil-ex-search-previous evil-ex-search-next evil-ex-search-previous) - (+my!repeat-with-spc evil-ex-search-forward evil-ex-search-next evil-ex-search-previous) - (+my!repeat-with-spc evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) - - ;; f/F/t/T/s/S - (after! evil-snipe - (setq evil-snipe-repeat-keys nil - evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; - - (+my!repeat-with-spc evil-snipe-f evil-snipe-repeat evil-snipe-repeat-reverse) - (+my!repeat-with-spc evil-snipe-F evil-snipe-repeat evil-snipe-repeat-reverse) - (+my!repeat-with-spc evil-snipe-t evil-snipe-repeat evil-snipe-repeat-reverse) - (+my!repeat-with-spc evil-snipe-T evil-snipe-repeat evil-snipe-repeat-reverse) - (+my!repeat-with-spc evil-snipe-s evil-snipe-repeat evil-snipe-repeat-reverse) - (+my!repeat-with-spc evil-snipe-S evil-snipe-repeat evil-snipe-repeat-reverse) - (+my!repeat-with-spc evil-snipe-x evil-snipe-repeat evil-snipe-repeat-reverse) - (+my!repeat-with-spc evil-snipe-X evil-snipe-repeat evil-snipe-repeat-reverse)) - - ;; */# - (after! evil-visualstar - (+my!repeat-with-spc evil-visualstar/begin-search-forward - evil-ex-search-next evil-ex-search-previous) - (+my!repeat-with-spc evil-visualstar/begin-search-backward - evil-ex-search-previous evil-ex-search-next))) - - (after! mu4e (setq-default smtpmail-stream-type 'starttls diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index 6e4e967a3..d728cce82 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -11,17 +11,6 @@ ;; evil-ify gist listing (set! :evil-state 'gist-list-mode 'normal) - (map! :map gist-list-menu-mode-map - :n "RET" #'+gist/open-current - :n "d" #'gist-kill-current - :n "r" #'gist-list-reload - :n "c" #'gist-add-buffer - :n "y" #'gist-print-current-url - :n "b" #'gist-browse-current-url - :n "s" #'gist-star - :n "S" #'gist-unstar - :n "f" #'gist-fork - :n "q" #'quit-window) (when (bound-and-true-p shackle-mode) (defun +gist*list-render (orig-fn &rest args)