diff options
-rw-r--r-- | .config/gtk-3.0/settings.ini | 3 | ||||
-rw-r--r-- | .config/mutt/muttrc | 2 | ||||
-rwxr-xr-x | .config/notmuch/default/hooks/post-new | 2 | ||||
-rw-r--r-- | .config/sway/config | 450 | ||||
-rw-r--r-- | .debpaste.rc | 3 | ||||
-rw-r--r-- | .emacs.d/early-init.el | 2 | ||||
-rw-r--r-- | .emacs.d/eshell/alias | 3 | ||||
-rw-r--r-- | .emacs.d/init.el | 672 | ||||
-rw-r--r-- | .gtkrc-2.0 | 2 | ||||
-rw-r--r-- | .mbsyncrc | 116 | ||||
-rw-r--r-- | .shinit | 4 | ||||
-rw-r--r-- | archive/.config/i3/config (renamed from .config/i3/config) | 2 | ||||
-rwxr-xr-x | archive/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-x | archive/scripts/desktop/dmenu_ssh (renamed from scripts/desktop/dmenu_ssh) | 0 | ||||
-rwxr-xr-x | archive/scripts/desktop/dmenu_window (renamed from scripts/desktop/dmenu_window) | 0 | ||||
-rwxr-xr-x | archive/scripts/desktop/i3-startup-always (renamed from scripts/desktop/i3-startup-always) | 0 | ||||
-rwxr-xr-x | bin/debpaste | 542 | ||||
-rwxr-xr-x | bin/movemymail | 4 | ||||
-rw-r--r-- | lib-src/certs/fastmail.crt | 41 | ||||
-rwxr-xr-x | scripts/desktop/sway-ftp-master | 3 |
21 files changed, 645 insertions, 1206 deletions
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/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/.emacs.d/early-init.el b/.emacs.d/early-init.el index a3793e15..08a4aa02 100644 --- a/.emacs.d/early-init.el +++ b/.emacs.d/early-init.el @@ -1,6 +1,6 @@ ;;; early-init.el --- frames conf. -*- lexical-binding:t;no-byte-compile:t -*- -;; Copyright (C) 2020-2022 Sean Whitton <spwhitton@spwhitton.name> +;; Copyright (C) 2020-2023 Sean Whitton <spwhitton@spwhitton.name> ;; ;; This file is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by diff --git a/.emacs.d/eshell/alias b/.emacs.d/eshell/alias index 5e66ab3b..3016144c 100644 --- a/.emacs.d/eshell/alias +++ b/.emacs.d/eshell/alias @@ -1,7 +1,7 @@ alias grep-queued { cd /ssh:ssh.upload.debian.org: && *grep $* /srv/upload.debian.org/queued/run/log } alias grep-dak { cd /ssh:ftp-master.debian.org: && *grep $* /srv/ftp-master.debian.org/log/current } alias push-develacc-dotfiles-branch git push -f origin develacc/develacc-"${hostname}":develacc-"${hostname}" -alias sbuild-prerelease sbuild --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn' $* +alias sbuild-prerelease sbuild --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn' $* --no-run-lintian alias sbuild-lts quilt pop -a; git is-clean ':!debian/patches/' && sbuild --no-clean-source --no-run-lintian $* alias dpkg-bp-lts quilt pop -a; git is-clean && dpkg-buildpackage -S -nc --force-sign $* alias dpkg-buildpackage-lts dpkg-bp-lts $* @@ -18,6 +18,7 @@ alias afsid apt-file --filter-suites unstable $* alias grepcopy grep -Eir '(copyright|©)' * alias pdfwords pdftotext "$1" - | wc -w alias dlp lp -o sides=two-sided-long-edge $* +alias pdd dd bs=4M status=progress conv=fdatasync $* alias tail-dak { cd /ssh:ftp-master.debian.org:/srv/ftp-master.debian.org/log && tail -f current } alias tail-queued { cd /ssh:ssh.upload.debian.org:/srv/upload.debian.org/queued/run && tail -f log } alias package-plan-unpack ~/src/dotfiles/scripts/debian/package-plan-unpack "$1"; cd "/tmp/$1" diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 87dde3cd..fb1e49d8 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -23,11 +23,6 @@ ;; matching ~/.emacs.d/*.el, since the "spw-" and "spw--" prefixes would be ;; for a file called "spw.el" with a defined API, providing an `spw' feature. ;; -;; Prefer using the customise interface for variables, faces and enabling and -;; disabling global minor modes, except when we want to associate an extended -;; comment to a number of settings (typically we use the customise interface's -;; facility for adding comments for only short comments). -;; ;; Aim for compatibility with the version of Emacs included in Debian stable. ;; ;; Bind only key sequences reserved for users or which are already bound to @@ -82,21 +77,32 @@ ;;;; Customisation & appearance -(custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. +;; The customisation system is additionally used to save safe local variable +;; values, SSL certificate overrides etc. (cf. `customize-push-and-save'). +;; Most of these should not be committed to git: they're often host-specific, +;; usually only relevant for a short time, and sometimes private. +;; So we use a disposable, local custom file, and `custom-theme-set-faces', +;; `customize-set-variable' and `custom-theme-set-variables' in this file. +;; (Re `setopt' vs. `customize-set-variable': former is for when we're making +;; a dynamic change that is not just host-specific but session-specific.) +(load (setq custom-file (expand-file-name "custom" user-emacs-directory)) + 'noerror 'nomessage 'nosuffix) + +(custom-theme-set-faces + 'user '(default ((t (:weight medium :height 105 :foundry "SRC" :family "Hack")))) + '(fixed-pitch ((t (:foundry "SRC" :family "Hack")))) + '(variable-pitch ((t (:weight regular :height 120 + :foundry "bitstream" :family "Bitstream Charter")))) + ;; We want to handle the `variable-pitch'/`variable-pitch-text' distinction + ;; using `spw/maybe-scale-basic-faces' instead. + '(variable-pitch-text ((t (:inherit variable-pitch)))) + '(comint-highlight-prompt ((t (:inherit minibuffer-prompt :weight bold)))) '(fill-column-indicator ((t (:background "light gray")))) - '(fixed-pitch ((t (:foundry "SRC" :family "Hack")))) - '(org-code ((t (:inherit (shadow fixed-pitch))))) - '(org-date ((t (:inherit fixed-pitch :foreground "Purple" :underline t)))) - '(org-verbatim ((t (:inherit (shadow fixed-pitch))))) - '(region ((t (:extend t :background "#EECD82"))) nil "Colour is from the Lucid build.") - '(variable-pitch ((t (:weight regular :height 120 :foundry "bitstream" :family "Bitstream Charter")))) - '(variable-pitch-text ((t (:inherit variable-pitch))) nil "Handled by `spw/maybe-scale-basic-faces' instead.")) + + ;; The colour is from the Lucid build of Emacs. + '(region ((t (:extend t :background "#EECD82"))))) ;; Set background colour but don't touch text terminals. (dolist (ws '(x pgtk w32 ns)) @@ -109,13 +115,13 @@ `(,ws . ((background-color . ,(pcase (daemonp) - ('nil "honeydew") ("gdbmacs" "linen") (_ "#FFFFF6"))))))) + ('nil "#F0FFF0") ("gdbmacs" "#F5F5DC") (_ "#FFFFF6"))))))) (defun spw/maybe-scale-basic-faces (frame) - "Entry for `window-size-change-functions' to increase font sizes -from those set by `custom-set-faces' for frames on wide monitors, -except where doing so would itself prevent fitting two 80-column -windows side-by-side in the frame." + "Entry for `window-size-change-functions' to increase font sizes, +relative to those set by the call to `custom-theme-set-faces' above, for +frames on wide monitors, except where doing so would itself prevent fitting +two 80-column windows side-by-side in the frame." (when (display-graphic-p frame) (let ((wide-monitor-p (> (cadddr (assoc 'geometry (frame-monitor-attributes frame))) @@ -167,32 +173,17 @@ windows side-by-side in the frame." (set-terminal-parameter nil 'background-mode 'light))) (add-hook 'tty-setup-hook #'spw/set-tmux-background-mode) -(custom-set-variables - ;; custom-set-variables was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. +(custom-theme-set-variables + 'user '(Man-notify-method 'aggressive) '(after-save-hook '(executable-make-buffer-file-executable-if-script-p)) - '(appt-display-diary nil) - '(appt-display-interval 6) '(async-shell-command-buffer 'rename-buffer) '(auth-source-save-behavior nil) '(auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-saves/" t))) '(backup-by-copying-when-linked t) '(backup-directory-alist '(("." . "~/.emacs.d/backups/"))) - '(bongo-default-directory "~/annex/music/") - '(bongo-insert-album-covers t) - '(bongo-insert-whole-directory-trees t) - '(bongo-mode-line-indicator-mode nil) - '(bongo-prefer-library-buffers nil) '(c-default-style "linux") '(calc-kill-line-numbering nil) - '(calendar-date-display-form - '((format "%s-%.2d-%.2d %.3s" year (string-to-number month) - (string-to-number day) dayname))) - '(calendar-date-style 'iso) - '(calendar-week-start-day 1) '(column-number-mode t) '(comint-prompt-read-only t) '(compilation-scroll-output 'first-error) @@ -202,223 +193,66 @@ windows side-by-side in the frame." '(copy-region-blink-delay 0) '(copyright-names-regexp "Sean Whitton") '(copyright-year-ranges t) - '(cperl-close-paren-offset -4 nil nil "See `cperl-indent-parens-as-block'.") - '(cperl-indent-level 4) - '(cperl-indent-parens-as-block t nil nil "Makes it easier to use longer names for subroutines.") - '(cperl-lineup-step 1) '(cursor-type 'box) - '(cycle-spacing-actions '(just-one-space) nil nil "Restore Emacs 28 behaviour of M-SPC.") + + ;; C-u M-\ to delete only before point, M-SPC M-SPC to delete only after. + '(cycle-spacing-actions '(just-one-space (delete-space-after -))) + '(dabbrev-case-fold-search t) - '(diary-file "~/doc/emacs-diary") - '(diary-list-entries-hook '(diary-include-other-diary-files diary-sort-entries)) - '(diary-mark-entries-hook '(diary-mark-included-diary-files)) - '(dired-clean-up-buffers-too nil) - '(dired-dwim-target t) - '(dired-free-space 'separate) - '(dired-isearch-filenames t) - '(dired-listing-switches "--group-directories-first -alh") - '(dired-omit-files "\\`[.]?#\\|\\`[.][.]?\\'\\|\\`\\.git\\'") - '(dired-recursive-copies 'always) '(display-fill-column-indicator-character 32) '(ediff-split-window-function 'split-window-horizontally) '(eldoc-minor-mode-string nil) '(emacs-lisp-docstring-fill-column 75) '(enable-recursive-minibuffers t) - '(eshell-cmpl-cycle-completions nil nil nil "This makes Eshell completions a bit more like bash's.") - '(eshell-cmpl-ignore-case t) - '(eshell-hist-ignoredups 'erase) - '(eshell-history-append t) - '(eshell-history-size 5000) - '(eshell-save-history-on-exit nil) - '(eshell-visual-commands - '("vi" "screen" "tmux" "top" "htop" "less" "more" "mutt" "locmaint" "gen-DSA" - "gen-DLA" "gen-ELA")) '(fill-column 78) - '(font-lock-maximum-decoration '((lisp-mode . 1) (consfigurator-lisp-mode . 1) (t . t))) + '(font-lock-maximum-decoration + '((lisp-mode . 1) (consfigurator-lisp-mode . 1) (t . t))) '(gc-cons-threshold 16777216) '(gdb-many-windows t) - '(gdb-show-main t nil nil "This is helpful when gdb-many-windows is turned off.") - '(git-rebase-confirm-cancel nil) + + ;; This is helpful when gdb-many-windows is turned off. + '(gdb-show-main t) + '(global-so-long-mode t) - '(gnus-article-skip-boring t) - '(gnus-auto-center-summary nil) - '(gnus-auto-select-next 'slightly-quietly) - '(gnus-buttonized-mime-types - '("text/x-\\(?:diff\\|patch\\)" "multipart/\\(?:alternative\\|signed\\)")) - '(gnus-directory "~/local/News/") - '(gnus-extra-headers '(To Cc List-Id)) - '(gnus-gcc-mark-as-read t) - '(gnus-global-score-files '("~/doc/News/")) - '(gnus-interactive-exit 'quiet) - '(gnus-kill-files-directory "~/src/athpriv/News/") - '(gnus-kill-summary-on-exit t nil nil "Would prefer nil but t seems advisable for notmuch groups.") - '(gnus-large-ephemeral-newsgroup 8000) - '(gnus-large-newsgroup 8000) - '(gnus-mark-article-hook '(spw/gnus-mark-article-hook)) - '(gnus-message-archive-group "sent") - '(gnus-message-archive-method '(nnmaildir "fmail" (directory "~/.fmail/"))) - '(gnus-permanently-visible-groups "^nnmaildir\\+fmail:\\(?:notes\\|sent\\)$") - '(gnus-read-newsrc-file nil) - '(gnus-refer-thread-use-search '(("nnmaildir:fmail"))) - '(gnus-save-killed-list - "^\\(?:[^n]\\|n[^n]\\|nn[^s]\\|nns[^e]\\|nnse[^l]\\|nnsel[^e]\\|nnsele[^c]\\|nnselec[^t]\\|nnselect[^:]\\)") - '(gnus-save-newsrc-file nil) - '(gnus-search-default-engines '((nnmaildir . notmuch))) - '(gnus-search-notmuch-remove-prefix "~/.fmail/") - '(gnus-secondary-select-methods '((nnmaildir "fmail" (directory "~/.fmail/")))) - '(gnus-sum-thread-tree-false-root "") - '(gnus-sum-thread-tree-indent " ") - '(gnus-sum-thread-tree-leaf-with-other "├► ") - '(gnus-sum-thread-tree-root "") - '(gnus-sum-thread-tree-single-leaf "╰► ") - '(gnus-sum-thread-tree-vertical "│") - '(gnus-summary-line-format "%U%R%z %(%12&user-date; %*%-23,23f%) %B%s\12") - '(gnus-summary-mode-line-format "Gnus: %u&summary;%g [%A] %Z") - '(gnus-summary-thread-gathering-function 'gnus-gather-threads-by-references) - '(gnus-suppress-duplicates t) - '(gnus-thread-sort-functions - '(gnus-thread-sort-by-number gnus-thread-sort-by-total-score)) - '(gnus-topic-display-empty-topics nil) - '(gnus-update-message-archive-method t) - '(gnus-user-date-format-alist - '((32042 . "%2l:%M%#p") (118823 . "Yest %2l:%M%#p") (604800 . "%a %2l:%M%#p") - (16102447 . "%d %B") (t . "%Y-%b-%d"))) - '(haskell-indentation-layout-offset 4) - '(haskell-indentation-left-offset 4) '(help-window-keep-selected t) - '(holiday-bahai-holidays nil) - '(holiday-hebrew-holidays nil) - '(holiday-islamic-holidays nil) - '(howm-directory "~/doc/howm/") - '(howm-file-name-format "%Y/%Y-%m-%d-%H%M.org") - '(howm-keyword-file "~/doc/howm/.howm-keys") - '(howm-view-use-grep t) - '(icomplete-hide-common-prefix nil) - '(icomplete-in-buffer t) - '(icomplete-mode t) - '(icomplete-show-matches-on-no-input t) - '(icomplete-tidy-shadowed-file-names t) '(imenu-auto-rescan t) + '(inferior-lisp-program "sbcl") '(initial-major-mode 'spw/scratch-lisp-interaction-mode) '(kill-read-only-ok t) - '(log-edit-hook - '(log-edit-insert-message-template log-edit-insert-cvs-template - log-edit-insert-changelog - spw/log-edit-show-diff) nil nil "Drop log-edit-show-files to avoid its window becoming most recently used for C-x o.") - '(mail-envelope-from 'header nil nil "Bypass MTA rewriting user@localhost.") - '(mail-specify-envelope-from t nil nil "Bypass MTA rewriting user@localhost.") + + ;; Bypass MTA rewriting user@localhost. + '(mail-envelope-from 'header) + '(mail-specify-envelope-from t) + '(mail-user-agent 'gnus-user-agent) '(mailscripts-detach-head-from-existing-branch 'ask) '(mailscripts-extract-patches-branch-prefix "mail/") '(mailscripts-project-library 'project) - '(major-mode-remap-alist '((perl-mode . cperl-mode)) nil nil "cperl-mode doesn't try to indent lines within a POD, and usefully font locks scalars that are members of hashes and arrays.") - '(make-pointer-invisible t nil nil "Works only for self-insert chars and undone by changes in window manager focus, but less annoying than `mouse-avoidance-mode'.") - '(message-auto-save-directory "~/tmp/" nil nil "So locmaint will catch them.") - '(message-citation-line-format "On %a %d %b %Y at %I:%M%p %Z, %N wrote:\12") - '(message-citation-line-function 'message-insert-formatted-citation-line) - '(message-forward-as-mime nil nil nil "For compatibility.") - '(message-forward-before-signature nil nil nil "For compatibility.") - '(message-forward-included-headers - '("^From:" "^Subject:" "^Date:" "^To:" "^Cc:" "^Message-ID:") nil nil "For compatibility.") - '(message-ignored-resent-headers - "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:\\|^\\(?:X-\\)?Content-Length:\\|^X-UIDL:\\|^X-TUID:\\|^\\(?:X-\\)?Status:\\|^Lines:") - '(message-make-forward-subject-function '(message-forward-subject-fwd) nil nil "For compatibility.") - '(message-sendmail-envelope-from 'header nil nil "Bypass MTA rewriting user@localhost.") - '(message-wash-forwarded-subjects t) + + ;; `cperl-mode' doesn't try to indent lines within a POD, and usefully font + ;; locks scalars that are members of hashes and arrays. + '(major-mode-remap-alist '((perl-mode . cperl-mode))) + + ;; Works only for self-insert chars and undone by changes in window manager + ;; focus, but less annoying than `mouse-avoidance-mode'. + '(make-pointer-invisible t) + '(minibuffer-follows-selected-frame nil) - '(mm-decrypt-option 'known) - '(mm-default-directory "~/tmp/") - '(mm-file-name-rewrite-functions - '(mm-file-name-delete-control mm-file-name-delete-gotchas - mm-file-name-trim-whitespace - mm-file-name-collapse-whitespace - mm-file-name-replace-whitespace)) - '(mml-secure-openpgp-encrypt-to-self t nil nil "So I can read copies in my sent mail directory.") - '(mml-secure-openpgp-sign-with-sender t) '(mode-line-compact 'long) - '(mouse-drag-copy-region t nil nil "X primary selection-like behaviour within Emacs even when not available outside.") - '(mouse-highlight 1 nil nil "See `make-pointer-invisible'.") + + ;; X primary selection-like behaviour within Emacs even when not available + ;; outside. + '(mouse-drag-copy-region t) + + ;; See `make-pointer-invisible'. + '(mouse-highlight 1) + '(mouse-yank-at-point t) '(native-comp-async-jobs-number 1) '(native-comp-async-report-warnings-errors 'silent) - '(nnmail-extra-headers '(To Cc List-Id)) - '(notmuch-address-use-company nil) - '(nov-text-width 78) - '(org-adapt-indentation t nil nil "Sometimes set to nil in .dir-locals.el, e.g. in ~/doc/newpapers.") - '(org-agenda-entry-text-maxlines 3) - '(org-agenda-files "~/doc/emacs-org-agenda-files") - '(org-agenda-persistent-filter t) - '(org-agenda-remove-times-when-in-prefix 'beg) - '(org-agenda-restore-windows-after-quit nil nil nil "Interacts badly with `tab-bar-history-mode'.") - '(org-agenda-skip-deadline-if-done t) - '(org-agenda-skip-deadline-prewarning-if-scheduled 3) - '(org-agenda-skip-scheduled-if-deadline-is-shown 'not-today) - '(org-agenda-skip-scheduled-if-done t) - '(org-agenda-skip-timestamp-if-done t) - '(org-agenda-start-on-weekday nil) - '(org-agenda-sticky t) - '(org-agenda-timegrid-use-ampm t) - '(org-agenda-todo-ignore-scheduled 'future) - '(org-agenda-window-setup 'current-window) - '(org-archive-location "~/doc/archive/howm/archive.org::* From %s") - '(org-archive-save-context-info '(time file olpath)) - '(org-archive-subtree-save-file-p t) - '(org-blank-before-new-entry '((heading . t) (plain-list-item . auto))) - '(org-bookmark-names-plist nil nil nil "Turn off to avoid git merge conflicts.") - '(org-cycle-separator-lines 0) - '(org-deadline-warning-days 60) - '(org-default-notes-file "~/doc/howm/refile.org") - '(org-directory "~/doc/howm/") - '(org-enforce-todo-checkbox-dependencies t) - '(org-enforce-todo-dependencies t) - '(org-fold-catch-invisible-edits 'show) - '(org-fold-show-context-detail - '((agenda . local) (bookmark-jump . lineage) (isearch . lineage) - (default . ancestors-full))) - '(org-footnote-section "Notes") - '(org-imenu-depth 4) - '(org-list-allow-alphabetical nil nil nil "So I can start lines with \"P. 211 - \" to refer to p. 211 not start a list.") - '(org-list-demote-modify-bullet - '(("-" . "+") ("+" . "*") ("*" . "-") ("1." . "-") ("1)" . "-"))) - '(org-list-use-circular-motion t) - '(org-log-done 'time) - '(org-log-into-drawer t) - '(org-log-repeat nil nil nil "Cluttering, and information probably in git.") - '(org-log-states-order-reversed nil) - '(org-outline-path-complete-in-steps nil nil nil "Desirable with `icomplete-mode'.") - '(org-read-date-prefer-future 'time) - '(org-refile-allow-creating-parent-nodes 'confirm) - '(org-refile-targets '((org-agenda-files :maxlevel . 5) (nil :maxlevel . 5))) - '(org-refile-use-outline-path 'file) - '(org-special-ctrl-a/e t) - '(org-special-ctrl-k t) - '(org-startup-folded nil) - '(org-startup-indented nil nil nil "Ensures buffer text doesn't go beyond 80 columns.") - '(org-tags-match-list-sublevels 'indented) - '(org-todo-keyword-faces - '(("SOMEDAY" :foreground "#0000FF" :weight bold) - ("NEXT" :foreground "#DD0000" :weight bold))) - '(org-todo-keywords - '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") - (sequence "WAITING(w@)" "SOMEDAY(s)" "|" "CANCELLED(c)"))) - '(org-treat-S-cursor-todo-selection-as-state-change nil) - '(org-treat-insert-todo-heading-as-state-change t) - '(org-use-fast-todo-selection 'expert) - '(org-yank-folded-subtrees nil) '(proced-enable-color-flag t) '(proced-show-remote-processes t) '(project-switch-commands 'project-prefix-or-any-command) - '(rcirc-default-full-name "Sean Whitton [spwhitton@spwhitton.name]") - '(rcirc-default-nick "spwhitton") - '(rcirc-default-user-name "spwhitton") - '(rcirc-display-server-buffer nil) - '(rcirc-log-directory "~/local/irclogs") - '(rcirc-log-filename-function 'spw/rcirc-generate-log-filename) - '(rcirc-log-flag t) - '(rcirc-time-format "%b/%d %H:%M ") - '(rcirc-track-abbreviate-flag nil) - '(rcirc-track-ignore-server-buffer-flag t) - '(rcirc-track-minor-mode t) '(read-buffer-completion-ignore-case t) '(read-file-name-completion-ignore-case t) '(read-mail-command 'gnus) @@ -427,38 +261,55 @@ windows side-by-side in the frame." '(remember-notes-buffer-name "*scratch*") '(remote-file-name-inhibit-delete-by-moving-to-trash t) '(require-final-newline t) - '(save-interprogram-paste-before-kill nil nil nil "See <https://debbugs.gnu.org/53728>.") - '(save-place-mode t nil nil "If quitting Emacs is slow, set `save-place-forget-unreadable-files' to nil.") + + ;; See <https://debbugs.gnu.org/53728>. + '(save-interprogram-paste-before-kill nil) + + ;; If quitting Emacs is slow set `save-place-forget-unreadable-files' to nil. + '(save-place-mode t) + '(savehist-additional-variables '(compile-history log-edit-comment-ring)) '(savehist-mode t) '(select-active-regions 'only) '(select-enable-primary t) '(send-mail-function 'sendmail-send-it) '(shell-command-prompt-show-cwd t) - '(show-paren-when-point-in-periphery t nil nil "Useful for C-M-d.") + + ;; Useful for C-M-d. + '(show-paren-when-point-in-periphery t) + '(shr-max-width 78) '(slime-load-failed-fasl 'never) '(tab-bar-history-mode t) '(tab-bar-show 1) - '(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 +373,11 @@ available are present in the `load-path'." for form = `(add-hook ',hook #',function) if name collect `(with-eval-after-load ',name ,form) else collect form))) +(defmacro spw/feature-add-to-list (list-var feature &rest elements) + (declare (indent 2)) + `(with-eval-after-load ',feature + ,@(cl-loop for el in elements collect `(add-to-list ',list-var ,el)))) + (cl-defmacro spw/define-skeleton (command (mode &key abbrev key (file `',mode) (map (intern (concat (symbol-name mode) "-map"))) @@ -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 " " "?") @@ -1641,6 +1505,21 @@ the non-side windows deleted by `delete-other-windows' will also reappear." ;;;; The Emacs shell +(custom-theme-set-variables + 'user + ;; This makes Eshell completions a bit more like bash's. + '(eshell-cmpl-cycle-completions nil) + + '(eshell-cmpl-ignore-case t) + '(eshell-hist-ignoredups 'erase) + '(eshell-history-append t) + '(eshell-history-size 5000) + '(eshell-save-history-on-exit nil)) +(spw/feature-add-to-list eshell-modules-list esh-module + 'eshell-elecslash 'eshell-tramp 'eshell-xtra) +(spw/feature-add-to-list eshell-visual-commands em-term + "locmaint" "gen-DSA" "gen-ELA") + (with-eval-after-load 'esh-cmd (add-hook 'eshell-pre-command-hook (lambda () @@ -1683,11 +1562,6 @@ the non-side windows deleted by `delete-other-windows' will also reappear." (with-eval-after-load 'esh-mode (define-key eshell-mode-map "\C-zp" #'spw/eshell-cd-project-root)) -;; Work around Emacs bug #54977. -(with-eval-after-load 'esh-module - (mapc (apply-partially #'add-to-list 'eshell-modules-list) - '(eshell-elecslash eshell-tramp eshell-xtra))) - (spw/define-skeleton spw/eshell-libexec (eshell-mode :abbrev "le" :file "esh-mode") "" "" "~/" '(eshell-electric-forward-slash) "src/dotfiles/scripts/") @@ -2796,6 +2670,7 @@ Called by '~/src/dotfiles/bin/emacsclient --spw/update-environment'." ;; `compile' or `project-compile' is called, and one Emacs frame/tab for GUD. (defun spw/run-or-restore-gud (arg) (interactive "P") + (require 'gdb-mi) (if (or arg (not (and (bound-and-true-p gud-comint-buffer) (get-buffer-process gud-comint-buffer)))) ;; Start a new debugging session even if one already exists. @@ -2875,6 +2750,43 @@ Called by '~/src/dotfiles/bin/emacsclient --spw/update-environment'." ;;;; Composing mail +(custom-theme-set-variables + 'user + ;; So locmaint will catch them. + '(message-auto-save-directory "~/tmp/") + + '(message-citation-line-format "On %a %d %b %Y at %I:%M%p %Z, %N wrote:\12") + '(message-citation-line-function 'message-insert-formatted-citation-line) + + ;; For compatibility. + '(message-forward-as-mime nil) + '(message-forward-before-signature nil) + '(message-forward-included-headers + '("^From:" "^Subject:" "^Date:" "^To:" "^Cc:" "^Message-ID:")) + '(message-make-forward-subject-function '(message-forward-subject-fwd)) + + '(message-ignored-resent-headers + "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:\\|^\\(?:X-\\)?Content-Length:\\|^X-UIDL:\\|^X-TUID:\\|^\\(?:X-\\)?Status:\\|^Lines:") + + ;; Bypass MTA rewriting user@localhost. + '(message-sendmail-envelope-from 'header) + + '(message-wash-forwarded-subjects t) + '(mm-decrypt-option 'known) + '(mm-default-directory "~/tmp/") + '(mm-file-name-rewrite-functions + '(mm-file-name-delete-control mm-file-name-delete-gotchas + mm-file-name-trim-whitespace + mm-file-name-collapse-whitespace + mm-file-name-replace-whitespace)) + + ;; So I can read copies in my sent mail directory. + '(mml-secure-openpgp-encrypt-to-self t) + + '(mml-secure-openpgp-sign-with-sender t) + '(nnmail-extra-headers '(To Cc List-Id)) + '(notmuch-address-use-company nil)) + (defvar spw/debian-bts-pseudoheader-regexp ;; "^\\([A-Za-z][a-z]+: [^ ]+\\|[cC]ontrol: .+\\)$" "^[A-Za-z][a-z]+: [^ ]+" @@ -3075,6 +2987,16 @@ mutt's review view, after exiting EDITOR." ;;;; Dired +(custom-theme-set-variables + 'user + '(dired-clean-up-buffers-too nil) + '(dired-dwim-target t) + '(dired-free-space 'separate) + '(dired-isearch-filenames t) + '(dired-listing-switches "--group-directories-first -alh") + '(dired-omit-files "\\`[.]?#\\|\\`[.][.]?\\'\\|\\`\\.git\\'") + '(dired-recursive-copies 'always)) + ;; this is the way you're meant to request dired-aux, not just dired-x, ;; according to (info "(dired-x) Installation") (with-eval-after-load 'dired (require 'dired-x)) @@ -3184,6 +3106,59 @@ mutt's review view, after exiting EDITOR." ;;;; Gnus +(custom-theme-set-variables + 'user + '(gnus-article-skip-boring t) + '(gnus-auto-center-summary nil) + '(gnus-auto-select-next 'slightly-quietly) + '(gnus-buttonized-mime-types + '("text/x-\\(?:diff\\|patch\\)" "multipart/\\(?:alternative\\|signed\\)")) + '(gnus-directory "~/local/News/") + '(gnus-extra-headers '(To Cc List-Id)) + '(gnus-gcc-mark-as-read t) + '(gnus-global-score-files '("~/doc/News/")) + '(gnus-interactive-exit 'quiet) + '(gnus-kill-files-directory "~/src/athpriv/News/") + + ;; Would prefer nil but t seems advisable for notmuch groups. + '(gnus-kill-summary-on-exit t) + + '(gnus-large-ephemeral-newsgroup 8000) + '(gnus-large-newsgroup 8000) + '(gnus-mark-article-hook '(spw/gnus-mark-article-hook)) + '(gnus-message-archive-group "sent") + '(gnus-message-archive-method '(nnmaildir "fmail" (directory "~/.fmail/"))) + '(gnus-permanently-visible-groups "^nnmaildir\\+fmail:\\(?:notes\\|sent\\)$") + '(gnus-read-newsrc-file nil) + '(gnus-refer-thread-use-search '(("nnmaildir:fmail"))) + '(gnus-save-killed-list + "^\\(?:[^n]\\|n[^n]\\|nn[^s]\\|nns[^e]\\|nnse[^l]\\|nnsel[^e]\\|nnsele[^c]\\|nnselec[^t]\\|nnselect[^:]\\)") + '(gnus-save-newsrc-file nil) + '(gnus-search-default-engines '((nnmaildir . notmuch))) + '(gnus-search-notmuch-remove-prefix "~/.fmail/") + '(gnus-secondary-select-methods + '((nnmaildir "fmail" (directory "~/.fmail/")))) + '(gnus-sum-thread-tree-false-root "") + '(gnus-sum-thread-tree-indent " ") + '(gnus-sum-thread-tree-leaf-with-other "├► ") + '(gnus-sum-thread-tree-root "") + '(gnus-sum-thread-tree-single-leaf "╰► ") + '(gnus-sum-thread-tree-vertical "│") + '(gnus-summary-line-format "%U%R%z %(%12&user-date; %*%-23,23f%) %B%s\12") + '(gnus-summary-mode-line-format "Gnus: %u&summary;%g [%A] %Z") + '(gnus-summary-thread-gathering-function 'gnus-gather-threads-by-references) + '(gnus-suppress-duplicates t) + '(gnus-thread-sort-functions + '(gnus-thread-sort-by-number gnus-thread-sort-by-total-score)) + '(gnus-topic-display-empty-topics nil) + '(gnus-update-message-archive-method t) + '(gnus-user-date-format-alist + '((32042 . "%2l:%M%#p") + (118823 . "Yest %2l:%M%#p") + (604800 . "%a %2l:%M%#p") + (16102447 . "%d %B") + (t . "%Y-%b-%d")))) + (with-eval-after-load 'gnus (cond ((spw/on-host-p "chiark.greenend.org.uk") (setq gnus-select-method @@ -3905,25 +3880,39 @@ unread." (gnus-summary-goto-article article))) (advice-add 'org-gnus-follow-link :around #'spw/org-gnus-follow-link) -(defun spw/gnus-fastmail-trash (n) +(defun spw/gnus-purelymail-trash (n) (interactive "p") (gnus-summary-move-article n "nnmaildir+fmail:trash")) (with-eval-after-load 'gnus-sum (define-key gnus-summary-mode-map - [remap gnus-summary-delete-article] #'spw/gnus-fastmail-trash)) + [remap gnus-summary-delete-article] #'spw/gnus-purelymail-trash)) -(defun spw/gnus-fastmail-learn-spam (n) +(defun spw/gnus-purelymail-learn-spam (n) (interactive "p") (save-excursion (gnus-summary-mark-forward n)) - (gnus-summary-move-article n "nnmaildir+fmail:spam") + (gnus-summary-move-article n "nnmaildir+fmail:junk") (gnus-summary-next-unread-article)) (with-eval-after-load 'gnus-sum - (define-key gnus-summary-mode-map [f5] #'spw/gnus-fastmail-learn-spam) - (define-key gnus-summary-mode-map "\C-z\C-s" #'spw/gnus-fastmail-learn-spam)) + (define-key gnus-summary-mode-map [f5] #'spw/gnus-purelymail-learn-spam) + (define-key gnus-summary-mode-map "\C-z\C-s" #'spw/gnus-purelymail-learn-spam)) ;;;; rcirc +(custom-theme-set-variables + 'user + '(rcirc-default-full-name "Sean Whitton [spwhitton@spwhitton.name]") + '(rcirc-default-nick "spwhitton") + '(rcirc-default-user-name "spwhitton") + '(rcirc-display-server-buffer nil) + '(rcirc-log-directory "~/local/irclogs") + '(rcirc-log-filename-function 'spw/rcirc-generate-log-filename) + '(rcirc-log-flag t) + '(rcirc-time-format "%b/%d %H:%M ") + '(rcirc-track-abbreviate-flag nil) + '(rcirc-track-ignore-server-buffer-flag t) + '(rcirc-track-minor-mode t)) + (defun spw/rcirc-generate-log-filename (process target) (concat (file-name-concat (format-time-string "%Y/%m") (process-name process) (or target "server")) @@ -4003,6 +3992,24 @@ unread." ;;;; VC +(custom-theme-set-variables + 'user + '(git-rebase-confirm-cancel nil) + '(vc-deduce-backend-nonvc-modes t) + '(vc-find-revision-no-save t) + '(vc-follow-symlinks t) + + ;; We might also consider -B. + '(vc-git-diff-switches '("--patch-with-stat" "-M" "-C")) + + '(vc-git-print-log-follow t)) + +;; Avoid `log-edit-show-files' window becoming most recently used for C-x o. +(with-eval-after-load 'log-edit + (customize-set-variable 'log-edit-hook + (delete 'log-edit-show-files log-edit-hook))) +(spw/feature-add-to-list log-edit-hook log-edit 'spw/log-edit-show-diff) + (require 'git-commit nil t) (spw/when-library-available mailscripts @@ -4015,7 +4022,7 @@ unread." "vt" notmuch-extract-thread-patches-to-project "vw" mailscripts-extract-message-patches-to-project)) -;; Emacs 30: move into `custom-set-variables'. +;; Emacs 30: move into `custom-theme-set-variables' call. (when (>= emacs-major-version 30) (setopt vc-git-log-switches '("--format=fuller" "--stat"))) @@ -4320,6 +4327,7 @@ unread." #'org-d20-d% #'org-d20-d20))))) +(customize-set-variable 'nov-text-width 78) (spw/when-library-available nov (add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))) @@ -4333,6 +4341,11 @@ unread." (dolist (hook '(html-mode-hook css-mode-hook)) (add-hook hook 'rainbow-mode))) +(custom-theme-set-variables + 'user + '(haskell-indentation-layout-offset 4) + '(haskell-indentation-left-offset 4)) + (spw/feature-add-hook subword-mode haskell-mode) ;; Use a local hook to turn on an appropriate indentation mode. Use @@ -4353,6 +4366,14 @@ unread." (spw/feature-add-hook orgtbl-mode message) +(custom-theme-set-variables + 'user + '(bongo-default-directory "~/annex/music/") + '(bongo-insert-album-covers t) + '(bongo-insert-whole-directory-trees t) + '(bongo-mode-line-indicator-mode nil) + '(bongo-prefer-library-buffers nil)) + (spw/feature-add-hook (lambda () (dired-hide-details-mode (if bongo-dired-library-mode 1 -1))) @@ -4464,15 +4485,6 @@ unread." (with-temp-buffer (call-interactively #'hyperspec-lookup))) (global-set-key "\C-cgh" #'spw/hyperspec-lookup) -;; `inf-lisp' says this is a defcustom and `slime' says it is a defvar, so -;; `custom-save-variables' will print the NOW field in the corresponding -;; argument to `custom-set-variables' as t or nil depending on whether or not -;; `inf-lisp' and/or `slime' happen to be loaded, and possibly even depending -;; on the order in which they were loaded. To prevent spurious changes to the -;; NOW field randomly showing up in git diffs of init.el, set the variable -;; without using the customisation interface. -(setq inferior-lisp-program "sbcl") - (defvar spw/last-command-was-slime-async-eval nil) (defvar spw/last-slime-async-eval-command-frame nil) @@ -4786,6 +4798,97 @@ before uploading to NEW again." \n \n ;;;; Org-mode +(custom-theme-set-faces + 'user + '(org-code ((t (:inherit (shadow fixed-pitch))))) + '(org-date ((t (:inherit fixed-pitch :foreground "Purple" :underline t)))) + '(org-verbatim ((t (:inherit (shadow fixed-pitch)))))) + +(custom-theme-set-variables + 'user + ;; Sometimes set to nil in .dir-locals.el, e.g. in ~/doc/newpapers. + '(org-adapt-indentation t nil) + + '(org-agenda-entry-text-maxlines 3) + '(org-agenda-files "~/doc/emacs-org-agenda-files") + '(org-agenda-persistent-filter t) + '(org-agenda-remove-times-when-in-prefix 'beg) + + ;; Interacts badly with `tab-bar-history-mode'. + '(org-agenda-restore-windows-after-quit nil) + + '(org-agenda-skip-deadline-if-done t) + '(org-agenda-skip-deadline-prewarning-if-scheduled 3) + '(org-agenda-skip-scheduled-if-deadline-is-shown 'not-today) + '(org-agenda-skip-scheduled-if-done t) + '(org-agenda-skip-timestamp-if-done t) + '(org-agenda-start-on-weekday nil) + '(org-agenda-sticky t) + '(org-agenda-timegrid-use-ampm t) + '(org-agenda-todo-ignore-scheduled 'future) + '(org-agenda-window-setup 'current-window) + '(org-archive-location "~/doc/archive/howm/archive.org::* From %s") + '(org-archive-save-context-info '(time file olpath)) + '(org-archive-subtree-save-file-p t) + '(org-blank-before-new-entry '((heading . t) (plain-list-item . auto))) + + ;; Turn off to avoid git merge conflicts. + '(org-bookmark-names-plist nil) + + '(org-cycle-separator-lines 0) + '(org-deadline-warning-days 60) + '(org-default-notes-file "~/doc/howm/refile.org") + '(org-directory "~/doc/howm/") + '(org-enforce-todo-checkbox-dependencies t) + '(org-enforce-todo-dependencies t) + '(org-fold-catch-invisible-edits 'show) + '(org-fold-show-context-detail + '((agenda . local) (bookmark-jump . lineage) (isearch . lineage) + (default . ancestors-full))) + '(org-footnote-section "Notes") + '(org-imenu-depth 4) + + ;; So I can start lines with \"P. 211 - \" to refer to p. 211, rather than + ;; starting a list. + '(org-list-allow-alphabetical nil) + + '(org-list-demote-modify-bullet + '(("-" . "+") ("+" . "*") ("*" . "-") ("1." . "-") ("1)" . "-"))) + '(org-list-use-circular-motion t) + '(org-log-done 'time) + '(org-log-into-drawer t) + + ;; Cluttering, and information probably in git. + '(org-log-repeat nil) + + '(org-log-states-order-reversed nil) + + ;; Desirable with `icomplete-mode'. + '(org-outline-path-complete-in-steps nil) + + '(org-read-date-prefer-future 'time) + '(org-refile-allow-creating-parent-nodes 'confirm) + '(org-refile-targets '((org-agenda-files :maxlevel . 5) (nil :maxlevel . 5))) + '(org-refile-use-outline-path 'file) + '(org-special-ctrl-a/e t) + '(org-special-ctrl-k t) + '(org-startup-folded nil) + + ;; Ensures buffer text doesn't go beyond 80 columns. + '(org-startup-indented nil) + + '(org-tags-match-list-sublevels 'indented) + '(org-todo-keyword-faces + '(("SOMEDAY" :foreground "#0000FF" :weight bold) + ("NEXT" :foreground "#DD0000" :weight bold))) + '(org-todo-keywords + '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") + (sequence "WAITING(w@)" "SOMEDAY(s)" "|" "CANCELLED(c)"))) + '(org-treat-S-cursor-todo-selection-as-state-change nil) + '(org-treat-insert-todo-heading-as-state-change t) + '(org-use-fast-todo-selection 'expert) + '(org-yank-folded-subtrees nil)) + (global-set-key "\C-coc" #'org-capture) (global-set-key "\C-col" #'org-store-link) (global-set-key "\C-coa" #'org-agenda) @@ -4987,8 +5090,7 @@ Called by doccheckin script." ;; setting this means if we type C-c C-e o O then the PDF opens for inspection (setq org-odt-preferred-output-format "pdf") -(with-eval-after-load 'org - (add-to-list 'org-file-apps '(system . "xdg-open %s"))) +(spw/feature-add-to-list org-file-apps org '(system . "xdg-open %s")) ;; ... but also ensure we get a .docx (would be better to make ;; `org-odt-preferred-output-format' accept a list) @@ -5328,6 +5430,23 @@ different occasions." ;;;; Diary +(custom-theme-set-variables + 'user + '(appt-display-diary nil) + '(appt-display-interval 6) + '(calendar-date-display-form + '((format "%s-%.2d-%.2d %.3s" year (string-to-number month) + (string-to-number day) dayname))) + '(calendar-date-style 'iso) + '(calendar-week-start-day 1) + '(diary-file "~/doc/emacs-diary") + '(diary-list-entries-hook + '(diary-include-other-diary-files diary-sort-entries)) + '(diary-mark-entries-hook '(diary-mark-included-diary-files)) + '(holiday-bahai-holidays nil) + '(holiday-hebrew-holidays nil) + '(holiday-islamic-holidays nil)) + ;; Don't bind `diary' globally as for viewing purposes we use Org agenda ;; bindings, and for editing purposes just C-x b suffices. (global-set-key "\C-cC" #'calendar) @@ -5422,6 +5541,13 @@ We don't use the FILES parameter in the entry for \"d\" in ;;;; Howm +(custom-theme-set-variables + 'user + '(howm-directory "~/doc/howm/") + '(howm-file-name-format "%Y/%Y-%m-%d-%H%M.org") + '(howm-keyword-file "~/doc/howm/.howm-keys") + '(howm-view-use-grep t)) + (setq howm-prefix "\C-cc" ;; Use Org-mode style because our notes are in `org-mode'. @@ -5519,6 +5645,18 @@ We don't use the FILES parameter in the entry for \"d\" in ;;;; Perl +(custom-theme-set-variables + 'user + ;; See `cperl-indent-parens-as-block'. + '(cperl-close-paren-offset -4) + + '(cperl-indent-level 4) + + ;; Makes it easier to use longer names for subroutines. + '(cperl-indent-parens-as-block t) + + '(cperl-lineup-step 1)) + (defun spw/perl-add-use (module) (interactive "suse ") (let ((line (concat "use " module diff --git a/.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" @@ -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 @@ -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/.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/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/movemymail b/bin/movemymail index fbe76178..06671043 100755 --- a/bin/movemymail +++ b/bin/movemymail @@ -45,11 +45,11 @@ if (hostfqdn eq "athena.silentflame.com") { system "imap-dl", "$ENV{HOME}/.config/mailscripts/imap-dl.gmail"; } -eval { system "mbsync", "fastmail" }; +eval { system "mbsync", "purelymail" }; if (my $exception = $@) { local $ENV{XDG_RUNTIME_DIR} = "/run/user/$<"; system "notify-send", "--urgency=critical", "--icon=dialog-warning", - "'mbsync fastmail' exited nonzero"; + "'mbsync purelymail' exited nonzero"; die $exception; } diff --git a/lib-src/certs/fastmail.crt b/lib-src/certs/fastmail.crt deleted file mode 100644 index ce40ed30..00000000 --- a/lib-src/certs/fastmail.crt +++ /dev/null @@ -1,41 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIHQDCCBiigAwIBAgIQDIVbcGvDCrksnNDtiwrz5zANBgkqhkiG9w0BAQsFADBZ -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTMwMQYDVQQDEypE -aWdpQ2VydCBHbG9iYWwgRzIgVExTIFJTQSBTSEEyNTYgMjAyMCBDQTEwHhcNMjMx -MDA0MDAwMDAwWhcNMjQxMTAxMjM1OTU5WjBoMQswCQYDVQQGEwJBVTERMA8GA1UE -CBMIVmljdG9yaWExEjAQBgNVBAcTCU1lbGJvdXJuZTEZMBcGA1UEChMQRmFzdE1h -aWwgUHR5IEx0ZDEXMBUGA1UEAwwOKi5mYXN0bWFpbC5jb20wggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIK7bTmFkD3zDvFKpT6h2CRrTgKa+cnZ7zToRQ -VdREXU+wDaqccWbihBR0sGhYeoUfqkjQfrFMyqK/FrGEB/ZWyxAx6q5HFnBQTuQV -q2Cdf08lo+eLdGIOl+ojV2OVIA+C88z/Pfvj8Peqo13b/LpKoWDxsMEeR1CfW3yX -oEVi/avIc2U0yoZ6YfqGQ9U/QX2gQMD1GqA1BIiCfxUr7bZxtAyL19y+Z87EtL9d -GGTBV+Gjh/DyATMmy1kwLcoZXT3Gnieq2ensqROUxpQ2Y0U7iww55kU86Clx9KnR -KqsWJGwbLtpQ+NFFbyDC/5tTTR6iNbetOGcPA6xpnsbFgI4TAgMBAAGjggPzMIID -7zAfBgNVHSMEGDAWgBR0hYDAZsffN97PvSk3qgMdvu3NFzAdBgNVHQ4EFgQUA9QH -pLBlScA8j+iaCIfKtcdi5/owgYEGA1UdEQR6MHiCDiouZmFzdG1haWwuY29tggxm -YXN0bWFpbC5jb22CFSouY2FsZGF2LmZhc3RtYWlsLmNvbYIWKi5jYXJkZGF2LmZh -c3RtYWlsLmNvbYITY2FsZGF2LmZhc3RtYWlsLmNvbYIUY2FyZGRhdi5mYXN0bWFp -bC5jb20wPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDov -L3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU -BggrBgEFBQcDAQYIKwYBBQUHAwIwgZ8GA1UdHwSBlzCBlDBIoEagRIZCaHR0cDov -L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsRzJUTFNSU0FTSEEyNTYy -MDIwQ0ExLTEuY3JsMEigRqBEhkJodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGln -aUNlcnRHbG9iYWxHMlRMU1JTQVNIQTI1NjIwMjBDQTEtMS5jcmwwgYcGCCsGAQUF -BwEBBHsweTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFEG -CCsGAQUFBzAChkVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRH -bG9iYWxHMlRMU1JTQVNIQTI1NjIwMjBDQTEtMS5jcnQwDAYDVR0TAQH/BAIwADCC -AX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHYA7s3QZNXbGs7FXLedtM0TojKHRny8 -7N7DUUhZRnEftZsAAAGK+6wcvgAABAMARzBFAiA1ar7gEFUKD92a7bFkHwfpr7+p -cMteU3TFN/cAI5gQjQIhANlbUK6ZblyoqFpkwCKNh2K58PykaD0bhnVbAZm0GNTp -AHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGK+6wcugAABAMA -RjBEAiAeKRWzn6XRdBByYajuV0IXKIXgbBnDd2ENiQ6kG1IwjgIgOz5x3UUwkSDP -UZtmUJQtxhJ/i3ILE0F7IxQO6b+ENx0AdwDatr9rP7W2Ip+bwrtca+hwkXFsu1GE -hTS9pD0wSNf7qwAAAYr7rBymAAAEAwBIMEYCIQCwbOuNCRajD/F6G3282N7bUUZL -S4xKCxuZ13jubGtnOQIhAMMAO2kzNNtvSo7ST2dxiQ9BUR1ynMSfujEwRCgcWpia -MA0GCSqGSIb3DQEBCwUAA4IBAQAait3EVZ7lQG8hkwLWJ8Jb0o1k+A51l0os8f/n -l3e5c3OlQztLhsjTwrJjuWVBPPH2ckyAqlu/nb1ZAoaK9r/6AhYVVMSkgE+VKzQH -n0H7FECB7agejypxXSxu9oqD/3bg+m7spM+vfBuOu9nAmJY7b+CGrbCrgiYomG8n -ELgz8t4U2oVhpHX1B6vO3e/wUjFjH9otSRz3hFr6D6YyV4nLyNofSQs9K8Mcbf/w -/KgvcnN2csFHkRmYBMb96Jtdj58nydsu/Cwyhru39SN1gkXpWL8L6p28TOqZlssb -kV289dZ2GuIsRAoaTWE5qtlMVmr/KknKqgaO/o+rLlagFiWh ------END CERTIFICATE----- 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) = @_; |