diff options
-rw-r--r-- | .config/common-lisp/source-registry.conf.d/50-my-lisp.conf | 2 | ||||
-rw-r--r-- | .config/git/config | 2 | ||||
-rw-r--r-- | .config/mailscripts/notmuch-import-patch | 2 | ||||
-rw-r--r-- | .config/mailscripts/notmuch-slurp-debbug | 2 | ||||
-rw-r--r-- | .config/mc/panels.ini | 2 | ||||
-rw-r--r-- | .config/mutt/muttrc | 2 | ||||
-rwxr-xr-x | .config/notmuch/default/hooks/post-new | 2 | ||||
-rw-r--r-- | .emacs.d/early-init.el | 2 | ||||
-rw-r--r-- | .emacs.d/eshell/alias | 3 | ||||
-rw-r--r-- | .emacs.d/init.el | 671 | ||||
-rw-r--r-- | .mbsyncrc | 116 | ||||
-rw-r--r-- | .notmuch-config | 4 | ||||
-rw-r--r-- | .pbuilderrc | 2 | ||||
-rw-r--r-- | .shinit | 4 | ||||
-rw-r--r-- | .ssh/config | 4 | ||||
-rwxr-xr-x | bin/movemymail | 4 | ||||
-rw-r--r-- | lib-src/certs/fastmail.crt | 41 |
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 @@ -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" @@ -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----- |