.emacs.d/init.el
2025-10-06 22:48:10 -07:00

286 lines
8.8 KiB
EmacsLisp

(add-to-list 'default-frame-alist '(fullscreen . maximized))
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
(unless package-archive-contents
(package-refresh-contents))
;; Save customization info elsewhere
(setq custom-file "~/.config/emacs-custom.el")
(when (file-exists-p custom-file)
(load custom-file))
;; Global Settings
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(show-paren-mode 1)
(global-hl-line-mode t)
(global-auto-revert-mode t)
(global-prettify-symbols-mode t)
(add-hook 'before-save-hook #'delete-trailing-whitespace)
(setf user-full-name "Caleb Gossler"
user-mail-address "caleb.gossler@gmail.com"
calendar-latitude 47.4
calendar-longitude -122.3
calendar-location-name "Seattle, WA"
indent-tabs-mode nil
ring-bell-function 'ignore
vc-follow-symlinks t
confirm-kill-emacs 'y-or-n-p
diray-file "~/org/diary"
backup-directory-alist '(("." . "~/.emacs.d/backup"))
abbrev-file-name "~/org/abbrev_defs"
backup-directory-alist `(("." . "~/.emacs.d/backups"))
compilation-scroll-output t
large-file-warning-threshold nil)
(use-package doom-themes
:ensure t
:config
;; Global settings (defaults)
(setq doom-themes-enable-bold t ; if nil, bold is universally disabled
doom-themes-enable-italic t) ; if nil, italics is universally disabled
(load-theme 'doom-one t)
;; Enable flashing mode-line on errors
(doom-themes-visual-bell-config)
;; Corrects (and improves) org-mode's native fontification.
(doom-themes-org-config))
(use-package doom-modeline
:ensure t
:init (doom-modeline-mode 1)
:config
(setq doom-modeline-icon nil))
(use-package flyspell
:config
(setf ispell-personal-dictionary "~/org/dictionary"))
(use-package markdown-mode :ensure t)
(use-package rg :ensure t)
(defun org-auto-preview-latex ()
(org-latex-preview '(16)))
(use-package org
:after flyspell
:hook
(org-mode . visual-line-mode)
(org-mode . org-display-inline-images)
(org-mode . org-auto-preview-latex)
(org-babel-after-execute . (lambda () (when org-inline-image-overlays (org-redisplay-inline-images))))
:config
(org-babel-do-load-languages
'org-babel-load-languages
'((ditaa . t)
(dot . t)
(shell . t)
(python . t)
(latex . t)
(gnuplot . t)))
(plist-put org-format-latex-options :scale 2.5)
(setq org-startup-indented t
org-hide-leading-stars t
org-startup-folded 'content
org-ellipsis ""
org-agenda-files '("~/org/agenda")
org-agenda-include-diary t
org-refile-targets '((org-agenda-files :maxlevel . 2))
org-startup-indented t
org-agenda-span 'day
org-agenda-todo-ignore-scheduled 'future
org-log-into-drawer t
org-clock-idle-time 10
org-return-follows-link t
org-special-ctrl-a/e t
org-pretty-entities t
org-pretty-entities-include-sub-superscripts t
org-agenda-skip-scheduled-if-deadline-is-shown t
org-log-done 'time
org-latex-create-formula-image-program 'dvipng
org-capture-templates
'(("c" "Clock into new")
("ct" "Task" entry (file+headline "~/org/agenda/inbox.org" "Inbox")
"* TODO %?\nSCHEDULED: %T Created: %U\n Context: %a\n %i" :clock-in t :clock-keep t)
("cm" "Meeting" entry (file+olp+datetree "~/org/agenda/meetings.org")
"* %?\n** Details\n + *Agenda*:\n + *Attendees*:\n" :clock-in t :clock-keep t)
("t" "New Task" entry (file+headline "~/org/agenda/inbox.org" "Inbox")
"* TODO %?\n Created: %U\n Context: %a\n %i")
("j" "New Journal Entry" entry (file+olp+datetree "~/org/agenda/journal.org.gpg")
"* %? %^g\n\nPosted At: %U" :empty-lines-after 1 :kill-buffer t)
("l" "New Log Entry" entry (file+olp+datetree "~/org/agenda/log.org.gpg")
"* %? \nPosted At: %U" :empty-lines-after 1 :kill-buffer t)
("r" "Random" entry (file "~/org/agenda/random.org.gpg")
"* %?\nCreated At: %U" :empty-lines-after 1 :kill-buffer t)
("n" "Add Note to Clocked in Entry" item (clock)
"+ %i%?\n Context: [[%L][Link]]")
("b" "Add Checkbox to Clocked in Entry" item (clock)
"+ [ ] %? (%<%r>)\nContext: %a" :prepend t)
("a" "Add Task to Clocked in Entry" entry (clock)
"* TODO %?" :prepend t))
org-agenda-custom-commands
'(("a" "Combined Agenda"
((agenda)
(tags-todo "+inbox" ((org-agenda-overriding-header "Inbox:")))))
("t" "Study"
((agenda)
(todo "READING" ((org-agenda-overriding-header "Currently Reading")))
(todo "PAUSED" ((org-agenda-overriding-header "On Hold")))
(todo "TO-WATCH" ((org-agenda-overriding-header "Videos to Watch")))
(todo "RESEARCH"))
((org-agenda-category-filter-preset '("+study"))))
("w" "Work"
((agenda)
(todo "BLOCKED" ((org-agenda-overriding-header "Blocked:")))
(todo "IN-PROGRESS" ((org-agenda-overriding-header "In Progress:")))
(todo "ON-HOLD" ((org-agenda-overriding-header "On Hold:")))
(todo "TODO" ((org-agenda-overriding-header "Backlog:")))
(tags-todo "+inbox" ((org-agenda-overriding-header "Inbox:"))))
((org-agenda-category-filter-preset '("+work"))))))
:bind
("\C-ca" . org-agenda)
("\C-cc" . org-capture)
("\C-cb" . org-iswitchb)
("\C-cl" . org-store-link))
(use-package org-habit :after org)
(use-package org-drill
:after org
:commands (org-drill org-drill-all org-drill-again)
:ensure
:config
(setq org-drill-spaced-repetition-algorithm 'sm5
org-drill-learn-fraction 0.5
org-drill-add-random-noise-to-intervals-p t
org-drill-leech-method 'warn))
(defun org-drill-all ()
(interactive)
(org-drill
(directory-files-recursively "~/org/notes/" "\.org$")))
(when (eq system-type 'gnu/linux)
(use-package pdf-tools
:ensure t
:magic ("%PDF" . pdf-view-mode)
:hook (pdf-view-mode . pdf-view-midnight-minor-mode)
:config
(pdf-tools-install :no-query))
(use-package org-pdftools
:ensure t
:hook (org-mode . org-pdftools-setup-link)
;; below is a hack until this issue is fixed:
;; https://github.com/fuxialexander/org-pdftools/issues/110
:config
(defalias 'find-if 'cl-find-if)
(defalias 'getf 'cl-getf))
(use-package docker
:ensure t))
(use-package yasnippet
:ensure t
:config
(setq yas-snippet-dirs '("~/.emacs.d/snippets"))
(yas-global-mode 1))
(use-package magit
:ensure t
:commands (magit-status magit-get-current-branch)
:bind (("C-x g" . magit-status)))
(use-package multiple-cursors
:ensure t
:bind (("C->" . mc/mark-next-like-this)
("C-<" . mc/mark-previous-like-this)
("C-c C-<" . mc/mark-all-like-this)))
(use-package ivy
:ensure t
:config (ivy-mode 1)
(setq ivy-use-virtual-buffers t
ivy-count-format "(%d/%d) "
enable-recursive-minibuffers t
magit-completing-read-function 'ivy-completing-read))
(use-package counsel
:ensure t
:bind (("C-s" . swiper-isearch))
:config
(setq swiper-include-line-number-in-search t))
(use-package projectile
:ensure
:config
(setq project-find-functions '(project-projectile))
:bind-keymap
("C-c p" . projectile-command-map)
:bind
("C-x f" . projectile-find-file)
("C-c s" . projectile-ripgrep)
("C-c t" . eglot-find-typeDefinition))
(use-package counsel-projectile
:ensure t
:config (counsel-projectile-mode +1)
:after projectile)
(use-package sharper
:ensure t
:bind
("C-c n" . sharper-main-transient))
(use-package corfu
:ensure t
:pin gnu
:init
(global-corfu-mode)
:config
(setq corfu-min-width 250
corfu-min-height 750
corfu-count 20
corfu-auto t
corfu-cycle t
corfu-separator ?\s
corfu-preview-current "insert"
corfu-scroll-margin 25
;; enable corfu on TAB
tab-always-indent 'complete
;; shows documentation after `corfu-popupinfo-delay'
corfu-popupinfo-delay '(1.25 . 0.5))
(corfu-popupinfo-mode 1)
;; Sort by input history (no need to modify `corfu-sort-function').
(with-eval-after-load 'savehist
(corfu-history-mode 1)
(add-to-list 'savehist-additional-variables 'corfu-history)))
(use-package fsharp-mode
:defer t
:ensure t
:config
(remove-hook 'project-find-functions #'fsharp-mode-project-root))
(use-package eglot-fsharp
:ensure t
:after fsharp-mode
:config
(add-hook 'fsharp-mode-hook #'eglot-ensure)
(setq eglot-fsharp-server-args '("--use-fcs-transparent-compiler" "--project-graph-enabled")
eglot-report-progress nil
eglot-ignored-server-capabilities '(:inlayHintProvider))
)
(use-package lua-mode :ensure t)
(use-package which-key
:ensure t
:config (which-key-mode))