From: Eshel Yaron Date: Fri, 25 Aug 2023 17:03:18 +0000 (+0200) Subject: Update Emacs configuration X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=942e4d1ac683d808d372c99f936f3264a5f26f87;p=dotfiles.git Update Emacs configuration --- diff --git a/.emacs.d/init.el b/.emacs.d/init.el index fd7d3d5..106f2f0 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -131,12 +131,19 @@ :repo "git://git.eshelyaron.com/esy-publish.git")) (elpaca embark-consult) (elpaca emms) +;; (elpaca expreg) (elpaca gnu-elpa-keyring-update) +;; (elpaca (gnus-o365-oauth2 +;; :repo "https://gitlab.com/qha/gnus-o365-oauth2.git")) (elpaca graphql-mode) (elpaca htmlize) (elpaca ialign) (elpaca keycast) (elpaca kubernetes) +(elpaca (oauth2 + :repo "git://git.sv.gnu.org/emacs/elpa" + :local-repo "oauth2" + :branch "externals/oauth2")) (elpaca (ledger-mode :files (:defaults))) (elpaca (lin @@ -151,6 +158,14 @@ (elpaca orderless) (elpaca org) (elpaca org-transclusion) +(elpaca (marginalia + :pre-build (("emacs" "--batch" "-l" "ox-texinfo" "README.org" + "--eval" "(setq org-babel-confirm-evaluate-answer-no t)" + "-f" "org-texinfo-export-to-texinfo")) + :repo "https://github.com/minad/marginalia.git")) +;; (elpaca (org-glossary +;; :repo "https://github.com/tecosaur/org-glossary.git" +;; :files ("org-glossary.el" "org-glossary.texi"))) (elpaca (osm :pre-build (("emacs" "--batch" "-l" "ox-texinfo" "README.org" "--eval" "(setq org-babel-confirm-evaluate-answer-no t)" @@ -190,6 +205,9 @@ "--entry" "* vterm::" "--section=Emacs" "--dir=dir" "vterm.info")))) (elpaca whitespace-cleanup-mode) +;; (elpaca (xref-union +;; :repo "https://git.sr.ht/~pkal/xref-union" +;; :pre-build (("pandoc" "-o" "xref-union.texi" "README.md")))) (elpaca-wait) @@ -390,18 +408,16 @@ 587 "me@eshelyaron.com" starttls nil nil nil)) - ;; (uva . ("eshel.yaron@student.uva.nl" - ;; "smtp.office365.com" - ;; 587 - ;; "eshel.yaron@student.uva.nl" - ;; starttls nil nil nil)) - ) + (uva . ("eshel.yaron@student.uva.nl" + "smtp.office365.com" + 587 + "eshel.yaron@student.uva.nl" + starttls nil nil nil))) ;; associate email addresses with SMTP accounts smtpmail-multi-associations '(("eshelshay\.yaron@gmail\.com" esy) ("eshel@swi-prolog\.org" swp) ("me@eshelyaron\.com" me) - ;; ("eshel\.yaron@student\.uva\.nl" uva) - ) + ("eshel\.yaron@student\.uva\.nl" uva)) ;; set function for sending email send-mail-function #'smtpmail-multi-send-it message-send-mail-function #'smtpmail-multi-send-it @@ -437,10 +453,11 @@ (nnimap-address "mail.swi-prolog.com") (nnimap-server-port "imaps") (nnimap-stream ssl)) - ;; (nnimap "uva" - ;; (nnimap-address "outlook.office365.com") - ;; (nnimap-server-port "imaps") - ;; (nnimap-stream ssl)) + (nnimap "uva" + (nnimap-address "outlook.office365.com") + (nnimap-server-port "imaps") + (nnimap-stream ssl) + (nnimap-authenticator xoauth2)) ) ;; simpler message gnus-no-groups-message "No new articles" @@ -1115,11 +1132,43 @@ as the initial input for completion, and return that directory." (add-to-list 'org-agenda-custom-commands '("h" "Holland TODOs" tags-todo "+holland"))) +;;; Outlook OAuth 2.0 setup + +(defvar esy/o365-token-last-refresh-time 0) +(defvar esy/o365-token-directory "~/checkouts/M365-IMAP/") + +(add-to-list 'auth-sources (expand-file-name ".authinfo" + esy/o365-token-directory)) + +(add-to-list 'savehist-additional-variables 'esy/o365-token-last-refresh-time) + +(defun esy/refresh-o365-token () + (interactive) + (files--ensure-directory esy/o365-token-directory) + (when-let ((default-directory esy/o365-token-directory) + (token (car (process-lines "python3" "refresh_token.py")))) + (with-temp-buffer + (insert "machine smtp.office365.com smtp-auth xoauth2 login eshel.yaron@student.uva.nl port 587 password \"" + token + "\"\nmachine outlook.office365.com login eshel.yaron@student.uva.nl port imaps password \"" + token + "\"\n") + (write-region (point-min) (point-max) ".authinfo")) + (auth-source-forget-all-cached))) + +(defun esy/maybe-refresh-o365-token () + (let ((now (float-time))) + (when (< (* 60 45) (- now esy/o365-token-last-refresh-time)) + (esy/refresh-o365-token) + (setq esy/o365-token-last-refresh-time now)))) + ;;; Configure email via `gnus' (with-eval-after-load 'gnus (require 'gnus-icalendar) (add-hook 'gnus-group-mode-hook #'gnus-topic-mode) + (add-hook 'gnus-before-resume-hook #'esy/maybe-refresh-o365-token) + (add-hook 'gnus-before-startup-hook #'esy/maybe-refresh-o365-token) (gnus-icalendar-setup) (gnus-icalendar-org-setup) (bbdb-initialize 'gnus 'mail 'message)) @@ -1249,6 +1298,7 @@ as the initial input for completion, and return that directory." global-diff-hl-mode global-whitespace-cleanup-mode lin-global-mode + marginalia-mode minibuffer-depth-indicate-mode mouse-avoidance-mode pixel-scroll-precision-mode