diff --git a/config/.config/doom/config.el b/config/.config/doom/config.el index b3805b5..ee7e913 100644 --- a/config/.config/doom/config.el +++ b/config/.config/doom/config.el @@ -23,7 +23,7 @@ ;; ;; (setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light) ;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) -(setq doom-font (font-spec :family "Iosevka Term SS12" :size 16)) +(setq doom-font (font-spec :family "Iosevka Term SS12" :size 18)) ;; ;; If you or Emacs can't find your font, use 'M-x describe-font' to look them ;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to @@ -33,7 +33,7 @@ ;; There are two ways to load a theme. Both assume the theme is installed and ;; available. You can either set `doom-theme' or manually load a theme with the ;; `load-theme' function. This is the default: -(setq doom-theme 'doom-one) +;; (setq doom-theme 'doom-one) ;; This determines the style of line numbers in effect. If set to `nil', line ;; numbers are disabled. For relative line numbers, set this to `relative'. @@ -78,7 +78,7 @@ ;; (setq! tab-always-indent nil) (after! corfu - (setq tab-always-indent nil)) + (setq! tab-always-indent nil)) ;; (map! :map corfu-map :i "TAB" nil) ;; (map! :map corfu-map "TAB" nil) ;; (map! :map corfu-map :i "S-TAB" nil) @@ -93,7 +93,6 @@ ;; (map! :map corfu-map :i "C-g" #'corfu-reset) ;; (setq +corfu-want-ret-to-confirm nil) - (use-package! auto-dark :defer t :init diff --git a/config/.config/doom/init.el b/config/.config/doom/init.el index 9e46a09..15e83ea 100644 --- a/config/.config/doom/init.el +++ b/config/.config/doom/init.el @@ -38,7 +38,7 @@ indent-guides ; highlighted indent columns ;;ligatures ; ligatures and symbols to make your code pretty again ;;minimap ; show a map of the code on the side - modeline ; snazzy, Atom-inspired modeline, plus API + ;; modeline ; snazzy, Atom-inspired modeline, plus API ;;nav-flash ; blink cursor line after big motions ;;neotree ; a project drawer, like NERDTree for vim ophints ; highlight the region an operation acts on @@ -46,15 +46,15 @@ smooth-scroll ; So smooth you won't believe it's not butter ;;tabs ; a tab bar for Emacs ;;treemacs ; a project drawer, like neotree but cooler - ;;unicode ; extended unicode support for various languages + unicode ; extended unicode support for various languages (vc-gutter +pretty) ; vcs diff in the fringe vi-tilde-fringe ; fringe tildes to mark beyond EOB ;;window-select ; visually switch windows - workspaces ; tab emulation, persistence & separate workspaces - ;;zen ; distraction-free coding or writing + ;; workspaces ; tab emulation, persistence & separate workspaces + zen ; distraction-free coding or writing :editor - ;; (evil +everywhere); come to the dark side, we have cookies + (evil +everywhere); come to the dark side, we have cookies file-templates ; auto-snippets for empty files fold ; (nigh) universal code folding (format +onsave) ; automated prettiness @@ -62,7 +62,7 @@ ;;lispy ; vim for lisp, for people who don't like vim multiple-cursors ; editing in many places at once ;;objed ; text object editing for the innocent - ;;parinfer ; turn lisp into python, sort of + parinfer ; turn lisp into python, sort of ;;rotate-text ; cycle region at point between text candidates snippets ; my elves. They type so I don't have to ;; (whitespace +guess +trim) ; a butler for your whitespace @@ -81,11 +81,11 @@ eshell ; the elisp shell that works everywhere ;;shell ; simple shell REPL for Emacs ;;term ; basic terminal emulator for Emacs - vterm ; the best terminal emulation in Emacs + ;; vterm ; the best terminal emulation in Emacs :checkers syntax ; tasing you for every semicolon you forget - ;;(spell +flyspell) ; tasing you for misspelling mispelling + (spell +flyspell) ; tasing you for misspelling mispelling ;;grammar ; tasing grammar mistake every you make :tools @@ -100,8 +100,8 @@ (eval +overlay) ; run code, run (also, repls) (lookup +dictionary +offline) ; navigate your code and its documentation ;;llm ; when I said you needed friends, I didn't mean... - (lsp +lsp) ; M-x vscode - magit ; a git porcelain for Emacs + (lsp +eglot) ; M-x vscode + (magit +forge) ; a git porcelain for Emacs ;;make ; run make tasks from Emacs ;;pass ; password manager for nerds ;;pdf ; pdf enhancements @@ -120,7 +120,7 @@ ;;beancount ; mind the GAAP (cc +lsp +tree-sitter) ; C > C++ == 1 ;;clojure ; java with a lisp - ;;common-lisp ; if you've seen one lisp, you've seen them all + common-lisp ; if you've seen one lisp, you've seen them all ;;coq ; proofs-as-programs ;;crystal ; ruby at the speed of c ;;csharp ; unity, .NET, and mono shenanigans @@ -153,7 +153,7 @@ ;;lean ; for folks with too much to prove ;;ledger ; be audit you can be ;;lua ; one-based indices? one-based indices - markdown ; writing docs for people to ignore + (markdown +grip +tree-sitter) ; writing docs for people to ignore ;;nim ; python + lisp at the speed of c ;;nix ; I hereby declare "nix geht mehr!" ;;ocaml ; an objective camel @@ -177,7 +177,7 @@ ;;solidity ; do you need a blockchain? No. (swift +lsp +tree-sitter); who asked for emoji variables? ;;terra ; Earth and Moon in alignment for performance. - ;;web ; the tubes + (web +lsp +tree-sitter) ; the tubes ;;yaml ; JSON, but readable (zig +lsp +tree-sitter) ; C, but simpler diff --git a/config/.config/nvim/lua/plugins/filetypes.lua b/config/.config/nvim/lua/plugins/filetypes.lua index 3d8dae0..687f579 100644 --- a/config/.config/nvim/lua/plugins/filetypes.lua +++ b/config/.config/nvim/lua/plugins/filetypes.lua @@ -49,5 +49,16 @@ return { version = "*", -- Pin Neorg to the latest stable release config = true, }, + + -- { + -- "Olical/conjure" + -- }, + + { + "vlime/vlime", + config = function(plugin) + vim.opt.rtp:append(plugin.dir .. '/vim/') + end + }, } diff --git a/config/.emacs.d/config/custom.el b/config/.emacs.d/config/custom.el index c7523c5..df5d775 100644 --- a/config/.emacs.d/config/custom.el +++ b/config/.emacs.d/config/custom.el @@ -1,19 +1 @@ ;;; -*- lexical-binding: t -*- -(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 - '("720838034f1dd3b3da66f6bd4d053ee67c93a747b219d1c546c41c4e425daf93" - "d481904809c509641a1a1f1b1eb80b94c58c210145effc2631c1a7f2e4a2fdf4" - "aec7b55f2a13307a55517fdf08438863d694550565dee23181d2ebd973ebd6b8" - "3613617b9953c22fe46ef2b593a2e5bc79ef3cc88770602e7e569bbd71de113b" - "0325a6b5eea7e5febae709dab35ec8648908af12cf2d2b569bedc8da0a3a81c1" - 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. - ) diff --git a/config/.emacs.d/config/emacs.el b/config/.emacs.d/config/emacs.el index 0836df3..86a0341 100644 --- a/config/.emacs.d/config/emacs.el +++ b/config/.emacs.d/config/emacs.el @@ -19,12 +19,25 @@ ;; ;;; Code: +(set-face-attribute 'default nil + :width 'normal :weight 'normal + :slant 'normal :font (font-spec :family "Iosevka Term SS12" :size 18)) +(set-face-attribute 'fixed-pitch nil + :width 'normal :weight 'normal + :slant 'normal :font (font-spec :family "Iosevka Term SS12" :size 18)) +(set-face-attribute 'variable-pitch nil + :width 'normal :weight 'normal + :slant 'normal :font (font-spec :family "Gentium Plus" :size 18)) +(defconst default-mode-line-format (copy-sequence mode-line-format)) (setq history-length 100 global-auto-revert-non-file-buffers t use-dialog-box nil custom-safe-themes t + make-backup-files nil read-file-name-completion-ignore-case t - tab-always-indent nil) + tab-always-indent nil + display-buffer-alist '( + ("\\*elfeed-.*\\*" (display-buffer-same-window)))) (setq-default indent-tabs-mode nil tab-width 4 diff --git a/config/.emacs.d/config/keymap.el b/config/.emacs.d/config/keymap.el index d7a41a4..a80be81 100644 --- a/config/.emacs.d/config/keymap.el +++ b/config/.emacs.d/config/keymap.el @@ -3,16 +3,18 @@ (global-set-key (kbd "C-c f") #'consult-fd) (global-set-key (kbd "C-c C-f") #'find-file-at-point) (global-set-key (kbd "C-c r") #'recentf) -(global-set-key (kbd "C-c 0") (lambda () (interactive) (other-window 1) (kill-buffer-and-window))) +(global-set-key (kbd "C-c x") #'kill-current-buffer) +(global-set-key (kbd "C-c X") (lambda () (interactive) (other-window 1) (kill-buffer-and-window))) (global-set-key (kbd "C-c g") #'consult-ripgrep) +(global-set-key (kbd "C-c L") #'consult-line) (global-set-key (kbd "C-c i") #'consult-info) (global-set-key (kbd "C-c s") #'ispell-word) -(global-set-key (kbd "C-c f") #'apheleia-format-buffer) (global-set-key (kbd "C-c t") #'load-theme) (global-set-key (kbd "C-c C-c") #'compile) (global-set-key (kbd "C-c d") #'dictionary-define-word) (global-set-key (kbd "C-c D") #'dictionary) (global-set-key (kbd "C-c l a") #'eglot-code-actions) +(global-set-key (kbd "C-c l f") #'apheleia-format-buffer) (global-set-key (kbd "C-c l n") #'eglot-rename) (global-set-key (kbd "C-c l s") #'consult-eglot-symbols) (global-set-key (kbd "C-c l r") #'xref-find-references) @@ -20,16 +22,18 @@ (global-set-key (kbd "C-c l D") #'eglot-find-declaration) (global-set-key (kbd "C-c l i") #'eglot-find-implementation) (global-set-key (kbd "C-c l t") #'eglot-find-typeDefinition) -;; (global-set-key (kbd "C-x C-;") (lambda () (interactive) (if (region-active-p) (comment-region) (comment-line)))) (global-set-key (kbd "C-c b") #'ibuffer) -(global-set-key (kbd "C-c x") #'kill-current-buffer) (global-set-key (kbd "C-c k") #'eldoc) (global-set-key (kbd "C-c m") #'man) (global-set-key (kbd "C-c o c") (lambda () (interactive) (dired user-init-dir))) (global-set-key (kbd "C-c o t") (lambda () (interactive) (eshell 'N))) -(global-set-key (kbd "C-c o m") #'magit) +(global-set-key (kbd "C-c o g") #'magit) +(global-set-key (kbd "C-c o e") #'mu4e) +(global-set-key (kbd "C-c o r") #'elfeed-summary) +(global-set-key (kbd "C-c o m") #'mpdel-browser-open) +(global-set-key (kbd "C-c o p") #'mpdel-playlist-open) ;; multi-cursor (global-set-key (kbd "C-c c w") #'mc/mark-next-like-this-word) diff --git a/config/.emacs.d/early-init.el b/config/.emacs.d/early-init.el index f3e2199..6822503 100644 --- a/config/.emacs.d/early-init.el +++ b/config/.emacs.d/early-init.el @@ -29,42 +29,7 @@ (menu-bar-mode -1) (tool-bar-mode -1) (scroll-bar-mode -1) -;; (defconst fonts '("Iosevka Term SS12" "Cascadia Code" "CaskaydiaCove Nerd Font")) -;; (defconst default-font-size 16) -;; (defun font-size (font) -;; (let ((size (plist-get font :size))) -;; (if size size default-font-size))) -;; (defun font-name (font) -;; (let ((name (plist-get font :name))) -;; (if name name font))) - -;; (defun font-string (font) -;; (let ((name (font-name font)) -;; (size (font-size font))) -;; (concat name " " (number-to-string size)))) - -;; (defun set-fonts () -;; (let ((default-font (car fonts)) -;; (fallback-fonts (cdr fonts))) -;; ;; (when (window-system) -;; (progn -;; (set-face-attribute 'default nil :font (font-string default-font)) -;; (mapc (lambda (font) -;; (let ((face (font-string font)) -;; (script (plist-get font :script))) -;; (if script -;; (progn -;; (set-fontset-font t script face) -;; (set-fontset-font t script (font-spec :script script) nil 'prepend)) -;; (set-fontset-font t nil face nil 'prepend)))) fallback-fonts)))) - -;; (set-fonts) - -;; (set-face-attribute 'default nil :font "Iosevka Term -;;(set-frame-font "Iosevka Term SS12-16") -(add-to-list 'default-frame-alist - '(font . "Iosevka Term SS12-14")) (defun efs/display-startup-time () (message "Emacs loaded in %s with %d garbage collections." (format "%.2f seconds" diff --git a/config/.emacs.d/init.el b/config/.emacs.d/init.el index 615c68c..05e9fc7 100644 --- a/config/.emacs.d/init.el +++ b/config/.emacs.d/init.el @@ -39,6 +39,7 @@ (mapc (lambda (file) (load-file file)) config-files)))) (load-user-config) + (setq gc-cons-threshold (* 2 1000 1000)) (provide 'init) diff --git a/config/.emacs.d/plugins/apps.el b/config/.emacs.d/plugins/apps.el index 60af4bf..1996dc1 100644 --- a/config/.emacs.d/plugins/apps.el +++ b/config/.emacs.d/plugins/apps.el @@ -36,9 +36,369 @@ :ensure t :defer t) +(use-package libmpdel + :ensure t + :demand t) + +(use-package mpdel + :ensure t + :demand t + :after libmpdel + :bind (:map mpdel-playlist-mode-map + ("h" . mpdel-song-normal-decrement) + ("l" . mpdel-song-normal-increment) + ("b" . libmpdel-playback-next) + ("z" . libmpdel-playback-next) + ("c" . libmpdel-playback-play-pause) + ("C" . mpdel/connect-with-ip) + ("v" . libmpdel-stop) + ("x" . (lambda () (interactive) (libmpdel-playback-seek 0))) + ("i" . mpdel-song-open) + ("s" . (lambda () (interactive) (if (libmpdel-get-state 'random #'identity) (libmpdel-playback-unset-random) (libmpdel-playback-set-random)))) + ("r" . (lambda () (interactive) (if (libmpdel-get-state 'repeat #'identity) (libmpdel-playback-unset-repeat) (libmpdel-playback-set-repeat)))) + ("X" . (lambda () (interactive (libmpdel-send-command "clear")))) + ("RET" . mpdel-playlist-play) + (";" . mpdel/switch-context-i)) + + :init + (setq mpdel-prefix-key (kbd "C-c z")) + :config + (add-to-list 'libmpdel-profiles '("Desktop" "127.0.0.1" 6600 ipv4)) + (add-to-list 'libmpdel-profiles '("Laptop" "127.0.0.1" 6600 ipv4)) + (keymap-set global-map "C-c z" mpdel-playlist-mode-map) + (defun mpdel/connect-with-ip () + (interactive) + (let* ((profile (completing-read "Connect to: " (mapcar #'car libmpdel-profiles) nil t)) + (ip (completing-read "IP: " nil))) + (setf (alist-get profile libmpdel-profiles nil nil #'equal) `(,ip ,6600 ipv4)) + (libmpdel-connect-profile (assoc-string profile libmpdel-profiles)))) + (defun mpdel/add-all-to-queue () + (interactive) + (libmpdel-send-command "clear") + (libmpdel-send-command "add /")) + (defun mpdel/start-all-music () + (interactive) + (mpdel/add-all-to-queue) + (mpdel-playlist-open) + (libmpdel-play)) + (defun mpdel/music-status () + (interactive) + (funcall mpdel/music-status)) + (defvar mpdel/music-status nil) + (let ((status nil)) + (setq mpdel/music-status + (lambda () + (require 'libmpdel) + (if (libmpdel-connected-p) + (let* ((song (libmpdel-current-song)) + (volume (libmpdel-get-state 'volume #'identity)) + (song-name (if song (libmpdel-entity-name song) nil)) + (shuffle (or (libmpdel-get-state 'random (lambda (state) (if state "S" ""))) "")) + (repeat (or (libmpdel-get-state 'repeat (lambda (state) (if state "R" ""))) "")) + (progress "")) + (libmpdel-send-command "status" (lambda (s) + (setq status (copy-alist s)))) + (when status + (let ((elapsed (libmpdel-time-to-string (cdr (assoc 'elapsed status)))) + (duration (libmpdel-time-to-string (cdr (assoc 'duration status))))) + (setq progress (format " - %s/%s" elapsed duration)))) + + + (cond + ((libmpdel-playing-p) (format "> %s%s %s%s %s%%%%" song-name progress repeat shuffle volume)) + ((libmpdel-paused-p) (format "| %s%s %s%s %s%%%%" song-name progress repeat shuffle volume)) + ((libmpdel-stopped-p) ""))))))) + (setq-default mode-line-format (append default-mode-line-format '((:eval (mpdel/music-status))))) + (defconst mpdel/contexts + `((podcasts . ((enter-hooks . ,(lambda (context) (libmpdel-send-commands '("clear" + "load podcasts" + "random 0" + "repeat 0" + "consume 1" + "single 0")))) + (song-change . ,(lambda (context) (libmpdel-send-commands '("rm podcasts" + "save podcasts")))) + (exit-hooks . ,(lambda (context) (libmpdel-send-commands '("rm podcasts" + "save podcasts" + "consume 0")))))) + (allmusic . ((enter-hooks . ,(lambda (context) + (libmpdel-send-commands '("random 1" + "repeat 1" + "consume 0" + "single 0")) + (mpdel/add-all-to-queue))))) + (playlist . ()))) + (defvar mpdel/current-context (assq 'allmusic mpdel/contexts)) + (defun mpdel/run-context-hooks (hook-name context) + (let ((hook (cdr (assq hook-name (cdr context))))) + (when hook + (funcall hook context)))) + (add-to-list 'savehist-additional-variables 'mpdel/current-context) + (add-hook 'libmpdel-current-song-changed-hook (lambda () + (let ((context mpdel/current-context)) + (mpdel/run-context-hooks 'song-change context)))) + (defun mpdel/is-current-context (context) + (eq context (car mpdel/current-context))) + (defun mpdel/switch-context-i () + (interactive) + (mpdel/switch-context (intern (completing-read "Context: " (mapcar #'car mpdel/contexts) nil t)))) + (defun mpdel/switch-context (context) + (interactive) + (libmpdel-ensure-connection) + (unless (eq (car mpdel/current-context) context) + (libmpdel-send-command "stop") + (mpdel/run-context-hooks 'exit-hooks mpdel/current-context) + (setq mpdel/current-context (assq context mpdel/contexts)) + (mpdel/run-context-hooks 'enter-hooks mpdel/current-context)))) + (use-package org :ensure t :defer t) +(use-package org-msg + :ensure t + :defer t + :hook ((mu4e-main-mode . org-msg-mode) + (mu4e-compose-mode . org-msg-mode)) + :config + (setq mail-user-agent 'mu4e-user-agent) + (setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t" + org-msg-startup "hidestars indent inlineimages" + org-msg-default-alternatives '((new . (text html)) + (reply-to-html . (text html)) + (reply-to-text . (text))) + org-msg-convert-citation t)) + + +(use-package mu4e + :ensure t + :commands (mu4e) + :config + (setq mu4e-mu-binary (executable-find "mu")) + + (setq mu4e-read-option-use-builtin nil + mu4e-completing-read-function 'completing-read) + ;; this is the directory we created before: + (setq mu4e-maildir "~/.local/share/mail/") + + ;; this command is called to sync imap servers: + (setq mu4e-get-mail-command (concat (executable-find "mbsync") " -a")) + ;; how often to call it in seconds: + (setq mu4e-update-interval 300) + + ;; save attachment to desktop by default + ;; or another choice of yours: + (setq mu4e-attachment-dir "~/Downloads") + + ;; rename files when moving - needed for mbsync: + (setq mu4e-change-filenames-when-moving t) + + ;; list of your email adresses: + (setq mu4e-user-mail-address-list '("mikecchalupiak@outlook.com" + "chalupmc@rose-hulman.edu" + "mikec@mchalupiak.com" + "spamreciver1@outlook.com")) + ; the following is to show shortcuts in the main view. + (setq mu4e-bookmarks ()) + (add-to-list 'mu4e-bookmarks + '(:name "spamreciver" + :query "maildir:/spamreciver1@outlook.com/INBOX" + :key ?s)) + (add-to-list 'mu4e-bookmarks + '(:name "mchalupiak.com" + :query "maildir:/mikec@mchalupiak.com/INBOX" + :key ?h)) + (add-to-list 'mu4e-bookmarks + '(:name "rose" + :query "maildir:/chalupmc@rose-hulman.edu/INBOX" + :key ?r)) + (add-to-list 'mu4e-bookmarks + '(:name "outlook" + :query "maildir:/mikecchalupiak@outlook.com/INBOX" + :key ?o)) + + + (setq mu4e-contexts + `(,(make-mu4e-context + :name "outlook" + :match-func + (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg + :to "mikecchalupiak@outlook.com"))) + :vars '((user-mail-address . "mikecchalupiak@outlook.com") + (user-full-name . "Michael Chalupiak") + (mu4e-drafts-folder . "/mikecchalupiak@outlook.com/Drafts") + (mu4e-refile-folder . "/mikecchalupiak@outlook.com/Archive") + (mu4e-sent-folder . "/mikecchalupiak@outlook.com/Sent") + (mu4e-trash-folder . "/mikecchalupiak@outlook.com/Trash"))) + + ,(make-mu4e-context + :name "rose" + :match-func + (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg + :to "chalupmc@rose-hulman.edu"))) + :vars '((user-mail-address . "chalupmc@rose-hulman.edu") + (user-full-name . "Michael Chalupiak") + (mu4e-drafts-folder . "/chalupmc@rose-hulman.edu/Drafts") + (mu4e-refile-folder . "/chalupmc@rose-hulman.edu/Archive") + (mu4e-sent-folder . "/chalupmc@rose-hulman.edu/Sent") + (mu4e-trash-folder . "/chalupmc@rose-hulman.edu/Trash"))) + + ,(make-mu4e-context + :name "hosted" + :match-func + (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg + :to "mikec@mchalupiak.com"))) + :vars '((user-mail-address . "mikec@mchalupiak.com") + (user-full-name . "Michael Chalupiak") + ;; check your ~/.maildir to see how the subdirectories are called + ;; e.g `ls ~/.maildir/example' + (mu4e-drafts-folder . "/mikec@mchalupiak.com/Drafts") + (mu4e-refile-folder . "/mikec@mchalupiak.com/Archive") + (mu4e-sent-folder . "/mikec@mchalupiak.com/Sent") + (mu4e-trash-folder . "/mikec@mchalupiak.com/Trash"))) + ,(make-mu4e-context + :name "spam" + :match-func + (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg + :to "spamreciver1@outlook.com"))) + :vars '((user-mail-address . "spamreciver1@outlook.com") + (user-full-name . "spamreciver") + ;; check your ~/.maildir to see how the subdirectories are called + ;; e.g `ls ~/.maildir/example' + (mu4e-drafts-folder . "/spamreciver1@outlook.com/Drafts") + (mu4e-refile-folder . "/spamreciver1@outlook.com/Archive") + (mu4e-sent-folder . "/spamreciver1@outlook.com/Sent") + (mu4e-trash-folder . "/spamreciver1@outlook.com/Trash"))))) + + (setq mu4e-context-policy 'pick-first) ;; start with the first (default) context; + (setq mu4e-compose-context-policy 'ask) + ; gpg encryptiom & decryption: + ;; this can be left alone + (require 'epa-file) + (epa-file-enable) + (setq epa-pinentry-mode 'loopback) + (auth-source-forget-all-cached) + + ;; don't keep message compose buffers around after sending: + (setq message-kill-buffer-on-exit t) + + ;; send function: + (setq send-mail-function 'message-send-mail-with-sendmail + message-send-mail-function 'message-send-mail-with-sendmail) + + ;; send program: + ;; this is exeranal. remember we installed it before. + (setq sendmail-program (executable-find "msmtp")) + + ;; select the right sender email from the context. + (setq message-sendmail-envelope-from 'header) + + ;; chose from account before sending + ;; this is a custom function that works for me. + ;; well I stole it somewhere long ago. + ;; I suggest using it to make matters easy + ;; of course adjust the email adresses and account descriptions + (defun timu/set-msmtp-account () + (if (message-mail-p) + (save-excursion + (let* + ((from (save-restriction + (message-narrow-to-headers) + (message-fetch-field "from"))) + (account + (cond + ((string-match "mikecchalupiak@outlook.com" from) "outlook") + ((string-match "chalupmc@rose-hulman.edu" from) "rose") + ((string-match "mikec@mchalupiak.com" from) "hosted") + ((string-match "spamreciver1@outlook.com" from) "spam")))) + (setq message-sendmail-extra-arguments (list '"-a" account))))) + + (add-hook 'message-send-mail-hook 'timu/set-msmtp-account) + + ;; mu4e cc & bcc + ;; this is custom as well + (add-hook 'mu4e-compose-mode-hook + (defun timu/add-cc-and-bcc () + "My Function to automatically add Cc & Bcc: headers. + This is in the mu4e compose mode." + (save-excursion (message-add-header "Cc:\n")) + (save-excursion (message-add-header "Bcc:\n")))))) + ;; ask for context if no context matches;))) + +(use-package elfeed + :ensure t + :defer t + :commands (elfeed) + :bind (:map elfeed-show-mode-map + ("a" . elfeed/add-to-playlist) + ("A" . (lambda () (interactive) + (elfeed/add-to-playlist) + (mpdel/switch-context 'podcasts) + (libmpdel-play))) + ("P" . (lambda () (interactive) + (mpdel/switch-context 'podcasts) + (libmpdel-play)))) + :bind (:map elfeed-search-mode-map + ("a" . elfeed/add-to-playlist) + ("A" . (lambda () (interactive) + (elfeed/add-to-playlist) + (mpdel/switch-context 'podcasts) + (libmpdel-play))) + ("P" . (lambda () (interactive) + (mpdel/switch-context 'podcasts) + (libmpdel-play)))) + :config + (setq-default elfeed-search-filter " ") + (setq elfeed-feeds + '( ("https://phaazon.net/blog/feed") + ("https://irreal.org/blog/?feed=rss2") + ("https://port19.xyz/rss.xml") + ("https://lukesmith.xyz/index.xml") + ("https://notrelated.xyz/rss") + ("https://karl-voit.at/feeds/lazyblorg-all.atom_1.0.links-and-content.xml") + ;("https://sizeof.cat/index.xml") + ("https://www.youtube.com/feeds/videos.xml?channel_id=UCkKmeTinUEU27syZPKrzWQQ") + ("https://www.youtube.com/feeds/videos.xml?playlist_id=PLq1vmb-z7PpQt2PDNUr7XOzBjWAOWf0Rt") + ("https://danielde.dev/rss.xml") + ("https://pkolaczk.github.io/feed.xml") + ("https://joeyh.name/blog/index.rss") + ("https://kagifeedback.org/atom/t/release-notes") + ("https://api.substack.com/feed/podcast/462466.rss") + ("https://www.dailywire.com/feeds/rss.xml") + ("https://feeds.simplecast.com/6c2VScgo") + ("https://feeds.simplecast.com/pp_b9xO6"))) + (defun elfeed/add-to-playlist () + (interactive + (let* ((entry (if (eq major-mode 'elfeed-show-mode) + elfeed-show-entry + (elfeed-search-selected :ignore-region))) + (link (elfeed-entry-link entry)) + (enclosure (elt (car (elfeed-entry-enclosures entry)) 0)) ; fragile?))) + (command (if (mpdel/is-current-context 'podcasts) (format "add \"%s\"" enclosure) + (format "playlistadd podcasts \"%s\"" enclosure)))) + (when enclosure + (libmpdel-ensure-connection) + (libmpdel-send-command command (lambda (s) (pp s)))))))) +(use-package elfeed-summary + :straight t + :defer t + :commands (elfeed-summary) + :bind (:map elfeed-summary-mode-map + ("p" . magit-section-backward)) + :config + (setq-default elfeed-summary-default-filter " ") + (setq-default elfeed-summary-look-back most-positive-fixnum) + (setq elfeed-summary--search-show-read t) + (setq elfeed-summary-settings + '((query . :all)))) + (provide 'apps) ;;; apps.el ends here