From 66d75936fc82424b088906b38b375a26c848f300 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 03:41:26 -0500 Subject: [PATCH] config/default: split into evil/emacs files Done to better facilitate a non-evil config. - Adds winum (and enables support for it in doom-modeline) - Adds expand-region (#1231) - Uses default smartparens config for non-evil users (WIP) --- modules/config/default/+emacs.el | 32 +++++++ modules/config/default/+evil.el | 109 ++++++++++++++++++++++++ modules/config/default/config.el | 130 ++++------------------------- modules/config/default/packages.el | 6 ++ modules/ui/modeline/config.el | 6 +- 5 files changed, 168 insertions(+), 115 deletions(-) create mode 100644 modules/config/default/+emacs.el create mode 100644 modules/config/default/+evil.el create mode 100644 modules/config/default/packages.el diff --git a/modules/config/default/+emacs.el b/modules/config/default/+emacs.el new file mode 100644 index 000000000..c9188f3d5 --- /dev/null +++ b/modules/config/default/+emacs.el @@ -0,0 +1,32 @@ +;;; config/default/+emacs.el -*- lexical-binding: t; -*- + +(require 'projectile) ; we need its keybinds immediately + + +;; +;;; Reasonable defaults + +(setq shift-select-mode t) +(delete-selection-mode +1) + +(def-package! expand-region + :commands (er/contract-region er/mark-symbol er/mark-word) + :config + (defun doom*quit-expand-region () + "Properly abort an expand-region region." + (when (memq last-command '(er/expand-region er/contract-region)) + (er/contract-region 0))) + (advice-add #'evil-escape :before #'doom*quit-expand-region) + (advice-add #'doom/escape :before #'doom*quit-expand-region)) + + +(def-package! winum + :after-call (doom-switch-window-hook) + :config (winum-mode +1)) + + +;; +;;; Keybinds + +(when (featurep! +bindings) + (load! "+emacs-bindings")) diff --git a/modules/config/default/+evil.el b/modules/config/default/+evil.el new file mode 100644 index 000000000..5d624abed --- /dev/null +++ b/modules/config/default/+evil.el @@ -0,0 +1,109 @@ +;;; config/default/+evil.el -*- lexical-binding: t; -*- + +(defun +default|disable-delete-selection-mode () + (delete-selection-mode -1)) +(add-hook 'evil-insert-state-entry-hook #'delete-selection-mode) +(add-hook 'evil-insert-state-exit-hook #'+default|disable-delete-selection-mode) + + +;; +;;; Smartparens config + +(when (featurep! +smartparens) + ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) + ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) + ;; or specific :post-handlers with: + ;; (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) + (after! smartparens + ;; Autopair quotes more conservatively; if I'm next to a word/before another + ;; quote, I likely don't want to open a new pair. + (let ((unless-list '(sp-point-before-word-p + sp-point-after-word-p + sp-point-before-same-p))) + (sp-pair "'" nil :unless unless-list) + (sp-pair "\"" nil :unless unless-list)) + + ;; Expand {|} => { | } + ;; Expand {|} => { + ;; | + ;; } + (dolist (brace '("(" "{" "[")) + (sp-pair brace nil + :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) + ;; I likely don't want a new pair if adjacent to a word or opening brace + :unless '(sp-point-before-word-p sp-point-before-same-p))) + + ;; Major-mode specific fixes + (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler)) + + ;; Don't do square-bracket space-expansion where it doesn't make sense to + (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) + "[" nil :post-handlers '(:rem ("| " "SPC"))) + + ;; Reasonable default pairs for HTML-style comments + (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) + "" + :unless '(sp-point-before-word-p sp-point-before-same-p) + :actions '(insert) :post-handlers '(("| " "SPC"))) + + ;; Disable electric keys in C modes because it interferes with smartparens + ;; and custom bindings. We'll do it ourselves (mostly). + (after! cc-mode + (c-toggle-electric-state -1) + (c-toggle-auto-newline -1) + (setq c-electric-flag nil) + (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) + (define-key c-mode-base-map key nil))) + + ;; Expand C-style doc comment blocks. Must be done manually because some of + ;; these languages use specialized (and deferred) parsers, whose state we + ;; can't access while smartparens is doing its thing. + (defun +default-expand-doc-comment-block (&rest _ignored) + (let ((indent (current-indentation))) + (newline-and-indent) + (save-excursion + (newline) + (insert (make-string indent 32) " */") + (delete-char 2)))) + (sp-local-pair + '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode + csharp-mode java-mode php-mode css-mode scss-mode less-css-mode + stylus-mode) + "/*" "*/" + :actions '(insert) + :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) + + ;; Highjacks backspace to: + ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) + ;; b) delete space-indented `tab-width' steps at a time + ;; c) close empty multiline brace blocks in one step: + ;; { + ;; | + ;; } + ;; becomes {|} + ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work + ;; even after a backspace. + ;; e) properly delete smartparen pairs when they are encountered, without + ;; the need for strict mode. + ;; f) do none of this when inside a string + (advice-add #'delete-backward-char :override #'+default*delete-backward-char) + + ;; Makes `newline-and-indent' continue comments (and more reliably) + (advice-add #'newline-and-indent :around #'+default*newline-indent-and-continue-comments))) + + +;; +;;; Keybindings + +;; This section is dedicated to "fixing" certain keys so that they behave +;; sensibly (and consistently with similar contexts). + +;; Make SPC u SPC u [...] possible (#747) +(map! :map universal-argument-map + :prefix doom-leader-key "u" #'universal-argument-more + :prefix doom-leader-alt-key "u" #'universal-argument-more) + +(when (featurep! +bindings) + (load! "+evil-bindings")) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index bbc4660b5..4ae830bee 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -12,7 +12,7 @@ ;; -;; Reasonable defaults +;;; Reasonable defaults (after! epa (setq epa-file-encrypt-to @@ -27,110 +27,12 @@ epa-pinentry-mode 'loopback)) -(if (not (featurep 'evil)) - (delete-selection-mode +1) - (defun +default|disable-delete-selection-mode () (delete-selection-mode -1)) - (add-hook 'evil-insert-state-entry-hook #'delete-selection-mode) - (add-hook 'evil-insert-state-exit-hook #'+default|disable-delete-selection-mode)) - - -(when (featurep! +smartparens) - ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) - ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) - ;; or specific :post-handlers with: - ;; (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) - (after! smartparens - ;; Autopair quotes more conservatively; if I'm next to a word/before another - ;; quote, I likely don't want to open a new pair. - (let ((unless-list '(sp-point-before-word-p - sp-point-after-word-p - sp-point-before-same-p))) - (sp-pair "'" nil :unless unless-list) - (sp-pair "\"" nil :unless unless-list)) - - ;; Expand {|} => { | } - ;; Expand {|} => { - ;; | - ;; } - (dolist (brace '("(" "{" "[")) - (sp-pair brace nil - :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) - ;; I likely don't want a new pair if adjacent to a word or opening brace - :unless '(sp-point-before-word-p sp-point-before-same-p))) - - ;; Major-mode specific fixes - (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" - :pre-handlers '(:rem sp-ruby-pre-handler) - :post-handlers '(:rem sp-ruby-post-handler)) - - ;; Don't do square-bracket space-expansion where it doesn't make sense to - (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) - "[" nil :post-handlers '(:rem ("| " "SPC"))) - - ;; Reasonable default pairs for HTML-style comments - (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) - "" - :unless '(sp-point-before-word-p sp-point-before-same-p) - :actions '(insert) :post-handlers '(("| " "SPC"))) - - ;; Disable electric keys in C modes because it interferes with smartparens - ;; and custom bindings. We'll do it ourselves (mostly). - (after! cc-mode - (c-toggle-electric-state -1) - (c-toggle-auto-newline -1) - (setq c-electric-flag nil) - (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) - (define-key c-mode-base-map key nil))) - - ;; Expand C-style doc comment blocks. Must be done manually because some of - ;; these languages use specialized (and deferred) parsers, whose state we - ;; can't access while smartparens is doing its thing. - (defun +default-expand-doc-comment-block (&rest _ignored) - (let ((indent (current-indentation))) - (newline-and-indent) - (save-excursion - (newline) - (insert (make-string indent 32) " */") - (delete-char 2)))) - (sp-local-pair - '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode - csharp-mode java-mode php-mode css-mode scss-mode less-css-mode - stylus-mode) - "/*" "*/" - :actions '(insert) - :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) - - ;; Highjacks backspace to: - ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) - ;; b) delete space-indented `tab-width' steps at a time - ;; c) close empty multiline brace blocks in one step: - ;; { - ;; | - ;; } - ;; becomes {|} - ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work - ;; even after a backspace. - ;; e) properly delete smartparen pairs when they are encountered, without - ;; the need for strict mode. - ;; f) do none of this when inside a string - (advice-add #'delete-backward-char :override #'+default*delete-backward-char) - - ;; Makes `newline-and-indent' continue comments (and more reliably) - (advice-add #'newline-and-indent :around #'+default*newline-indent-and-continue-comments))) - - ;; -;; Keybinding fixes +;;; Keybinding fixes ;; This section is dedicated to "fixing" certain keys so that they behave ;; sensibly (and consistently with similar contexts). -;; Make SPC u SPC u [...] possible (#747) -(when (featurep 'evil) - (map! :map universal-argument-map - :prefix doom-leader-key "u" #'universal-argument-more - :prefix doom-leader-alt-key "u" #'universal-argument-more)) - (defun +default|init-input-decode-map () "Ensure TAB and [tab] are treated the same in TTY Emacs." (define-key input-decode-map [tab] (kbd "TAB")) @@ -138,13 +40,6 @@ (define-key input-decode-map [escape] (kbd "ESC"))) (add-hook 'tty-setup-hook #'+default|init-input-decode-map) -;; A Doom convention where C-s on popups and interactive searches will invoke -;; ivy/helm for their superior filtering. -(define-key! :keymaps +default-minibuffer-maps - "C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history)) - ;; Consistently use q to quit windows (after! tabulated-list (define-key tabulated-list-mode-map "q" #'quit-window)) @@ -192,7 +87,7 @@ ;; -;; Doom's keybinding scheme +;;; Keybind schemes ;; Custom help keys -- these aren't under `+bindings' because they ought to be ;; universal. @@ -239,6 +134,13 @@ "M-x" #'execute-extended-command "A-x" #'execute-extended-command) + ;; A Doom convention where C-s on popups and interactive searches will invoke + ;; ivy/helm for their superior filtering. + (define-key! :keymaps +default-minibuffer-maps + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history)) + ;; Smarter C-a/C-e for both Emacs and Evil. C-a will jump to indentation. ;; Pressing it again will send you to the true bol. Same goes for C-e, except ;; it will ignore comments+trailing whitespace before jumping to eol. @@ -249,8 +151,12 @@ :gni [M-return] #'+default/newline-below :gni [M-S-return] #'+default/newline-above :gni [C-return] #'+default/newline-below - :gni [C-S-return] #'+default/newline-above) + :gni [C-S-return] #'+default/newline-above)) - (if (featurep 'evil) - (load! "+evil-bindings") - (load! "+emacs-bindings"))) + +;; +;;; Bootstrap configs + +(if (featurep 'evil) + (load! "+evil") + (load! "+emacs")) diff --git a/modules/config/default/packages.el b/modules/config/default/packages.el new file mode 100644 index 000000000..54cfa79b1 --- /dev/null +++ b/modules/config/default/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; config/default/packages.el + +(unless (featurep! :feature evil) + (package! winum) + (package! expand-region)) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 709904ec7..b12726dcb 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -58,15 +58,15 @@ ;; Remove unused segments & extra padding (doom-modeline-def-modeline 'main - '(bar matches buffer-info remote-host buffer-position selection-info) + '(bar window-number matches buffer-info remote-host buffer-position selection-info) '(misc-info persp-name irc mu4e github debug indent input-method buffer-encoding lsp major-mode process vcs checker)) (doom-modeline-def-modeline 'special - '(bar matches buffer-info-simple buffer-position selection-info) + '(bar window-number matches buffer-info-simple buffer-position selection-info) '(misc-info persp-name debug input-method irc-buffers buffer-encoding lsp major-mode process checker)) (doom-modeline-def-modeline 'project - '(bar buffer-default-directory) + '(bar window-number buffer-default-directory) '(misc-info mu4e github debug fancy-battery " " major-mode)) ;; Some functions modify the buffer, causing the modeline to show a false