477 lines
12 KiB
EmacsLisp

;; performance enhancements
(setq gc-cons-threshold #x40000000)
(setq read-process-output-max (* 1024 1024 4))
;; EMACS ----------
(use-package emacs
:ensure nil
:custom
(column-number-mode t)
(auto-save-default nil)
(create-lockfiles nil)
(display-line-numbers-type 'relative)
(global-auto-revert-non-file-buffers t)
(history-length 25)
(inhibit-startup-message t)
(initial-scratch-message "")
(ispell-dictionary "en_US")
(make-backup-files nil)
(pixel-scroll-precision-mode t)
(pixel-scroll-precision-use-momentum nil)
(ring-bell-function 'ignore)
(split-width-threshold 300)
(switch-to-buffer-obey-display-actions t)
(tab-width 4)
(treesit-font-lock-level 4)
(truncate-lines t)
(use-dialog-box nil)
(use-short-answers t)
;; recommended from vertico
(context-menu-mode t)
(enable-recursive-minibuffers t)
(read-extended-command-predicate #'command-completion-default-include-p)
(minibuffer-prompt-properties
'(read-only t cursor-intangible t face minibuffer-prompt))
;; recommended from corfu
(tab-always-indent 'complete)
(text-mode-ispell-word-completion nil)
:hook
(prog-mode . display-line-numbers-mode)
:config
(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 120)
:init
(tool-bar-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(global-hl-line-mode 1)
(global-auto-revert-mode 1)
(indent-tabs-mode -1)
(recentf-mode 1)
(savehist-mode 1)
(save-place-mode 1)
(winner-mode 1)
(xterm-mouse-mode 1)
(file-name-shadow-mode 1))
;; THEMES AND MODELINE ----------
(use-package modus-themes
:ensure t
:config
(load-theme 'modus-vivendi t))
(use-package doom-modeline
:ensure t
:config
(display-battery-mode t)
(display-time-mode t)
:config (doom-modeline-mode 1))
(use-package nerd-icons
:ensure t)
(use-package nerd-icons-dired
:ensure t
:hook
(dired-mode . nerd-icons-dired-mode))
;; EVIL MODE ----------
(use-package evil
:ensure t
:defer t
:hook
(after-init . evil-mode)
:init
(setq evil-want-integration t)
(setq evil-want-keybinding nil)
(setq evil-want-C-u-scroll t)
(setq evil-want-C-u-delete t)
:config
(evil-set-undo-system 'undo-tree)
(evil-set-leader 'normal (kbd "SPC"))
(evil-set-leader 'visual (kbd "SPC")))
(use-package evil-collection
:after evil
:ensure t
:config
(evil-collection-init))
(use-package evil-surround
:after evil
:ensure t
:config
(global-evil-surround-mode 1))
;; MINAD STACK -----------
(use-package vertico
:ensure t
:config
(setq vertico-cycle t)
(setq vertico-resize t)
(vertico-mode))
(use-package orderless
:ensure t
:config
(setq completion-styles '(orderless basic))
(setq completion-category-overrides '((file (styles partial-completion))))
(setq completion-category-defaults nil)
(setq completion-pcm-leading-wildcard t))
(use-package marginalia
:ensure t
:config
(marginalia-mode))
(use-package consult
:ensure t)
(use-package embark
:ensure t)
(use-package embark-consult
:ensure t
:hook
(embark-collect-mode . consult-preview-at-point-mode))
(use-package corfu
:ensure t
:config
(setq corfu-cycle t)
(setq corfu-quit-at-boundary nil)
(setq corfu-quit-no-match t)
(setq corfu-preselect 'prompt)
(setq corfu-on-exact-match nil)
(setq corfu-auto t)
(setq corfu-auto-prefix 2)
(setq corfu-popupinfo-delay 0.5)
(global-corfu-mode)
(corfu-history-mode)
(corfu-popupinfo-mode))
(use-package nerd-icons-corfu
:ensure t
:after corfu
:config (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
(use-package cape
:ensure t
:bind ("C-c p" . cape-prefix-map)
:config
(add-hook 'completion-at-point-functions #'cape-abbrev)
(add-hook 'completion-at-point-functions #'cape-dict)
(add-hook 'completion-at-point-functions #'cape-file)
(add-hook 'completion-at-point-functions #'cape-elisp-block)
(add-hook 'completion-at-point-functions #'cape-keyword)
(add-hook 'completion-at-point-functions #'cape-tex))
(use-package tempel
:ensure t
:custom
(defun tempel-setup-capf ()
(setq-local completion-at-point-functions
(cons #'tempel-expand
completion-at-point-functions)))
(add-hook 'conf-mode-hook 'tempel-setup-capf)
(add-hook 'prog-mode-hook 'tempel-setup-capf)
(add-hook 'text-mode-hook 'tempel-setup-capf))
(use-package tempel-collection
:ensure t)
(use-package eldoc
:ensure nil
:init
(global-eldoc-mode))
;; LINTING ------------
(use-package flycheck
:ensure t
:config
(global-flycheck-mode))
(use-package consult-flycheck
:ensure t)
(use-package flycheck-eglot
:ensure t
:after (flycheck eglot)
:config
(global-flycheck-eglot-mode 1))
;; LANGUAGE MODES -------
(use-package treesit-auto
:ensure t
:config
(treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode))
(use-package nix-ts-mode
:ensure t
:mode "\\.nix\\'")
;; LSP ---------
(use-package eglot
:ensure t
:defer t
:hook ((nix-ts-mode . eglot-ensure)
(go-ts-mode . eglot-ensure)
(typescript-ts-mode . eglot-ensure)))
(use-package eglot-booster
:ensure t
:after eglot
:config
(eglot-booster-mode))
(use-package markdown-mode
:ensure t)
;; TOOLS ---------
(use-package magit
:ensure t
:defer t)
(use-package vterm
:ensure t)
(use-package multi-vterm
:ensure t)
(use-package undo-tree
:ensure t
:config
(setq undo-tree-visualizer-timestamps t
undo-tree-visualizer-diff t
undo-limit 800000
undo-strong-limit 12000000
undo-outer-limit 120000000)
(setq undo-tree-history-directory-alist '(("." . "~/.config/emacs/.cache/undo")))
(global-undo-tree-mode))
;; PATH STUFF --------
(use-package exec-path-from-shell
:ensure t
:init
(exec-path-from-shell-initialize))
(use-package envrc
:ensure t
:init
(setq envrc-show-summary-in-minibuffer nil)
:hook
(after-init . envrc-global-mode))
;; ORG ----------
(use-package org
:ensure nil
:defer t
:custom
(org-tags-column 0)
(org-return-follows-link t)
(org-hide-emphasis-markers t)
(org-log-into-drawer t)
(org-log-done 'time)
(org-agenda-span 'day)
(org-todo-keywords
'((sequence "TODO(t)" "NEXT(n)" "PROG(p)" "INTR(i)" "WAIT(w)" "SOMEDAY(s)" "|" "DONE(d)" "CANCELLED(c)")))
(org-capture-templates
`(("i" "Inbox" entry (file+headline "todo.org" "Inbox")
,(concat "* TODO %?\n"
"%U"))
("j" "Journal" entry (file denote-journal-path-to-new-or-existing-entry)
"* %U %?\n%i\n%a"
:kill-buffer t
:empty-lines 1)
("@" "Inbox [email]" entry (file+headline "todo.org" "Inbox")
,(concat "* TODO Process \"%a\" %?\n"
"%U"))))
(org-refile-use-outline-path 'file)
(org-outline-path-complete-in-steps nil)
(org-refile-targets '((nil :maxlevel . 9)
(org-agenda-files :maxlevel . 9)))
(org-agenda-skip-scheduled-if-done t)
(org-agenda-skip-deadline-if-done t)
(org-agenda-include-deadlines t)
(org-agenda-include-diary t)
(org-agenda-block-separator nil)
(org-agenda-compact-blocks t)
(org-agenda-start-with-log-mode t)
:config
(setq org-directory "~/org")
(setq org-agenda-files (list "todo.org"))
:hook
(org-mode . org-indent-mode)
:init
(require 'org-tempo))
(use-package denote
:ensure t
:hook
((dired-mode . denote-dired-mode)
(text-mode . denote-fontify-links-mode))
:bind
(("C-c n n" . denote)
("C-c n r" . denote-rename-file)
("C-c n l" . denote-link)
("C-c n b" . denote-backlinks)
("C-c n d" . denote-dired))
:config
(setq denote-directory (expand-file-name "~/org/note"))
(denote-rename-buffer-mode 1))
(use-package consult-denote
:ensure t
:bind
(("C-c n f" . consult-denote-find)
("C-c n g" . consult-denote-grep))
:config
(consult-denote-mode 1))
(use-package denote-journal
:ensure t
:commands (denote-journal-new-entry
denote-journal-new-or-existing-entry
denote-journal-link-or-create-entry )
:hook (calendar-mode . denote-journal-calendar-mode)
:config
(setq denote-journal-directory
(expand-file-name "journal" denote-directory))
(setq denote-journal-keyword "journal")
(setq denote-journal-title-format 'day-date-month-year))
(use-package org-superstar
:ensure t
:hook
(org-mode . org-superstar-mode))
(use-package org-super-agenda
:ensure t
:custom
(org-super-agenda-groups
'(
(:name "Today"
:time-grid t
:date today
:todo "TODAY"
:scheduled today
:order 1)
(:name "Next Items"
:todo "NEXT"
:order 2)
(:name "Due Today"
:deadline today
:order 3)
(:name "Due Soon"
:deadline future
:order 4)
(:name "Overdue"
:deadline past
:order 5)
(:name "Scheduled Soon"
:scheduled future
:order 6)
(:name "Waiting"
:todo "WAIT"
:order 7)
(:habit t
:order 8)
(:name "Project"
:category "Project"
:order 9)
)))
;; KEYBINDS ---------
(use-package which-key
:ensure nil
:config
(which-key-mode))
(use-package general
:ensure t
:config
(general-evil-setup t)
(general-define-key
:states 'normal
"] d" '(next-error :wk "Goto next error")
"[ d" '(previous-error :wk "Goto prev error")
"] c" '(diff-hl-next-hunk :wk "Goto next hunk")
"[ c" '(diff-hl-previous-hunk :wk "Goto prev hunk")
"K" '(eldoc :wk "Describe"))
(general-create-definer my-leader-def
:states '(normal insert visual motion emacs)
:keymaps 'override
:prefix "SPC"
:global-prefix "C-SPC")
(my-leader-def
"f" '(:ignore t :wk "Find")
"f c" '((lambda () (interactive) (find-file "~/.config/emacs/init.el")) :wk "Edit emacs config")
"f r" '(consult-recent-file :wk "Recent files")
"f f" '(consult-find :wk "Find Files")
"f g" '(consult-ripgrep :wk "Ripgrep search in files")
"f l" '(consult-line :wk "Find line")
"f i" '(consult-imenu :wk "Imenu buffer locations"))
(my-leader-def
"c" '(:ignore t :wk "Code")
"c a" '(eglot-code-actions :wk "Code actions"))
(my-leader-def
"h" '(:ignore t :wk "Help")
"h v" '(describe-variable :wk "Describe variable")
"h f" '(describe-function :wk "Describe function")
"h k" '(describe-key :wk "Describe key"))
(my-leader-def
"p" '(:ignore t :wk "Project")
"p b" '(consult-project-buffer :wk "Project buffers")
"p p" '(project-switch-project :wk "Project switch")
"p f" '(project-find-file :wk "Project find file")
"p g" '(project-find-regexp :wk "Project grep file")
"p k" '(project-kill-buffers :wk "Project kill buffers")
"p d" '(project-dired :wk "Project dired"))
(my-leader-def
"x" '(:ignore t :wk "Flymake")
"x x" '(consult-flycheck :wk "Show diagnostics"))
(my-leader-def
"g" '(:ignore t :wk "Git")
"g g" '(magit-status :wk "Magit status")
"g l" '(magit-log-current :wk "Magit log"))
(my-leader-def
"u" '(undo-tree-visualize :wk "Undo-tree")))
(use-package diff-hl
:ensure t
:config
(global-diff-hl-mode))
(provide 'init)
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(custom-safe-themes
'("77f281064ea1c8b14938866e21c4e51e4168e05db98863bd7430f1352cab294a"
default)))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)