;; 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 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. )