summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.config/git/config11
-rw-r--r--.config/gtk-3.0/settings.ini3
-rw-r--r--.config/mutt/muttrc2
-rw-r--r--.config/ncdu/config2
-rwxr-xr-x.config/notmuch/default/hooks/post-new2
-rw-r--r--.config/sway/config450
-rw-r--r--.debpaste.rc3
-rw-r--r--.duply/melete-spwhitton-home/exclude2
-rw-r--r--.emacs.d/early-init.el2
-rw-r--r--.emacs.d/eshell/alias3
-rw-r--r--.emacs.d/init.el829
-rw-r--r--.gtkrc-2.02
-rw-r--r--.hstow-unstow-ignore2
-rw-r--r--.mbsyncrc116
-rw-r--r--.sbuildrc3
-rw-r--r--.shinit4
-rw-r--r--.ssh/config6
-rw-r--r--archive/.config/i3/config (renamed from .config/i3/config)2
-rwxr-xr-xarchive/bin/choose-wallpaper (renamed from bin/choose-wallpaper)0
-rw-r--r--archive/perl5/Desktop.pm (renamed from perl5/Local/Desktop.pm)0
-rwxr-xr-xarchive/scripts/desktop/dmenu_ssh (renamed from scripts/desktop/dmenu_ssh)0
-rwxr-xr-xarchive/scripts/desktop/dmenu_window (renamed from scripts/desktop/dmenu_window)0
-rwxr-xr-xarchive/scripts/desktop/i3-startup-always (renamed from scripts/desktop/i3-startup-always)0
-rwxr-xr-xbin/athenet-apt-add (renamed from bin/athena-apt-add)6
-rwxr-xr-xbin/buildssrht-preupload2
-rwxr-xr-xbin/debpaste542
-rwxr-xr-xbin/doccheckin4
-rwxr-xr-xbin/locmaint13
-rwxr-xr-xbin/movemymail4
-rwxr-xr-xbin/reprepro-rebuilder5
-rw-r--r--lib-src/certs/fastmail.crt41
-rw-r--r--lib-src/git/includes4
-rw-r--r--lib-src/git/lib/athenet-apt (renamed from lib-src/git/lib/athena-apt)2
-rw-r--r--lib-src/mr/config56
-rwxr-xr-xscripts/desktop/sway-ftp-master3
-rwxr-xr-xscripts/git/sort-into-yyyy2
36 files changed, 767 insertions, 1361 deletions
diff --git a/.config/git/config b/.config/git/config
index 09c01894..d13e6637 100644
--- a/.config/git/config
+++ b/.config/git/config
@@ -83,16 +83,18 @@
email = spwhitton@spwhitton.name
[url "https://git.spwhitton.name/"]
- insteadOf = demeter:
+ insteadOf = spw:
insteadOf = git://git.spwhitton.name/
insteadOf = http://git.spwhitton.name/
insteadOf = athena: # for compatibility only
+ insteadOf = demeter: # for compatibility only
insteadOf = git://spwhitton.name/ # for compatibility only
[url "git@git.spwhitton.name:"]
pushInsteadOf = http://git.spwhitton.name/
pushInsteadOf = https://git.spwhitton.name/
pushInsteadOf = git://git.spwhitton.name/
- pushInsteadOf = demeter:
+ pushInsteadOf = spw:
+ pushInsteadOf = demeter: # for compatibility only
pushInsteadOf = athena: # for compatibility only
pushInsteadOf = git://spwhitton.name/ # for compatibility only
@@ -117,6 +119,11 @@
[url "spwhitton@git.savannah.gnu.org:/srv/git/"]
pushInsteadOf = https://git.savannah.gnu.org/git/
+[log]
+ excludeDecoration = refs/remotes/*/HEAD
+ excludeDecoration = refs/remotes/dgit/
+ excludeDecoration = refs/tags/archive/debian/
+
[include]
# Mostly local overrides, e.g. of user.name and user.email.
path = ~/.config/git/local
diff --git a/.config/gtk-3.0/settings.ini b/.config/gtk-3.0/settings.ini
deleted file mode 100644
index 7e447047..00000000
--- a/.config/gtk-3.0/settings.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[Settings]
-gtk-key-theme-name=Emacs
-gtk-application-prefer-dark-theme=0
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/ncdu/config b/.config/ncdu/config
new file mode 100644
index 00000000..6e3c5701
--- /dev/null
+++ b/.config/ncdu/config
@@ -0,0 +1,2 @@
+--exclude-kernfs
+--color dark-bg
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/.config/sway/config b/.config/sway/config
index dbd62231..69678c08 100644
--- a/.config/sway/config
+++ b/.config/sway/config
@@ -11,10 +11,16 @@ client.placeholder #000000 #000000 #FFFFF6 #AA9E9F #AA9E9F
client.background #FFFFF6
-# Use Mouse+Mod4 to drag floating windows to their wanted position
floating_modifier Mod4
-
mouse_warping output
+focus_wrapping no
+popup_during_fullscreen leave_fullscreen
+
+input type:keyboard repeat_rate 25
+input type:keyboard repeat_delay 380
+seat * hide_cursor 5000
+
+output * bg ~/src/dotfiles/lib-src/img/green_gobbler.png tile
# Key binding strategy:
#
@@ -32,228 +38,180 @@ mouse_warping output
# than one keypress with the other hand, which is worth avoiding.
mode "C-i-" {
- # make a fresh Emacs frame -- typically this gets invoked only on
- # empty workspaces, as otherwise I use commands under `C-x 5` to get
- # more Emacs frames
bindsym e exec emacsclient -ncw15, mode "default"
+ bindsym BackSpace exec foot, mode "default"
+ bindsym b exec firefox -new-window, mode "default"
# override the script's usual logic to start a fresh, non-debug daemon
bindsym Ctrl+Mod1+e exec emacsclient -ncw8 --spw/installed, \
mode "default"
- # special daemon instance for debugging primary instance & Gnus
+ # special daemon instance for debugging primary instance and for Gnus
bindsym r exec emacsclient -ncw8 -sgdbmacs, mode "default"
# Fresh Emacs frame and get a shell in HOME. Without this it's
- # C-i e M-& which is too many keys esp. compared to C-i DEL
- bindsym Return exec emacsclient -ncw15 -e \
+ # C-i e M-& which is too many keys esp. compared to C-i DEL.
+ bindsym Return exec emacsclient -ncw15 -e \
"(let ((default-directory (expand-file-name "'"'~/'"'")) \
- (display-buffer-overriding-action \
- '(display-buffer-same-window \
- . ((inhibit-same-window . nil))))) \
- (transient-cycles-cmd-spw/eshell-jump-from-here))", \
+ (display-buffer-overriding-action \
+ '(display-buffer-same-window \
+ . ((inhibit-same-window . nil))))) \
+ (transient-cycles-cmd-spw/eshell-jump-from-here))", \
mode "default"
- # start a terminal emulator
- bindsym BackSpace exec foot, mode "default"
-
- # make a fresh browser window
- bindsym b exec firefox -new-window, mode "default"
-
- # lock screen -- relies on swayidle
- # note that this won't lock other VTs (lock-session*s*
- # requires root password)
- bindsym l exec loginctl lock-session, mode "default"
-
- # go to sleep -- swayidle will lock screen
- bindsym --locked Ctrl+l exec systemctl suspend, mode "default"
-
- # kill focused window
- bindsym k kill, mode "default"
-
- # sway sample config says to pipe dmenu into `xargs swaymsg exec --`
- # but doesn't seem necessary with wofi
-
- bindsym p exec wofi --show=drun -i, mode "default"
-
- bindsym Ctrl+p exec wofi --show=run -i, mode "default"
+ # lock screen, go to sleep -- these rely on swayidle
+ # note that this won't lock other VTs (lock-sessions requires root pw)
+ bindsym l exec loginctl lock-session, mode "default"
+ bindsym --locked Ctrl+l exec systemctl suspend, mode "default"
+ bindsym p exec wofi --show=drun -i, mode "default"
bindsym s exec ~/src/dotfiles/scripts/desktop/wofi_ssh, mode "default"
-
bindsym Mod1+g exec makoctl dismiss --all, mode "default"
- # enter fullscreen mode for the focused container
- bindsym f fullscreen toggle, mode "default"
-
- # toggle tiling / floating
- bindsym t floating toggle, mode "default"
-
- # change focus between tiling / floating windows
- bindsym Tab focus mode_toggle, mode "default"
-
- # # when screen is divided into two containers where at least one might
- # # have several tabs, as I usually have it, this works well to go back
- # # and forth
- # bindsym o focus_wrapping workspace, focus parent, focus right, \
- # focus_wrapping yes, mode "default"
+ bindsym t floating toggle, mode "default"
+ bindsym Tab focus mode_toggle, mode "default"
bindsym o exec papersway-msg other column, mode "default"
-
- # switch to workspace
- bindsym 1 workspace 1, mode "default"
- bindsym 2 workspace 2, mode "default"
- bindsym 3 workspace 3, mode "default"
- bindsym 4 workspace 4, mode "default"
- bindsym 5 workspace 5, mode "default"
- bindsym 6 workspace 6, mode "default"
- bindsym 7 workspace 7, mode "default"
- bindsym 8 workspace 8, mode "default"
- bindsym 9 workspace 9, mode "default"
- bindsym 0 workspace 10, mode "default"
- bindsym F1 workspace 11:F1, mode "default"
- bindsym F2 workspace 12:F2, mode "default"
- bindsym F3 workspace 13:F3, mode "default"
- bindsym F4 workspace 14:F4, mode "default"
- bindsym F5 workspace 15:F5, mode "default"
- bindsym F6 workspace 16:F6, mode "default"
- bindsym F7 workspace 17:F7, mode "default"
- bindsym F8 workspace 18:F8, mode "default"
- bindsym F9 workspace 19:F9, mode "default"
- bindsym F10 workspace 20:F10, mode "default"
- bindsym F11 workspace 21:F11, mode "default"
- bindsym F12 workspace 22:F12, mode "default"
- bindsym semicolon workspace back_and_forth, mode "default"
-
- # move focused container to workspace
- bindsym Mod1+1 move container to workspace 1, mode "default"
- bindsym Mod1+2 move container to workspace 2, mode "default"
- bindsym Mod1+3 move container to workspace 3, mode "default"
- bindsym Mod1+4 move container to workspace 4, mode "default"
- bindsym Mod1+5 move container to workspace 5, mode "default"
- bindsym Mod1+6 move container to workspace 6, mode "default"
- bindsym Mod1+7 move container to workspace 7, mode "default"
- bindsym Mod1+8 move container to workspace 8, mode "default"
- bindsym Mod1+9 move container to workspace 9, mode "default"
- bindsym Mod1+0 move container to workspace 10, mode "default"
- bindsym Mod1+F1 move container to workspace 11:F1, mode "default"
- bindsym Mod1+F2 move container to workspace 12:F2, mode "default"
- bindsym Mod1+F3 move container to workspace 13:F3, mode "default"
- bindsym Mod1+F4 move container to workspace 14:F4, mode "default"
- bindsym Mod1+F5 move container to workspace 15:F5, mode "default"
- bindsym Mod1+F6 move container to workspace 16:F6, mode "default"
- bindsym Mod1+F7 move container to workspace 17:F7, mode "default"
- bindsym Mod1+F8 move container to workspace 18:F8, mode "default"
- bindsym Mod1+F9 move container to workspace 19:F9, mode "default"
- bindsym Mod1+F10 move container to workspace 20:F10, mode "default"
- bindsym Mod1+F11 move container to workspace 21:F11, mode "default"
- bindsym Mod1+F12 move container to workspace 22:F12, mode "default"
- bindsym Mod1+semicolon move container to workspace back_and_forth, \
- mode "default"
- bindsym Mod1+Ctrl+semicolon move container to workspace back_and_forth, \
- workspace back_and_forth, mode "default"
-
- # next unused workspace
- bindsym j exec papersway-msg fresh-workspace, mode "default"
- # sends window to next unused but doesn't change view
- bindsym Mod1+j exec papersway-msg fresh-workspace send, mode "default"
- # sends window to next unused and changes view
- bindsym Mod1+Ctrl+j exec \
- papersway-msg fresh-workspace take, mode "default"
+ # Pre-papersway version: was useful as I'd typically have two columns
+ # with at least one containing several tabs.
+ # bindsym o focus_wrapping workspace, focus parent, focus right, \
+ # focus_wrapping yes, mode "default"
+
+ bindsym 1 workspace 1, mode "default"
+ bindsym 2 workspace 2, mode "default"
+ bindsym 3 workspace 3, mode "default"
+ bindsym 4 workspace 4, mode "default"
+ bindsym 5 workspace 5, mode "default"
+ bindsym 6 workspace 6, mode "default"
+ bindsym 7 workspace 7, mode "default"
+ bindsym 8 workspace 8, mode "default"
+ bindsym 9 workspace 9, mode "default"
+ bindsym 0 workspace 10, mode "default"
+ bindsym F1 workspace 11:F1, mode "default"
+ bindsym F2 workspace 12:F2, mode "default"
+ bindsym F3 workspace 13:F3, mode "default"
+ bindsym F4 workspace 14:F4, mode "default"
+ bindsym F5 workspace 15:F5, mode "default"
+ bindsym F6 workspace 16:F6, mode "default"
+ bindsym F7 workspace 17:F7, mode "default"
+ bindsym F8 workspace 18:F8, mode "default"
+ bindsym F9 workspace 19:F9, mode "default"
+ bindsym F10 workspace 20:F10, mode "default"
+ bindsym F11 workspace 21:F11, mode "default"
+ bindsym F12 workspace 22:F12, mode "default"
+ bindsym semicolon workspace back_and_forth, mode "default"
+
+ bindsym Mod1+1 move container to workspace 1, mode "default"
+ bindsym Mod1+2 move container to workspace 2, mode "default"
+ bindsym Mod1+3 move container to workspace 3, mode "default"
+ bindsym Mod1+4 move container to workspace 4, mode "default"
+ bindsym Mod1+5 move container to workspace 5, mode "default"
+ bindsym Mod1+6 move container to workspace 6, mode "default"
+ bindsym Mod1+7 move container to workspace 7, mode "default"
+ bindsym Mod1+8 move container to workspace 8, mode "default"
+ bindsym Mod1+9 move container to workspace 9, mode "default"
+ bindsym Mod1+0 move container to workspace 10, mode "default"
+ bindsym Mod1+F1 move container to workspace 11:F1, mode "default"
+ bindsym Mod1+F2 move container to workspace 12:F2, mode "default"
+ bindsym Mod1+F3 move container to workspace 13:F3, mode "default"
+ bindsym Mod1+F4 move container to workspace 14:F4, mode "default"
+ bindsym Mod1+F5 move container to workspace 15:F5, mode "default"
+ bindsym Mod1+F6 move container to workspace 16:F6, mode "default"
+ bindsym Mod1+F7 move container to workspace 17:F7, mode "default"
+ bindsym Mod1+F8 move container to workspace 18:F8, mode "default"
+ bindsym Mod1+F9 move container to workspace 19:F9, mode "default"
+ bindsym Mod1+F10 move container to workspace 20:F10, mode "default"
+ bindsym Mod1+F11 move container to workspace 21:F11, mode "default"
+ bindsym Mod1+F12 move container to workspace 22:F12, mode "default"
+ bindsym Mod1+semicolon \
+ move container to workspace back_and_forth, mode "default"
+ bindsym Mod1+Ctrl+semicolon \
+ move container to workspace back_and_forth, \
+ workspace back_and_forth, mode "default"
+
+ bindsym j exec papersway-msg fresh-workspace, mode "default"
+ bindsym Mod1+j exec papersway-msg fresh-workspace send, mode "default"
+ bindsym Mod1+Ctrl+j \
+ exec papersway-msg fresh-workspace take, mode "default"
bindsym comma exec papersway-msg absorb_expel left, mode "default"
bindsym period exec papersway-msg absorb_expel right, mode "default"
- # reload the configuration file
- bindsym Ctrl+Mod1+c reload, mode "default"
- # exit i3 (logs you out of your X session)
- bindsym Ctrl+Mod1+Shift+e exit
-
- bindsym g mode "C-i g-"
-
- # bindsym bracketleft exec debian-ftp-master-cut-note, mode "default"
- # bindsym Ctrl+bracketleft exec xdo-evince-highlight, mode "default"
-
- # Workspaces do not ever get assigned to particular purposes / windows
- # don't get assigned to particular workspaces. If I can't find where
- # I was working on something, there's my bindings to `workspace
- # {next,prev}_on_output`. Long-running processes like builds, for
- # example, stay in the workspace(s) where I'm working on that
- # task/project
- #
- # Previously I thought that instead of having them on a dedicated
- # workspace, windows that are almost always open should be put on the
- # scratcpad:
- #
- # Note that we have to move to scratchpad at startup ('move to
- # scratchpad' below), or the toggle key won't work.
- #
- # Once every so often I'll have to launch the program, and then
- # immediately use the toggle key to make it visible. This is a
- # bit inelegant, but much more reliable than binding the key to a
- # script which starts the program if it's not around and otherwise
- # toggles
+ bindsym Ctrl+Mod1+c reload, mode "default"
+ bindsym Ctrl+Mod1+Shift+e exit
+
+ # Workspaces do not ever get assigned to particular purposes / windows
+ # don't get assigned to particular workspaces. If I can't find where
+ # I was working on something, there's my bindings to `workspace
+ # {next,prev}_on_output`. Long-running processes like builds, for
+ # example, stay in the workspace(s) where I'm working on that
+ # task/project
+ #
+ # Previously I thought that instead of having them on a dedicated
+ # workspace, windows that are almost always open should be put on the
+ # scratcpad:
+ #
+ # Note that we have to move to scratchpad at startup ('move to
+ # scratchpad' below), or the toggle key won't work.
+ #
+ # Once every so often I'll have to launch the program, and then
+ # immediately use the toggle key to make it visible. This is a
+ # bit inelegant, but much more reliable than binding the key to a
+ # script which starts the program if it's not around and otherwise
+ # toggles
#
# However, I now think that scratchpad windows are unwieldy for
# various reasons, so just having them as regular windows with
- # shortcuts to get back to them is better.
-
- bindsym n exec swaymsg '[title="\[mosh\] tmux default on athena"]' focus \
- || foot ssh-and-tmux athena.silentflame.com, mode "default"
+ # shortcuts to get back to them [all gone since papersway] is better.
bindsym c [con_mark=caffeinated] inhibit_idle none; \
- inhibit_idle open, mark caffeinated; mode "default"
+ inhibit_idle open, mark caffeinated; mode "default"
bindsym Ctrl+c [con_mark=caffeinated] inhibit_idle none, \
mark --toggle caffeinated; mode "default"
- # # The two % values are for melete. Cf. `spw/maybe-scale-basic-faces'.
- # #
- # # This says: shrink such that an Emacs frame taking up the rest of the
- # # width can fit two 80-column windows, with Debian's fonts-hack at
- # # height 105. So should be <33. Sometimes we'll be able to fit an
- # # 80-column frame in the smaller part of the split, but usually we
- # # won't: the point is to ensure we can use Emacs with two 80-column
- # # windows, as is usual, while also displaying something narrower.
+ # The two % values are for melete. Cf. `spw/maybe-scale-basic-faces'.
+
+ # This says: shrink such that an Emacs frame taking up the rest of the
+ # width can fit two 80-column windows, with Debian's fonts-hack at
+ # height 105. So should be <33. Sometimes we'll be able to fit an
+ # 80-column frame in the smaller part of the split, but usually we
+ # won't: the point is to ensure we can use Emacs with two 80-column
+ # windows, as is usual, while also displaying something narrower.
# bindsym minus resize set width 31 ppt, mode "default"
- # # And this says: ensure that the current window can be an Emacs frame
- # # with at least 80 columns. Based on Debian's fonts-hack scaled up to
- # # height 120 by `spw/maybe-scale-basic-faces'.
+
+ # And this says: ensure that the current window can be an Emacs frame
+ # with at least 80 columns. Based on Debian's fonts-hack scaled up to
+ # height 120 by `spw/maybe-scale-basic-faces'.
# bindsym equal resize set width 43 ppt, mode "default"
bindsym minus exec papersway-msg cols decr, mode "default"
bindsym equal exec papersway-msg cols incr, mode "default"
- bindsym Ctrl+y exec ~/src/dotfiles/scripts/desktop/sway-ftp-master-cut-note , mode "default"
+ bindsym Ctrl+y exec \
+ ~/src/dotfiles/scripts/desktop/sway-ftp-master-cut-note, \
+ mode "default"
- bindsym --locked Ctrl+g mode "default"
+ bindsym g mode "C-i g-"
+ bindsym --locked Ctrl+g mode "default"
}
bindsym --locked Ctrl+i mode "C-i-"
-for_window [con_mark=caffeinated] inhibit_idle open
-
-for_window [title="ftp-master GNU mc session"] mark mc
-for_window [title="ftp-master dak command session"] mark dak
-
-focus_wrapping no
-
-# change focus
-bindsym Ctrl+7 exec papersway-msg focus left \
- || swaymsg focus left
-bindsym Ctrl+0 exec papersway-msg focus right \
- || swaymsg focus right
-bindsym Ctrl+8 focus down
-bindsym Ctrl+9 focus up
-
-# move focused window
-bindsym Mod1+Ctrl+7 exec papersway-msg move left || swaymsg move left
-bindsym Mod1+Ctrl+0 exec papersway-msg move right || swaymsg move right
-bindsym Mod1+Ctrl+8 move down
-bindsym Mod1+Ctrl+9 move up
-
-bindsym Ctrl+5 kill
-bindsym Ctrl+6 exec papersway-msg monocle toggle
+# launchers
+mode "C-i g-" {
+ bindsym g exec thunar, mode "default"
+ bindsym a exec foot alsamixer, mode "default"
+ bindsym y exec foot yapet, mode "default"
+ bindsym w exec \
+ ~/src/dotfiles/scripts/desktop/whitenoise , mode "default"
+ bindsym f exec \
+ ~/src/dotfiles/scripts/desktop/sway-ftp-master, mode "default"
+ bindsym s mode "default", \
+ exec grim -c ~/tmp/$(hostname -s)_$(date +%F_%H.%M.%S).png
+ bindsym x exec wdisplays, mode "default"
-# bindsym Ctrl+apostrophe layout toggle splith splitv tabbed
+ bindsym Ctrl+g mode "default"
+}
# Cycle through all workspaces.
# Warp the cursor to a point on the screen which is hopefully a titlebar.
@@ -261,107 +219,81 @@ bindsym Ctrl+6 exec papersway-msg monocle toggle
# e.g., a VNC client has grabbed the keyboard upon entry to the workspace.
bindsym Ctrl+1 seat - cursor set 0 0, exec papersway-msg workspace prev
bindsym Ctrl+4 seat - cursor set 0 0, exec papersway-msg workspace next
-bindsym Mod1+Ctrl+1 seat - cursor set 0 0, exec \
- papersway-msg move_workspace prev
-bindsym Mod1+Ctrl+4 seat - cursor set 0 0, exec \
- papersway-msg move_workspace next
+bindsym Mod1+Ctrl+1 seat - cursor set 0 0, \
+ exec papersway-msg move_workspace prev
+bindsym Mod1+Ctrl+4 seat - cursor set 0 0, \
+ exec papersway-msg move_workspace next
bindsym Ctrl+2 focus output left
bindsym Mod1+Ctrl+2 move workspace to output left
bindsym Ctrl+3 focus output right
bindsym Mod1+Ctrl+3 move workspace to output right
-# Start swaybar to display a workspace bar (plus the system information
-# i3status finds out, if available)
-bar {
- # i3status is designed to be highly performant so it continues
- # to be refreshed when the system is under load; we're giving
- # up some of that with papersway, but let's see if it
- # actually matters
- status_command papersway --i3status
-
- # default behaviour is to cycle through workspaces when scroll
- # wheel is used on the bar. However, don't think I've ever
- # used this deliberately, and often I do it by mistake, so
- # let's disable it
- bindsym button4 nop
- bindsym button5 nop
-
- colors {
- background #E5E5E5
- focused_background #FFFFF6
- statusline #000000
- separator #000000
-
- focused_workspace #000000 #B4EEB4 #000000
- active_workspace #000000 #FFFFF6 #000000
- inactive_workspace #000000 #E5E5E5 #000000
- urgent_workspace #000000 #702020 #FFFFF6
- binding_mode #000000 #EECD82 #000000
- }
-
- # Leave papersway to disable the workspace buttons once it has started
- # handling workspaces.
-
- position bottom
- strip_workspace_numbers yes
- status_edge_padding 11
- tray_padding 0
-
- workspace_min_width 50
-}
+bindsym Ctrl+5 kill
+bindsym Ctrl+6 exec papersway-msg monocle toggle
-# single key launching
-mode "C-i g-" {
- # start a graphical file manager
- bindsym g exec thunar , mode "default"
+bindsym Ctrl+7 exec papersway-msg focus left
+bindsym Ctrl+8 focus down
+bindsym Ctrl+9 focus up
+bindsym Ctrl+0 exec papersway-msg focus right
- # open virt-viewer pointed at develacc
- bindsym d exec develacc-please , mode "default"
+bindsym Mod1+Ctrl+7 exec papersway-msg move left
+bindsym Mod1+Ctrl+8 move down
+bindsym Mod1+Ctrl+9 move up
+bindsym Mod1+Ctrl+0 exec papersway-msg move right
- bindsym y exec foot yapet , mode "default"
- bindsym w exec ~/src/dotfiles/scripts/desktop/whitenoise , mode "default"
+bindsym --locked XF86AudioRaiseVolume \
+ exec pactl set-sink-volume @DEFAULT_SINK@ +5%
+bindsym --locked XF86AudioLowerVolume \
+ exec pactl set-sink-volume @DEFAULT_SINK@ -5%
+bindsym --locked XF86AudioMute \
+ exec pactl set-sink-mute @DEFAULT_SINK@ toggle
- # connect to Debian's ftp-master server for ftpteam work
- bindsym f exec ~/src/dotfiles/scripts/desktop/sway-ftp-master , mode "default"
+bindsym --locked XF86MonBrightnessUp exec brightnessctl set +10%
+bindsym --locked XF86MonBrightnessDown exec brightnessctl set 10%-
- bindsym s mode "default", \
- exec grim -c ~/tmp/$(hostname -s)_$(date +%F_%H.%M.%S).png
+bar {
+ status_command papersway --i3status
- bindsym x exec wdisplays , mode "default"
+ # Avoid accidentally scrolling through workspaces.
+ bindsym button4 nop
+ bindsym button5 nop
- bindsym Ctrl+g mode "default"
+ colors {
+ background #E5E5E5
+ focused_background #FFFFF6
+ statusline #000000
+ separator #000000
+
+ focused_workspace #000000 #B4EEB4 #000000
+ active_workspace #000000 #FFFFF6 #000000
+ inactive_workspace #000000 #E5E5E5 #000000
+ urgent_workspace #000000 #702020 #FFFFF6
+ binding_mode #000000 #EECD82 #000000
+ }
+
+ # Leave papersway to disable the ws buttons once it has started.
+ position bottom
+ strip_workspace_numbers yes
+ status_edge_padding 11
+ tray_padding 0
+ workspace_min_width 50
}
-bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
-bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
-bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
-
-bindsym --locked XF86MonBrightnessUp exec brightnessctl set +10%
-bindsym --locked XF86MonBrightnessDown exec brightnessctl set 10%-
-
-popup_during_fullscreen leave_fullscreen
-
-# windows that should always float
for_window [title="^Ediff"] floating enable
no_focus [title="Firefox . Sharing Indicator"]
-for_window [title="Firefox . Sharing Indicator"] floating enable, \
- move position 0 0
-
-input type:keyboard repeat_rate 25
-input type:keyboard repeat_delay 380
-
-seat * hide_cursor 5000
+for_window [title="Firefox . Sharing Indicator"] \
+ floating enable, move position 0 0
+for_window [con_mark=caffeinated] inhibit_idle open
+for_window [title="ftp-master GNU mc session"] mark mc
+for_window [title="ftp-master dak command session"] mark dak
exec mako
exec swayidle -w
exec emacsclient --spw/update-environment
exec emacsclient -sgdbmacs --spw/no-start --spw/update-environment
-
exec_always fcitx5 -d --replace
exec blueman-applet
exec nm-applet --indicator
-output * bg ~/src/dotfiles/lib-src/img/green_gobbler.png tile
-
include ~/.config/sway/$(hostname)/*
diff --git a/.debpaste.rc b/.debpaste.rc
deleted file mode 100644
index 2a5a08f1..00000000
--- a/.debpaste.rc
+++ /dev/null
@@ -1,3 +0,0 @@
-User: spwhitton
-Expires: 86400
-Server: https://paste.debian.net/
diff --git a/.duply/melete-spwhitton-home/exclude b/.duply/melete-spwhitton-home/exclude
index d230f72b..17866820 100644
--- a/.duply/melete-spwhitton-home/exclude
+++ b/.duply/melete-spwhitton-home/exclude
@@ -1,6 +1,6 @@
- /home/spwhitton/lib/annex/.git/annex
- /home/spwhitton/annex/.git/annex
-- /home/spwhitton/lib/athena-apt/pool
+- /home/spwhitton/lib/athenet-apt/pool
- /home/spwhitton/lib/dionysus/.git/annex/objects
- /home/spwhitton/lib/podcasts/.git/annex/objects
- /home/spwhitton/lib/rt
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..29a43d2d 100644
--- a/.emacs.d/eshell/alias
+++ b/.emacs.d/eshell/alias
@@ -2,7 +2,7 @@ alias grep-queued { cd /ssh:ssh.upload.debian.org: && *grep $* /srv/upload.debia
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-lts quilt pop -a; git is-clean ':!debian/patches/' && sbuild --no-clean-source --no-run-lintian $*
+alias sbuild-lts quilt pop -a; git is-clean ':!debian/patches/' && sbuild --no-clean-source $*
alias dpkg-bp-lts quilt pop -a; git is-clean && dpkg-buildpackage -S -nc --force-sign $*
alias dpkg-buildpackage-lts dpkg-bp-lts $*
alias d dired $1
@@ -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 87dde3cd..89644aa1 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,40 +77,49 @@
;;;; 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."))
-
-;; Set background colour but don't touch text terminals.
-(dolist (ws '(x pgtk w32 ns))
- (add-to-list
- 'window-system-default-frame-alist
- ;; If we were not started with --daemon or by 'emacsclient -a ""', then
- ;; we're probably a shortlived instance of Emacs just to test something.
- ;; Set a different background colour to more easily distinguish frames
- ;; belonging to shortlived instances from those belonging to main instance.
- `(,ws
- . ((background-color
- . ,(pcase (daemonp)
- ('nil "honeydew") ("gdbmacs" "linen") (_ "#FFFFF6")))))))
+
+ ;; The colour is from the Lucid build of Emacs.
+ '(region ((t (:extend t :background "#EECD82")))))
+
+;; Set background colours for graphical frames; leave TUI frames alone.
+;; If we were not started with --daemon or by 'emacsclient -a ""', then
+;; we're probably a shortlived instance of Emacs just to test something.
+;; Set a different background colour to more easily distinguish frames
+;; belonging to shortlived instances from those belonging to main instance.
+(let ((colour (pcase (daemonp)
+ ('nil "#F0FFF0") ("gdbmacs" "#F5F5DC") (_ "#FFFFF6"))))
+ (dolist (ws '(x pgtk w32 ns))
+ (add-to-list 'window-system-default-frame-alist
+ `(,ws . ((background-color . ,colour))))))
(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 +171,23 @@ 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)
+
+ ;; Always update buffers when files change on disk -- if we want to go back
+ ;; to the version of the file we had in Emacs, we can just hit C-/.
+ '(auto-revert-use-notify nil)
+ '(global-auto-revert-mode 1)
+
'(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 +197,67 @@ 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-display-function-type nil)
'(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,38 +266,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)
- '(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/.")
+ '(text-mode-ispell-word-completion nil)
+
+ ;; 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))
@@ -522,6 +378,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")))
@@ -1004,11 +865,6 @@ To be used only when it seems to be necessary."
;; calling emacsclient(1), this is like '<ESC>ZZ' in vi.
(global-set-key "\C-cz" "\C-x\C-s\C-x#")
-;; always update buffers when files change on disk -- if we want to go back to
-;; the version of the file we had in Emacs, we can just hit undo
-(setq auto-revert-use-notify nil)
-(global-auto-revert-mode 1)
-
;; C-x x g should not ask for confirmation.
(global-set-key "\C-xxg" (lambda ()
(interactive)
@@ -1059,7 +915,7 @@ To be used only when it seems to be necessary."
(global-set-key "\C-cih" #'add-file-local-variable-prop-line)
;; don't do anything with abbrevs if ~/doc is not checked out
-(defvar spw/doc-abbrevs-file (expand-file-name "~/doc/emacs-abbrevs"))
+(defvar spw/doc-abbrevs-file (expand-file-name "~/doc/abbrevs"))
(when (file-exists-p spw/doc-abbrevs-file)
(setq abbrev-file-name spw/doc-abbrevs-file)
(quietly-read-abbrev-file)
@@ -1070,7 +926,7 @@ To be used only when it seems to be necessary."
(setf (cadr (assq 'abbrev-mode minor-mode-alist)) nil))
;; similar
-(defvar spw/doc-bookmarks-file (expand-file-name "~/doc/emacs-bookmarks"))
+(defvar spw/doc-bookmarks-file (expand-file-name "~/doc/bookmarks"))
(when (file-exists-p spw/doc-bookmarks-file)
(setq bookmark-default-file spw/doc-bookmarks-file
bookmark-save-flag 1))
@@ -1187,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 " " "?")
@@ -1554,9 +1418,8 @@ state, attempt to produce some useful side window(s)."
(let ((default-directory (expand-file-name "~/")))
(slime))))
(t (error "No side windows state & no heuristic")))))))
-;; Possibly this command should go on M-5 or M-6.
-(global-set-key [remap window-toggle-side-windows]
- #'spw/window-toggle-side-windows)
+(define-key spw/personal-bindings-mode-map "\M-6"
+ #'spw/window-toggle-side-windows)
(defun spw/delete-other-windows--toggle-side-windows
(&optional window &rest _ignore)
@@ -1621,16 +1484,12 @@ the non-side windows deleted by `delete-other-windows' will also reappear."
;;;; TRAMP
-(with-eval-after-load 'tramp
- (add-to-list 'tramp-connection-properties
- ;; Activate direct-async-process for all non-multihop SSH
- ;; connections.
- '("/ssh:" "direct-async-process" t)
- ;; session-timeout is about dropping a connection for security
- ;; reasons alone: never do that.
- '(nil "session-timeout" nil))
-
- (add-to-list 'tramp-remote-path 'tramp-own-remote-path))
+(spw/feature-add-to-list tramp-connection-properties tramp
+ ;; Activate `direct-async-process' for all non-multihop SSH connections.
+ '("/ssh:" "direct-async-process" t)
+ ;; Don't drop connections for security reasons alone.
+ '(nil "session-timeout" nil))
+(spw/feature-add-to-list tramp-remote-path tramp 'tramp-own-remote-path)
(unless (string-match ; Emacs 28: unquote and `string-search'
(regexp-quote tramp-file-name-regexp) vc-ignore-dir-regexp)
@@ -1641,6 +1500,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 ()
@@ -1683,11 +1557,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/")
@@ -2133,36 +2002,6 @@ Some ideas behind these behaviours are as follows.
(display-buffer buffer))))
(global-set-key "\C-cvc" #'spw/clone-repo)
-;; author unknown
-(defun spw/toggle-frame-split ()
- "Toggle the orientation of a two-window split.
-
-Useful after resizing the frame."
- (interactive)
- (when (= (count-windows) 2)
- (let* ((this-win-buffer (window-buffer))
- (next-win-buffer (window-buffer (next-window)))
- (this-win-edges (window-edges (selected-window)))
- (next-win-edges (window-edges (next-window)))
- (this-win-2nd (not (and (<= (car this-win-edges)
- (car next-win-edges))
- (<= (cadr this-win-edges)
- (cadr next-win-edges)))))
- (splitter
- (if (= (car this-win-edges)
- (car (window-edges (next-window))))
- 'split-window-horizontally
- 'split-window-vertically)))
- (delete-other-windows)
- (let ((first-win (selected-window)))
- (funcall splitter)
- (when this-win-2nd (other-window 1))
- (set-window-buffer (selected-window) this-win-buffer)
- (set-window-buffer (next-window) next-win-buffer)
- (select-window first-win)
- (when this-win-2nd (other-window 1))))))
-(define-key spw/personal-bindings-mode-map "\M-5" #'spw/toggle-frame-split)
-
(defun spw/maybe-toggle-split-after-resize (frame)
(when (and (framep frame)
(frame-size-changed-p frame)
@@ -2250,31 +2089,6 @@ Useful after resizing the frame."
(interactive)
(spw/myrepos-global-action "sync")))
-;; There are many variations on this online. This one by Robert Bost, based
-;; on work by Steve Yegge, Colin Doering and others
-(defun spw/rotate-windows (arg)
- "Rotate your windows, reversing direction if ARG."
- (interactive "P")
- (if (not (> (count-windows) 1))
- (message "You can't rotate a single window!")
- (let* ((rotate-times (prefix-numeric-value arg))
- (direction (if (or (< rotate-times 0) (equal arg '(4)))
- 'reverse 'identity)))
- (dotimes (_ (abs rotate-times))
- (dotimes (i (- (count-windows) 1))
- (let* ((w1 (elt (funcall direction (window-list)) i))
- (w2 (elt (funcall direction (window-list)) (+ i 1)))
- (b1 (window-buffer w1))
- (b2 (window-buffer w2))
- (s1 (window-start w1))
- (s2 (window-start w2))
- (p1 (window-point w1))
- (p2 (window-point w2)))
- (set-window-buffer-start-and-point w1 b2 s2 p2)
- (set-window-buffer-start-and-point w2 b1 s1 p1)))))))
-;; This gets this key because we're likely to want to invoke it repeatedly.
-(define-key spw/personal-bindings-mode-map "\M-6" #'spw/rotate-windows)
-
;; some influence here from Michael Stapelberg's config -- we both had a
;; function to do this, I discovered
(defun spw/recipient-first-name ()
@@ -2796,6 +2610,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.
@@ -2824,7 +2639,7 @@ Called by '~/src/dotfiles/bin/emacsclient --spw/update-environment'."
(interactive)
(let ((string (ignore-errors (cdr (bounds-of-thing-at-point 'string)))))
(fill-region-as-paragraph
- (car (bounds-of-thing-at-point 'sentence))
+ (point)
(cond (string (min string (cdr (bounds-of-thing-at-point 'paragraph))))
((cl-fifth (syntax-ppss))
(min (cdr (bounds-of-thing-at-point 'paragraph))
@@ -2875,6 +2690,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]+: [^ ]+"
@@ -3075,6 +2927,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))
@@ -3184,6 +3046,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
@@ -3889,7 +3804,8 @@ unread."
;; `gnus-summary-save-parts' has some alternative ways to get the handles
;; if `gnus-article-mime-handles' is nil.
(let ((handles gnus-article-mime-handles))
- (when (stringp (car handles)) (pop handles))
+ (when (stringp (car handles))
+ (setq handles (cdr handles)))
(mapc #'mm-save-part (cl-remove-if-not #'mm-handle-filename handles)))))
(with-eval-after-load 'gnus-sum
@@ -3905,25 +3821,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"))
@@ -4003,6 +3933,30 @@ 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)
+
+ ;; Drop the name & date to make more of the commit message visible.
+ '(vc-git-root-log-format
+ '("%d%h..: %s"
+ "^\\(?:[*/\\| ]+ \\)?\\(?2: ([^)]+)\\)?\\(?1:[0-9a-z]+\\)\\.\\.: "
+ ((1 'log-view-message) (2 'change-log-list nil lax)))))
+
+;; 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
+ (cons 'spw/log-edit-show-diff
+ (delete 'log-edit-show-files log-edit-hook))))
+
(require 'git-commit nil t)
(spw/when-library-available mailscripts
@@ -4015,7 +3969,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")))
@@ -4320,6 +4274,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)))
@@ -4333,6 +4288,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
@@ -4353,6 +4313,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)))
@@ -4464,15 +4432,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)
@@ -4786,6 +4745,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/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)
@@ -4840,17 +4890,17 @@ before uploading to NEW again." \n \n
("m" ((in-mode . "gnus-summary-mode"))))
org-capture-templates
'(("t" "Task to be refiled" entry (file org-default-notes-file)
- "* TODO %^{Title}\n%?")
+ "* TODO %^{Title}\n%?"
+ :empty-lines 1)
("T" "Task to be refiled" entry (file org-default-notes-file)
- "* TODO %^{Title}\n%?")
+ "* TODO %^{Title}\n%?"
+ :empty-lines 1)
("n" "Information to be refiled" entry (file org-default-notes-file)
- "* %^{Title}\n%?")
+ "* %^{Title}\n%?"
+ :empty-lines 1)
("m" "Task from mail to be refiled" entry (file org-default-notes-file)
- ;; Lisp is to filter square brackets out of the subject as these mean that
- ;; the Org-mode link does not properly form. In Org 9.3, the escaping
- ;; syntax for links has changed, so might be able to do something smarter
- ;; than this
- "* TODO [[gnus:%:group#%:message-id][%^{Title|\"%(replace-regexp-in-string \"\\\\\\[\\\\\\|\\\\\\]\" \"\" \"%:subject\")\" from %:fromname}]]\n%?")
+ "* TODO [[gnus:%:group#%:message-id][%^{Title|%:fromname ⁘ %:subject}]]\n%?"
+ :empty-lines 1)
;; ("a" "Appointment" entry (file+datetree "~/doc/howm/diary.org")
;; "* %^{Time} %^{Title & location}
@@ -4860,11 +4910,13 @@ before uploading to NEW again." \n \n
;; %^t" :immediate-finish t)
("s" "Task for the future to be refiled" entry (file org-default-notes-file)
- "* SOMEDAY %^{Title}\n%?")
- ("d" "Diary entry" entry (file+datetree "~/.labbook.gpg")
- "* %^{Title}\n%U\n\n%?")
+ "* SOMEDAY %^{Title}\n%?"
+ :empty-lines 1)
+ ("d" "Diary entry" entry (file+olp+datetree "~/.labbook.gpg") "* %U\n\n%?"
+ :jump-to-captured t :empty-lines 1 :tree-type month)
("u" "URI on clipboard" entry (file org-default-notes-file)
- "* SOMEDAY [[%^{URI|%x}][%^{Title}]]" :immediate-finish t)))
+ "* SOMEDAY [[%^{URI|%x}][%^{Title}]]"
+ :immediate-finish t :empty-lines 1)))
;; `org-forward-paragraph', `org-backward-paragraph' and `org-mark-element' do
;; not leave point where someone who uses `forward-paragraph',
@@ -4987,8 +5039,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)
@@ -5328,17 +5379,34 @@ 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/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)
-(when (file-readable-p "~/doc/emacs-diary")
+(when (file-readable-p "~/doc/diary")
(require 'org-agenda) ; for `org-class'
(unless
(bound-and-true-p appt-timer) ; avoid msgs when `eval-buffer' init.el
(appt-activate 1))
(add-to-list 'auto-mode-alist
- `(,(format "\\`%s\\'" (expand-file-name "~/doc/emacs-diary"))
+ `(,(format "\\`%s\\'" (expand-file-name "~/doc/diary"))
. diary-mode)))
(defun spw/diary-archive-entry (year)
@@ -5349,7 +5417,7 @@ different occasions."
(let ((start (point)))
(forward-line 1)
(while (looking-at "[[:blank:]]+") (forward-line 1))
- (append-to-file start (point) (format "~/doc/archive/emacs-diary-%d" year))
+ (append-to-file start (point) (format "~/doc/archive/diary-%d" year))
(delete-region start (point))
(when (and (bolp) (eolp)) (delete-blank-lines))))
(with-eval-after-load 'diary-lib
@@ -5422,6 +5490,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'.
@@ -5519,6 +5594,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/.gtkrc-2.0 b/.gtkrc-2.0
deleted file mode 100644
index 62d8ede9..00000000
--- a/.gtkrc-2.0
+++ /dev/null
@@ -1,2 +0,0 @@
-include "/usr/share/themes/Emacs/gtk-2.0-key/gtkrc"
-gtk-key-theme-name = "Emacs"
diff --git a/.hstow-unstow-ignore b/.hstow-unstow-ignore
index ef6e3658..27accd71 100644
--- a/.hstow-unstow-ignore
+++ b/.hstow-unstow-ignore
@@ -3,7 +3,7 @@ doc/*
.emacs.d/eln-cache/*
.fmail/*
lib/annex/*
-lib/athena-apt/*
+lib/athenet-apt/*
lib/wikiannex/*
lib/podcasts/*
lib/priv/*
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/.sbuildrc b/.sbuildrc
index d3eee9b6..1d69220a 100644
--- a/.sbuildrc
+++ b/.sbuildrc
@@ -8,7 +8,8 @@ $build_source = 0;
$build_arch_all = 1;
$distribution = 'unstable';
-$run_lintian = 1;
+# don't run by default: see sbuild-preupload function in ~/.bashrc
+$run_lintian = 0;
$lintian_opts = [
'--allow-root',
'--color=never', # make the .build file more readable
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..c09b9550 100644
--- a/.ssh/config
+++ b/.ssh/config
@@ -14,6 +14,7 @@ User spw
####################################################################
Host fasolo | ftp-master | ftp-master.debian.org
+User spwhitton
HostName ftp-master.debian.org
Host *.debian.org !*.ssh.debian.org !ssh.debian.org
@@ -34,7 +35,7 @@ HostName athena.silentflame.com
ForwardAgent yes
IdentityFile ~/.ssh/id_athena
-# For demeter's gitolite installation.
+# For personal gitolite installation.
Host git.spwhitton.name spwhitton.name
IdentityFile ~/.ssh/id_athena
@@ -48,6 +49,9 @@ Host melete.silentflame.com | melete
User spwhitton
ForwardAgent yes
+Host *.silentflame.com silentflame.com
+User spwhitton
+
####################################################################
Host github | github.com
diff --git a/.config/i3/config b/archive/.config/i3/config
index 470fd3f7..ffb81c9b 100644
--- a/.config/i3/config
+++ b/archive/.config/i3/config
@@ -2,7 +2,7 @@
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!
-# ** not yet adjusted for or tested with PaperWM-inspired i3status-wrapper **
+# ** not updated for, or tested with, papersway **
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
diff --git a/bin/choose-wallpaper b/archive/bin/choose-wallpaper
index 5fc14c83..5fc14c83 100755
--- a/bin/choose-wallpaper
+++ b/archive/bin/choose-wallpaper
diff --git a/perl5/Local/Desktop.pm b/archive/perl5/Desktop.pm
index 858e57cd..858e57cd 100644
--- a/perl5/Local/Desktop.pm
+++ b/archive/perl5/Desktop.pm
diff --git a/scripts/desktop/dmenu_ssh b/archive/scripts/desktop/dmenu_ssh
index 76d9aa72..76d9aa72 100755
--- a/scripts/desktop/dmenu_ssh
+++ b/archive/scripts/desktop/dmenu_ssh
diff --git a/scripts/desktop/dmenu_window b/archive/scripts/desktop/dmenu_window
index 8dc33fde..8dc33fde 100755
--- a/scripts/desktop/dmenu_window
+++ b/archive/scripts/desktop/dmenu_window
diff --git a/scripts/desktop/i3-startup-always b/archive/scripts/desktop/i3-startup-always
index b2a02e25..b2a02e25 100755
--- a/scripts/desktop/i3-startup-always
+++ b/archive/scripts/desktop/i3-startup-always
diff --git a/bin/athena-apt-add b/bin/athenet-apt-add
index 0346fa54..d3784b94 100755
--- a/bin/athena-apt-add
+++ b/bin/athenet-apt-add
@@ -7,8 +7,8 @@ set -e
changes="$(readlink -f $1)"
dist="$(grep ^Distribution: $changes | cut -d \ -f2)"
-if ! [ -d "$HOME/lib/athena-apt" ]; then
- echo >&2 "athena-apt annex not checked out"
+if ! [ -d "$HOME/lib/athenet-apt" ]; then
+ echo >&2 "athenet-apt annex not checked out"
exit 1
fi
if ! [ -f "$changes" ]; then
@@ -18,6 +18,6 @@ fi
changestool "$changes" includeallsources || true
(
- cd "$HOME/lib/athena-apt"
+ cd "$HOME/lib/athenet-apt"
reprepro include "$dist" "$changes"
)
diff --git a/bin/buildssrht-preupload b/bin/buildssrht-preupload
index ebae98f2..c39eebce 100755
--- a/bin/buildssrht-preupload
+++ b/bin/buildssrht-preupload
@@ -101,7 +101,7 @@ $manifest->{tasks} = [
[
build => [
"cd $source",
- "dgit --quilt=$quilt sbuild -d $dist --no-run-lintian"
+ "dgit --quilt=$quilt sbuild -d $dist"
]
],
[lintian => ["lintian $changes"]],
diff --git a/bin/debpaste b/bin/debpaste
deleted file mode 100755
index 72e8ce2c..00000000
--- a/bin/debpaste
+++ /dev/null
@@ -1,542 +0,0 @@
-#!/usr/bin/perl -w
-#
-
-=head1 NAME
-
-debpaste - http://paste.debian.net/ XML-RPC client
-
-=cut
-
-# Author: Hanno Hecker <vetinari@ankh-morp.org>
-# Licence: AGPL 3.0 (http://www.fsf.org/licensing/licenses/agpl-3.0.html)
-# Version: $Id: debpaste 25 2012-11-18 07:21:02Z vetinari $
-# SVN: http://svn.ankh-morp.org:8080/tools/paste-dn/
-#
-# Required:
-# deb: perl-base perl-modules
-# libtimedate-perl libfrontier-rpc-perl libtext-iconv-perl
-#
-# ToDo:
-# * "get" formatting?
-# * wishlist :)
-#
-use strict;
-use Getopt::Long;
-use Pod::Usage;
-my %config;
-my $VERSION = '1.1 ($Rev: 25 $)';
-
-=head1 SYNOPSIS
-
-B<debpaste> ACTION [OPTIONS] [CODE|ID]
-
-=head1 ACTIONS
-
-=over 4
-
-=item add
-
-Usage: debpaste add [OPTIONS] [CODE]
-
-Adds a new paste to L<http://paste.debian.net/>. If no code is given on the
-command line, it will read from stdin.
-
-Your paste infos are saved to I<~/.debpaste.history>
-
-=item del
-
-Usage: debpaste del [OPTIONS] ID
-
-Deletes paste with id ID. This must be an ID which you have pasted before
-(and is in your history file)
-
-=item get
-
-Usage: debpaste get [OPTIONS] ID
-
-Fetches the paste with id ID from L<http://paste.debian.net>. To C<download>
-a paste use something like
-
- debpaste get --noheader ID > OUTFILE
-
-=item lang
-
-Usage: debpaste lang [OPTIONS]
-
-Dumps the list of available languages for syntax highlighting, use the
-B<--lang=LANG> option when B<add>ing a paste.
-
-=item edit
-
-Usage: debpaste edit [OPTIONS] ID
-
-Downloads the paste with id ID, spawns an editor, and sends the edited file
-as new paste.
-
-=item expire
-
-Usage: debpaste expire [OPTIONS] [ID]
-
-Removes the entry ID from history file. If no ID is given it removes all
-entries which are expired.
-
-=back
-
-=head1 OPTIONS
-
-=over 4
-
-=item --user=USERNAME
-
-paste as USERNAME instead of C<anonymous>
-
-=item --server=URL
-
-use URL instead of http://paste.debian.net/server.pl
-
-=item --hidden
-
-post as hidden entry
-
-=item --noproxy
-
-do not use the http proxy given in the environment variable C<http_proxy>
-
-=item --lang=LANG
-
-use LANG for syntax highlight ('debpaste lang' for available languages)
-
-=item --expires=SEC
-
-expires in SEC seconds (default: 259200 = 72h)
-
-=item --encoding=ENC
-
-when adding new paste, use ENC as encoding of file, default: UTF-8
-
-=item --noheader
-
-when B<get>ting entries, don't print header, just dump the paste to stdout.
-
-=item --version
-
-print version and exit
-
-=back
-
-=cut
-
-binmode(STDOUT, ":utf8");
-binmode(STDERR, ":utf8");
-
-$0 =~ s#.*/##;
-
-=head1 FILES
-
-=over 4
-
-=item ~/.debpaste.rc
-
-The right place for setting default options like the username or expire values.
-Format is C<KeyInAnYCase: value>, example:
-
- User: Vetinari
- Expires: 86400
-
-=item ~/.debpaste.history
-
-All info about pastes done with B<debpaste> are recorded here. This file
-is used to keep a record for B<del>eting entries after pasting. Use
-B<debpaste expire> to remove old entries.
-
-=back
-
-=cut
-
-my $settings = $ENV{HOME}."/.debpaste.rc";
-
-## Don't change, edit $settings file:
-## KeYInAnyCaSE: value
-## AnoThErKey: other-value
-my $history = $ENV{HOME}."/.debpaste.history";
-%config = (
- server => "http://paste.debian.net/server.pl",
- user => "anonymous",
- lang => "",
- expires => 86400 * 3, #
- history_file => $history,
- no_get_header => 0,
- hidden => 0,
-);
-my $action = "help";
-my %help = (
- 'add' => "\n"
- ."Usage: $0 add [OPTIONS] [CODE]\n"
- ." Adds a new paste to http://paste.debian.net/\n"
- ." If no code is given on the command line, it will read from\n"
- ." stdin.\n"
- ." Your paste infos are saved to $history\n",
- 'get' => "\n"
- ."Usage: $0 get [OPTIONS] ID\n"
- ." Fetches the paste with id ID from paste.debian.net\n"
- ." To 'download' a paste use something like\n"
- ." $0 get --noheader ID > OUTFILE\n",
- 'del' => "\n"
- ."Usage: $0 del [OPTIONS] ID\n"
- ." Deletes paste with id ID. This must be an ID which you have\n"
- ." pasted before (and is in your history file)\n",
- 'lang' => "\n"
- ."Usage: $0 lang [OPTIONS]\n"
- ." Dumps the list of available languages for syntax highlighting\n",
- 'edit' => "\n"
- ."Usage: $0 edit [OPTIONS] ID\n"
- ." Downloads the paste with id ID, spawns an editor (\$EDITOR)\n"
- ." and sends the edited file as new paste\n",
- 'expire' => "\n"
- ."Usage: $0 expire [OPTIONS] [ID]\n"
- ." Removes the entry ID from history file. If no ID is given,\n"
- ." it removes all entries which are expired.\n",
- # 'help' => "FIXME: help",
- );
-
-if (@ARGV and $ARGV[0] !~ /^-/) {
- $action = shift @ARGV;
-}
-
-&read_settings();
-
-GetOptions(
- "user=s" => \$config{user},
- "server=s" => \$config{server},
- "expires=s" => \$config{expires},
- "lang=s" => \$config{lang},
- "encoding=s"=> \$config{encoding},
- "noheader" => \$config{no_get_header},
- "hidden" => \$config{hidden},
- "help" => sub { pod2usage(-exitval => 0, -verbose => 2) },
- "version" => sub { print "debpaste v$VERSION\n"; exit 0; },
- )
- or pod2usage(-exitval => 1, -verbose => 2);
-
-if ($action and $action eq "help") {
- $action = shift @ARGV
- if (@ARGV and $ARGV[0] !~ /^-/);
- &help($action);
- exit 0;
-}
-
-my $paste = PasteDN->new(%config);
-if ($paste->can($action) and $action ne "new" and $action !~ /^_/) {
- $paste->$action();
-}
-else {
- die "$0: err... unknown action $action...\n";
-}
-
-sub read_settings {
- open SET, $settings
- or return;
- while (defined (my $line = <SET>)) {
- next unless $line =~ /^(\w+):\s+(.*)$/;
- my ($key, $value) = (lc $1, $2);
- unless (exists $config{$key}) {
- warn "$0: unknown config key '$key' found\n";
- next;
- }
- ($config{$key} = $value) =~ s/^\s*(.*?)\s*$/$1/;
- }
- close SET;
-}
-
-sub help {
- my $msg = "";
- ($msg = $help{$_[0]}."\n") if (exists $help{$_[0]});
- pod2usage(-exitval => 0, -verbose => 2, -message => $msg);
-}
-
-###################################################################
-
-package PasteDN;
-use Frontier::Client;
-use Date::Parse;
-use POSIX qw(strftime);
-use File::Temp qw(tempfile);
-use Text::Iconv;
-
-sub new {
- my $me = shift;
- my %args = @_;
- my $type = ref($me) || $me;
- my $self = {};
- bless $self, $type;
- foreach (keys %args) {
- $self->{$_} = $args{$_};
- }
- unless (exists $self->{editor}) {
- $self->{editor} = $ENV{EDITOR} ?
- $ENV{EDITOR} : ($ENV{VISUAL} ?
- $ENV{VISUAL} : "/usr/bin/editor");
- }
- $self->{encoding} = "UTF-8" unless $self->{encoding};
- $self->{expires} += time;
- my %fc = ( url => $self->{server} );
- unless ($self->{noproxy}) {
- $fc{proxy} = $ENV{http_proxy} if $ENV{http_proxy};
- }
- $self->{_service} = Frontier::Client->new(%fc);
- $self;
-}
-
-sub _to_utf8 {
- my ($self,$txt) = @_;
- my $enc = $self->{encoding};
- return $txt if $enc eq "UTF-8";
-
- my $i = eval { Text::Iconv->new($enc, "UTF-8"); };
- die "$0: unsupported encoding $enc\n" if $@;
-
- my $new = $i->convert($txt);
- return $txt unless $new;
- return $new;
-}
-
-sub _error {
- my ($self, $msg) = @_;
- unlink $self->{_tempfile} if $self->{_tempfile};
- die "$0: $msg\n";
-}
-
-sub lang {
- my $self = shift;
- my $rc = $self->{_service}->call("paste.getLanguages");
- die $rc->{statusmessage},"\n" if $rc->{rc};
- ## print $rc->{statusmessage},"\n";
- print "Available syntax highlights:\n";
- foreach (@{$rc->{langs}}) {
- print " $_\n";
- }
-}
-
-sub get {
- my $self = shift;
- my $id = shift @ARGV;
- die "$0: no id given\n" unless $id;
- my $rc = $self->{_service}->call("paste.getPaste", $id);
- die $rc->{statusmessage},"\n" if $rc->{rc};
- # ugly, but dates are ok then...
- # FIXME: probably only works with paste.d.n's timezone:
- my $stime = str2time($rc->{submitdate}, "CET") - 3600;
- my $sub_date = strftime('%Y-%m-%d %H:%M:%S', localtime $stime);
- my $exp_date = strftime('%Y-%m-%d %H:%M:%S',
- localtime($stime + $rc->{expiredate}));
- unless ($self->{no_get_header}) {
- print "User: ", $rc->{submitter}, "\n",
- "Date: $sub_date\n",
- "Expires: $exp_date\n",
- "---------------------------------\n";
- }
- print $rc->{code},"\n";
-}
-
-sub edit {
- my $self = shift;
- my $id = shift @ARGV;
- die "$0: no id given\n" unless $id;
-
- my $rc = $self->{_service}->call("paste.getPaste", $id);
- die $rc->{statusmessage},"\n" if $rc->{rc};
- my $new = $self->_spawn_editor($rc->{code});
- if (!$new or ($new eq $rc->{code})) {
- print "$0: not changed, aborting...\n";
- exit 0;
- }
- ## FIXME: text from paste.debian.net is probably UTF-8
- ## $new = $self->_to_utf8($new);
- $rc = $self->{_service}->call("paste.addPaste", $new,
- $self->{user},
- $self->{expires} - time,
- $self->{lang},
- $self->{hidden});
- die $rc->{statusmessage},"\n"
- if $rc->{rc};
- print $rc->{statusmessage},"\n";
- print "To delete this entry, use: $0 del $rc->{id}\n";
- $self->_save_entry($rc);
-}
-
-sub _spawn_editor {
- my ($self, $txt) = @_;
- my $fh;
-
- ($fh, $self->{_tempfile}) = tempfile("debpaste.XXXXXX", DIR => "/tmp");
-
- $self->_error("Could not create temp file: $!")
- unless ($fh and $self->{_tempfile});
- print $fh $txt or $self->_error("Could not print to tempfile: $!");
- close $fh or $self->_error("Failed to close tempfile: $!");
-
- if (system($self->{editor}, $self->{_tempfile}) != 0) {
- $self->_error("failed to execute: $!")
- if $? == -1;
-
- $self->_error(sprintf('child died with signal %d, %s coredump',
- ($? & 127), ($? & 128) ? 'with' : 'without'))
- if $? & 127;
-
- $self->_error(sprintf('editor exited with value %d', $? >> 8));
- }
-
- open FH, $self->{_tempfile}
- or $self->_error("Failed to open temp file: $!");
- {
- local $/ = undef;
- $txt = <FH>;
- };
- close FH;
- unlink $self->{_tempfile};
- return $txt;
-}
-
-sub delete { $_[0]->del(); }
-sub del {
- my $self = shift;
- my %entry = ();
- my $id = shift @ARGV;
- die "$0: no id given\n" unless $id;
- open FILE, $self->{history_file}
- or die "$0: failed to open history file: $!\n";
- {
- local $/ = "\n\n";
- while (<FILE>) {
- s#^[\n\s]+##ms;
- s#[\n\s]+$##ms;
- next unless $_;
- %entry = map { /^(\S+):\s*(.*?)\s*$/;
- ($1, $2 ? $2 : "") } split /\n/, $_;
- last if ($entry{Entry} and $entry{Entry} eq $id);
- %entry = ();
- }
- }
- die "$0: Entry for $id not found...\n" unless $entry{Entry};
- die "$0: No Digest for $id\n" unless $entry{Digest};
- die "$0: Entry $id expired at ", scalar(localtime($entry{Expires})),"\n"
- if ($entry{Expires} and $entry{Expires} < time);
-
- my $rc = $self->{_service}->call("paste.deletePaste", $entry{Digest});
- die $rc->{statusmessage},"\n" if $rc->{rc};
- print $rc->{statusmessage},"\n",
- "$0: deleted paste id ",$rc->{id},"\n";
- $self->_expire($rc->{id});
-}
-
-sub expire {
- my $self = shift;
- my $id = shift @ARGV;
- $self->_expire($id);
-}
-
-sub _expire {
- my ($self, $id) = @_;
- my @history = ();
- my %entry;
- my @ids = ();
- open FILE, $self->{history_file}
- or return;
- {
- local $/ = "\n\n";
- while (<FILE>) {
- s#^[\n\s]+##ms;
- s#[\n\s]+$##ms;
- next unless $_;
- %entry = map { /^(\S+):\s*(.*?)\s*$/;
- ($1, $2 ? $2 : "") } split /\n/, $_;
-
- ## print "ID: $entry{Entry}\n";
- if ($id) {
- if ($entry{Entry} and $entry{Entry} eq $id) {
- push @ids, $entry{Entry};
- next;
- }
- }
- elsif ($entry{Expires} and $entry{Expires} < time) {
- push @ids, $entry{Entry};
- next;
- }
- push @history, { %entry };
- }
- }
- close FILE;
- open FILE, ">", $self->{history_file}
- or die "$0: Failed to open history file: $!\n";
- foreach my $h (@history) {
- foreach (keys %{$h}) {
- next unless $_;
- print FILE "$_: $h->{$_}\n";
- }
- print FILE "\n";
- }
- close FILE or die "$0: failed to write: $!\n";
- print "$0: expired ", scalar(@ids), " entries from history",
- (@ids ? ": ".join(", ", @ids) : ""), "\n";
-}
-
-sub add {
- my $self = shift;
-
- my $code = undef;
- if (@ARGV) {
- $code = join("\n", @ARGV);
- }
- else {
- { local $/ = undef; $code = <STDIN>; }
- }
- die "$0: no code given\n"
- unless $code;
-
- $code = $self->_to_utf8($code);
- my $rc = $self->{_service}->call("paste.addPaste", $code,
- $self->{user},
- $self->{expires} - time,
- $self->{lang},
- $self->{hidden});
- die $rc->{statusmessage},"\n"
- if $rc->{rc};
- print $rc->{statusmessage},"\n";
- print "To delete this entry, use: $0 del $rc->{id}\n";
- $self->_save_entry($rc);
-}
-
-sub _save_entry {
- my ($self, $rc) = @_;
- # return unless $self->{save_pastes};
- my $file = $self->{history_file}
- or return;
- open FILE, ">>", $file or die "$0: failed to open $file: $!\n";
- seek FILE, 0, 2 or die "$0: Failed to seek: $!\n";
- print FILE "Server: ", $self->{server}, "\n",
- "Entry: ", $rc->{id}, "\n",
- "Lang: ", $self->{lang}, "\n",
- "Expires: ", $self->{expires},"\n",
- "Hidden: ", $self->{hidden}, "\n",
- "Digest: ", $rc->{digest}, "\n\n"
- or die "$0: Failed to save paste: $!\n";
- close FILE or die "$0: Failed to save paste: $!\n";
-}
-
-=head1 DOWNLOAD
-
-L<http://ankh-morp.org/code/paste-dn/debpaste> or
-L<SVN|http://svn.ankh-morp.org:8080/tools/paste-dn/>
-
-=head1 NOTES
-
-Renamed to C<debpaste> at Rev. 20
-
-=head1 AUTHOR
-
-Hanno Hecker <vetinari@ankh-morp.org>
-
-=cut
-
-
-# vim: ts=4 sw=4 expandtab syn=perl
diff --git a/bin/doccheckin b/bin/doccheckin
index 7c09e819..fe2553e5 100755
--- a/bin/doccheckin
+++ b/bin/doccheckin
@@ -19,8 +19,8 @@ git add howm/*.org howm/*/*.org archive/howm/archive.org \
papers/*.org papers/*.md papers/*.bib \
newpapers/*/*.org \
dissert/*.md pres/*.md letters/*.tex \
- howm/.howm-keys emacs-abbrevs emacs-bookmarks \
- News/*.SCORE emacs-diary archive/emacs-diary-* \
+ howm/.howm-keys abbrevs bookmarks \
+ News/*.SCORE diary archive/diary-* \
|| true
# this command should never fail and stop mr
diff --git a/bin/locmaint b/bin/locmaint
index 4f28593f..9bdce9ef 100755
--- a/bin/locmaint
+++ b/bin/locmaint
@@ -106,7 +106,7 @@ our @remote_annexes = (
{ origin => "athenag:annex.git", homedir => "lib/annex", lazy => 1 },
{ origin => "athenag:annex19.git", homedir => "annex" },
{ origin => "athenag:libpriv.git", homedir => "lib/priv" },
- { origin => "athena:wikiannex", homedir => "lib/wikiannex" },
+ { origin => "git@git.spwhitton.name:wikiannex", homedir => "lib/wikiannex" },
{ origin => "athenap:athpriv", homedir => "src/athpriv", synconlyannex => 1 });
for (getpwuid($<) . '@' . `hostname -f`) {
@@ -394,15 +394,16 @@ sub do_coldbkup {
# point, to grab metadata non-recursively
}
- # athena main repos
- mkdir catfile($gitbk, "athena"); # compat dirname
+ # git.spwhitton.name main repos
+ mkdir catfile($gitbk, "athena"); # use 'athena' for backup drive compat
my @athena_repos = map {
if (m|^/srv/git/repositories/priv/(.+)\.git$|) {
{ uri => "athenap:$1", dir => "priv/$1.git" }
} elsif (m|^/srv/git/repositories/(.+)\.git$|) {
{ uri => "athena:$1", dir => "$1.git" }
}
- } `ssh demeter find /srv/git/repositories -name "*.git" -type d 2>/dev/null`;
+ } `ssh spwhitton\@git.spwhitton.name\\
+ find /srv/git/repositories -name "*.git" -type d 2>/dev/null`;
backup_repo($_->{uri}, catfile($gitbk, "athena", $_->{dir}))
for @athena_repos;
@@ -410,7 +411,7 @@ sub do_coldbkup {
mkdir catfile($gitbk, "athena_gcrypt");
my @gcrypt_repos
= map { m|^local/gcrypt/(.+)$|; { uri => "athenag:$1", dir => "$1" } }
- `ssh athena find local/gcrypt -name "*.git" -type d`;
+ `ssh spwhitton\@athena find local/gcrypt -name "*.git" -type d`;
chomp @gcrypt_repos;
backup_repo($_->{uri}, catfile($gitbk, "athena_gcrypt", $_->{dir}))
for @gcrypt_repos;
@@ -473,7 +474,7 @@ sub do_workstation_duplicity {
$full = prompt_yn("Run full duply backup? (requires time & bandwidth)")
if $full;
- system "duply $profile " . ($full ? "full+purgeFull --force" : "incr");
+ system "duply", $profile, ($full ? "full+purgeFull" : "incr"), "--force";
}
sub do_sysmaint {
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/bin/reprepro-rebuilder b/bin/reprepro-rebuilder
index 4007b0ed..354cd52f 100755
--- a/bin/reprepro-rebuilder
+++ b/bin/reprepro-rebuilder
@@ -33,7 +33,7 @@ use Getopt::Long;
use Term::UI;
use File::chdir;
-our $repo = "$ENV{HOME}/lib/athena-apt";
+our $repo = "$ENV{HOME}/lib/athenet-apt";
our $prefix = "athena";
our @dists = qw(bookworm bookworm-backports unstable experimental);
our $bpo_dist = "bookworm-backports";
@@ -186,7 +186,8 @@ sub build {
my $build_debs = sub {
my %opts = shift->%*;
- my @args = ("--no-run-lintian", "-d", $dist);
+ my @args = ("--no-run-piuparts", "--no-run-lintian",
+ "--no-run-autopkgtest", "-d", $dist);
push @args, $opts{all} ? "--arch-all" : "--no-arch-all";
for (@_) {
no autodie;
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-----
diff --git a/lib-src/git/includes b/lib-src/git/includes
index 6f8114af..8fb50d3d 100644
--- a/lib-src/git/includes
+++ b/lib-src/git/includes
@@ -4,8 +4,8 @@
path = ~/src/dotfiles/lib-src/git/doc
[includeIf "gitdir:~/lib/annex/"]
path = ~/src/dotfiles/lib-src/git/lib/annex
-[includeIf "gitdir:~/lib/athena-apt/"]
- path = ~/src/dotfiles/lib-src/git/lib/athena-apt
+[includeIf "gitdir:~/lib/athenet-apt/"]
+ path = ~/src/dotfiles/lib-src/git/lib/athenet-apt
[includeIf "gitdir:~/lib/podcasts/"]
path = ~/src/dotfiles/lib-src/git/lib/podcasts
[includeIf "gitdir:~/lib/priv/"]
diff --git a/lib-src/git/lib/athena-apt b/lib-src/git/lib/athenet-apt
index ff09fb6f..696e97ab 100644
--- a/lib-src/git/lib/athena-apt
+++ b/lib-src/git/lib/athenet-apt
@@ -14,7 +14,7 @@
[push]
default = matching
-[remote "demeter"]
+[remote "htdocs"]
annex-tracking-branch = master
[remote "origin"]
diff --git a/lib-src/mr/config b/lib-src/mr/config
index 6e43ee0e..72600ec6 100644
--- a/lib-src/mr/config
+++ b/lib-src/mr/config
@@ -187,7 +187,7 @@ autoci =
pre_update = mr autoci
[src/athpriv]
-checkout = git clone demeterp:athpriv
+checkout = git clone spwp:athpriv
pre_update = on athena || git annex sync origin athenah
pre_push = on athena || git annex sync --content origin athenah
post_update = hstow restow ~/src/athpriv
@@ -214,7 +214,7 @@ fixups =
####################################################################
[doc]
-checkout = git clone demeterp:doc doc
+checkout = git clone spwp:doc doc
update = git pull --rebase=false --no-edit "$@"
autoci = doccheckin
pre_update = win32 || doccheckin
@@ -225,17 +225,17 @@ post_checkout = git utime
skip = ! mine
[src/wiki]
-checkout = git clone demeter:wiki
+checkout = git clone spw:wiki
skip = ! mine
[lib/realloc]
-checkout = git clone demeterp:realloc
+checkout = git clone spwp:realloc
skip = ! mine
####################################################################
[lib/radicale]
-checkout = git clone demeterp:radicale radicale
+checkout = git clone spwp:radicale radicale
skip = ! on spwhitton@athena
[public_html]
@@ -266,26 +266,28 @@ push = git annex sync --content cloud origin
skip = lazy
[lib/wikiannex]
-checkout = git clone demeter:wikiannex
+# legacy url for the origin remote
+checkout = git clone git@git.spwhitton.name:wikiannex
post_checkout = cd wikiannex; git annex init
update = git annex sync --no-content
push = git annex sync --content
-fixups = ! on demeter || git annex adjust --hide-missing --unlock
+fixups = ! on leto || git annex adjust --hide-missing --unlock
skip = lazy
[lib/podcasts]
-checkout = git clone demeterp:podcasts
+checkout = git clone spwp:podcasts
post_checkout = cd podcasts; git annex init
update = ./update-and-sync
push = git annex --no-content sync
skip = lazy
-[lib/athena-apt]
-checkout = git clone demeter:athena-apt
+[lib/athenet-apt]
+# legacy url for the origin remote
+checkout = git clone git@git.spwhitton.name:athena-apt athenet-apt
post_checkout =
- cd athena-apt
+ cd athenet-apt
git annex init --version=7
- git annex enableremote demeter rsyncurl=demeter:/srv/www/debian
+ git annex enableremote htdocs rsyncurl=silentflame.com:/srv/www/debian
git annex get .
update = git annex sync --no-content
skip = lazy
@@ -293,10 +295,10 @@ skip = lazy
push =
git annex add
git annex unlock db
- git annex sync --content demeter
+ git annex sync --content htdocs
git annex sync origin
- ssh demeter find /srv/www/debian -type f -exec chmod 644 '{}' +
- ssh demeter find /srv/www/debian -type d -exec chmod 755 '{}' +
+ ssh silentflame.com find /srv/www/debian -type f -exec chmod 644 '{}' +
+ ssh silentflame.com find /srv/www/debian -type d -exec chmod 755 '{}' +
# The git-diff-files(1) call in ~/src/dotfiles/bin/git-is-clean fails in v7
# git-annex repos with unlocked empty files, which this repo often has: empty
@@ -332,9 +334,9 @@ isclean =
# This branch doesn't usually need to be pushed anywhere, but if we do
# need to push it somewhere for backup purposes, we execute
#
-# % git config branch."$(hostname -s)".pushRemote demeter
+# % git config branch."$(hostname -s)".pushRemote spwhitton
#
-# and then 'mr push' will force push it to demeter.
+# and then 'mr push' will force push it to git.spwhitton.name.
#
# "athena/unstable" branch:
#
@@ -356,7 +358,7 @@ isclean =
#
# % cd ~/src/deb/emacs-snapshot
# % debian/merge-snapshot
-# % dgit sbuild --no-run-lintian
+# % dgit sbuild
# % cp ../emacs-snapshot_29~git202*amd64.deb<TAB> ~/local/develacc/tmp
# % sudo virsh start develacc.melete.silentflame.com
# % cd /ssh:root@develacc:/home/spwhitton/tmp
@@ -374,10 +376,10 @@ isclean =
#
# If need to back out before reprepro-rebuilder:
# % cd ~//src/deb/emacs-snapshot
-# % git reset --hard demeter/athena/unstable
+# % git reset --hard spwhitton/athena/unstable
#
# It is important to test local installability of the new .deb, probably
-# in develacc or a sid chroot, before adding to demeter-apt, because
+# in develacc or a sid chroot, before adding to athenet-apt, because
# running the rebased "melete" branch doesn't detect any byte compilation
# issues against my current selection of elpa-* packages.
#
@@ -394,7 +396,7 @@ checkout = git clone https://git.savannah.gnu.org/git/emacs.git trunk
post_clean = ./autogen.sh autoconf
post_checkout =
cd trunk
- git remote add -f demeter demeter:emacs ||:
+ git remote add -f spwhitton spw:emacs ||:
git -c fetch.fsckObjects=false \
remote add -f debian https://salsa.debian.org/rlb/deb-emacs.git/ ||:
./autogen.sh all
@@ -405,8 +407,8 @@ skip = lazy
checkout = git_worktree_checkout "$HOME/src/emacs/trunk" \
-b "$hostname" --no-track \
"$(if [ -n "$(git -C $HOME/src/emacs/trunk \
- for-each-ref '[r]efs/remotes/demeter/'"$hostname")" ]
- then echo demeter/"$hostname"; else echo master; fi)"
+ for-each-ref '[r]efs/remotes/spwhitton/'"$hostname")" ]
+ then echo spwhitton/"$hostname"; else echo master; fi)"
post_clean = ./autogen.sh autoconf
post_checkout = cd primary; ./autogen.sh autoconf
# We don't have the "$(hostname -s)" branch's upstream set to origin/master to
@@ -438,7 +440,7 @@ skip = lazy || git_worktree_skip
[src/deb/emacs-snapshot]
checkout = git_worktree_checkout "$HOME/src/emacs/trunk" \
- -b athena/unstable demeter/athena/unstable
+ -b athena/unstable spwhitton/athena/unstable
skip = ! workstation || git_worktree_skip
[src/deb/emacs]
@@ -478,12 +480,12 @@ skip = lazy
checkout = git clone salsa:dgit-team/dgit
post_checkout =
cd dgit
- git remote add -f demeter demeter:dgit ||:
+ git remote add -f spwhitton spw:dgit ||:
dgit setup-new-tree
skip = lazy
[src/p5-Git-Annex]
-checkout = git clone demeter:p5-Git-Annex
+checkout = git clone spw:p5-Git-Annex
post_checkout =
cd p5-Git-Annex
git remote \
@@ -492,7 +494,7 @@ post_checkout =
skip = lazy
[src/p5-API-GitForge]
-checkout = git clone demeter:p5-API-GitForge
+checkout = git clone spw:p5-API-GitForge
post_checkout =
cd p5-API-GitForge
git remote \
diff --git a/scripts/desktop/sway-ftp-master b/scripts/desktop/sway-ftp-master
index 0a36feee..bd74cb95 100755
--- a/scripts/desktop/sway-ftp-master
+++ b/scripts/desktop/sway-ftp-master
@@ -6,13 +6,14 @@
#
# GPL-3 or later
+# BROKEN: Needs updating for transition from Local::Desktop to papersway
+
use 5.032;
use strict;
use warnings;
use lib "$ENV{HOME}/src/dotfiles/perl5";
use JSON;
-use Local::Desktop;
sub walk_tree (&$) {
my ($pred, $tree) = @_;
diff --git a/scripts/git/sort-into-yyyy b/scripts/git/sort-into-yyyy
index 46939e91..c3e4be98 100755
--- a/scripts/git/sort-into-yyyy
+++ b/scripts/git/sort-into-yyyy
@@ -6,7 +6,7 @@ use Git::Wrapper;
$git = Git::Wrapper->new(getcwd);
-open $fh, "<", "$ENV{HOME}/doc/emacs-org-agenda-files";
+open $fh, "<", "$ENV{HOME}/doc/org-agenda-files";
for (<$fh>) {
chomp;
s{^~/doc/}{};