feat(emacs): enhance setup further

This commit is contained in:
Price Hiller 2023-09-11 17:44:24 -05:00
parent 900fc9bfbe
commit a72068b61c
No known key found for this signature in database

View File

@ -1,12 +1,13 @@
;; -*- lexical-binding: t -*-
;; Install elpaca ;; Install elpaca
(defvar elpaca-installer-version 0.5) (defvar elpaca-installer-version 0.5)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) (defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) (defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" (defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
:ref nil :ref nil
:files (:defaults (:exclude "extensions")) :files (:defaults (:exclude "extensions"))
:build (:not elpaca--activate-package))) :build (:not elpaca--activate-package)))
(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) (let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory))
(build (expand-file-name "elpaca/" elpaca-builds-directory)) (build (expand-file-name "elpaca/" elpaca-builds-directory))
(order (cdr elpaca-order)) (order (cdr elpaca-order))
@ -16,18 +17,18 @@
(make-directory repo t) (make-directory repo t)
(when (< emacs-major-version 28) (require 'subr-x)) (when (< emacs-major-version 28) (require 'subr-x))
(condition-case-unless-debug err (condition-case-unless-debug err
(if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
((zerop (call-process "git" nil buffer t "clone" ((zerop (call-process "git" nil buffer t "clone"
(plist-get order :repo) repo))) (plist-get order :repo) repo)))
((zerop (call-process "git" nil buffer t "checkout" ((zerop (call-process "git" nil buffer t "checkout"
(or (plist-get order :ref) "--")))) (or (plist-get order :ref) "--"))))
(emacs (concat invocation-directory invocation-name)) (emacs (concat invocation-directory invocation-name))
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
"--eval" "(byte-recompile-directory \".\" 0 'force)"))) "--eval" "(byte-recompile-directory \".\" 0 'force)")))
((require 'elpaca)) ((require 'elpaca))
((elpaca-generate-autoloads "elpaca" repo))) ((elpaca-generate-autoloads "elpaca" repo)))
(progn (message "%s" (buffer-string)) (kill-buffer buffer)) (progn (message "%s" (buffer-string)) (kill-buffer buffer))
(error "%s" (with-current-buffer buffer (buffer-string)))) (error "%s" (with-current-buffer buffer (buffer-string))))
((error) (warn "%s" err) (delete-directory repo 'recursive)))) ((error) (warn "%s" err) (delete-directory repo 'recursive))))
(unless (require 'elpaca-autoloads nil t) (unless (require 'elpaca-autoloads nil t)
(require 'elpaca) (require 'elpaca)
@ -47,7 +48,6 @@
;; General for keybindings ;; General for keybindings
(use-package general (use-package general
:demand t) :demand t)
(elpaca-wait) (elpaca-wait)
(general-create-definer key-leader (general-create-definer key-leader
@ -58,7 +58,8 @@
(key-leader (key-leader
:states 'normal :states 'normal
"/" '(comment-line :which-key "Comment: Toggle Current Line")) "/" '(comment-line :which-key "Comment: Toggle Current Line")
)
(key-leader (key-leader
:states 'visual :states 'visual
@ -79,13 +80,24 @@
:keymaps 'emacs-lisp-mode-map :keymaps 'emacs-lisp-mode-map
"f r" '(eval-region :which-key "File: Evaluate Region")) "f r" '(eval-region :which-key "File: Evaluate Region"))
(key-leader
:states 'normal
"b b" #'ibuffer)
(general-def
"<escape>" #'keyboard-escape-quit)
;; Which key to hint key bindings ;; Which key to hint key bindings
(use-package which-key (use-package which-key
:after evil :defer nil
:general
(key-leader
:states 'normal
"w w" #'which-key-show-top-level)
:custom
(which-key-idle-delay 0.1)
(which-key-max-description-length 50)
:init :init
(setq which-key-idle-delay 0.1)
:config
(which-key-mode)) (which-key-mode))
(custom-set-variables (custom-set-variables
@ -105,32 +117,64 @@
doom-themes-enable-italic t) doom-themes-enable-italic t)
(load-theme 'doom-one t) (load-theme 'doom-one t)
(doom-themes-visual-bell-config) (doom-themes-visual-bell-config)
(doom-themes-treemacs-config)
(doom-themes-org-config)) (doom-themes-org-config))
(use-package nerd-icons) (use-package nerd-icons)
(use-package nerd-icons-ibuffer
:ensure t
:hook (ibuffer-mode . nerd-icons-ibuffer-mode))
(use-package nerd-icons-dired
:after nerd-icons
:hook
(dired-mode . nerd-icons-dired-mode))
(use-package treemacs (use-package treemacs
:defer t :defer t
:after nerd-icons :general
(key-leader
:states 'normal
"t" '(nil :which-key "Treemacs"))
(key-leader
:states 'normal
"t t" '(treemacs :which-key "Treemacs: Toggle")
"t p" '(nil :which-key "Treemacs Project"))
(key-leader
:states 'normal
"t p n" '(nil :which-key "Treemacs Project: New"))
:custom
(treemacs-silent-refresh t)
(treemacs-silent-filewatch t)
(treemacs-filewatch-mode t)
(treemacs-show-hidden-files nil)
(treemacs-follow-after-init t)
(treemacs-expand-after-init t)
(treemacs-file-event-delay 100)
(treemacs-follow-mode t)
:hook (treemacs-mode . (lambda () (display-line-numbers-mode -1))))
(use-package treemacs-nerd-icons
:after nerd-icons treemacs
:config :config
(use-package treemacs-nerd-icons) (treemacs-load-theme "nerd-icons"))
(use-package treemacs-evil)
(treemacs-load-theme "nerd-icons") (use-package treemacs-evil
(setq treemacs-silent-refresh t :after treemacs)
treemacs-silent-filewatch t
tree-file-event-delay 100))
;; Download Evil ;; Download Evil
(use-package goto-chg) (use-package goto-chg)
(use-package evil (use-package evil
:after goto-chg :after goto-chg
:init :custom
(setq evl-kbd-macro-suppress-motion-error t (evl-kbd-macro-suppress-motion-error t)
evil-want-C-u-scroll t (evil-want-C-u-scroll t)
evil-want-integration t (evil-want-integration t)
evil-want-keybinding 'nil (evil-want-keybinding 'nil)
which-key-allow-evil-operators t (which-key-allow-evil-operators t)
evil-undo-system 'undo-redo) (evil-undo-system 'undo-redo)
(evil-want-fine-undo t)
(evil-show-paren-range 1000)
:config :config
(evil-mode 1)) (evil-mode 1))
@ -184,22 +228,48 @@
(use-package orderless (use-package orderless
:after hotfuzz :after hotfuzz
:custom :config
(completion-ignore-case t) (defun +orderless--consult-suffix ()
(completion-styles '(hotfuzz orderless)) "Regexp which matches the end of string with Consult tofu support."
(completion-category-defaults nil) (if (and (boundp 'consult--tofu-char) (boundp 'consult--tofu-range))
(completion-category-overrides '((file (styles basic partial-completion)))) (format "[%c-%c]*$"
(orderless-matching-styles consult--tofu-char
(+ consult--tofu-char consult--tofu-range -1))
"$"))
;; Recognizes the following patterns:
;; * .ext (file extension)
;; * regexp$ (regexp matching at end)
(defun +orderless-consult-dispatch (word _index _total)
(cond
;; Ensure that $ works with Consult commands, which add disambiguation suffixes
((string-suffix-p "$" word)
`(orderless-regexp . ,(concat (substring word 0 -1) (+orderless--consult-suffix))))
;; File extensions
((and (or minibuffer-completing-file-name
(derived-mode-p 'eshell-mode))
(string-match-p "\\`\\.." word))
`(orderless-regexp . ,(concat "\\." (substring word 1) (+orderless--consult-suffix))))))
(orderless-define-completion-style +orderless-with-initialism
(orderless-matching-styles '(orderless-initialism orderless-literal orderless-regexp)))
(setq
completion-ignore-case t
completion-styles '(hotfuzz orderless basic)
completion-category-defaults nil
completion-category-overrides '((file (styles partial-completion))
(command (styles +orderless-with-initialism))
(variable (styles +orderless-with-initialism))
(symbol (styles +orderless-with-initialism)))
orderless-component-separator #'orderless-escapable-split-on-space
orderless-style-dispatchers (list #'+orderless-consult-dispatch
#'orderless-affix-dispatch)
orderless-matching-styles
'(orderless-literal '(orderless-literal
orderless-prefixes orderless-prefixes
orderless-initialism))) orderless-initialism)))
(use-package corfu (use-package corfu
:elpaca
(:host github
:repo "minad/corfu"
:depth 1
:files ("extensions/*"))
:after tempel tempel-collection :after tempel tempel-collection
:custom :custom
(completion-cycle-threshold nil) (completion-cycle-threshold nil)
@ -224,14 +294,6 @@
"M-d" #'corfu-show-documentation "M-d" #'corfu-show-documentation
"M-d" #'corfu-show-location) "M-d" #'corfu-show-location)
:init :init
(defun corfu-enable-always-in-minibuffer ()
"Enable Corfu in the minibuffer if Vertico/Mct are not active."
(unless (or (bound-and-true-p mct--active)
(bound-and-true-p vertico--input)
(eq (current-local-map) read-passwd-map))
(setq-local corfu-popupinfo-delay 0.1)
(corfu-mode 1)))
(add-hook 'minibuffer-setup-hook #'corfu-enable-always-in-minibuffer 1)
(global-corfu-mode) (global-corfu-mode)
(corfu-popupinfo-mode)) (corfu-popupinfo-mode))
@ -244,7 +306,9 @@
;; Add extensions ;; Add extensions
(use-package cape (use-package cape
:elpaca (:host github :repo "minad/cape") :elpaca (:host github
:repo "minad/cape"
:depth 1)
:init :init
;; Add to the global default value of `completion-at-point-functions' which is ;; Add to the global default value of `completion-at-point-functions' which is
;; used by `completion-at-point'. The order of the functions matters, the ;; used by `completion-at-point'. The order of the functions matters, the
@ -306,11 +370,6 @@
:config :config
(add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter)) (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter))
(use-package nerd-icons-dired
:after nerd-icons
:hook
(dired-mode . nerd-icons-dired-mode))
(use-package nerd-icons-completion (use-package nerd-icons-completion
:after marginalia :after marginalia
:config :config
@ -319,44 +378,38 @@
;; Enable vertico ;; Enable vertico
(use-package vertico (use-package vertico
:elpaca (:host github
:depth 1
:repo "minad/vertico"
:files ("extensions/*"))
:general :general
(:keymaps '(normal insert visual motion) (:keymaps '(normal insert visual motion)
"M-." #'vertico-repeat) ; Perfectly return to the state of the last Vertico minibuffer usage "M-." #'vertico-repeat) ; Perfectly return to the state of the last Vertico minibuffer usage
(:keymaps 'vertico-map (:keymaps 'vertico-map
"<C-RET>" #'vertico-insert "C-<return>" #'vertico-insert
"<escape>" #'minibuffer-keyboard-quit "<escape>" #'minibuffer-keyboard-quit
"<M-s>" #'vertico-next-group "M-s" #'vertico-next-group
"<M-a>" #'vertico-previous-group "M-a" #'vertico-previous-group
"TAB" #'vertico-next "TAB" #'vertico-next
[tab] #'vertico-next [tab] #'vertico-next
"S-TAB" #'vertico-previous "S-TAB" #'vertico-previous
[backtab] #'vertico-previous [backtab] #'vertico-previous
"<backspace>" #'vertico-directory-delete-char "<backspace>" #'vertico-directory-delete-char
"C-<backspace>" #'vertico-directory-delete-word "C-<backspace>" #'vertico-directory-delete-word
"RET" #'vertico-directory-enter "<return>" #'vertico-directory-enter
"M-j" #'vertico-quick-insert) "M-j" #'vertico-quick-insert)
:hook (minibuffer-setup . vertico-repeat-save) ; Make sure vertico state is saved for `vertico-repeat' :hook (minibuffer-setup . vertico-repeat-save) ; Make sure vertico state is saved for `vertico-repeat'
:custom :custom
(vertico-count 50) (vertico-count 15)
(vertico-resize t) (vertico-resize t)
(vertico-cycle nil) (vertico-cycle nil)
(enable-recursive-minibuffers t) (enable-recursive-minibuffers t)
(vertico-grid-separator " ")
(vertico-grid-lookahead 50) (vertico-grid-lookahead 50)
(vertico-buffer-display-action '(display-buffer-reuse-window)) (vertico-buffer-display-action '(display-buffer-reuse-window))
(vertico-multiform-categories (vertico-multiform-categories
'((file reverse) '((file reverse)
(consult-grep buffer) (consult-ripgrep buffer)
(consult-location) (consult-location)
(imenu buffer) (imenu buffer)
(library reverse indexed) (library reverse indexed)
(org-roam-node reverse indexed) (org-roam-node reverse indexed)
(t reverse) (t reverse)))
))
(vertico-multiform-commands (vertico-multiform-commands
'(("flyspell-correct-*" grid reverse) '(("flyspell-correct-*" grid reverse)
(org-refile grid reverse indexed) (org-refile grid reverse indexed)
@ -381,8 +434,6 @@
(setq read-extended-command-predicate (setq read-extended-command-predicate
#'command-completion-default-include-p) #'command-completion-default-include-p)
(vertico-mode) (vertico-mode)
(vertico-mouse-mode)) (vertico-mouse-mode))
@ -396,10 +447,40 @@
"M-A" #'marginalia-cycle) "M-A" #'marginalia-cycle)
:custom :custom
(marginalia-max-relative-age 0) (marginalia-max-relative-age 0)
(marginalia-align #'right) (marginalia-align #'center)
:init :init
(marginalia-mode)) (marginalia-mode))
;; (use-package embark
;; :after marginalia
;; :custom
;; (prefix-help-command #'embark-prefix-help-command)
;; :init)
(use-package consult
:init
(advice-add #'register-preview :override #'consult-register-window)
(setq register-preview-delay 0.5
register-preview-function #'consult-register-format
xref-show-xrefs-function #'consult-xref
xref-show-definitions-function #'consult-xref
completion-in-region-function (lambda (&rest args)
(apply (if vertico-mode
#'consult-completion-in-region
#'completion--in-region)
args))
consult-narrow-key "<")
:general
(key-leader
:states 'normal
"c" '(nil :which-key "Consult"))
(key-leader
:states 'normal
"c r" '(consult-recent-file :which-key "Consult: Recent Files")))
;; Persist history over Emacs restarts. Vertico sorts by history position. ;; Persist history over Emacs restarts. Vertico sorts by history position.
(use-package savehist (use-package savehist
:elpaca nil :elpaca nil
@ -422,7 +503,7 @@
:after tree-sitter :after tree-sitter
:init :init
(setq treesit-language-source-alist (setq treesit-language-source-alist
'((emacs-lisp "https://github.com/Wilfred/tree-sitter-elisp"))) '((emacs-lisp "https://github.com/Wilfred/tree-sitter-elisp")))
:config :config
(setq treesit-auto-install 'prompt) (setq treesit-auto-install 'prompt)
(global-treesit-auto-mode)) (global-treesit-auto-mode))
@ -435,9 +516,24 @@
(global-ts-fold-indicators-mode) (global-ts-fold-indicators-mode)
(ts-fold-line-comment-mode)) (ts-fold-line-comment-mode))
;; Undo Tree
(use-package vundo
:defer t
:hook (vundo-mode . (lambda () (setq-local cursor-type nil)))
:custom
(vundo-glyph-alist vundo-unicode-symbols))
;; Persistent Undo
(use-package undo-fu-session
:config
(undo-fu-session-global-mode))
;; Set background colors for color codes
(use-package rainbow-mode
:config
(rainbow-mode t))
;; Opacity ;; Opacity
(set-frame-parameter nil 'alpha-background 25)
(add-to-list 'default-frame-alist '(alpha-background . 25))
(menu-bar-mode -1) ; Disable menubar (menu-bar-mode -1) ; Disable menubar
(scroll-bar-mode -1) ; Disable visible scrollbar (scroll-bar-mode -1) ; Disable visible scrollbar
(tool-bar-mode -1) ; Disable toolbar (tool-bar-mode -1) ; Disable toolbar
@ -446,4 +542,14 @@
(setq visible-bell t) ; Enable visible bell (setq visible-bell t) ; Enable visible bell
(blink-cursor-mode 0) ; Disable blinking cursor (blink-cursor-mode 0) ; Disable blinking cursor
(setq display-line-numbers-type 'relative) (setq display-line-numbers-type 'relative)
(global-display-line-numbers-mode) (column-number-mode t)
(global-display-line-numbers-mode t)
(setq-default indent-tabs-mode nil)
(global-hl-line-mode t)
(setq use-dialog-box nil)
(global-auto-revert-mode t)
(recentf-mode t)
(fset 'yes-or-no-p 'y-or-n-p)
(save-place-mode 1)
(setq custom-file (locate-user-emacs-file "custom-vars.el"))
(load custom-file 'noerror 'nomessage)