(setq system-email "ret2pop@gmail.com")
(setq system-username "prestonpan")
(setq system-fullname "Preston Pan")
(use-package emacs
:custom
;; Startup errors
(warning-minimum-level :emergency "Supress emacs warnings")
(debug-ignored-errors (cons 'remote-file-error debug-ignored-errors) "Remove annoying error from debug errors")
;; Mouse wheel
(mouse-wheel-scroll-amount '(1 ((shift) . 1)) "Nicer scrolling")
(mouse-wheel-progressive-speed nil "Make scrolling non laggy")
(mouse-wheel-follow-mouse 't "Scroll correct window")
(scroll-conservatively 101 "Sort of smooth scrolling")
(scroll-step 1 "Scroll one line at a time")
(display-time-24hr-format t "Use 24 hour format to read the time")
(display-line-numbers-type 'relative "Relative line numbers for easy vim jumping")
(use-short-answers t "Use y instead of yes")
(make-backup-files nil "Don't make backups")
(display-fill-column-indicator-column 100 "Draw a line at 100 characters")
(line-spacing 2 "Default line spacing")
;; Editor comments
(c-doc-comment-style '((c-mode . doxygen)
(c++-mode . doxygen)))
:hook ((text-mode . auto-fill-mode)
(text-mode . visual-line-mode)
(prog-mode . auto-fill-mode)
(prog-mode . display-line-numbers-mode)
(prog-mode . display-fill-column-indicator-mode)
(org-mode . auto-fill-mode)
(org-mode . display-fill-column-indicator-mode)
(org-mode . display-line-numbers-mode)
(org-mode . (lambda ()
(setq prettify-symbols-alist
'(("#+begin_src" . ?)
("#+BEGIN_SRC" . ?)
("#+end_src" . ?)
("#+END_SRC" . ?)
("#+begin_example" . ?)
("#+BEGIN_EXAMPLE" . ?)
("#+end_example" . ?)
("#+END_EXAMPLE" . ?)
("#+header:" . ?)
("#+HEADER:" . ?)
("#+name:" . ?﮸)
("#+NAME:" . ?﮸)
("#+results:" . ?)
("#+RESULTS:" . ?)
("#+call:" . ?)
("#+CALL:" . ?)
(":PROPERTIES:" . ?)
(":properties:" . ?)
("lambda" . ?λ)
("->" . ?→)
("map" . ?↦)
("/=" . ?≠)
("!=" . ?≠)
("==" . ?≡)
("<=" . ?≤)
(">=" . ?≥)
("&&" . ?∧)
("||" . ?∨)
("sqrt" . ?√)
("..." . ?…)))
(prettify-symbols-mode)))
(prog-mode .
(lambda ()
(setq prettify-symbols-alist
'(("lambda" . ?λ)
("->" . ?→)
("map" . ?↦)
("/=" . ?≠)
("!=" . ?≠)
("==" . ?≡)
("<=" . ?≤)
(">=" . ?≥)
("&&" . ?∧)
("||" . ?∨)
("sqrt" . ?√)
("..." . ?…)))
(prettify-symbols-mode))))
:config
(require 'tex-site)
(server-start)
;; start wiith sane defaults
(pixel-scroll-precision-mode 1)
(display-battery-mode 1)
(display-time-mode 1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode -1)
;; load theme, fonts, and transparency. Prettify symbols.
(global-prettify-symbols-mode 1)
(load-theme 'catppuccin :no-confirm)
(set-face-attribute 'default nil :font "Iosevka Nerd Font" :height 130)
(set-frame-parameter nil 'alpha-background 90)
(add-to-list 'default-frame-alist '(alpha-background . 90)))
(use-package org
:custom
(org-confirm-babel-evaluate nil "Don't ask to evaluate code block")
(org-export-with-broken-links t "publish website even with broken links")
(org-src-fontify-natively t "Colors!")
(org-latex-preview-image-directory (expand-file-name "~/.cache/ltximg/") "don't use weird cache location")
(org-preview-latex-image-directory (expand-file-name "~/.cache/ltximg/") "don't use weird cache location")
(TeX-PDF-mode t)
(org-latex-pdf-process '("xelatex -interaction=nonstopmode -output-directory=%o %f") "set xelatex as default")
(TeX-engine 'xetex "set xelatex as default engine")
(preview-default-option-list '("displaymath" "textmath" "graphics") "preview latex")
(preview-image-type 'png "Use PNGs")
(org-format-latex-options (plist-put org-format-latex-options :scale 1.5) "space latex better")
(org-return-follows-link t "be able to follow links without mouse")
(org-habit-preceding-days 1 "See org habit entries")
(org-startup-indented t "Indent the headings")
(org-image-actual-width '(300) "Cap width")
(org-startup-with-latex-preview t "see latex previews on opening file")
(org-startup-with-inline-images t "See images on opening file")
(org-hide-emphasis-markers t "prettify org mode")
(org-use-sub-superscripts "{}" "Only display superscripts and subscripts when enclosed in {}")
(org-pretty-entities t "prettify org mode")
(org-agenda-files (list "~/monorepo/agenda.org" "~/org/notes.org" "~/org/agenda.org") "set default org files")
(org-default-notes-file (concat org-directory "/notes.org") "Notes file")
(org-publish-project-alist
'(("website-org"
:base-directory "~/monorepo"
:base-extension "org"
:publishing-directory "~/website_html"
:recursive t
:publishing-function org-html-publish-to-html
:headline-levels 4
:html-preamble t
:html-preamble-format (("en" "
home | section main page
")))
("website-static"
:base-directory "~/monorepo"
:base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|ico\\|asc\\|pub\\|webmanifest\\|xml"
:publishing-directory "~/website_html/"
:recursive t
:publishing-function org-publish-attachment)
("website" :auto-sitemap t :components ("website-org" "website-static"))) "functions to publish website")
(org-html-postamble "Copyright © 2024 Preston Pan" "set copyright notice on bottom of site")
:config
(require 'ox-publish)
(require 'org-tempo)
(require 'org-habit)
(org-babel-do-load-languages 'org-babel-load-languages
'((shell . t)
(python . t)
(latex . t))))
(use-package unicode-fonts
:init (unicode-fonts-setup))
(use-package electric-pair
:hook ((prog-mode . electric-pair-mode)))
(use-package lyrics-fetcher
:after (emms)
:custom
(lyrics-fetcher-genius-access-token (password-store-get "genius_api") "Use genius for backend")
:config
(lyrics-fetcher-use-backend 'genius))
(use-package org-fragtog :hook (org-mode . org-fragtog-mode))
(use-package yasnippet
:config
(add-to-list 'yas-snippet-dirs "~/monorepo/yasnippet/")
(yas-global-mode 1)
:hook (org-mode . (lambda () (yas-minor-mode) (yas-activate-extra-mode 'latex-mode))))
(use-package company
:config
'(add-to-list 'company-backends '(company-ispell company-capf company-yasnippet company-files))
:hook ((after-init . global-company-mode)))
(use-package ispell
:custom
(ispell-program-name "aspell" "use aspell")
(ispell-silently-savep t "Save changes to dict without confirmation")
(ispell-dictionary "en" "Use english dictionary")
(ispell-alternate-dictionary "~/.local/share/dict" "dict location"))
(use-package flyspell
:hook (text-mode . flyspell-mode))
(use-package evil
:custom
(evil-want-keybinding nil "Don't load a whole bunch of default keybindings")
:config
(evil-mode 1)
(evil-set-undo-system 'undo-redo)
(evil-set-initial-state 'pdf-view-mode 'normal))
(use-package evil-collection
:after (evil)
:config
(with-eval-after-load 'evil-maps
(define-key evil-motion-state-map (kbd "SPC") nil)
(define-key evil-motion-state-map (kbd "RET") nil)
(define-key evil-motion-state-map (kbd "TAB") nil))
(evil-collection-init))
(use-package evil-commentary
:after (evil)
:config
(evil-commentary-mode))
(use-package evil-org
:after (evil org)
:hook (org-mode . (lambda () evil-org-mode))
:config
(require 'evil-org-agenda)
(evil-org-agenda-set-keys))
(use-package which-key
:config
(which-key-mode))
(use-package page-break-lines
:init
(page-break-lines-mode))
(use-package org-journal
:after (org)
:custom
(org-journal-dir "~/monorepo/journal/" "Set journal directory")
(org-journal-date-format "%A, %d %B %Y" "Date format")
(org-journal-file-format "%Y%m%d.org" "Automatic file creation format based on date")
(org-journal-enable-agenda-integration t "All org-journal entries are org-agenda entries")
:init
(defun org-journal-file-header-func (time)
"Custom function to create journal header."
(concat
(pcase org-journal-file-type
(`daily "#+TITLE: Daily Journal\n#+STARTUP: showeverything\n#+DESCRIPTION: My daily journal entry\n#+AUTHOR: Preston Pan\n#+HTML_HEAD: \n#+html_head: \n#+html_head: \n#+options: broken-links:t")
(`weekly "#+TITLE: Weekly Journal\n#+STARTUP: folded")
(`monthly "#+TITLE: Monthly Journal\n#+STARTUP: folded")
(`yearly "#+TITLE: Yearly Journal\n#+STARTUP: folded"))))
(setq org-journal-file-header 'org-journal-file-header-func))
(use-package doom-modeline
:config
(doom-modeline-mode 1))
(use-package writegood-mode
:hook (text-mode . writegood-mode))
(use-package org-superstar
:after (org)
:hook (org-mode . (lambda () (org-superstar-mode 1))))
(use-package eglot
:hook
(prog-mode . eglot-ensure)
(nix-mode . eglot-ensure)
:config
(add-to-list 'eglot-server-programs '(nix-mode . ("nil"))))
(use-package lsp
:hook
(prog-mode . lsp))
(use-package flycheck
:config (global-flycheck-mode))
(use-package platformio-mode
:hook (prog-mode . platformio-conditionally-enable))
(use-package irony-mode
:hook (
(c++-mode . irony-mode)
(c-mode . irony-mode)
(objc-mode . irony-mode)
(irony-mode . irony-cdb-autosetup-compile-options)))
(use-package irony-eldoc
:hook ((irony-mode . irony-eldoc)))
(use-package solidity-mode)
(use-package company-solidity)
(use-package solidity-flycheck
:custom
(solidity-flycheck-solc-checker-active t))
(use-package projectile
:custom
(projectile-project-search-path '("~/org" "~/src" "~/monorepo" "~/projects") "search path for projects")
:config
(projectile-mode +1))
(use-package dashboard
:after (projectile)
:custom
(dashboard-banner-logo-title "Welcome, Commander!" "Set title for dashboard")
(dashboard-icon-type 'nerd-icons "Use nerd icons")
(dashboard-vertically-center-content t "Center content")
(dashboard-set-init-info t)
(dashboard-week-agenda t "Agenda in dashboard")
(dashboard-items '((recents . 5)
(bookmarks . 5)
(projects . 5)
(agenda . 5)
(registers . 5)) "Look at some items")
:config
(dashboard-setup-startup-hook))
(use-package counsel)
(use-package ivy
:custom
(ivy-use-virtual-buffers t "Make searching more efficient")
(enable-recursive-minibuffers t "Don't get soft locked when in a minibuffer")
:bind
("C-s" . swiper)
("C-c C-r" . ivy-resume)
("M-x" . counsel-M-x)
("C-x C-f" . counsel-find-file)
(" f" . counsel-describe-function)
(" v" . counsel-describe-variable)
(" o" . counsel-describe-symbol)
(" l" . counsel-find-library)
(" i" . counsel-info-lookup-symbol)
(" u" . counsel-unicode-char)
("C-c g" . counsel-git)
("C-c j" . counsel-git-grep)
("C-c k" . counsel-ag)
("C-x l" . counsel-locate)
:config
(ivy-mode))
(define-key ivy-minibuffer-map (kbd "C-j") 'ivy-immediate-done)
(use-package magit)
(use-package erc
:custom
(erc-nick system-username "Set erc nick to username")
(erc-user-full-name system-fullname "Use real name for full name"))
(use-package general
:init
(defun prestonpan ()
(interactive)
(erc-tls :server "nullring.xyz"
:port "6697"))
(defun liberachat ()
(interactive)
(erc-tls :server "irc.libera.chat"
:port "6697"))
(defun efnet ()
(interactive)
(erc-tls :server "irc.prison.net"
:port "6697"))
(defun matrix-org ()
(interactive)
(ement-connect :uri-prefix "http://localhost:8009"))
:config
(general-create-definer leader-key :prefix "SPC")
(leader-key 'normal
"o a" '(org-agenda :wk "Open agenda")
"o c" '(org-capture :wk "Capture")
"n" '(:ignore t :wk "Org mode plugins")
"n j j" '(org-journal-new-entry :wk "Make new journal entry")
"n r f" '(org-roam-node-find :wk "Find roam node")
"n r i" '(org-roam-node-insert :wk "Insert roam node")
"n r a" '(org-roam-alias-add :wk "Add alias to org roam node")
"n r g" '(org-roam-graph :wk "Graph roam database")
"r s s" '(elfeed :wk "rss feed")
"." '(counsel-find-file :wk "find file")
"g" '(:ignore t :wk "Magit")
"g /" '(magit-dispatch :wk "git commands")
"g P" '(magit-push :wk "git push")
"g c" '(magit-commit :wk "git commit")
"g p" '(magit-pull :wk "Pull from git")
"g s" '(magit-status :wk "Change status of files")
"o" '(:ignore t :wk "Open application")
"o t" '(vterm :wk "Terminal")
"o e" '(eshell :wk "Elisp Interpreter")
"o m" '(mu4e :wk "Email")
"e w w" '(eww :wk "web browser")
"e c c" '(ellama-chat :wk "Chat with Ollama")
"e a b" '(ellama-ask-about :wk "Ask Ollama")
"e s" '(ellama-summarize :wk "Summarize text with Ollama")
"e c r" '(ellama-code-review :wk "Review code with Ollama")
"e c C" '(ellama-code-complete :wk "Complete code with Ollama")
"e c a" '(ellama-code-add :wk "Add code with Ollama")
"e c e" '(ellama-code-edit :wk "Edit code with Ollama")
"e w i" '(ellama-improve-wording :wk "Improve wording with Ollama")
"e g i" '(ellama-improve-grammar :wk "Improve grammar with Ollama")
"c" '(:ignore t :wk "Counsel commands")
"c g" '(counsel-git :wk "Search file in git project")
"c f" '(counsel-git-grep :wk "Find string in git project")
"g s" '(gptel-send :wk "Send to Ollama")
"g e" '(gptel :wk "Ollama interface")
"m P p" '(org-publish :wk "Publish website components")
"s e" '(sudo-edit :wk "Edit file with sudo")
"m m" '(emms :wk "Music player")
"m l" '(lyrics-fetcher-show-lyrics :wk "Music lyrics")
"o p" '(treemacs :wk "Project Drawer")
"o P" '(treemacs-projectile :wk "Import Projectile project to treemacs")
"f f" '(eglot-format :wk "Format code buffer")
"i p c" '(prestonpan :wk "Connect to my IRC server")
"i l c" '(liberachat :wk "Connect to libera chat server")
"i e c" '(efnet :wk "Connect to efnet chat server")
"h" '(:ignore t :wk "Documentation")
"h v" '(counsel-describe-variable :wk "Describe variable")
"h f" '(counsel-describe-function :wk "Describe function")
"h h" '(help :wk "Help")
"h m" '(woman :wk "Manual")
"h i" '(info :wk "Info")
"s m" '(proced :wk "System Manager")
"l p" '(list-processes :wk "List Emacs Processes")
"m I" '(org-id-get-create :wk "Make org id")
"w r" '(writeroom-mode :wk "focus mode for writing")
"y n s" '(yas-new-snippet :wk "Create new snippet")
"u w" '((lambda () (interactive) (shell-command "rsync -azvP ~/website_html/ root@nullring.xyz:/usr/share/nginx/ret2pop/")) :wk "rsync website update")
"h r r" '(lambda () (interactive) (org-babel-load-file (expand-file-name "~/monorepo/config/emacs.org")))))
(use-package ellama
:custom
(ellama-sessions-directory "~/org/ellama/" "Set org directory")
:init
(require 'llm-ollama)
(setopt ellama-provider (make-llm-ollama
:host "localhost"
:chat-model "gemma:7b")))
(use-package elfeed
:custom
(elfeed-search-filter "@1-month-ago +unread" "Only display unread articles from a month ago")
:hook ((elfeed-search-mode . elfeed-update)))
(use-package elfeed-org
:custom
(rmh-elfeed-org-files '("~/monorepo/config/elfeed.org") "Use elfeed config in repo as default")
:config
(elfeed-org))
(use-package elfeed-tube
:after elfeed
:demand t
:config
(elfeed-tube-setup)
:bind (:map elfeed-show-mode-map
("F" . elfeed-tube-fetch)
([remap save-buffer] . elfeed-tube-save)
:map elfeed-search-mode-map
("F" . elfeed-tube-fetch)
([remap save-buffer] . elfeed-tube-save)))
(use-package elfeed-tube-mpv
:bind (:map elfeed-show-mode-map
("C-c C-f" . elfeed-tube-mpv-follow-mode)
("C-c C-c" . elfeed-tube-mpv)
("C-c C-w" . elfeed-tube-mpv-where)
:map elfeed-search-mode-map
("M" . elfeed-tube-mpv)))
(use-package treemacs)
(use-package treemacs-evil
:after (treemacs evil))
(use-package treemacs-projectile
:after (treemacs projectile))
(use-package treemacs-magit
:after (treemacs magit))
(use-package eww
:custom
(search-engines
'((("google" "g") "https://google.com/search?q=%s")
(("duckduckgo" "d" "ddg") "https://duckduckgo.com/?q=%s")
(("rfc" "r") "https://www.rfc-editor.org/rfc/rfc%s.txt")
(("rfc-kw" "rk") "https://www.rfc-editor.org/search/rfc_search_detail.php?title=%s"))
"use this set of search engines")
(search-engine-default "google" "Use google as default")
(eww-search-prefix "https://google.com/search?q=" "Google prefix")
(browse-url-secondary-browser-function 'browse-url-generic browse-url-generic-program "firefox" "Use firefox as secondary browser")
:hook ((eww-mode . (lambda () (local-set-key (kbd "y Y") #'eww-copy-page-url)))))
(use-package org-roam
:after (org)
:custom
(org-roam-db-update-on-save t "Update org-roam db")
(org-roam-graph-viewer "firefox" "Use firefox to view org-roam graph")
(org-roam-directory (file-truename "~/monorepo/mindmap") "Set org-roam directory inside monorepo")
(org-roam-capture-templates '(("d" "default" plain "%?"
:target (file+head "${title}.org"
"#+title: ${title}\n#+author: Preston Pan\n#+html_head: \n#+html_head: \n#+html_head: \n#+options: broken-links:t")
:unnarrowed t)) "org-roam files start with this snippet by default")
:config
(org-roam-db-autosync-mode)
;; Otherwise links are broken when publishing
(org-roam-update-org-id-locations))
(use-package org-roam-ui
:after org-roam
:hook (after-init . org-roam-ui-mode)
:custom
(org-roam-ui-sync-theme t "Use emacs theme for org-roam-ui")
(org-roam-ui-follow t "Have cool visual while editing org-roam")
(org-roam-ui-update-on-save t "This option is obvious")
(org-roam-ui-open-on-start t "Have cool visual open in firefox when emacs loads"))
(use-package pinentry
:custom (epa-pinentry-mode `loopback "Set this option to match gpg-agent.conf")
:config (pinentry-start))
(use-package smtpmail
:custom
(user-mail-address system-email "Use our email")
(user-full-name system-fullname "Use our full name")
(sendmail-program "msmtp" "Use msmtp in order to send emails")
(send-mail-function 'smtpmail-send-it "This is required for this to work")
(message-sendmail-f-is-evil t "Use evil-mode for sendmail")
(message-sendmail-extra-arguments '("--read-envelope-from") "idk what this does")
(message-send-mail-function 'message-send-mail-with-sendmail "Use sendmail"))
(use-package mu4e
:after smtpmail
:custom
(mu4e-drafts-folder "/Drafts" "Set drafts folder mu db")
(mu4e-sent-folder "/Sent" "Set sent folder in mu db")
(mu4e-trash-folder "/Trash" "Set trash folder in mu db")
(mu4e-attachment-dir "~/Downloads" "Set downloads folder for attachments")
(mu4e-view-show-addresses 't "Show email addresses in main view")
(mu4e-confirm-quit nil "Don't ask to quit")
(message-kill-buffer-on-exit t "Kill buffer when I exit mu4e")
(mu4e-compose-dont-reply-to-self t "Don't include self in replies")
(mu4e-change-filenames-when-moving t)
(mu4e-get-mail-command "mbsync ret2pop" "Use mbsync for imap")
(mu4e-compose-reply-ignore-address (list "no-?reply" system-email) "ignore my own address and noreply")
(mu4e-html2text-command "w3m -T text/html" "Use w3m to convert html to text")
(mu4e-update-interval 300 "Update duration")
(mu4e-headers-auto-update t "Auto-updates feed")
(mu4e-view-show-images t "Shows images")
(mu4e-compose-signature-auto-include nil)
(mu4e-use-fancy-chars t "Random option to make mu4e look nicer"))
(use-package emms
:custom
(emms-source-file-default-directory (expand-file-name "~/music/") "Use directory specified in Nix")
(emms-player-mpd-music-directory (expand-file-name "~/music/") "Use directory specified in Nix")
(emms-player-mpd-server-name "localhost" "Connect to localhost")
(emms-player-mpd-server-port "6600" "Connect to port 6600")
(emms-player-list '(emms-player-mpd) "Use mpd")
:init
(emms-all)
(add-to-list 'emms-info-functions 'emms-info-mpd)
(add-to-list 'emms-player-list 'emms-player-mpd)
:config (emms-player-mpd-connect))