Files
emacs.d/post-init.el
2026-03-05 00:17:32 +01:00

215 lines
6.1 KiB
EmacsLisp

;;When installing a package used in the init file itself,
;;e.g. a package which adds a use-package key word,
;;use the :wait recipe keyword to block until that package is installed/configured.
;;For example:
;;(use-package general :ensure (:wait t) :demand t)
;; Expands to: (elpaca evil (use-package evil :demand t))
(use-package evil :ensure t
:init
(setq evil-want-integration t)
(setq evil-want-keybinding nil)
(setq evil-want-C-u-scroll t)
:config
(evil-mode))
(use-package evil-collection :ensure t
:after evil
:custom
(evil-collection-outline-bind-tab-p t)
(evil-collection-setup-minibuffer t)
:init
(evil-collection-init))
(use-package evil-goggles
:ensure t
:config
(evil-goggles-mode))
(use-package evil-surround
:ensure t
:config
(global-evil-surround-mode))
(use-package evil-commentary
:ensure t
:config
(evil-commentary-mode)
;; optionally use diff-mode's faces; as a result, deleted text
;; will be highlighed with `diff-removed` face which is typically
;; some red color (as defined by the color theme)
;; other faces such as `diff-added` will be used for other actions
(evil-goggles-use-diff-faces))
(use-package evil-org
:ensure t
:after org
:hook (org-mode . (lambda () evil-org-mode))
:config
(require 'evil-org-agenda)
(evil-org-agenda-set-keys))
(use-package general
:ensure t
:config
;; Create a leader-key definer (SPC in normal/visual, M-SPC elsewhere)
(general-create-definer leader!
:keymaps '(normal insert visual emacs)
:prefix "SPC"
:global-prefix "M-SPC")
(general-define-key
"C-s" #'write-file)
(general-define-key
:states 'normal
:keymaps 'lsp-mode-map
"K" #'lsp-ui-doc-glance)
;; Named prefix groups
(leader!
"SPC" '(project-find-file :which-key "find project files")
"f" '(:ignore t :which-key "files")
"ff" '(find-file :which-key "find file")
"fs" '(save-buffer :which-key "save")
"fr" '(recentf-open :which-key "recent files")
"e" '(dired-jump :which-key "dired")
"b" '(:ignore t :which-key "buffers")
"bb" '(switch-to-buffer :which-key "switch buffer")
"bd" '(evil-delete-buffer :which-key "delete buffer")
"c" '(:ignore t :which-key "code")
"ca" '(lsp-execute-code-action :which-key "code action")
"cd" '(lsp-find-definition :which-key "definition")
"cr" '(lsp-rename :which-key "rename")
"cf" '(apheleia-format-buffer :which-key "format")
;; useful extras while you're at it
"p" '(:ignore t :which-key "project")
"pp" '(project-switch-project :which-key "switch project")
"pb" '(project-switch-to-buffer :which-key "project buffers")
"pk" '(project-kill-buffers :which-key "kill project buffers")))
;; Theming
(use-package catppuccin-theme :ensure t
:config
(load-theme 'catppuccin :no-confirm))
(set-frame-font "JetBrainsMono NFM 16" nil t)
;; Minibuffer
(use-package vertico
:custom
(vertico-scroll-margin 0) ;; Different scroll margin
(vertico-count 20) ;; Show more candidates
(vertico-resize t) ;; Grow and shrink the Vertico minibuffer
(vertico-cycle t) ;; Enable cycling for `vertico-next/previous'
:init
(vertico-mode))
;; Persist history over Emacs restarts. Vertico sorts by history position.
(use-package savehist :ensure nil
:init
(savehist-mode))
;; Emacs minibuffer configurations.
(use-package emacs :ensure nil
:custom
;; Enable context menu. `vertico-multiform-mode' adds a menu in the minibuffer
;; to switch display modes.
(context-menu-mode t)
;; Support opening new minibuffers from inside existing minibuffers.
(enable-recursive-minibuffers t)
;; Hide commands in M-x which do not work in the current mode. Vertico
;; commands are hidden in normal buffers. This setting is useful beyond
;; Vertico.
(read-extended-command-predicate #'command-completion-default-include-p)
;; Do not allow the cursor in the minibuffer prompt
(minibuffer-prompt-properties
'(read-only t cursor-intangible t face minibuffer-prompt)))
;; `orderless' completion style.
(use-package orderless
:custom
;; Configure a custom style dispatcher (see the Consult wiki)
;; (orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch))
;; (orderless-component-separator #'orderless-escapable-split-on-space)
(completion-styles '(orderless basic))
(completion-category-overrides '((file (styles partial-completion))))
(completion-category-defaults nil) ;; Disable defaults, use our settings
(completion-pcm-leading-wildcard t)) ;; Emacs 31: partial-completion behaves like substring;; LSP & Treesitter
;; #########
;; LSP Stuff
;; #########
(use-package treesit-auto :ensure t
:custom
(treesit-auto-install 'prompt)
:config
(global-treesit-auto-mode))
(use-package lsp-mode :ensure t
:init
(setq lsp-keymap-prefix "C-c l")
:hook ((c-mode . lsp-deferred )
(lsp-mode . lsp-enable-which-key-integration))
:commands (lsp lsp-deferred))
(use-package lsp-ui :ensure t
:custom
(lsp-ui-doc-enable t)
(lsp-ui-doc-position 'at-point)
(lsp-ui-sideline-show-diagnostics t)
:hook (lsp-mode . lsp-ui-mode))
;; Completion via corfu (modern, lighter than company)
(use-package corfu
:ensure t
:custom
(corfu-auto t)
(corfu-auto-delay 0.1)
:init (global-corfu-mode))
;; Diagnostics via flymake (built-in) or flycheck
(use-package flycheck
:ensure t
:hook (lsp-mode . flycheck-mode))
(use-package apheleia
:ensure t
:config
(apheleia-global-mode))
;; #########
;; Which-Key
;; #########
(use-package which-key :ensure t
:config
(which-key-mode))
(use-package smartparens
:ensure t
:hook (prog-mode . smartparens-mode)
:config
(require 'smartparens-config)) ; loads language-specific rules
(use-package rainbow-delimiters
:ensure t
:hook (prog-mode . rainbow-delimiters-mode))
(use-package dashboard
:ensure t
:config
(setq dashboard-items '((recents . 5)
(bookmarks . 5)
(projects . 5)
(agenda . 5)
(registers . 5)))
(add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists)
(add-hook 'elpaca-after-init-hook #'dashboard-initialize)
(dashboard-setup-startup-hook))