summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.config/common-lisp/source-registry.conf.d/50-my-lisp.conf2
-rw-r--r--.config/git/config2
-rw-r--r--.config/mailscripts/notmuch-import-patch2
-rw-r--r--.config/mailscripts/notmuch-slurp-debbug2
-rw-r--r--.config/mc/panels.ini2
-rw-r--r--.config/mutt/muttrc2
-rwxr-xr-x.config/notmuch/default/hooks/post-new2
-rw-r--r--.emacs.d/early-init.el2
-rw-r--r--.emacs.d/eshell/alias3
-rw-r--r--.emacs.d/init.el671
-rw-r--r--.mbsyncrc116
-rw-r--r--.notmuch-config4
-rw-r--r--.pbuilderrc2
-rw-r--r--.shinit4
-rw-r--r--.ssh/config4
-rwxr-xr-xbin/movemymail4
-rw-r--r--lib-src/certs/fastmail.crt41
17 files changed, 462 insertions, 403 deletions
diff --git a/.config/common-lisp/source-registry.conf.d/50-my-lisp.conf b/.config/common-lisp/source-registry.conf.d/50-my-lisp.conf
index 0ed6822f..36871711 100644
--- a/.config/common-lisp/source-registry.conf.d/50-my-lisp.conf
+++ b/.config/common-lisp/source-registry.conf.d/50-my-lisp.conf
@@ -1 +1 @@
-(:tree "/home/spwhitton/src/cl/")
+(:tree "/home/swhitton/src/cl/")
diff --git a/.config/git/config b/.config/git/config
index 09c01894..c8b0d04d 100644
--- a/.config/git/config
+++ b/.config/git/config
@@ -44,7 +44,7 @@
# There's no tilde expansion for this. When can assume git 2.31 can
# set GIT_CONFIG_KEY_0=format.outputDirectory &
# GIT_CONFIG_VALUE_0="$HOME/tmp" in ~/.profile instead.
- outputDirectory = /home/spwhitton/tmp
+ outputDirectory = /home/swhitton/tmp
# These defaults turn off anonymous recipients to minimise key usage prompts.
[gcrypt]
diff --git a/.config/mailscripts/notmuch-import-patch b/.config/mailscripts/notmuch-import-patch
index 1ac7a532..625908e9 100644
--- a/.config/mailscripts/notmuch-import-patch
+++ b/.config/mailscripts/notmuch-import-patch
@@ -1 +1 @@
-maildir = /home/spwhitton/.fmail/inbox
+maildir = /home/swhitton/.fmail/inbox
diff --git a/.config/mailscripts/notmuch-slurp-debbug b/.config/mailscripts/notmuch-slurp-debbug
index 1ac7a532..625908e9 100644
--- a/.config/mailscripts/notmuch-slurp-debbug
+++ b/.config/mailscripts/notmuch-slurp-debbug
@@ -1 +1 @@
-maildir = /home/spwhitton/.fmail/inbox
+maildir = /home/swhitton/.fmail/inbox
diff --git a/.config/mc/panels.ini b/.config/mc/panels.ini
index 77188397..f0378787 100644
--- a/.config/mc/panels.ini
+++ b/.config/mc/panels.ini
@@ -30,4 +30,4 @@ user_mini_status=0
[Dirs]
current_is_left=true
-other_dir=/home/spwhitton
+other_dir=/home/swhitton
diff --git a/.config/mutt/muttrc b/.config/mutt/muttrc
index 2825f7ec..25e097be 100644
--- a/.config/mutt/muttrc
+++ b/.config/mutt/muttrc
@@ -29,7 +29,7 @@ unset crypt_use_gpgme # Some Debian services require inline sigs.
unset mark_old # Better with mbsync.
unset wait_key
-mailboxes +inbox +notes +sent +ham +spam +junk +trash
+mailboxes +inbox +notes +sent +junk +trash
ignore *
unignore From: Subject: To: Cc: Date: Reply-To: Message-Id:
diff --git a/.config/notmuch/default/hooks/post-new b/.config/notmuch/default/hooks/post-new
index b46d08bd..1774b148 100755
--- a/.config/notmuch/default/hooks/post-new
+++ b/.config/notmuch/default/hooks/post-new
@@ -1,7 +1,7 @@
#!/bin/sh
# mark all spam as spam, and as read, for Gnus
-notmuch tag -unread +spam -- folder:junk folder:spam
+notmuch tag -unread +spam -- folder:junk
# mark all trash as trash, and as read, for Gnus
notmuch tag -unread +deleted -- folder:trash
diff --git a/.emacs.d/early-init.el b/.emacs.d/early-init.el
index a3793e15..08a4aa02 100644
--- a/.emacs.d/early-init.el
+++ b/.emacs.d/early-init.el
@@ -1,6 +1,6 @@
;;; early-init.el --- frames conf. -*- lexical-binding:t;no-byte-compile:t -*-
-;; Copyright (C) 2020-2022 Sean Whitton <spwhitton@spwhitton.name>
+;; Copyright (C) 2020-2023 Sean Whitton <spwhitton@spwhitton.name>
;;
;; This file is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
diff --git a/.emacs.d/eshell/alias b/.emacs.d/eshell/alias
index 5e66ab3b..3016144c 100644
--- a/.emacs.d/eshell/alias
+++ b/.emacs.d/eshell/alias
@@ -1,7 +1,7 @@
alias grep-queued { cd /ssh:ssh.upload.debian.org: && *grep $* /srv/upload.debian.org/queued/run/log }
alias grep-dak { cd /ssh:ftp-master.debian.org: && *grep $* /srv/ftp-master.debian.org/log/current }
alias push-develacc-dotfiles-branch git push -f origin develacc/develacc-"${hostname}":develacc-"${hostname}"
-alias sbuild-prerelease sbuild --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn' $*
+alias sbuild-prerelease sbuild --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn' $* --no-run-lintian
alias sbuild-lts quilt pop -a; git is-clean ':!debian/patches/' && sbuild --no-clean-source --no-run-lintian $*
alias dpkg-bp-lts quilt pop -a; git is-clean && dpkg-buildpackage -S -nc --force-sign $*
alias dpkg-buildpackage-lts dpkg-bp-lts $*
@@ -18,6 +18,7 @@ alias afsid apt-file --filter-suites unstable $*
alias grepcopy grep -Eir '(copyright|©)' *
alias pdfwords pdftotext "$1" - | wc -w
alias dlp lp -o sides=two-sided-long-edge $*
+alias pdd dd bs=4M status=progress conv=fdatasync $*
alias tail-dak { cd /ssh:ftp-master.debian.org:/srv/ftp-master.debian.org/log && tail -f current }
alias tail-queued { cd /ssh:ssh.upload.debian.org:/srv/upload.debian.org/queued/run && tail -f log }
alias package-plan-unpack ~/src/dotfiles/scripts/debian/package-plan-unpack "$1"; cd "/tmp/$1"
diff --git a/.emacs.d/init.el b/.emacs.d/init.el
index e220af96..fb1e49d8 100644
--- a/.emacs.d/init.el
+++ b/.emacs.d/init.el
@@ -23,11 +23,6 @@
;; matching ~/.emacs.d/*.el, since the "spw-" and "spw--" prefixes would be
;; for a file called "spw.el" with a defined API, providing an `spw' feature.
;;
-;; Prefer using the customise interface for variables, faces and enabling and
-;; disabling global minor modes, except when we want to associate an extended
-;; comment to a number of settings (typically we use the customise interface's
-;; facility for adding comments for only short comments).
-;;
;; Aim for compatibility with the version of Emacs included in Debian stable.
;;
;; Bind only key sequences reserved for users or which are already bound to
@@ -82,21 +77,32 @@
;;;; Customisation & appearance
-(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.
+;; The customisation system is additionally used to save safe local variable
+;; values, SSL certificate overrides etc. (cf. `customize-push-and-save').
+;; Most of these should not be committed to git: they're often host-specific,
+;; usually only relevant for a short time, and sometimes private.
+;; So we use a disposable, local custom file, and `custom-theme-set-faces',
+;; `customize-set-variable' and `custom-theme-set-variables' in this file.
+;; (Re `setopt' vs. `customize-set-variable': former is for when we're making
+;; a dynamic change that is not just host-specific but session-specific.)
+(load (setq custom-file (expand-file-name "custom" user-emacs-directory))
+ 'noerror 'nomessage 'nosuffix)
+
+(custom-theme-set-faces
+ 'user
'(default ((t (:weight medium :height 105 :foundry "SRC" :family "Hack"))))
+ '(fixed-pitch ((t (:foundry "SRC" :family "Hack"))))
+ '(variable-pitch ((t (:weight regular :height 120
+ :foundry "bitstream" :family "Bitstream Charter"))))
+ ;; We want to handle the `variable-pitch'/`variable-pitch-text' distinction
+ ;; using `spw/maybe-scale-basic-faces' instead.
+ '(variable-pitch-text ((t (:inherit variable-pitch))))
+
'(comint-highlight-prompt ((t (:inherit minibuffer-prompt :weight bold))))
'(fill-column-indicator ((t (:background "light gray"))))
- '(fixed-pitch ((t (:foundry "SRC" :family "Hack"))))
- '(org-code ((t (:inherit (shadow fixed-pitch)))))
- '(org-date ((t (:inherit fixed-pitch :foreground "Purple" :underline t))))
- '(org-verbatim ((t (:inherit (shadow fixed-pitch)))))
- '(region ((t (:extend t :background "#EECD82"))) nil "Colour is from the Lucid build.")
- '(variable-pitch ((t (:weight regular :height 120 :foundry "bitstream" :family "Bitstream Charter"))))
- '(variable-pitch-text ((t (:inherit variable-pitch))) nil "Handled by `spw/maybe-scale-basic-faces' instead."))
+
+ ;; The colour is from the Lucid build of Emacs.
+ '(region ((t (:extend t :background "#EECD82")))))
;; Set background colour but don't touch text terminals.
(dolist (ws '(x pgtk w32 ns))
@@ -109,13 +115,13 @@
`(,ws
. ((background-color
. ,(pcase (daemonp)
- ('nil "honeydew") ("gdbmacs" "linen") (_ "#FFFFF6")))))))
+ ('nil "#F0FFF0") ("gdbmacs" "#F5F5DC") (_ "#FFFFF6")))))))
(defun spw/maybe-scale-basic-faces (frame)
- "Entry for `window-size-change-functions' to increase font sizes
-from those set by `custom-set-faces' for frames on wide monitors,
-except where doing so would itself prevent fitting two 80-column
-windows side-by-side in the frame."
+ "Entry for `window-size-change-functions' to increase font sizes,
+relative to those set by the call to `custom-theme-set-faces' above, for
+frames on wide monitors, except where doing so would itself prevent fitting
+two 80-column windows side-by-side in the frame."
(when (display-graphic-p frame)
(let ((wide-monitor-p (> (cadddr (assoc 'geometry
(frame-monitor-attributes frame)))
@@ -167,32 +173,17 @@ windows side-by-side in the frame."
(set-terminal-parameter nil 'background-mode 'light)))
(add-hook 'tty-setup-hook #'spw/set-tmux-background-mode)
-(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-theme-set-variables
+ 'user
'(Man-notify-method 'aggressive)
'(after-save-hook '(executable-make-buffer-file-executable-if-script-p))
- '(appt-display-diary nil)
- '(appt-display-interval 6)
'(async-shell-command-buffer 'rename-buffer)
'(auth-source-save-behavior nil)
'(auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-saves/" t)))
'(backup-by-copying-when-linked t)
'(backup-directory-alist '(("." . "~/.emacs.d/backups/")))
- '(bongo-default-directory "~/annex/music/")
- '(bongo-insert-album-covers t)
- '(bongo-insert-whole-directory-trees t)
- '(bongo-mode-line-indicator-mode nil)
- '(bongo-prefer-library-buffers nil)
'(c-default-style "linux")
'(calc-kill-line-numbering nil)
- '(calendar-date-display-form
- '((format "%s-%.2d-%.2d %.3s" year (string-to-number month)
- (string-to-number day) dayname)))
- '(calendar-date-style 'iso)
- '(calendar-week-start-day 1)
'(column-number-mode t)
'(comint-prompt-read-only t)
'(compilation-scroll-output 'first-error)
@@ -202,223 +193,66 @@ windows side-by-side in the frame."
'(copy-region-blink-delay 0)
'(copyright-names-regexp "Sean Whitton")
'(copyright-year-ranges t)
- '(cperl-close-paren-offset -4 nil nil "See `cperl-indent-parens-as-block'.")
- '(cperl-indent-level 4)
- '(cperl-indent-parens-as-block t nil nil "Makes it easier to use longer names for subroutines.")
- '(cperl-lineup-step 1)
'(cursor-type 'box)
- '(cycle-spacing-actions '(just-one-space) nil nil "Restore Emacs 28 behaviour of M-SPC.")
+
+ ;; C-u M-\ to delete only before point, M-SPC M-SPC to delete only after.
+ '(cycle-spacing-actions '(just-one-space (delete-space-after -)))
+
'(dabbrev-case-fold-search t)
- '(diary-file "~/doc/emacs-diary")
- '(diary-list-entries-hook '(diary-include-other-diary-files diary-sort-entries))
- '(diary-mark-entries-hook '(diary-mark-included-diary-files))
- '(dired-clean-up-buffers-too nil)
- '(dired-dwim-target t)
- '(dired-free-space 'separate)
- '(dired-isearch-filenames t)
- '(dired-listing-switches "--group-directories-first -alh")
- '(dired-omit-files "\\`[.]?#\\|\\`[.][.]?\\'\\|\\`\\.git\\'")
- '(dired-recursive-copies 'always)
'(display-fill-column-indicator-character 32)
'(ediff-split-window-function 'split-window-horizontally)
'(eldoc-minor-mode-string nil)
'(emacs-lisp-docstring-fill-column 75)
'(enable-recursive-minibuffers t)
- '(eshell-cmpl-cycle-completions nil nil nil "This makes Eshell completions a bit more like bash's.")
- '(eshell-cmpl-ignore-case t)
- '(eshell-hist-ignoredups 'erase)
- '(eshell-history-append t)
- '(eshell-history-size 5000)
- '(eshell-save-history-on-exit nil)
- '(eshell-visual-commands
- '("vi" "screen" "tmux" "top" "htop" "less" "more" "mutt" "locmaint" "gen-DSA"
- "gen-DLA" "gen-ELA"))
'(fill-column 78)
- '(font-lock-maximum-decoration '((lisp-mode . 1) (consfigurator-lisp-mode . 1) (t . t)))
+ '(font-lock-maximum-decoration
+ '((lisp-mode . 1) (consfigurator-lisp-mode . 1) (t . t)))
'(gc-cons-threshold 16777216)
'(gdb-many-windows t)
- '(gdb-show-main t nil nil "This is helpful when gdb-many-windows is turned off.")
- '(git-rebase-confirm-cancel nil)
+
+ ;; This is helpful when gdb-many-windows is turned off.
+ '(gdb-show-main t)
+
'(global-so-long-mode t)
- '(gnus-article-skip-boring t)
- '(gnus-auto-center-summary nil)
- '(gnus-auto-select-next 'slightly-quietly)
- '(gnus-buttonized-mime-types
- '("text/x-\\(?:diff\\|patch\\)" "multipart/\\(?:alternative\\|signed\\)"))
- '(gnus-directory "~/local/News/")
- '(gnus-extra-headers '(To Cc List-Id))
- '(gnus-gcc-mark-as-read t)
- '(gnus-global-score-files '("~/doc/News/"))
- '(gnus-interactive-exit 'quiet)
- '(gnus-kill-files-directory "~/src/athpriv/News/")
- '(gnus-kill-summary-on-exit t nil nil "Would prefer nil but t seems advisable for notmuch groups.")
- '(gnus-large-ephemeral-newsgroup 8000)
- '(gnus-large-newsgroup 8000)
- '(gnus-mark-article-hook '(spw/gnus-mark-article-hook))
- '(gnus-message-archive-group "sent")
- '(gnus-message-archive-method '(nnmaildir "fmail" (directory "~/.fmail/")))
- '(gnus-permanently-visible-groups "^nnmaildir\\+fmail:\\(?:notes\\|sent\\)$")
- '(gnus-read-newsrc-file nil)
- '(gnus-refer-thread-use-search '(("nnmaildir:fmail")))
- '(gnus-save-killed-list
- "^\\(?:[^n]\\|n[^n]\\|nn[^s]\\|nns[^e]\\|nnse[^l]\\|nnsel[^e]\\|nnsele[^c]\\|nnselec[^t]\\|nnselect[^:]\\)")
- '(gnus-save-newsrc-file nil)
- '(gnus-search-default-engines '((nnmaildir . notmuch)))
- '(gnus-search-notmuch-remove-prefix "~/.fmail/")
- '(gnus-secondary-select-methods '((nnmaildir "fmail" (directory "~/.fmail/"))))
- '(gnus-sum-thread-tree-false-root "")
- '(gnus-sum-thread-tree-indent " ")
- '(gnus-sum-thread-tree-leaf-with-other "├► ")
- '(gnus-sum-thread-tree-root "")
- '(gnus-sum-thread-tree-single-leaf "╰► ")
- '(gnus-sum-thread-tree-vertical "│")
- '(gnus-summary-line-format "%U%R%z %(%12&user-date; %*%-23,23f%) %B%s\12")
- '(gnus-summary-mode-line-format "Gnus: %u&summary;%g [%A] %Z")
- '(gnus-summary-thread-gathering-function 'gnus-gather-threads-by-references)
- '(gnus-suppress-duplicates t)
- '(gnus-thread-sort-functions
- '(gnus-thread-sort-by-number gnus-thread-sort-by-total-score))
- '(gnus-topic-display-empty-topics nil)
- '(gnus-update-message-archive-method t)
- '(gnus-user-date-format-alist
- '((32042 . "%2l:%M%#p") (118823 . "Yest %2l:%M%#p") (604800 . "%a %2l:%M%#p")
- (16102447 . "%d %B") (t . "%Y-%b-%d")))
- '(haskell-indentation-layout-offset 4)
- '(haskell-indentation-left-offset 4)
'(help-window-keep-selected t)
- '(holiday-bahai-holidays nil)
- '(holiday-hebrew-holidays nil)
- '(holiday-islamic-holidays nil)
- '(howm-directory "~/doc/howm/")
- '(howm-file-name-format "%Y/%Y-%m-%d-%H%M.org")
- '(howm-keyword-file "~/doc/howm/.howm-keys")
- '(howm-view-use-grep t)
- '(icomplete-hide-common-prefix nil)
- '(icomplete-in-buffer t)
- '(icomplete-mode t)
- '(icomplete-show-matches-on-no-input t)
- '(icomplete-tidy-shadowed-file-names t)
'(imenu-auto-rescan t)
+ '(inferior-lisp-program "sbcl")
'(initial-major-mode 'spw/scratch-lisp-interaction-mode)
'(kill-read-only-ok t)
- '(log-edit-hook
- '(log-edit-insert-message-template log-edit-insert-cvs-template
- log-edit-insert-changelog
- spw/log-edit-show-diff) nil nil "Drop log-edit-show-files to avoid its window becoming most recently used for C-x o.")
- '(mail-envelope-from 'header nil nil "Bypass MTA rewriting user@localhost.")
- '(mail-specify-envelope-from t nil nil "Bypass MTA rewriting user@localhost.")
+
+ ;; Bypass MTA rewriting user@localhost.
+ '(mail-envelope-from 'header)
+ '(mail-specify-envelope-from t)
+
'(mail-user-agent 'gnus-user-agent)
'(mailscripts-detach-head-from-existing-branch 'ask)
'(mailscripts-extract-patches-branch-prefix "mail/")
'(mailscripts-project-library 'project)
- '(major-mode-remap-alist '((perl-mode . cperl-mode)) nil nil "cperl-mode doesn't try to indent lines within a POD, and usefully font locks scalars that are members of hashes and arrays.")
- '(make-pointer-invisible t nil nil "Works only for self-insert chars and undone by changes in window manager focus, but less annoying than `mouse-avoidance-mode'.")
- '(message-auto-save-directory "~/tmp/" nil nil "So locmaint will catch them.")
- '(message-citation-line-format "On %a %d %b %Y at %I:%M%p %Z, %N wrote:\12")
- '(message-citation-line-function 'message-insert-formatted-citation-line)
- '(message-forward-as-mime nil nil nil "For compatibility.")
- '(message-forward-before-signature nil nil nil "For compatibility.")
- '(message-forward-included-headers
- '("^From:" "^Subject:" "^Date:" "^To:" "^Cc:" "^Message-ID:") nil nil "For compatibility.")
- '(message-ignored-resent-headers
- "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:\\|^\\(?:X-\\)?Content-Length:\\|^X-UIDL:\\|^X-TUID:\\|^\\(?:X-\\)?Status:\\|^Lines:")
- '(message-make-forward-subject-function '(message-forward-subject-fwd) nil nil "For compatibility.")
- '(message-sendmail-envelope-from 'header nil nil "Bypass MTA rewriting user@localhost.")
- '(message-wash-forwarded-subjects t)
+
+ ;; `cperl-mode' doesn't try to indent lines within a POD, and usefully font
+ ;; locks scalars that are members of hashes and arrays.
+ '(major-mode-remap-alist '((perl-mode . cperl-mode)))
+
+ ;; Works only for self-insert chars and undone by changes in window manager
+ ;; focus, but less annoying than `mouse-avoidance-mode'.
+ '(make-pointer-invisible t)
+
'(minibuffer-follows-selected-frame nil)
- '(mm-decrypt-option 'known)
- '(mm-default-directory "~/tmp/")
- '(mm-file-name-rewrite-functions
- '(mm-file-name-delete-control mm-file-name-delete-gotchas
- mm-file-name-trim-whitespace
- mm-file-name-collapse-whitespace
- mm-file-name-replace-whitespace))
- '(mml-secure-openpgp-encrypt-to-self t nil nil "So I can read copies in my sent mail directory.")
- '(mml-secure-openpgp-sign-with-sender t)
'(mode-line-compact 'long)
- '(mouse-drag-copy-region t nil nil "X primary selection-like behaviour within Emacs even when not available outside.")
- '(mouse-highlight 1 nil nil "See `make-pointer-invisible'.")
+
+ ;; X primary selection-like behaviour within Emacs even when not available
+ ;; outside.
+ '(mouse-drag-copy-region t)
+
+ ;; See `make-pointer-invisible'.
+ '(mouse-highlight 1)
+
'(mouse-yank-at-point t)
'(native-comp-async-jobs-number 1)
'(native-comp-async-report-warnings-errors 'silent)
- '(nnmail-extra-headers '(To Cc List-Id))
- '(notmuch-address-use-company nil)
- '(nov-text-width 78)
- '(org-adapt-indentation t nil nil "Sometimes set to nil in .dir-locals.el, e.g. in ~/doc/newpapers.")
- '(org-agenda-entry-text-maxlines 3)
- '(org-agenda-files "~/doc/emacs-org-agenda-files")
- '(org-agenda-persistent-filter t)
- '(org-agenda-remove-times-when-in-prefix 'beg)
- '(org-agenda-restore-windows-after-quit nil nil nil "Interacts badly with `tab-bar-history-mode'.")
- '(org-agenda-skip-deadline-if-done t)
- '(org-agenda-skip-deadline-prewarning-if-scheduled 3)
- '(org-agenda-skip-scheduled-if-deadline-is-shown 'not-today)
- '(org-agenda-skip-scheduled-if-done t)
- '(org-agenda-skip-timestamp-if-done t)
- '(org-agenda-start-on-weekday nil)
- '(org-agenda-sticky t)
- '(org-agenda-timegrid-use-ampm t)
- '(org-agenda-todo-ignore-scheduled 'future)
- '(org-agenda-window-setup 'current-window)
- '(org-archive-location "~/doc/archive/howm/archive.org::* From %s")
- '(org-archive-save-context-info '(time file olpath))
- '(org-archive-subtree-save-file-p t)
- '(org-blank-before-new-entry '((heading . t) (plain-list-item . auto)))
- '(org-bookmark-names-plist nil nil nil "Turn off to avoid git merge conflicts.")
- '(org-cycle-separator-lines 0)
- '(org-deadline-warning-days 60)
- '(org-default-notes-file "~/doc/howm/refile.org")
- '(org-directory "~/doc/howm/")
- '(org-enforce-todo-checkbox-dependencies t)
- '(org-enforce-todo-dependencies t)
- '(org-fold-catch-invisible-edits 'show)
- '(org-fold-show-context-detail
- '((agenda . local) (bookmark-jump . lineage) (isearch . lineage)
- (default . ancestors-full)))
- '(org-footnote-section "Notes")
- '(org-imenu-depth 4)
- '(org-list-allow-alphabetical nil nil nil "So I can start lines with \"P. 211 - \" to refer to p. 211 not start a list.")
- '(org-list-demote-modify-bullet
- '(("-" . "+") ("+" . "*") ("*" . "-") ("1." . "-") ("1)" . "-")))
- '(org-list-use-circular-motion t)
- '(org-log-done 'time)
- '(org-log-into-drawer t)
- '(org-log-repeat nil nil nil "Cluttering, and information probably in git.")
- '(org-log-states-order-reversed nil)
- '(org-outline-path-complete-in-steps nil nil nil "Desirable with `icomplete-mode'.")
- '(org-read-date-prefer-future 'time)
- '(org-refile-allow-creating-parent-nodes 'confirm)
- '(org-refile-targets '((org-agenda-files :maxlevel . 5) (nil :maxlevel . 5)))
- '(org-refile-use-outline-path 'file)
- '(org-special-ctrl-a/e t)
- '(org-special-ctrl-k t)
- '(org-startup-folded nil)
- '(org-startup-indented nil nil nil "Ensures buffer text doesn't go beyond 80 columns.")
- '(org-tags-match-list-sublevels 'indented)
- '(org-todo-keyword-faces
- '(("SOMEDAY" :foreground "#0000FF" :weight bold)
- ("NEXT" :foreground "#DD0000" :weight bold)))
- '(org-todo-keywords
- '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
- (sequence "WAITING(w@)" "SOMEDAY(s)" "|" "CANCELLED(c)")))
- '(org-treat-S-cursor-todo-selection-as-state-change nil)
- '(org-treat-insert-todo-heading-as-state-change t)
- '(org-use-fast-todo-selection 'expert)
- '(org-yank-folded-subtrees nil)
'(proced-enable-color-flag t)
'(proced-show-remote-processes t)
'(project-switch-commands 'project-prefix-or-any-command)
- '(rcirc-default-full-name "Sean Whitton [spwhitton@spwhitton.name]")
- '(rcirc-default-nick "spwhitton")
- '(rcirc-default-user-name "spwhitton")
- '(rcirc-display-server-buffer nil)
- '(rcirc-log-directory "~/local/irclogs")
- '(rcirc-log-filename-function 'spw/rcirc-generate-log-filename)
- '(rcirc-log-flag t)
- '(rcirc-time-format "%b/%d %H:%M ")
- '(rcirc-track-abbreviate-flag nil)
- '(rcirc-track-ignore-server-buffer-flag t)
- '(rcirc-track-minor-mode t)
'(read-buffer-completion-ignore-case t)
'(read-file-name-completion-ignore-case t)
'(read-mail-command 'gnus)
@@ -427,39 +261,55 @@ windows side-by-side in the frame."
'(remember-notes-buffer-name "*scratch*")
'(remote-file-name-inhibit-delete-by-moving-to-trash t)
'(require-final-newline t)
- '(save-interprogram-paste-before-kill nil nil nil "See <https://debbugs.gnu.org/53728>.")
- '(save-place-mode t nil nil "If quitting Emacs is slow, set `save-place-forget-unreadable-files' to nil.")
+
+ ;; See <https://debbugs.gnu.org/53728>.
+ '(save-interprogram-paste-before-kill nil)
+
+ ;; If quitting Emacs is slow set `save-place-forget-unreadable-files' to nil.
+ '(save-place-mode t)
+
'(savehist-additional-variables '(compile-history log-edit-comment-ring))
'(savehist-mode t)
'(select-active-regions 'only)
'(select-enable-primary t)
'(send-mail-function 'sendmail-send-it)
'(shell-command-prompt-show-cwd t)
- '(show-paren-when-point-in-periphery t nil nil "Useful for C-M-d.")
+
+ ;; Useful for C-M-d.
+ '(show-paren-when-point-in-periphery t)
+
'(shr-max-width 78)
'(slime-load-failed-fasl 'never)
'(tab-bar-history-mode t)
'(tab-bar-show 1)
'(text-mode-ispell-word-completion nil)
- '(tramp-auto-save-directory "~/.emacs.d/auto-saves/" nil nil "Put TRAMP auto-saves under local `user-emacs-directory'.")
- '(tramp-backup-directory-alist '(("." . "~/.emacs.d/backups/")) nil nil "Put TRAMP backups under remote ~/.emacs.d/.")
+
+ ;; Put TRAMP auto-saves under local `user-emacs-directory'.
+ '(tramp-auto-save-directory "~/.emacs.d/auto-saves/")
+ ;; Put TRAMP backups under remote ~/.emacs.d/.
+ '(tramp-backup-directory-alist '(("." . "~/.emacs.d/backups/")))
+
'(tramp-copy-size-limit nil)
'(tramp-default-method "rsync")
- '(tramp-use-connection-share nil nil nil "Rely on my ~/.ssh/config.")
- '(tramp-verbose 1 nil nil "Manual says this should improve performance.")
+
+ ;; Rely on my ~/.ssh/config.
+ '(tramp-use-connection-share nil)
+
+ ;; Manual says this should improve performance.
+ '(tramp-verbose 1)
+
'(transient-cycles-buffer-siblings-mode t)
'(transient-cycles-tab-bar-mode t)
- '(transient-cycles-window-buffers-cycle-backwards-key [134217777] nil nil "M-1.")
- '(transient-cycles-window-buffers-cycle-forwards-key [134217780] nil nil "M-4.")
+ '(transient-cycles-window-buffers-cycle-backwards-key [134217777]) ; M-1
+ '(transient-cycles-window-buffers-cycle-forwards-key [134217780]) ; M-4
'(transient-cycles-window-buffers-mode t)
'(uniquify-buffer-name-style 'forward nil (uniquify))
'(use-short-answers t)
- '(vc-deduce-backend-nonvc-modes t)
- '(vc-find-revision-no-save t)
- '(vc-follow-symlinks t)
- '(vc-git-diff-switches '("--patch-with-stat" "-M" "-C") nil nil "We might also consider -B.")
- '(vc-git-print-log-follow t)
- '(view-read-only t nil nil "Rebind otherwise useless self-insert keys, and means existing C-x C-r, C-x 4 r etc. usable for getting into mode.")
+
+ ;; Rebind otherwise useless self-insert keys, and means existing C-x C-r,
+ ;; C-x 4 r etc. usable for getting into the mode.
+ '(view-read-only t)
+
'(warning-suppress-types '((comp)))
'(window-combination-resize t)
'(x-stretch-cursor t))
@@ -523,6 +373,11 @@ available are present in the `load-path'."
for form = `(add-hook ',hook #',function)
if name collect `(with-eval-after-load ',name ,form) else collect form)))
+(defmacro spw/feature-add-to-list (list-var feature &rest elements)
+ (declare (indent 2))
+ `(with-eval-after-load ',feature
+ ,@(cl-loop for el in elements collect `(add-to-list ',list-var ,el))))
+
(cl-defmacro spw/define-skeleton
(command (mode &key abbrev key (file `',mode)
(map (intern (concat (symbol-name mode) "-map")))
@@ -1188,6 +1043,14 @@ To be used only when it seems to be necessary."
;;; Icomplete
+(custom-theme-set-variables
+ 'user
+ '(icomplete-hide-common-prefix nil)
+ '(icomplete-in-buffer t)
+ '(icomplete-mode t)
+ '(icomplete-show-matches-on-no-input t)
+ '(icomplete-tidy-shadowed-file-names t))
+
;; Possibly we could call `minibuffer-complete-word' if we know we're
;; completing the name of a Lisp symbol.
(spw/reclaim-keys-from minibuffer minibuffer-local-completion-map " " "?")
@@ -1642,6 +1505,21 @@ the non-side windows deleted by `delete-other-windows' will also reappear."
;;;; The Emacs shell
+(custom-theme-set-variables
+ 'user
+ ;; This makes Eshell completions a bit more like bash's.
+ '(eshell-cmpl-cycle-completions nil)
+
+ '(eshell-cmpl-ignore-case t)
+ '(eshell-hist-ignoredups 'erase)
+ '(eshell-history-append t)
+ '(eshell-history-size 5000)
+ '(eshell-save-history-on-exit nil))
+(spw/feature-add-to-list eshell-modules-list esh-module
+ 'eshell-elecslash 'eshell-tramp 'eshell-xtra)
+(spw/feature-add-to-list eshell-visual-commands em-term
+ "locmaint" "gen-DSA" "gen-ELA")
+
(with-eval-after-load 'esh-cmd
(add-hook 'eshell-pre-command-hook
(lambda ()
@@ -1684,11 +1562,6 @@ the non-side windows deleted by `delete-other-windows' will also reappear."
(with-eval-after-load 'esh-mode
(define-key eshell-mode-map "\C-zp" #'spw/eshell-cd-project-root))
-;; Work around Emacs bug #54977.
-(with-eval-after-load 'esh-module
- (mapc (apply-partially #'add-to-list 'eshell-modules-list)
- '(eshell-elecslash eshell-tramp eshell-xtra)))
-
(spw/define-skeleton spw/eshell-libexec
(eshell-mode :abbrev "le" :file "esh-mode")
"" "" "~/" '(eshell-electric-forward-slash) "src/dotfiles/scripts/")
@@ -2797,6 +2670,7 @@ Called by '~/src/dotfiles/bin/emacsclient --spw/update-environment'."
;; `compile' or `project-compile' is called, and one Emacs frame/tab for GUD.
(defun spw/run-or-restore-gud (arg)
(interactive "P")
+ (require 'gdb-mi)
(if (or arg (not (and (bound-and-true-p gud-comint-buffer)
(get-buffer-process gud-comint-buffer))))
;; Start a new debugging session even if one already exists.
@@ -2876,6 +2750,43 @@ Called by '~/src/dotfiles/bin/emacsclient --spw/update-environment'."
;;;; Composing mail
+(custom-theme-set-variables
+ 'user
+ ;; So locmaint will catch them.
+ '(message-auto-save-directory "~/tmp/")
+
+ '(message-citation-line-format "On %a %d %b %Y at %I:%M%p %Z, %N wrote:\12")
+ '(message-citation-line-function 'message-insert-formatted-citation-line)
+
+ ;; For compatibility.
+ '(message-forward-as-mime nil)
+ '(message-forward-before-signature nil)
+ '(message-forward-included-headers
+ '("^From:" "^Subject:" "^Date:" "^To:" "^Cc:" "^Message-ID:"))
+ '(message-make-forward-subject-function '(message-forward-subject-fwd))
+
+ '(message-ignored-resent-headers
+ "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:\\|^\\(?:X-\\)?Content-Length:\\|^X-UIDL:\\|^X-TUID:\\|^\\(?:X-\\)?Status:\\|^Lines:")
+
+ ;; Bypass MTA rewriting user@localhost.
+ '(message-sendmail-envelope-from 'header)
+
+ '(message-wash-forwarded-subjects t)
+ '(mm-decrypt-option 'known)
+ '(mm-default-directory "~/tmp/")
+ '(mm-file-name-rewrite-functions
+ '(mm-file-name-delete-control mm-file-name-delete-gotchas
+ mm-file-name-trim-whitespace
+ mm-file-name-collapse-whitespace
+ mm-file-name-replace-whitespace))
+
+ ;; So I can read copies in my sent mail directory.
+ '(mml-secure-openpgp-encrypt-to-self t)
+
+ '(mml-secure-openpgp-sign-with-sender t)
+ '(nnmail-extra-headers '(To Cc List-Id))
+ '(notmuch-address-use-company nil))
+
(defvar spw/debian-bts-pseudoheader-regexp
;; "^\\([A-Za-z][a-z]+: [^ ]+\\|[cC]ontrol: .+\\)$"
"^[A-Za-z][a-z]+: [^ ]+"
@@ -3076,6 +2987,16 @@ mutt's review view, after exiting EDITOR."
;;;; Dired
+(custom-theme-set-variables
+ 'user
+ '(dired-clean-up-buffers-too nil)
+ '(dired-dwim-target t)
+ '(dired-free-space 'separate)
+ '(dired-isearch-filenames t)
+ '(dired-listing-switches "--group-directories-first -alh")
+ '(dired-omit-files "\\`[.]?#\\|\\`[.][.]?\\'\\|\\`\\.git\\'")
+ '(dired-recursive-copies 'always))
+
;; this is the way you're meant to request dired-aux, not just dired-x,
;; according to (info "(dired-x) Installation")
(with-eval-after-load 'dired (require 'dired-x))
@@ -3185,6 +3106,59 @@ mutt's review view, after exiting EDITOR."
;;;; Gnus
+(custom-theme-set-variables
+ 'user
+ '(gnus-article-skip-boring t)
+ '(gnus-auto-center-summary nil)
+ '(gnus-auto-select-next 'slightly-quietly)
+ '(gnus-buttonized-mime-types
+ '("text/x-\\(?:diff\\|patch\\)" "multipart/\\(?:alternative\\|signed\\)"))
+ '(gnus-directory "~/local/News/")
+ '(gnus-extra-headers '(To Cc List-Id))
+ '(gnus-gcc-mark-as-read t)
+ '(gnus-global-score-files '("~/doc/News/"))
+ '(gnus-interactive-exit 'quiet)
+ '(gnus-kill-files-directory "~/src/athpriv/News/")
+
+ ;; Would prefer nil but t seems advisable for notmuch groups.
+ '(gnus-kill-summary-on-exit t)
+
+ '(gnus-large-ephemeral-newsgroup 8000)
+ '(gnus-large-newsgroup 8000)
+ '(gnus-mark-article-hook '(spw/gnus-mark-article-hook))
+ '(gnus-message-archive-group "sent")
+ '(gnus-message-archive-method '(nnmaildir "fmail" (directory "~/.fmail/")))
+ '(gnus-permanently-visible-groups "^nnmaildir\\+fmail:\\(?:notes\\|sent\\)$")
+ '(gnus-read-newsrc-file nil)
+ '(gnus-refer-thread-use-search '(("nnmaildir:fmail")))
+ '(gnus-save-killed-list
+ "^\\(?:[^n]\\|n[^n]\\|nn[^s]\\|nns[^e]\\|nnse[^l]\\|nnsel[^e]\\|nnsele[^c]\\|nnselec[^t]\\|nnselect[^:]\\)")
+ '(gnus-save-newsrc-file nil)
+ '(gnus-search-default-engines '((nnmaildir . notmuch)))
+ '(gnus-search-notmuch-remove-prefix "~/.fmail/")
+ '(gnus-secondary-select-methods
+ '((nnmaildir "fmail" (directory "~/.fmail/"))))
+ '(gnus-sum-thread-tree-false-root "")
+ '(gnus-sum-thread-tree-indent " ")
+ '(gnus-sum-thread-tree-leaf-with-other "├► ")
+ '(gnus-sum-thread-tree-root "")
+ '(gnus-sum-thread-tree-single-leaf "╰► ")
+ '(gnus-sum-thread-tree-vertical "│")
+ '(gnus-summary-line-format "%U%R%z %(%12&user-date; %*%-23,23f%) %B%s\12")
+ '(gnus-summary-mode-line-format "Gnus: %u&summary;%g [%A] %Z")
+ '(gnus-summary-thread-gathering-function 'gnus-gather-threads-by-references)
+ '(gnus-suppress-duplicates t)
+ '(gnus-thread-sort-functions
+ '(gnus-thread-sort-by-number gnus-thread-sort-by-total-score))
+ '(gnus-topic-display-empty-topics nil)
+ '(gnus-update-message-archive-method t)
+ '(gnus-user-date-format-alist
+ '((32042 . "%2l:%M%#p")
+ (118823 . "Yest %2l:%M%#p")
+ (604800 . "%a %2l:%M%#p")
+ (16102447 . "%d %B")
+ (t . "%Y-%b-%d"))))
+
(with-eval-after-load 'gnus
(cond ((spw/on-host-p "chiark.greenend.org.uk")
(setq gnus-select-method
@@ -3906,25 +3880,39 @@ unread."
(gnus-summary-goto-article article)))
(advice-add 'org-gnus-follow-link :around #'spw/org-gnus-follow-link)
-(defun spw/gnus-fastmail-trash (n)
+(defun spw/gnus-purelymail-trash (n)
(interactive "p")
(gnus-summary-move-article n "nnmaildir+fmail:trash"))
(with-eval-after-load 'gnus-sum
(define-key gnus-summary-mode-map
- [remap gnus-summary-delete-article] #'spw/gnus-fastmail-trash))
+ [remap gnus-summary-delete-article] #'spw/gnus-purelymail-trash))
-(defun spw/gnus-fastmail-learn-spam (n)
+(defun spw/gnus-purelymail-learn-spam (n)
(interactive "p")
(save-excursion (gnus-summary-mark-forward n))
- (gnus-summary-move-article n "nnmaildir+fmail:spam")
+ (gnus-summary-move-article n "nnmaildir+fmail:junk")
(gnus-summary-next-unread-article))
(with-eval-after-load 'gnus-sum
- (define-key gnus-summary-mode-map [f5] #'spw/gnus-fastmail-learn-spam)
- (define-key gnus-summary-mode-map "\C-z\C-s" #'spw/gnus-fastmail-learn-spam))
+ (define-key gnus-summary-mode-map [f5] #'spw/gnus-purelymail-learn-spam)
+ (define-key gnus-summary-mode-map "\C-z\C-s" #'spw/gnus-purelymail-learn-spam))
;;;; rcirc
+(custom-theme-set-variables
+ 'user
+ '(rcirc-default-full-name "Sean Whitton [spwhitton@spwhitton.name]")
+ '(rcirc-default-nick "spwhitton")
+ '(rcirc-default-user-name "spwhitton")
+ '(rcirc-display-server-buffer nil)
+ '(rcirc-log-directory "~/local/irclogs")
+ '(rcirc-log-filename-function 'spw/rcirc-generate-log-filename)
+ '(rcirc-log-flag t)
+ '(rcirc-time-format "%b/%d %H:%M ")
+ '(rcirc-track-abbreviate-flag nil)
+ '(rcirc-track-ignore-server-buffer-flag t)
+ '(rcirc-track-minor-mode t))
+
(defun spw/rcirc-generate-log-filename (process target)
(concat (file-name-concat (format-time-string "%Y/%m")
(process-name process) (or target "server"))
@@ -4004,6 +3992,24 @@ unread."
;;;; VC
+(custom-theme-set-variables
+ 'user
+ '(git-rebase-confirm-cancel nil)
+ '(vc-deduce-backend-nonvc-modes t)
+ '(vc-find-revision-no-save t)
+ '(vc-follow-symlinks t)
+
+ ;; We might also consider -B.
+ '(vc-git-diff-switches '("--patch-with-stat" "-M" "-C"))
+
+ '(vc-git-print-log-follow t))
+
+;; Avoid `log-edit-show-files' window becoming most recently used for C-x o.
+(with-eval-after-load 'log-edit
+ (customize-set-variable 'log-edit-hook
+ (delete 'log-edit-show-files log-edit-hook)))
+(spw/feature-add-to-list log-edit-hook log-edit 'spw/log-edit-show-diff)
+
(require 'git-commit nil t)
(spw/when-library-available mailscripts
@@ -4016,7 +4022,7 @@ unread."
"vt" notmuch-extract-thread-patches-to-project
"vw" mailscripts-extract-message-patches-to-project))
-;; Emacs 30: move into `custom-set-variables'.
+;; Emacs 30: move into `custom-theme-set-variables' call.
(when (>= emacs-major-version 30)
(setopt vc-git-log-switches '("--format=fuller" "--stat")))
@@ -4321,6 +4327,7 @@ unread."
#'org-d20-d%
#'org-d20-d20)))))
+(customize-set-variable 'nov-text-width 78)
(spw/when-library-available nov
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode)))
@@ -4334,6 +4341,11 @@ unread."
(dolist (hook '(html-mode-hook css-mode-hook))
(add-hook hook 'rainbow-mode)))
+(custom-theme-set-variables
+ 'user
+ '(haskell-indentation-layout-offset 4)
+ '(haskell-indentation-left-offset 4))
+
(spw/feature-add-hook subword-mode haskell-mode)
;; Use a local hook to turn on an appropriate indentation mode. Use
@@ -4354,6 +4366,14 @@ unread."
(spw/feature-add-hook orgtbl-mode message)
+(custom-theme-set-variables
+ 'user
+ '(bongo-default-directory "~/annex/music/")
+ '(bongo-insert-album-covers t)
+ '(bongo-insert-whole-directory-trees t)
+ '(bongo-mode-line-indicator-mode nil)
+ '(bongo-prefer-library-buffers nil))
+
(spw/feature-add-hook (lambda ()
(dired-hide-details-mode
(if bongo-dired-library-mode 1 -1)))
@@ -4465,15 +4485,6 @@ unread."
(with-temp-buffer (call-interactively #'hyperspec-lookup)))
(global-set-key "\C-cgh" #'spw/hyperspec-lookup)
-;; `inf-lisp' says this is a defcustom and `slime' says it is a defvar, so
-;; `custom-save-variables' will print the NOW field in the corresponding
-;; argument to `custom-set-variables' as t or nil depending on whether or not
-;; `inf-lisp' and/or `slime' happen to be loaded, and possibly even depending
-;; on the order in which they were loaded. To prevent spurious changes to the
-;; NOW field randomly showing up in git diffs of init.el, set the variable
-;; without using the customisation interface.
-(setq inferior-lisp-program "sbcl")
-
(defvar spw/last-command-was-slime-async-eval nil)
(defvar spw/last-slime-async-eval-command-frame nil)
@@ -4787,6 +4798,97 @@ before uploading to NEW again." \n \n
;;;; Org-mode
+(custom-theme-set-faces
+ 'user
+ '(org-code ((t (:inherit (shadow fixed-pitch)))))
+ '(org-date ((t (:inherit fixed-pitch :foreground "Purple" :underline t))))
+ '(org-verbatim ((t (:inherit (shadow fixed-pitch))))))
+
+(custom-theme-set-variables
+ 'user
+ ;; Sometimes set to nil in .dir-locals.el, e.g. in ~/doc/newpapers.
+ '(org-adapt-indentation t nil)
+
+ '(org-agenda-entry-text-maxlines 3)
+ '(org-agenda-files "~/doc/emacs-org-agenda-files")
+ '(org-agenda-persistent-filter t)
+ '(org-agenda-remove-times-when-in-prefix 'beg)
+
+ ;; Interacts badly with `tab-bar-history-mode'.
+ '(org-agenda-restore-windows-after-quit nil)
+
+ '(org-agenda-skip-deadline-if-done t)
+ '(org-agenda-skip-deadline-prewarning-if-scheduled 3)
+ '(org-agenda-skip-scheduled-if-deadline-is-shown 'not-today)
+ '(org-agenda-skip-scheduled-if-done t)
+ '(org-agenda-skip-timestamp-if-done t)
+ '(org-agenda-start-on-weekday nil)
+ '(org-agenda-sticky t)
+ '(org-agenda-timegrid-use-ampm t)
+ '(org-agenda-todo-ignore-scheduled 'future)
+ '(org-agenda-window-setup 'current-window)
+ '(org-archive-location "~/doc/archive/howm/archive.org::* From %s")
+ '(org-archive-save-context-info '(time file olpath))
+ '(org-archive-subtree-save-file-p t)
+ '(org-blank-before-new-entry '((heading . t) (plain-list-item . auto)))
+
+ ;; Turn off to avoid git merge conflicts.
+ '(org-bookmark-names-plist nil)
+
+ '(org-cycle-separator-lines 0)
+ '(org-deadline-warning-days 60)
+ '(org-default-notes-file "~/doc/howm/refile.org")
+ '(org-directory "~/doc/howm/")
+ '(org-enforce-todo-checkbox-dependencies t)
+ '(org-enforce-todo-dependencies t)
+ '(org-fold-catch-invisible-edits 'show)
+ '(org-fold-show-context-detail
+ '((agenda . local) (bookmark-jump . lineage) (isearch . lineage)
+ (default . ancestors-full)))
+ '(org-footnote-section "Notes")
+ '(org-imenu-depth 4)
+
+ ;; So I can start lines with \"P. 211 - \" to refer to p. 211, rather than
+ ;; starting a list.
+ '(org-list-allow-alphabetical nil)
+
+ '(org-list-demote-modify-bullet
+ '(("-" . "+") ("+" . "*") ("*" . "-") ("1." . "-") ("1)" . "-")))
+ '(org-list-use-circular-motion t)
+ '(org-log-done 'time)
+ '(org-log-into-drawer t)
+
+ ;; Cluttering, and information probably in git.
+ '(org-log-repeat nil)
+
+ '(org-log-states-order-reversed nil)
+
+ ;; Desirable with `icomplete-mode'.
+ '(org-outline-path-complete-in-steps nil)
+
+ '(org-read-date-prefer-future 'time)
+ '(org-refile-allow-creating-parent-nodes 'confirm)
+ '(org-refile-targets '((org-agenda-files :maxlevel . 5) (nil :maxlevel . 5)))
+ '(org-refile-use-outline-path 'file)
+ '(org-special-ctrl-a/e t)
+ '(org-special-ctrl-k t)
+ '(org-startup-folded nil)
+
+ ;; Ensures buffer text doesn't go beyond 80 columns.
+ '(org-startup-indented nil)
+
+ '(org-tags-match-list-sublevels 'indented)
+ '(org-todo-keyword-faces
+ '(("SOMEDAY" :foreground "#0000FF" :weight bold)
+ ("NEXT" :foreground "#DD0000" :weight bold)))
+ '(org-todo-keywords
+ '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
+ (sequence "WAITING(w@)" "SOMEDAY(s)" "|" "CANCELLED(c)")))
+ '(org-treat-S-cursor-todo-selection-as-state-change nil)
+ '(org-treat-insert-todo-heading-as-state-change t)
+ '(org-use-fast-todo-selection 'expert)
+ '(org-yank-folded-subtrees nil))
+
(global-set-key "\C-coc" #'org-capture)
(global-set-key "\C-col" #'org-store-link)
(global-set-key "\C-coa" #'org-agenda)
@@ -4988,8 +5090,7 @@ Called by doccheckin script."
;; setting this means if we type C-c C-e o O then the PDF opens for inspection
(setq org-odt-preferred-output-format "pdf")
-(with-eval-after-load 'org
- (add-to-list 'org-file-apps '(system . "xdg-open %s")))
+(spw/feature-add-to-list org-file-apps org '(system . "xdg-open %s"))
;; ... but also ensure we get a .docx (would be better to make
;; `org-odt-preferred-output-format' accept a list)
@@ -5329,6 +5430,23 @@ different occasions."
;;;; Diary
+(custom-theme-set-variables
+ 'user
+ '(appt-display-diary nil)
+ '(appt-display-interval 6)
+ '(calendar-date-display-form
+ '((format "%s-%.2d-%.2d %.3s" year (string-to-number month)
+ (string-to-number day) dayname)))
+ '(calendar-date-style 'iso)
+ '(calendar-week-start-day 1)
+ '(diary-file "~/doc/emacs-diary")
+ '(diary-list-entries-hook
+ '(diary-include-other-diary-files diary-sort-entries))
+ '(diary-mark-entries-hook '(diary-mark-included-diary-files))
+ '(holiday-bahai-holidays nil)
+ '(holiday-hebrew-holidays nil)
+ '(holiday-islamic-holidays nil))
+
;; Don't bind `diary' globally as for viewing purposes we use Org agenda
;; bindings, and for editing purposes just C-x b suffices.
(global-set-key "\C-cC" #'calendar)
@@ -5423,6 +5541,13 @@ We don't use the FILES parameter in the entry for \"d\" in
;;;; Howm
+(custom-theme-set-variables
+ 'user
+ '(howm-directory "~/doc/howm/")
+ '(howm-file-name-format "%Y/%Y-%m-%d-%H%M.org")
+ '(howm-keyword-file "~/doc/howm/.howm-keys")
+ '(howm-view-use-grep t))
+
(setq howm-prefix "\C-cc"
;; Use Org-mode style because our notes are in `org-mode'.
@@ -5520,6 +5645,18 @@ We don't use the FILES parameter in the entry for \"d\" in
;;;; Perl
+(custom-theme-set-variables
+ 'user
+ ;; See `cperl-indent-parens-as-block'.
+ '(cperl-close-paren-offset -4)
+
+ '(cperl-indent-level 4)
+
+ ;; Makes it easier to use longer names for subroutines.
+ '(cperl-indent-parens-as-block t)
+
+ '(cperl-lineup-step 1))
+
(defun spw/perl-add-use (module)
(interactive "suse ")
(let ((line (concat "use " module
diff --git a/.mbsyncrc b/.mbsyncrc
index 995f5df0..3eb4264e 100644
--- a/.mbsyncrc
+++ b/.mbsyncrc
@@ -1,62 +1,51 @@
-# -*- mode: conf-space; -*-
-
-# ---- defaults
-
Create Near
-# FastMail always expunges server-side. mbsync author says this is a
-# really bad idea. Let's just have mbsync expunge client-side.
-Expunge Near
+Expunge Both
SyncState *
-# ---- stores
-
-MaildirStore fmmaildir
+MaildirStore pmmaildir
Path ~/.fmail/
Inbox ~/.fmail/inbox
-# Flatten .
-
-# Trash option doesn't seem to work. Setting Trash to trash and
-# Expunge to Near makes deleted mail get moved into the trash folder,
-# but it is left marked as deleted so it the FastMail IMAP server
-# won't add it to the folder, however many times mbsync tries to put
-# it there. So just unbind deletion in mutt for now.
-# Trash trash
-
-IMAPAccount fastmail
-Host imap.fastmail.com
-User spwhitton@fastmail.com
-AuthMechs LOGIN
-PassCmd "cat ~/local/auth/fmailsyncpass"
-SSLType IMAPS
-SSLVersions TLSv1.2
-CertificateFile ~/src/dotfiles/lib-src/certs/fastmail.crt
+IMAPAccount purelymail
+Host imap.purelymail.com
+User spwhitton@spwhitton.name
+AuthMechs LOGIN
+PassCmd "cat ~/local/auth/fmailsyncpass"
+SSLType IMAPS
+SSLVersions TLSv1.3
SystemCertificates no
+CertificateFile /etc/ssl/certs/ISRG_Root_X1.pem
+
+IMAPStore pmimap
+Account purelymail
-IMAPStore fmimap
-Account fastmail
-# UseNamespace no
-# PathDelimiter .
+Channel pmaili
+Far :pmimap:INBOX
+Near :pmmaildir:
-# ---- mailboxes
+Channel pmails
+Far :pmimap:Sent
+Near :pmmaildir:sent
-Channel fmaili
-Far :fmimap:INBOX
-Near :fmmaildir:
+Channel pmailj
+Far :pmimap:Junk
+Near :pmmaildir:junk
-Channel fmails
-Far :fmimap:"Sent Items"
-Near :fmmaildir:sent
+Channel pmailt
+Far :pmimap:Trash
+Near :pmmaildir:trash
-# if I find myself wanting to separate listservs into different
-# folders within Lists/ on the server side (unlikely because I am
-# using notmuch), something like this should allow downloading all of
-# them without the INBOX.Lists prefix:
+# notes written on smartphone
+Channel pmailn
+Far :pmimap:Notes
+Near :pmmaildir:notes
-# Channel fmaill
-# Far :fmimap:Lists/
-# Near :fmmaildir:
-# Patterns * !INBOX
+Group purelymail
+Channel pmaili
+Channel pmails
+Channel pmailj
+Channel pmailt
+Channel pmailn
# So long as I'm using a mail provider that supports Sieve, can install this
# to deliver all mail which has a List-Id into a separate Lists folder. The
@@ -83,38 +72,3 @@ Near :fmmaildir:sent
# {
# keep;
# }
-
-# Channel lists
-# Far :fmimap:Lists
-# Near :fmmaildir:lists
-
-Channel fmailt
-Far :fmimap:Trash
-Near :fmmaildir:trash
-
-Channel fmailj
-Far :fmimap:"Junk Mail"
-Near :fmmaildir:junk
-
-Channel spamtraining
-Far :fmimap:Training/Spam
-Near :fmmaildir:spam
-
-Channel hamtraining
-Far :fmimap:Training/Ham
-Near :fmmaildir:ham
-
-# notes from tablet computer / smartphone
-Channel notes
-Far :fmimap:Notes
-Near :fmmaildir:notes
-
-Group fastmail
-Channel fmaili
-Channel fmails
-Channel fmailt
-# Channel lists
-Channel notes
-Channel fmailj
-Channel spamtraining
-Channel hamtraining
diff --git a/.notmuch-config b/.notmuch-config
index 6f72698d..c562b507 100644
--- a/.notmuch-config
+++ b/.notmuch-config
@@ -3,8 +3,8 @@
# For more information about notmuch, see https://notmuchmail.org
[database]
-mail_root=/home/spwhitton/.fmail
-path=/home/spwhitton/.local/share/notmuch/default
+mail_root=/home/swhitton/.fmail
+path=/home/swhitton/.local/share/notmuch/default
# User configuration
#
diff --git a/.pbuilderrc b/.pbuilderrc
index 8ce2d576..b3c73eb0 100644
--- a/.pbuilderrc
+++ b/.pbuilderrc
@@ -4,7 +4,7 @@
DISTRIBUTION="${DIST:-unstable}"
ARCHITECTURE="${ARCH:-$(dpkg --print-architecture)}"
-HOME="${HOME:-/home/spwhitton}"
+HOME="${HOME:-/home/swhitton}"
HOOKDIR="$HOME/local/pbuilder/hooks"
BUILDPLACE="$HOME/local/pbuilder/build"
CCACHEDIR="/var/cache/ccache-sbuild"
diff --git a/.shinit b/.shinit
index 342a2e01..2ee29f95 100644
--- a/.shinit
+++ b/.shinit
@@ -10,6 +10,9 @@ ls --version 2>/dev/null | grep -q "GNU coreutils" \
grep --version 2>/dev/null | grep -q "GNU grep" \
&& alias grep="grep --color=auto"
+alias doas="doas "
+alias sudo="sudo "
+
alias e="$EDITOR"
alias d="emacsclient -te '(dired \".\")'"
alias ta="tmux new-session -A -s default -c ~"
@@ -28,6 +31,7 @@ alias arsync="rsync -aSHAXc --partial --numeric-ids --info=progress2"
alias axrsync="rsync -aSHAXxc --partial --numeric-ids --info=progress2"
# To have a terminal emulator exit upon remote tmux detach, like my C-i s.
alias sshta="exec ssh-and-tmux"
+alias pdd="dd bs=4M status=progress conv=fdatasync"
upenv () {
# don't want to do this outside of tmux as then tmux show-environment will
diff --git a/.ssh/config b/.ssh/config
index d1a97eb7..f03ee978 100644
--- a/.ssh/config
+++ b/.ssh/config
@@ -64,9 +64,13 @@ Host chiark
User spwhitton
HostName login.chiark.greenend.org.uk
+Host deb.freexian.com
+User extended-lts
+
####################################################################
Host *
+User spwhitton
ControlMaster auto
ControlPath /tmp/ssh-%u-%r@%h:%p
ControlPersist 4h
diff --git a/bin/movemymail b/bin/movemymail
index fbe76178..06671043 100755
--- a/bin/movemymail
+++ b/bin/movemymail
@@ -45,11 +45,11 @@ if (hostfqdn eq "athena.silentflame.com") {
system "imap-dl", "$ENV{HOME}/.config/mailscripts/imap-dl.gmail";
}
-eval { system "mbsync", "fastmail" };
+eval { system "mbsync", "purelymail" };
if (my $exception = $@) {
local $ENV{XDG_RUNTIME_DIR} = "/run/user/$<";
system "notify-send", "--urgency=critical", "--icon=dialog-warning",
- "'mbsync fastmail' exited nonzero";
+ "'mbsync purelymail' exited nonzero";
die $exception;
}
diff --git a/lib-src/certs/fastmail.crt b/lib-src/certs/fastmail.crt
deleted file mode 100644
index ce40ed30..00000000
--- a/lib-src/certs/fastmail.crt
+++ /dev/null
@@ -1,41 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIHQDCCBiigAwIBAgIQDIVbcGvDCrksnNDtiwrz5zANBgkqhkiG9w0BAQsFADBZ
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTMwMQYDVQQDEypE
-aWdpQ2VydCBHbG9iYWwgRzIgVExTIFJTQSBTSEEyNTYgMjAyMCBDQTEwHhcNMjMx
-MDA0MDAwMDAwWhcNMjQxMTAxMjM1OTU5WjBoMQswCQYDVQQGEwJBVTERMA8GA1UE
-CBMIVmljdG9yaWExEjAQBgNVBAcTCU1lbGJvdXJuZTEZMBcGA1UEChMQRmFzdE1h
-aWwgUHR5IEx0ZDEXMBUGA1UEAwwOKi5mYXN0bWFpbC5jb20wggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQDIK7bTmFkD3zDvFKpT6h2CRrTgKa+cnZ7zToRQ
-VdREXU+wDaqccWbihBR0sGhYeoUfqkjQfrFMyqK/FrGEB/ZWyxAx6q5HFnBQTuQV
-q2Cdf08lo+eLdGIOl+ojV2OVIA+C88z/Pfvj8Peqo13b/LpKoWDxsMEeR1CfW3yX
-oEVi/avIc2U0yoZ6YfqGQ9U/QX2gQMD1GqA1BIiCfxUr7bZxtAyL19y+Z87EtL9d
-GGTBV+Gjh/DyATMmy1kwLcoZXT3Gnieq2ensqROUxpQ2Y0U7iww55kU86Clx9KnR
-KqsWJGwbLtpQ+NFFbyDC/5tTTR6iNbetOGcPA6xpnsbFgI4TAgMBAAGjggPzMIID
-7zAfBgNVHSMEGDAWgBR0hYDAZsffN97PvSk3qgMdvu3NFzAdBgNVHQ4EFgQUA9QH
-pLBlScA8j+iaCIfKtcdi5/owgYEGA1UdEQR6MHiCDiouZmFzdG1haWwuY29tggxm
-YXN0bWFpbC5jb22CFSouY2FsZGF2LmZhc3RtYWlsLmNvbYIWKi5jYXJkZGF2LmZh
-c3RtYWlsLmNvbYITY2FsZGF2LmZhc3RtYWlsLmNvbYIUY2FyZGRhdi5mYXN0bWFp
-bC5jb20wPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDov
-L3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU
-BggrBgEFBQcDAQYIKwYBBQUHAwIwgZ8GA1UdHwSBlzCBlDBIoEagRIZCaHR0cDov
-L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsRzJUTFNSU0FTSEEyNTYy
-MDIwQ0ExLTEuY3JsMEigRqBEhkJodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGln
-aUNlcnRHbG9iYWxHMlRMU1JTQVNIQTI1NjIwMjBDQTEtMS5jcmwwgYcGCCsGAQUF
-BwEBBHsweTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFEG
-CCsGAQUFBzAChkVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRH
-bG9iYWxHMlRMU1JTQVNIQTI1NjIwMjBDQTEtMS5jcnQwDAYDVR0TAQH/BAIwADCC
-AX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHYA7s3QZNXbGs7FXLedtM0TojKHRny8
-7N7DUUhZRnEftZsAAAGK+6wcvgAABAMARzBFAiA1ar7gEFUKD92a7bFkHwfpr7+p
-cMteU3TFN/cAI5gQjQIhANlbUK6ZblyoqFpkwCKNh2K58PykaD0bhnVbAZm0GNTp
-AHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGK+6wcugAABAMA
-RjBEAiAeKRWzn6XRdBByYajuV0IXKIXgbBnDd2ENiQ6kG1IwjgIgOz5x3UUwkSDP
-UZtmUJQtxhJ/i3ILE0F7IxQO6b+ENx0AdwDatr9rP7W2Ip+bwrtca+hwkXFsu1GE
-hTS9pD0wSNf7qwAAAYr7rBymAAAEAwBIMEYCIQCwbOuNCRajD/F6G3282N7bUUZL
-S4xKCxuZ13jubGtnOQIhAMMAO2kzNNtvSo7ST2dxiQ9BUR1ynMSfujEwRCgcWpia
-MA0GCSqGSIb3DQEBCwUAA4IBAQAait3EVZ7lQG8hkwLWJ8Jb0o1k+A51l0os8f/n
-l3e5c3OlQztLhsjTwrJjuWVBPPH2ckyAqlu/nb1ZAoaK9r/6AhYVVMSkgE+VKzQH
-n0H7FECB7agejypxXSxu9oqD/3bg+m7spM+vfBuOu9nAmJY7b+CGrbCrgiYomG8n
-ELgz8t4U2oVhpHX1B6vO3e/wUjFjH9otSRz3hFr6D6YyV4nLyNofSQs9K8Mcbf/w
-/KgvcnN2csFHkRmYBMb96Jtdj58nydsu/Cwyhru39SN1gkXpWL8L6p28TOqZlssb
-kV289dZ2GuIsRAoaTWE5qtlMVmr/KknKqgaO/o+rLlagFiWh
------END CERTIFICATE-----