(setq fancy-splash-image "~/.config/doom/splash.png") (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-shortmenu) (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-footer) (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-loaded) (add-hook! '+doom-dashboard-mode-hook (hide-mode-line-mode 1) (hl-line-mode -1)) (setq-hook! '+doom-dashboard-mode-hook evil-normal-state-cursor (list nil)) (setq user-full-name "opal" user-mail-address "ry.orlando@proton.me") (load-theme 'doom-gruvbox t) ;;(define-key global-map (kbd "") #'modus-themes-toggle) (dolist (mode '(org-mode-hook term-mode-hook shell-mode-hook eshell-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) (setq browse-url-browser-function 'eww-browse-url) (set-face-attribute 'default nil :font "Terminus" :height 200 :weight 'regular) (set-face-attribute 'fixed-pitch nil :font "Terminus" :height 1.0 :weight 'regular) (set-face-attribute 'variable-pitch nil :font "Terminus" :height 1.0 :weight 'bold) (defun opal/org-font-setup () ;; Replace list hyphen with dot (font-lock-add-keywords 'org-mode '(("^ *\\([-]\\) " (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) ;; Set faces for heading levels (dolist (face '((org-level-1 . 1.2) (org-level-2 . 1.1) (org-level-3 . 1.05) (org-level-4 . 1.0) (org-level-5 . 1.1) (org-level-6 . 1.1) (org-level-7 . 1.1) (org-level-8 . 1.1))) (set-face-attribute (car face) nil :font "Terminus" :weight 'regular :height (cdr face))) ;; Ensure that anything that should be fixed-pitch in Org files appears that way (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch) (set-face-attribute 'org-table nil :inherit 'fixed-pitch) (set-face-attribute 'org-formula nil :inherit 'fixed-pitch) (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch) (set-face-attribute 'line-number nil :inherit 'fixed-pitch) (set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch)) (defun opal/org-mode-setup () (org-indent-mode) (variable-pitch-mode 1) (visual-line-mode 1)) (use-package org :commands (org-capture org-agenda) :hook (org-mode . opal/org-mode-setup) :config (setq org-ellipsis " ▾") (setq org-agenda-start-with-log-mode t) (setq org-log-done 'time) (setq org-log-into-drawer t) (setq org-startup-folded t) (setq org-agenda-files '("~/work/work.org")) (require 'org-habit) (add-to-list 'org-modules 'org-habit) (setq org-habit-graph-column 60) (setq org-todo-keywords '((sequence "NEXT(n)" "TODO(t)" "|" "DONE(d!)") (sequence "ACTIVE(a)" "PROJ(p)" "READY(r)" "WAIT(w@/!)" "HOLD(h)" "BACKLOG(b)" "DOC(u)" "|" "COMPLETED(c)" "CANC(k@)"))) (setq org-todo-keyword-faces '(("NEXT" . "red") ("TODO" . "orange") ("WAIT" . "yellow") ("DONE" . "green"))) (setq org-refile-targets '(("archive.org" :maxlevel . 1) ("planner.org" :maxlevel . 1))) ;; Save Org buffers after refiling! (advice-add 'org-refile :after 'org-save-all-org-buffers) (add-hook 'org-mode-hook #'org-make-toc-mode) ;; Configure custom agenda views (setq org-agenda-custom-commands '(("d" "Dashboard" ((agenda "" ((org-deadline-warning-days 7))) (todo "NEXT" ((org-agenda-overriding-header "Next Tasks"))) (tags-todo "agenda/ACTIVE" ((org-agenda-overriding-header "Active Projects"))))) ("n" "Next Tasks" ((todo "NEXT" ((org-agenda-overriding-header "Next Tasks"))))) ;; Low-effort next actions ("e" tags-todo "+TODO=\"NEXT\"+Effort<15&+Effort>0" ((org-agenda-overriding-header "Low Effort Tasks") (org-agenda-max-todos 20) (org-agenda-files org-agenda-files))))) ;; Create capture templates (setq org-capture-templates `(("t" "Tasks") ("tt" "Task" entry (file+olp "~/work/work.org" "Inbox") "* TODO %?\n %U\n %a\n %i" :empty-lines 1))) ;; Tell Org to stop indenting inside of org source blocks. (setq org-edit-src-content-indentation 0) ;; Set org agenda dir (setq org-directory "~/org/") ;; Init org font setup (opal/org-font-setup)) (use-package org-bullets :after org :hook (org-mode . org-bullets-mode) :custom (org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●"))) (defun opal/org-mode-visual-fill () (setq visual-fill-column-width 150 visual-fill-column-center-text t) (visual-fill-column-mode 1)) (use-package visual-fill-column :hook (org-mode . opal/org-mode-visual-fill)) ;; Load languages for babel code blocks. (with-eval-after-load 'org (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (lisp . t) (python . t) (sql . t))) (push '("conf-unix" . conf-unix) org-src-lang-modes)) (with-eval-after-load 'org (require 'org-tempo) (add-to-list 'org-structure-template-alist '("sh" . "src shell")) (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) (add-to-list 'org-structure-template-alist '("cl" . "src lisp")) (add-to-list 'org-structure-template-alist '("sql" . "src sql")) (add-to-list 'org-structure-template-alist '("py" . "src python")) (add-to-list 'org-structure-template-alist '("clj" . "src clojure"))) (defun opal/elfeed-open-in-firefox () "Open the current Elfeed entry link in Firefox." (interactive) (let ((link (elfeed-entry-link (elfeed-search-selected :single)))) (if link (browse-url-firefox link) (message "No link to open.")))) (use-package elfeed :ensure t :bind (("C-c e" . elfeed) ("C-c f" . opal/elfeed-open-in-firefox)) :config ;; Set your feeds (setq elfeed-feeds '( ;; Emacs ("https://sachachua.com/blog/feed/index.xml" tech emacs) ("https://protesilaos.com/master.xml" tech emacs philosophy) ("https://systemcrafters.net/rss/news.xml" tech emacs) ;; Reddit ("https://www.reddit.com/r/stupidpol/.rss" reddit politics) ;; News ("https://thegrayzone.com/rss" news politics) ("https://multipolarista.com/rss" news politics) ("https://www.telesurenglish.net/feed/" news politics) ("https://theintercept.com/feed/" news politics) ("https://www.dropsitenews.com/feed" news politics) ;; Tech ("https://landchad.net/rss.xml" tech) ("https://videos.lukesmith.xyz/feeds/videos.xml?videoChannelId=2" tech linux) ("https://pluralistic.net/feed/" tech privacy) ("https://blog.privacyguides.org/feed_rss_created.xml" tech privacy) ;; Podcasts ("https://feeds.simplecast.com/dCXMIpJz" podcast history) ("http://feeds.soundcloud.com/users/soundcloud:users:572119410/sounds.rss" podcast music) ("https://feeds.feedburner.com/dancarlin/history?format=xml" podcast history) ;; YouTube ("https://www.youtube.com/channel/UC_bOcLgDdfE1whPDIwx3M_g" youtube travel) ("https://www.youtube.com/feeds/videos.xml?channel_id=UC8uT9cgJorJPWu7ITLGo9Ww" youtube tech retro) ("https://www.youtube.com/feeds/videos.xml?channel_id=UC0aanx5rpr7D1M7KCFYzrLQ" youtube commentary politics) )) ;; Set default search filter (setq elfeed-search-filter "@1-month-ago +unread") ;; Update feeds automatically when entering Elfeed search mode (add-hook 'elfeed-search-mode-hook 'elfeed-update) ;; Evil keybindings for Elfeed (evil-define-key 'normal elfeed-search-mode-map "o" 'opal/elfeed-open-in-firefox ;; Open link in Firefox "gr" 'elfeed-update ;; Refresh feeds "q" 'quit-window)) ;; Quit Elfeed (setq create-lockfiles nil) ;; Make sure eww opens in it's own buffer (after! eww (set-popup-rule! "^\\*eww\\*" :ignore t)) (setq erc-server "irc.libera.chat" erc-nick "opalvault" erc-user-full-name "Opal" erc-track-shorten-start 8 erc-autojoin-channels-alist '(("irc.libera.chat" "#systemcrafters" "#emacs" "#nyxt" "#guix")) erc-kill-buffer-on-part t erc-auto-query 'bury erc-hide-list '("JOIN" "PART" "QUIT"))