;; -*- lexical-binding: t; -*- (add-to-list 'load-path "~/.emacs.d/elisp") (fset 'yes-or-no-p 'y-or-n-p) (setq default-frame-alist '((font . "Iosevka SS13 Extended") (height . 150) (line-spacing . 0.5)) ;; undo undo-limit 10000000 undo-outer-limit 20000000 ;; Package list package-list '(almost-mono-themes avy devdocs ednc eldoc-box elfeed elfeed-protocol enwc embark emms expand-region exwm geiser geiser-guile go-mode god-mode guix pdf-tools lem magit markdown-mode mastodon nix-mode nov org-alert org-remark pass pinentry rec-mode tldr yasnippet yasnippet-snippets) package-archives '(("elpa" . "https://elpa.gnu.org") ("gnu" . "http://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/") ("non-gnu" . "https://elpa.nongnu.org/nongnu/") ("melpa-stable" . "https://stable.melpa.org/packages/"))) ;; UI (menu-bar-mode -1) (tool-bar-mode -1) (setq-default fill-column 80 line-spacing 5 frame-title-format '("%b")) (package-initialize) (unless package-archive-contents (package-refresh-contents)) ;; install the missing packages (dolist (package package-list) (unless (package-installed-p package) (package-install package))) (use-package tab-bar :init (tab-bar-mode)) (use-package project :ensure t :config (add-to-list 'project-switch-commands '(project-shell "Shell"))) (use-package exwm :init (setq exwm-workspace-number 1 exwm-input-global-keys `(([?\s-r] . exwm-reset) ;; s-r: Reset (to line-mode). ;; s-N: Switch to certain workspace. ,@(mapcar (lambda (i) `(,(kbd (format "s-%d" i)) . (lambda () (interactive) (tab-bar-select-tab ,i)))) (number-sequence 0 9)))) (exwm-input-set-key (kbd "s-f") 'exwm-layout-toggle-fullscreen) (exwm-input-set-key (kbd "") (lambda () (interactive) (shell-command "scrot -F '/home/mccd/screenshots/%Y-%m-%d_$wx$h.png'"))) (exwm-input-set-key (kbd "C-") (lambda () (interactive) (shell-command "scrot -s -F '/home/mccd/screenshots/%Y-%m-%d_$wx$h.png'"))) (exwm-input-set-key (kbd "") (lambda () (interactive) (shell-command "amixer set Master toggle 1> /dev/null"))) (exwm-input-set-key (kbd "") (lambda () (interactive) (shell-command "amixer set Master 10%+ 1> /dev/null"))) (exwm-input-set-key (kbd "") (lambda () (interactive) (shell-command "amixer set Master 10%- 1> /dev/null"))) (exwm-input-set-key (kbd "") (lambda () (interactive) (shell-command "brightnessctl set 5%- 1> /dev/null"))) (exwm-input-set-key (kbd "") (lambda () (interactive) (shell-command "brightnessctl set +5% 1> /dev/null"))) (exwm-input-set-key (kbd "s-") (lambda (cmd) ;; s-&: Launch application. (interactive (list (read-shell-command "$ "))) (start-process-shell-command cmd nil cmd))) (exwm-enable) (exwm-xim-mode) (require 'exwm-systemtray) (exwm-systemtray-mode) (setq exwm-systemtray-height 30) (shell-command "xset r rate 200 60 1> /dev/null") (shell-command "xrdb ~/.Xresources") (shell-command "dbus-update-activation-environment DISPLAY") (push ?\C-\\ exwm-input-prefix-keys) :config (setq ring-bell-function 'ignore default-directory "/home/mccd/" focus-follows-mouse t mouse-autoselect-window t) :hook (;; Make sure titles match X window (exwm-update-title . (lambda () (exwm-workspace-rename-buffer (concat exwm-class-name ":" (if (<= (length exwm-title) 50) exwm-title (concat (substring exwm-title 0 49) "...")))))) (exwm-update-class . (lambda () (exwm-workspace-rename-buffer (concat exwm-class-name ":" (if (<= (length exwm-title) 50) exwm-title (concat (substring exwm-title 0 49) "...")))))))) (use-package ffap :demand t :bind (("C-x C-f" . find-file-at-point)) :init (ffap-bindings) :config (setq ffap-require-prefix nil)) (use-package time :init (display-time-mode) :config (setq display-time-format "%a, %d/%m/%Y %H:%M")) (use-package geiser :ensure t :config (with-eval-after-load 'geiser-guile (add-to-list 'geiser-guile-load-path "~/builds/nonguix"))) (use-package pixel-scroll :init (pixel-scroll-precision-mode)) (use-package scroll-bar :init (scroll-bar-mode -1)) (use-package delsel :init (delete-selection-mode)) (use-package frame :config (window-divider-mode)) (defun me/god-mode-update-cursor-type () (setq cursor-type (if (or god-local-mode buffer-read-only) 'box 'bar))) (use-package god-mode :hook ((prog-mode . god-local-mode) (post-command . me/god-mode-update-cursor-type)) :config (god-mode) (define-key god-local-mode-map (kbd "z") #'repeat) (define-key god-local-mode-map (kbd "M-j") #'minibuffer-keyboard-quit) (define-key god-local-mode-map (kbd ".") #'er/expand-region) (define-key god-local-mode-map (kbd "o") #'avy-goto-char-timer) (define-key god-local-mode-map (kbd ";") #'point-to-register) (global-set-key (kbd "C-x C-1") #'delete-other-windows) (global-set-key (kbd "C-x C-2") #'split-window-below) (global-set-key (kbd "C-x C-3") #'split-window-right) (global-set-key (kbd "C-x C-0") #'delete-window) (add-to-list 'god-exempt-major-modes 'mu4e-headers-mode) (add-to-list 'god-exempt-major-modes 'org-mode) (custom-set-faces '(god-mode-lighter ((t (:weight bold :foreground "orange red"))))) (setq god-mode-alist '((nil . "C-") ("g" . "M-") ("G" . "C-M-"))) (require 'god-mode-isearch) (define-key isearch-mode-map (kbd "") #'god-mode-isearch-activate) (define-key god-mode-isearch-map (kbd "") #'god-mode-isearch-disable) (define-key god-local-mode-map (kbd "[") #'backward-paragraph) (define-key god-local-mode-map (kbd "]") #'forward-paragraph) (global-set-key (kbd "") #'god-local-mode)) (use-package files :config (setq delete-old-versions t kept-new-versions 6 kept-old-versions 2 version-control t auto-save-default nil)) (use-package minibuffer :defer t :config (setq completion-cycle-threshold 5 completion-ignore-case t)) (use-package pass :defer t :ensure t) (use-package embark :ensure t :bind (("M-RET" . embark-dwim) ("C-h B" . embark-bindings)) :ensure t) (use-package select :config (setq x-select-enable-clipboard t x-select-enable-primary t)) (use-package exwm-randr :config (exwm-randr-mode) (start-process-shell-command "xrandr" nil "")) (use-package pdf-tools) (use-package imenu :defer t :config (setq imenu-auto-rescan t)) (defun sudo-shell-command (command) (interactive "MShell command (root): ") (with-temp-buffer (cd "/sudo::/") (async-shell-command command))) (use-package guix :ensure t :bind (("C-c C-p g" . guix) ("C-c C-p o" . (lambda () (interactive) (sudo-shell-command "guix system reconfigure /home/mccd/system/os/config.scm"))) ("C-c C-p h" . (lambda () (interactive) (async-shell-command "guix home reconfigure ~/system/home/config.scm"))))) (use-package nov :defer t :ensure t :init (add-to-list 'auto-mode-alist '("\\.epub'" . nov-mode))) (use-package ednc :ensure t :demand t :init (ednc-mode)) (use-package org-remark :bind (;; :bind keyword also implicitly defers org-remark itself. ;; Keybindings before :map is set for global-map. ("C-c n m" . org-remark-mark) ("C-c n l" . org-remark-mark-line) ; new in v1.3 :map org-remark-mode-map ("C-c n o" . org-remark-open) ("C-c n ]" . org-remark-view-next) ("C-c n [" . org-remark-view-prev) ("C-c n r" . org-remark-remove) ("C-c n d" . org-remark-delete)) ;; Alternative way to enable `org-remark-global-tracking-mode' in ;; `after-init-hook'. ;; :hook (after-init . org-remark-global-tracking-mode) :init ;; It is recommended that `org-remark-global-tracking-mode' be ;; enabled when Emacs initializes. Alternatively, you can put it to ;; `after-init-hook' as in the comment above (org-remark-global-tracking-mode +1) :config (use-package org-remark-info :after info :config (org-remark-info-mode +1)) (use-package org-remark-eww :after eww :config (org-remark-eww-mode +1)) (use-package org-remark-nov :after nov :config (org-remark-nov-mode +1))) (use-package battery :init (display-battery-mode t)) (use-package comint :bind ((:repeat-map repeat-hist-line-map ("n" . comint-next-input) ("p" . comint-previous-input)))) (use-package repeat :demand t :bind ((:repeat-map repeat-movement-map ("e" . end-of-defun) ("f" . forward-sexp) ("n" . forward-list) ("p" . backward-list) ("d" . down-list) ("u" . up-list) ("b" . backward-sexp) ("a" . beginning-of-defun))) :config (setq repeat-on-final-keystroke t set-mark-command-repeat-pop t repeat-exit-key (kbd "")) (repeat-mode 1)) (use-package enwc :ensure t :init (setq enwc-default-backend 'nm) (defun list-notifications () (mapconcat #'ednc-format-notification (ednc-notifications) "")) (nconc global-mode-string '((:eval (list-notifications)))) ; or stack (add-hook 'ednc-notification-presentation-functions (lambda (&rest _) (force-mode-line-update t)))) (use-package org-crypt :ensure nil :init (setenv "GPG_AGENT_INFO" nil) (setq auth-source-debug t epg-gpg-program "gpg2") (org-crypt-use-before-save-magic)) (use-package grep :config (setq-default grep-template (string-join '("ugrep" "--color=never" "--ignore-binary" "--ignore-case" "--include=" "--line-number" "--null" "--recursive" "--regexp=") " "))) (use-package pinentry :ensure t :init (pinentry-start)) (use-package epa-file :init (epa-file-enable) (setq epa-pinentry-mode 'loopback)) (use-package exwm-mff :demand t :load-path "elisp" :hook ((server-after-make-frame . exwm-mff-mode))) (use-package avy :ensure t :config (setq avy-timeout-seconds 0.2) (global-set-key (kbd "M-o") 'avy-goto-char-timer) (set-face-attribute 'avy-lead-face nil :inherit 'fixed-pitch) (set-face-attribute 'avy-lead-face-0 nil :inherit 'fixed-pitch) (set-face-attribute 'avy-lead-face-1 nil :inherit 'fixed-pitch) (set-face-attribute 'avy-lead-face-2 nil :inherit 'fixed-pitch) (setf (alist-get ? avy-dispatch-alist) 'avy-action-mark-to-char) (define-key isearch-mode-map (kbd "M-o") 'avy-isearch) (defun avy-action-kill-whole-line (pt) (save-excursion (goto-char pt) (kill-whole-line)) (select-window (cdr (ring-ref avy-ring 0))) t) (setf (alist-get ?k avy-dispatch-alist) 'avy-action-kill-stay (alist-get ?K avy-dispatch-alist) 'avy-action-kill-whole-line) (defun avy-action-copy-whole-line (pt) (save-excursion (goto-char pt) (cl-destructuring-bind (start . end) (bounds-of-thing-at-point 'line) (copy-region-as-kill start end))) (select-window (cdr (ring-ref avy-ring 0))) t) (defun avy-action-yank-whole-line (pt) (avy-action-copy-whole-line pt) (save-excursion (yank)) t) (defun avy-action-embark (pt) (unwind-protect (save-excursion (goto-char pt) (embark-act)) (select-window (cdr (ring-ref avy-ring 0)))) t) (setf (alist-get ?. avy-dispatch-alist) 'avy-action-embark) (setf (alist-get ?y avy-dispatch-alist) 'avy-action-yank (alist-get ?w avy-dispatch-alist) 'avy-action-copy (alist-get ?W avy-dispatch-alist) 'avy-action-copy-whole-line (alist-get ?Y avy-dispatch-alist) 'avy-action-yank-whole-line) (defun avy-action-copy-whole-line (pt) (save-excursion (goto-char pt) (cl-destructuring-bind (start . end) (bounds-of-thing-at-point 'line) (copy-region-as-kill start end))) (select-window (cdr (ring-ref avy-ring 0))) t) (defun avy-action-yank-whole-line (pt) (avy-action-copy-whole-line pt) (save-excursion (yank)) t) (setf (alist-get ?y avy-dispatch-alist) 'avy-action-yank (alist-get ?w avy-dispatch-alist) 'avy-action-copy (alist-get ?W avy-dispatch-alist) 'avy-action-copy-whole-line (alist-get ?Y avy-dispatch-alist) 'avy-action-yank-whole-line) (defun avy-action-teleport-whole-line (pt) (avy-action-kill-whole-line pt) (save-excursion (yank)) t) (setf (alist-get ?t avy-dispatch-alist) 'avy-action-teleport (alist-get ?T avy-dispatch-alist) 'avy-action-teleport-whole-line) (defun avy-action-mark-to-char (pt) (activate-mark) (goto-char pt)) (setf (alist-get ? avy-dispatch-alist) 'avy-action-mark-to-char)) (use-package flymake :defer t :bind (:repeat-map flymake-repeat-map ("]" . flymake-goto-next-error) ("[" . flymake-goto-prev-error)) :hook ((flymake-mode . (lambda () (define-key flymake-mode-map (kbd "C-c ]") 'flymake-goto-next-error) (define-key flymake-mode-map (kbd "C-c [") 'flymake-goto-prev-error))))) (use-package expand-region :ensure t :bind ("C-c ." . er/expand-region)) (use-package devdocs :ensure t :init (global-set-key (kbd "C-h D") 'devdocs-lookup)) (use-package custom-keymaps :bind (:map keymaps-mode-map ("C-c ." . er/expand-region)) :load-path "elisp") (use-package sgml-mode :init (add-to-list 'auto-mode-alist '("\\.njk\\'" . html-mode)) (add-to-list 'auto-mode-alist '("\\.tmpl\\'" . html-mode)) :config (define-key html-mode-map (kbd "M-") nil) (define-key html-mode-map (kbd "M-o") nil) :hook (css-mode . (lambda ((interactive) (setq-local tab-width 2) (setq sgml-basic-offset 2 indent-tabs-mode t)))) (html-mode . (lambda () (interactive) (setq-local tab-width 2) (setq sgml-basic-offset 2 indent-tabs-mode t)))) (use-package eldoc :ensure t :demand t :diminish "" :config (setq eldoc-print-after-edit t echo-area-display-truncation-message nil eldoc-echo-area-prefer-doc-buffer 'maybe eldoc-echo-area-use-multiline-p nil) :hook (prog-mode . eldoc-mode)) (use-package eldoc-box :ensure t :demand t :hook (eglot-managed-mode . #'eldoc-box-hover-mode) :config (global-set-key (kbd "C-h .") #'eldoc-box-help-at-point)) (use-package markdown-mode :ensure t :config (set-face-attribute 'markdown-code-face nil :inherit 'fixed-pitch) :hook ((markdown-mode . variable-pitch-mode) (markdown-mode . markdown-toggle-url-hiding) (markdown-mode . markdown-toggle-markup-hiding) (markdown-mode . visual-line-mode))) (use-package elec-pair :init (electric-pair-mode 1) :config (global-set-key (kbd "M-{") 'insert-pair) (global-set-key (kbd "M-\"") 'insert-pair) (global-set-key (kbd "M-\'") 'insert-pair) (global-set-key (kbd "M-<") 'insert-pair) (global-set-key (kbd "M-[") 'insert-pair)) (use-package ido :init (ido-mode t)) (use-package org-link-minor-mode :load-path "elisp" :defer t) (use-package calendar :defer t :hook ((diary-mode . variable-pitch-mode) ; (diary-mode . org-link-minor-mode) ; (diary-fancy-display-mode . org-link-minor-mode) (diary-fancy-display-mode . variable-pitch-mode)) :config (global-set-key (kbd "C-c d") 'calendar) (calendar-set-date-style 'european) (setq calendar-week-start-day 1)) (use-package nix-mode :ensure t :defer t :hook ((nix-mode . (lambda () (add-hook 'before-save-hook #'nix-format-buffer nil t))) (nix-mode . nix-prettify-mode))) (use-package hyperbole :ensure t :defer t :config (setq hyperbole-file-list '("~/personal-db/notes/inbox.org"))) (use-package eglot :config ;; Ensure `nil` is in your PATH. (add-to-list 'eglot-server-programs '(nix-mode . ("nil"))) (define-key eglot-mode-map (kbd "C-c r") 'eglot-rename) (define-key eglot-mode-map (kbd "C-c o") 'eglot-code-actions) :hook (css-mode . eglot-ensure) (html-mode . eglot-ensure) (javascript-mode . eglot-ensure) (nix-mode . eglot-ensure) (go-mode . eglot-ensure)) (use-package go-mode :ensure t :defer t :hook ((go-mode . (lambda () (add-hook 'before-save-hook 'eglot-format-buffer nil t))) (go-mode . (lambda () (setq-local compile-command "go build ."))))) (use-package rec-mode :ensure t :defer t :mode "\\.rec\\'" :config (define-key rec-edit-mode-map (kbd "") nil) (define-key rec-mode-map (kbd "") nil) :hook ((rec-mode . variable-pitch-mode) (rec-mode . flymake-mode) (rec-mode . eldoc-mode))) (use-package erc :ensure t :config (setq erc-autojoin-channels-alist '(("Libera.Chat" "#emacs" "#permacomputing" "#oldcomputerchallenge" "#go-nuts" "#netbsd" "#nonguix" "#guix"))) :init (global-set-key "\C-cef" (lambda () (interactive) (erc :server "irc.libera.chat" :port "6667" :nick "mccd" :password (shell-command-to-string "pass show libera.chat"))))) (use-package ob-rec :ensure nil) (defun sync-org () (interactive) (async-shell-command "org-sync")) (add-to-list 'display-buffer-alist '("*Async Shell Command*" display-buffer-no-window (nil))) ;; Org (use-package org :ensure t :init (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) (org-babel-do-load-languages 'org-babel-load-languages '((shell . t) (rec .t))) :config (setq org-refile-targets '((nil :maxlevel . 4) (org-agenda-files :maxlevel . 4)) org-default-notes-file "~/personal-db/notes/todo.org" org-hide-emphasis-markers t org-agenda-include-diary nil org-agenda-remove-tags t org-startup-folded 'content org-agenda-inhibit-startup nil ;; Add /New Heading at the end for use org-refile-allow-creating-parent-nodes 'confirm org-outline-path-complete-in-steps nil org-refile-use-outline-path 'file ;; Otherwise looks weird in variable-pitch-mode org-log-done 'time org-capture-templates '(("t" "Todo" entry (file "~/personal-db/notes/todo.org") "* TODO %?\n%i\n%a\n " :empty-lines 1) ("l" "Log" entry (file+headline "~/personal-db/notes/log.org" "Log") "** %?\n%T" :prepend t :empty-lines 0) ("n" "Inbox" entry (file "~/personal-db/notes/inbox.org") "* %?\n%U\n" :empty-lines 1))) (set-face-attribute 'org-block nil :inherit 'fixed-pitch) (set-face-attribute 'org-code nil :inherit 'fixed-pitch) (set-face-attribute 'org-table nil :inherit 'fixed-pitch) (set-face-attribute 'org-date nil :inherit 'fixed-pitch) (set-face-attribute 'org-tag nil :inherit 'fixed-pitch) (global-set-key (kbd "C-c l") #'org-store-link) (global-set-key (kbd "C-c a") #'org-agenda) (global-set-key (kbd "C-c c") #'org-capture) (global-set-key (kbd "C-c j") #'org-goto) (global-set-key (kbd "C-c s") #'project-find-regexp) (global-set-key (kbd "C-c C-o") #'org-open-at-point-global) (global-set-key (kbd "C-c C-s") #'sync-org) ;; Something errors out with capture logs and non-org files (add-to-list 'warning-suppress-log-types '(org-element)) (add-to-list 'warning-suppress-types '(org-element)) :hook ((org-mode . auto-save-visited-mode) (org-mode . org-indent-mode) (org-mode . flyspell-mode) (org-mode . auto-revert-mode) (org-mode . visual-line-mode) (org-mode . (lambda () (add-hook 'after-save-hook 'sync-org nil t))) (org-mode . variable-pitch-mode))) (use-package org-alert :init (setq alert-default-style 'libnotify org-alert-interval 300 org-alert-notify-cutoff 10 org-alert-notify-after-event-cutoff 10) :ensure t) (use-package rec-mode :ensure t) (use-package magit :ensure t :demand t :config (global-key-binding (kbd "C-x p m") 'magit-project-status) (define-key project-prefix-map (kbd "m") 'magit-project-status) (add-to-list 'project-switch-commands '(magit-project-status "magit"))) (use-package magit-extras :demand t) (use-package yasnippet :diminish t :ensure t :init (yas-global-mode 1)) (use-package register :bind (("C-z" . 'point-to-register))) (defun marc/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 "marcc@fastmail.fr" from) "home") ((string-match "marc.coquand@sustainably.app" from) "work") ((string-match "marc@mccd.space" from) "home")))) (setq message-sendmail-extra-arguments (list '"-a" account)))))) ;(use-package message ; :defer t ; :hook ; ((message-send-mail . marc/set-msmtp-account) ; (message-mode-hook flyspell-mode))) (add-hook 'message-send-mail-hook #'marc/set-msmtp-account) (add-hook 'message-mode-hook #'flyspell-mode) (use-package flyspell :defer t) (use-package mu4e :ensure nil :config ;; This is set to 't' to avoid mail syncing issues when using mbsync (setq mu4e-change-filenames-when-moving t) ;; don't keep message compose buffers around after sending: (setq message-kill-buffer-on-exit t) (setq mu4e-notification-support t) ;; send function: (setq send-mail-function 'sendmail-send-it message-send-mail-function 'sendmail-send-it) ;; 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) ;; Refresh mail using isync every 10 minutes (setq mu4e-update-interval (* 10 60) mu4e-get-mail-command "mbsync -a" mu4e-view-show-images t mu4e-view-show-addresses t mu4e-attachment-dir "~/Downloads" mu4e-view-prefer-html t mu4e-maildir "~/mail") (setq mu4e-contexts (list ;; Home (make-mu4e-context :name "home" :enter-func (lambda () (mu4e-message "Entering personal context")) :leave-func (lambda () (mu4e-message "Leaving personal context")) :match-func (lambda (msg) (when msg (string-prefix-p "/home" (mu4e-message-field msg :maildir)))) :vars '((user-mail-address . "marc@mccd.space") (user-full-name . "Marc Coquand") (mu4e-drafts-folder . "/home/Drafts") (mu4e-sent-folder . "/home/Sent") (mu4e-refile-folder . "/home/Archive") (mu4e-trash-folder . "/home/Trash") (mu4e-sent-messages-behavior . sent) (mu4e-maildir-shortcuts . (("/home/INBOX" . ?i) ("/home/Archive/Done" . ?d) ("/home/Archive" . ?a) ("/home/Archive/Todo" . ?t))))) ;; Work account (make-mu4e-context :name "work" :enter-func (lambda () (mu4e-message "Entering work context")) :leave-func (lambda () (mu4e-message "Leaving work context")) :match-func (lambda (msg) (when msg (string-prefix-p "/work" (mu4e-message-field msg :maildir)))) :vars '((user-mail-address . "marc.coquand@sustainably.app") (user-full-name . "Marc Coquand") (mu4e-drafts-folder . "/work/[Gmail]/Drafts") (mu4e-sent-folder . "/work/[Gmail]/Sent Mail") (mu4e-refile-folder . "/work/[Gmail]/All Mail") (mu4e-sent-messages-behavior . delete) (mu4e-trash-folder . "/work/[Gmail]/Trash") (mu4e-maildir-shortcuts . (("/work/[Gmail]/All Mail" . ?a) ("/work/INBOX" . ?i)))))))) (use-package lem :ensure t :config (setq lem-instance-url "https://lemmy.sdf.org")) (use-package elfeed-protocol :ensure t :init (elfeed-protocol-enable)) (use-package elfeed :ensure t :config (setq elfeed-use-curl t ;; setup feeds elfeed-protocol-fever-update-unread-only t elfeed-protocol-fever-fetch-category-as-tag t elfeed-protocol-feeds '(("fever+https://freshrss@rss.mccd.space" :api-url "https://rss.mccd.space/api/fever.php" :password (shell-command-to-string "pass show mccd/freshrss"))) ;; enable elfeed-protocol elfeed-protocol-enabled-protocols '(fever) elfeed-curl-extra-arguments '("--insecure")) ;necessary for https without a trust certificate (elfeed-set-timeout 36000) (global-set-key (kbd "C-x w") 'elfeed)) (use-package mastodon :defer t :config (setq mastodon-active-user "marcc" mastodon-instance-url "https://fosstodon.org")) (use-package eww :config (setq browse-url-browser-function 'eww-browse-url ; Use eww as the default browser eww-search-prefix "https://lite.duckduckgo.com/lite/?q=" shr-max-image-proportion 0.3 shr-width 70)) ;; Can play youtube urls and music. ;; Requires mpv (use-package emms :ensure t :init (add-hook 'emms-player-started-hook 'emms-show) :config (setq emms-shop-format "on: %s") (emms-all) (emms-default-players)) (set-cursor-color "red") (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. '(default ((t (:inherit nil :extend nil :stipple nil :background "white" :foreground "black" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight regular :height 150 :width expanded :foundry "UKWN" :family "Iosevka SS13 Extended")))) '(avy-lead-face ((t (:inherit fixed-pitch :background "dark red" :foreground "white")))) '(calendar-weekend-header ((t (:inherit nil)))) '(custom-group-subtitle ((t (:weight bold :family "Iosevka Aile")))) '(diary ((t (:inherit fixed-pitch :foreground "red1")))) '(eglot-highlight-symbol-face ((t (:weight bold)))) '(eglot-mode-line ((t (:weight regular)))) '(erc-timestamp-face ((t (:foreground "blue" :weight bold)))) '(eshell-prompt ((t (:weight bold)))) '(eww-valid-certificate ((t (:foreground "black" :weight bold)))) '(fixed-pitch ((t (:family "Iosevka SS13 Extended")))) '(font-lock-builtin-face ((t (:weight regular)))) '(font-lock-comment-face ((t (:foreground "royalblue" :slant normal)))) '(font-lock-constant-face ((t (:slant italic :weight regular)))) '(font-lock-function-name-face ((t (:weight regular)))) '(font-lock-keyword-face ((t (:weight regular)))) '(font-lock-string-face ((t (:foreground "black" :slant italic)))) '(font-lock-type-face ((t (:foreground "black")))) '(font-lock-variable-name-face ((t (:foreground "black")))) '(fringe ((t (:background "white")))) '(header-line ((t (:inherit default :foreground "grey20" :box (:line-width (12 . 12) :color "#FFFFFF") :underline (:color "#e0e0e0" :style line :position 0) :family "Iosevka Aile")))) '(highlight ((t (:background "azure2")))) '(info-header-xref ((t (:inherit info-xref :underline (:color "RoyalBlue3" :style line :position t))))) '(info-node ((t (:foreground "brown" :box (:line-width (4 . 4) :color "white") :slant italic :weight bold)))) '(enwc-connected ((t (:foreground "dark green" :weight bold)))) '(link ((t (:foreground "royalblue" :underline t)))) '(magit-branch-remote ((t (:foreground "royalblue")))) '(markdown-inline-code-face ((t (:inherit markdown-code-face)))) '(markdown-pre-face ((t (:inherit markdown-code-face)))) '(mastodon-display-name-face ((t (:inherit nil :weight bold)))) '(mode-line ((t (:background "gray95" :foreground "black" :box (:line-width (12 . 12) :style flat-button) :overline "white" :underline (:color "white" :style line :position t) :family "Iosevka Aile")))) '(mode-line-emphasis ((t (:weight regular)))) '(mode-line-inactive ((t (:inherit mode-line :background "#fbfbfb" :foreground "grey60" :overline "#f9f9f9" :underline (:color "#f9f9f9" :style line :position 0) :weight light)))) '(mu4e-header-highlight-face ((t (:inherit hl-line :extend t :weight bold)))) '(mu4e-highlight-face ((t (:inherit highlight)))) '(org-date ((t (:inherit fixed-pitch :foreground "gray40" :underline t)))) '(org-headline-done ((t (:foreground "gray40")))) '(org-level-1 ((t (:inherit outline-1 :extend nil :weight regular)))) '(org-tag ((t (:inherit fixed-pitch :foreground "gray40" :weight regular)))) '(org-time-grid ((t (:foreground "gray")))) '(org-quote ((t (:inherit org-block :slant italic)))) '(outline-4 ((t (:inherit outline-2)))) '(tab-bar ((t (:box (:line-width (12 . 24) :style flat-button) :weight semi-light :family "Iosevka Aile")))) '(tab-bar-tab ((t (:inherit tab-bar :foreground "black" :box (:line-width (20 . 1) :color "white") :weight semi-bold)))) '(tab-bar-tab-inactive ((t (:inherit tab-bar-tab :background "white" :foreground "#999999" :weight semi-light)))) '(tldr-code-block ((t (:background "cornsilk" :foreground "black")))) '(tldr-command-argument ((t (:background "cornsilk" :foreground "black")))) '(tldr-command-itself ((t (:background "khaki" :foreground "black" :weight bold)))) '(tldr-introduction ((t (:foreground "black" :slant italic)))) '(tldr-title ((t (:inherit variable-pitch :foreground "black" :weight bold :height 1.2)))) '(variable-pitch ((t (:family "Iosevka Aile")))) '(window-divider ((t (:foreground "gray90"))))) (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 '("cbd85ab34afb47003fa7f814a462c24affb1de81ebf172b78cb4e65186ba59d2" default)) '(erc-mode-line-format "") '(erc-modules '(autojoin button completion fill irccontrols list match menu move-to-prompt netsplit networks noncommands notifications readonly ring services stamp spelling)) '(magit-section-visibility-indicator '("..." . t)) '(markdown-list-item-bullets '("-")) '(mastodon-tl--enable-proportional-fonts t) '(mastodon-use-emojify t) '(mode-line-compact 'long) '(mode-line-format '("%e" mode-line-front-space (:propertize ("" mode-line-modified " ")) mode-line-buffer-identification " " mode-line-modes)) '(mode-line-percent-position nil) '(mode-line-position-line-format '(" ")) '(mu4e-bookmarks '((:name "Last 7 days" :query "date:7d..now" :hide-unread t :key 119) (:name "Messages with images" :query "mime:image/*" :key 112))) '(org-agenda-files '("~/personal-db/notes/sustainable-software.org" "/home/mccd/personal-db/notes/thoughts.org" "/home/mccd/personal-db/notes/cal-ios.org" "/home/mccd/personal-db/notes/ethics-and-software.org" "/home/mccd/personal-db/notes/reminders.org" "/home/mccd/builds/sustainably/piva.org" "/home/mccd/personal-db/notes/programming.org" "/home/mccd/personal-db/notes/unix.org" "/home/mccd/personal-db/notes/agency-and-tech.org" "/home/mccd/personal-db/notes/emacs-teaches.org" "/home/mccd/personal-db/notes/emacs.org" "/home/mccd/personal-db/notes/inbox.org" "/home/mccd/personal-db/notes/todo.org" "/home/mccd/system/guix.org" "/home/mccd/personal-db/notes/log.org")) '(org-fold-core-style 'overlays) '(package-selected-packages '(nov eldoc-box hide-mode-line exwm-mff eat pinentry exwm emms company orglink web-mode flycheck nix-mode nix-ts-mode avy pdf-tools elfeed-protocol lem yasnippet-snippets elfeed yasnippet smartparens markdown-mode mastodon tldr almost-mono-themes rec-mode magit go-mode expand-region devdocs)) '(tab-bar-auto-width t) '(tab-bar-close-button-show nil) '(tab-bar-format '(tab-bar-format-tabs tab-bar-format-align-right tab-bar-format-global)) '(tab-bar-position nil) '(tab-bar-tab-hints t) '(window-divider-default-right-width 2) '(yank-from-kill-ring-rotate t)) (put 'secrets-mode 'disabled nil)