[rc] switch from i3gs to i3status
[~bandali/configs] / rc.org
diff --git a/rc.org b/rc.org
index afe914a..f3c86e6 100644 (file)
--- a/rc.org
+++ b/rc.org
@@ -14,47 +14,6 @@ Note: This file is best viewed inside Emacs with org mode.
 This section contains the configuration files (dotfiles) of various
 programs I use.
 
-** [[https://github.com/afewmail/afew][afew]]
-:PROPERTIES:
-:header-args+: :tangle ~/.config/afew/config
-:END:
-
-#+begin_quote
-an initial tagging script for notmuch mail
-#+end_quote
-
-#+begin_src conf
-# This is the default filter chain
-[SpamFilter]
-#[ClassifyingFilter]
-[KillThreadsFilter]
-#[ListMailsFilter]
-[ArchiveSentMailsFilter]
-sent_tag = sent
-[InboxFilter]
-
-#[Filter.1]
-#query = 'folder:amin/lists/.haskell-cafe'
-#tags = +lists;+lists/haskell-cafe
-#message = lists/haskell-cafe
-
-#[Filter.2]
-#query = 'folder:amin/lists/.haskell-weekly'
-#tags = +lists;+lists/haskell-weekly
-#message = lists/haskell-weekly
-
-#[Filter.3]
-#query = 'folder:amin/lists/.hackernewsletter'
-#tags = +lists;+lists/hackernewsletter
-#message = lists/hackernewsletter
-
-
-#[FolderNameFilter]
-#folder_blacklist = Inbox
-#maildir_separator = /.
-#folder_transforms = Drafts:draft Junk:spam Trash:deleted Sent:sent Archive:archive lists/haskell-cafe:lists/haskell-cafe
-#+end_src
-
 ** bspwm
 
 *** bspwmrc
@@ -62,7 +21,7 @@ sent_tag = sent
 :header-args+: :tangle ~/.config/bspwm/bspwmrc :shebang "#!/bin/sh"
 :END:
 
-#+begin_src sh
+#+begin_src sh :tangle no
 sxhkd &
 sh ~/.fehbg &
 xfce4-panel -d &
@@ -126,7 +85,7 @@ bspc rule -a Zathura state=tiled
 :header-args+: :tangle ~/.config/sxhkd/sxhkdrc
 :END:
 
-#+begin_src conf
+#+begin_src conf :tangle no
 #
 # wm independent hotkeys
 #
@@ -177,6 +136,9 @@ XF86Audio{Raise,Lower}Volume
 XF86AudioMute
        pamixer --toggle-mute
 
+XF86AudioMicMute
+       pactl set-source-mute 1 toggle
+
 # playback control
 XF86Audio{Play,Prev,Next}
        mpc {toggle,prev,next}
@@ -204,6 +166,9 @@ super + apostrophe
 #XF86KbdBrightness{Up,Down}
 #      kbdlight {up,down}
 
+XF86RotateWindows
+       toggle-tablet
+
 #
 # bspwm hotkeys
 #
@@ -323,7 +288,7 @@ super + {Left,Down,Up,Right}
 :header-args+: :tangle ~/.config/compton.conf
 :END:
 
-#+begin_src conf
+#+begin_src conf :tangle no
 # Shadow
 shadow = false;                        # Enabled client-side shadows on windows.
 no-dock-shadow = true;         # Avoid drawing shadows on dock/panel windows.
@@ -667,6 +632,64 @@ timeout = 0
 </fontconfig>
 #+end_src
 
+** getmail
+
+*** getmailrc
+:PROPERTIES:
+:header-args+: :tangle ~/.getmail/getmailrc
+:END:
+
+#+begin_src conf
+[retriever]
+type = SimplePOP3SSLRetriever
+server = fencepost.gnu.org
+username = aminb
+password_command = ("gpg2", "--no-tty", "-q", "-d", "/home/amin/.passwd/gnu.gpg")
+port = 995
+use_apop = True
+
+[destination]
+type = Maildir
+path = ~/mail/gnu/Inbox/
+
+[options]
+delete = True
+#+end_src
+
+*** getmail.service
+:PROPERTIES:
+:header-args+: :tangle ~/.config/systemd/user/getmail.service
+:END:
+
+#+begin_src conf :tangle no
+[Unit]
+Description=getmail service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/getmail
+StandardOutput=syslog
+StandardError=syslog
+#+end_src
+
+*** getmail.timer
+:PROPERTIES:
+:header-args+: :tangle ~/.config/systemd/user/getmail.timer
+:END:
+
+#+begin_src conf :tangle no
+[Unit]
+Description=getmail timer
+
+[Timer]
+OnCalendar=*:0/30
+Persistent=true
+Unit=getmail.service
+
+[Install]
+WantedBy=timers.target
+#+end_src
+
 ** Git
 
 *** gitconfig
@@ -678,14 +701,14 @@ timeout = 0
 #+begin_src conf
 [user]
     name = Amin Bandali
-    email = amin@aminb.org
-    # signingkey = 4E05246AB0BF7FFB
+    email = amin@gnu.org
+    signingkey = CDDE75F903538E71813CDA27D1FBA36627D65876
 #+end_src
 
 **** signing
 #+begin_src conf
-[commit]
-    gpgsign = true
+[commit]
+    gpgsign = true
 # [format]
 #     signoff = true
 #+end_src
@@ -721,6 +744,8 @@ timeout = 0
     pr = pull --rebase
     ps = push
     psf = push --force
+    nmam = "!f() { notmuch show --format=raw $1 | git am -; }; f"
+    nmam3 = "!f() { notmuch show --format=raw $1 | git am -3 -; }; f"
 #+end_src
 
 **** color
@@ -753,6 +778,16 @@ timeout = 0
        user = aminb
 #+end_src
 
+**** send-email
+#+begin_src conf
+[sendemail]
+       smtpuser = aminb
+       smtpserver = fencepost.gnu.org
+       smtpserverport = 587
+       smtpencryption = tls
+       annotate = yes
+#+end_src
+
 *** gitignore
 :PROPERTIES:
 :header-args+: :tangle ~/.gitignore_global
@@ -768,99 +803,6 @@ timeout = 0
 *-autoloads.el
 #+end_src
 
-** Latexmk
-:PROPERTIES:
-:header-args+: :tangle ~/.latexmkrc
-:END:
-
-#+begin_src conf
-$pdf_previewer = "start zathura %O %S";
-$clean_ext = "aux out";
-
-# $pdf_update_method = 4;
-# $pdf_update_command = "zathura %O %S";
-
-# Synctex allows one to jump to from the PDF in Zathura to the source in Emacs
-# by Ctrl+click in the PDF.
-# Tell latexmk to use Zathura as a previewer, and run emacsclient as the Synctex
-# editor.
-# $pdf_previewer = 'exec zathura --synctex-forward -x \'emacsclient --no-wait +%{line} %{input}\' %O %S';
-#+end_src
-
-** libinput
-
-Improve XPS 15 9560's touchpad experience.
-
-#+begin_src conf :tangle (when (and (eq system-type 'gnu/linux) (string= (system-name) "plasma")) "/sudo::/etc/X11/xorg.conf.d/30-touchpad.conf")
-Section "InputClass"
-    Identifier "libinput touchpad catchall"
-    Driver "libinput"
-    MatchIsTouchpad "on"
-    Option "ClickMethod" "clickfinger"
-    Option "NaturalScrolling" "true"
-    Option "Tapping" "on"
-    Option "TappingButtonMap" "lrm"
-EndSection
-#+end_src
-
-** getmail
-
-*** getmailrc
-:PROPERTIES:
-:header-args+: :tangle ~/.getmail/getmailrc
-:END:
-
-#+begin_src conf
-[retriever]
-type = SimplePOP3SSLRetriever
-server = fencepost.gnu.org
-username = aminb
-password_command = ("gpg2", "--no-tty", "-q", "-d", "~/.passwd/gnu.gpg")
-port = 995
-use_apop = True
-
-[destination]
-type = Maildir
-path = ~/mail/gnu/Inbox/
-
-[options]
-delete = True
-#+end_src
-
-*** getmail.service
-:PROPERTIES:
-:header-args+: :tangle ~/.config/systemd/user/getmail.service
-:END:
-
-#+begin_src conf :tangle no
-[Unit]
-Description=getmail service
-
-[Service]
-Type=oneshot
-ExecStart=/usr/bin/getmail
-StandardOutput=syslog
-StandardError=syslog
-#+end_src
-
-*** getmail.timer
-:PROPERTIES:
-:header-args+: :tangle ~/.config/systemd/user/getmail.timer
-:END:
-
-#+begin_src conf :tangle no
-[Unit]
-Description=getmail timer
-
-[Timer]
-OnCalendar=*:0/30
-Persistent=true
-Unit=getmail.service
-
-[Install]
-WantedBy=timers.target
-#+end_src
-
 ** GnuPG
 :PROPERTIES:
 :header-args+: :tangle ~/.gnupg/gpg-agent.conf
@@ -909,6 +851,114 @@ gtk-font-name = Ubuntu 10
 # gtk-key-theme-name = Emacs
 #+end_src
 
+** [[https://github.com/Leinnan/i3gs][i3gs]]
+:PROPERTIES:
+:header-args+: :tangle ~/.config/i3gs/config
+:END:
+
+#+begin_src conf :comments none :tangle no
+borders_width=0 0 2 0
+separator_width=10
+
+#[mpd]
+#preset=MPD
+#title=<span weight='heavy' fgcolor='#7FDBFF'> </span>
+#borders_color=#7FDBFF
+
+[ram]
+preset=RAM
+title=<span weight='heavy' fgcolor='#3D9970'> </span>
+borders_color=#3D9970
+
+#[cpu]
+#preset=CPU
+#title=<span weight='heavy' fgcolor='#2ECC40'> </span>
+#borders_color=#2ECC40
+
+#[hdd]
+#preset=HDD
+#title=<span weight='heavy' fgcolor='#01FF70'> </span>
+#borders_color=#01FF70
+
+[volume]
+command=volume-info
+title=<span weight='heavy' fgcolor='#7FDBFF'></span>
+borders_color=#7FDBFF
+
+[battery]
+preset=BAT
+command=battery-percentage-time
+title=<span weight='heavy' fgcolor='#39CCCC'> </span>
+borders_color=#39CCCC
+
+[wifi]
+preset=WIFI
+title=<span weight='heavy' fgcolor='#01FF70'> </span>
+borders_color=#01FF70
+
+[date]
+preset=DATE
+command=date '+%-I:%M, %a %b %d '
+title=<span weight='heavy' fgcolor='#FFDC00'> </span>
+borders_color=#FFDC00
+separator_width=0
+#+end_src
+
+** i3status
+:PROPERTIES:
+:header-args+: :tangle ~/.config/i3status/config
+:END:
+
+#+begin_src conf :comments none
+# i3status configuration file.
+# see "man i3status" for documentation.
+
+# It is important that this file is edited as UTF-8.
+# The following line should contain a sharp s:
+# ß
+# If the above line is not correctly displayed, fix your editor first!
+
+general {
+        colors = true
+        interval = 5
+}
+
+order += "ipv6"
+order += "disk /"
+order += "wireless _first_"
+order += "ethernet _first_"
+order += "battery all"
+order += "load"
+order += "tztime local"
+
+wireless _first_ {
+        format_up = "W: (%quality at %essid) %ip"
+        format_down = "W: down"
+}
+
+ethernet _first_ {
+        # if you use %speed, i3status requires root privileges
+        format_up = "E: %ip (%speed)"
+        format_down = "E: down"
+}
+
+battery all {
+        format = "%status %percentage %remaining"
+}
+
+tztime local {
+        format = "%Y-%m-%d %H:%M:%S"
+}
+
+load {
+        format = "%1min"
+}
+
+disk "/" {
+        format = "%avail"
+}
+#+end_src
+
 ** isync
 
 *** mbsyncrc
@@ -999,6 +1049,42 @@ Unit=mbsync.service
 WantedBy=timers.target
 #+end_src
 
+** Latexmk
+:PROPERTIES:
+:header-args+: :tangle ~/.latexmkrc
+:END:
+
+#+begin_src conf
+$pdf_previewer = "start zathura %O %S";
+$clean_ext = "aux out";
+
+# $pdf_update_method = 4;
+# $pdf_update_command = "zathura %O %S";
+
+# Synctex allows one to jump to from the PDF in Zathura to the source in Emacs
+# by Ctrl+click in the PDF.
+# Tell latexmk to use Zathura as a previewer, and run emacsclient as the Synctex
+# editor.
+# $pdf_previewer = 'exec zathura --synctex-forward -x \'emacsclient --no-wait +%{line} %{input}\' %O %S';
+#+end_src
+
+** libinput
+
+Improve XPS 15 9560's touchpad experience.
+
+# begin_src conf :tangle (when (and (eq system-type 'gnu/linux) (string= (system-name) "plasma")) "/sudo::/etc/X11/xorg.conf.d/30-touchpad.conf")
+#+begin_src conf :tangle no
+Section "InputClass"
+    Identifier "libinput touchpad catchall"
+    Driver "libinput"
+    MatchIsTouchpad "on"
+    Option "ClickMethod" "clickfinger"
+    Option "NaturalScrolling" "true"
+    Option "Tapping" "on"
+    Option "TappingButtonMap" "lrm"
+EndSection
+#+end_src
+
 ** mpd
 :PROPERTIES:
 :header-args+: :tangle ~/.config/mpd/mpd.conf
@@ -1431,7 +1517,8 @@ logfile ~/.msmtp.log
 # aminb
 account aminb
 host nix.aminb.org
-tls_fingerprint BB:98:B3:02:83:B0:E0:C3:49:3E:C2:B2:A8:60:62:78:03:B3:5D:B3:BD:B8:0A:39:BB:E4:B0:66:D1:CF:D1:6B
+# use `msmtp -a aminb --serverinfo --tls --tls-certcheck=off --tls-fingerprint=` to get the current fingerprint
+tls_fingerprint 98:C7:F0:02:7F:2B:D8:B6:D3:BF:E8:C1:D4:07:6B:B5:6C:B1:C7:5D:97:20:70:88:AB:9E:B5:09:5D:2C:DC:8E
 tls_starttls on
 from amin@aminb.org
 user amin@aminb.org
@@ -1440,12 +1527,21 @@ passwordeval gpg2 --no-tty -q -d ~/.passwd/amin.gpg
 # gnu
 account gnu
 host fencepost.gnu.org
-tls_fingerprint 94:0E:37:EB:EA:44:5A:4B:B6:6F:16:3D:6C:7E:7E:44:2D:93:61:C1:FE:82:A8:29:5E:3C:12:4E:2D:BE:0E:2C
+# use `msmtp -a gnu --serverinfo --tls --tls-certcheck=off --tls-fingerprint=` to get the current fingerprint
+tls_fingerprint 28:70:42:76:1C:EC:91:5F:D1:B3:27:A1:CD:3B:32:A4:8B:0B:DC:3A:CD:CA:F6:6F:E4:61:BA:69:D7:4D:0D:0B
 tls_starttls on
 from aminb@gnu.org
 user aminb
 passwordeval gpg2 --no-tty -q -d ~/.passwd/gnu.gpg
 
+# gnu (amin)
+account gnu-amin : gnu
+from amin@gnu.org
+
+# gnu (mab)
+account gnu-mab : gnu
+from mab@gnu.org
+
 # uwaterloo
 account uwaterloo
 host connect.uwaterloo.ca
@@ -1455,10 +1551,6 @@ user abandali
 passwordeval gpg2 --no-tty -q -d ~/.passwd/uwaterloo.gpg
 tls_trust_file /etc/ssl/certs/ca-certificates.crt
 
-# uwaterloo (friendly address)
-account uwaterloo-friendly : uwaterloo
-from amin.bandali@uwaterloo.ca
-
 # Set a default account
 account default : aminb
 #+end_src
@@ -2081,7 +2173,7 @@ path=/home/amin/mail
 [user]
 name=Amin Bandali
 primary_email=amin@aminb.org
-other_email=amin.bandali@uwaterloo.ca;mbandali@uwaterloo.ca;aminb@gnu.org;
+other_email=amin@gnu.org;abandali@uwaterloo.ca;mab@gnu.org;aminb@gnu.org;
 
 # Configuration for "notmuch new"
 #
@@ -2100,7 +2192,7 @@ other_email=amin.bandali@uwaterloo.ca;mbandali@uwaterloo.ca;aminb@gnu.org;
 [new]
 tags=new;
 #tags=unread;inbox;
-ignore=.uidvalidity;.mbsyncstate
+ignore=.uidvalidity;.mbsyncstate;/.*/dovecot*/
 
 # Search configuration
 #
@@ -2149,23 +2241,79 @@ synchronize_flags=true
 gpg_path=gpg
 #+end_src
 
+*** pre-new hook
+:PROPERTIES:
+:header-args+: :tangle ~/mail/.notmuch/hooks/pre-new :shebang "#!/bin/sh"
+:END:
+
+#+begin_src sh
+touch /tmp/gnusieve.log
+sieve-filter -eW -o postmaster_address=postmaster@aminb.org \
+            -o mail_location=maildir:$MAILDIR/gnu:LAYOUT=fs:INBOX=$MAILDIR/gnu/Inbox ~/sieve/gnu.sieve INBOX delete &>>/tmp/gnusieve.log
+#+end_src
+
 *** post-new hook
 :PROPERTIES:
 :header-args+: :tangle ~/mail/.notmuch/hooks/post-new :shebang "#!/bin/sh"
 :END:
 
 #+begin_src sh
-afew -tn
+# apply sent tag to messages sent by me
+notmuch tag -new +sent -- from:amin@aminb.org or from:amin@gnu.org or from:mab@gnu.org or from:aminb@gnu.org or from:abandali@uwaterloo.ca
+
+# initial tagging
+notmuch tag -latest                     -- tag:latest
+notmuch tag +inbox +unread +latest -new -- tag:new
+
 
 # apply tags to lists
-notmuch tag +lists +lists/deepspec -- folder:amin/lists/deepspec
-notmuch tag +lists +lists/haskell-cafe -- folder:amin/lists/haskell-cafe
-notmuch tag +lists +lists/haskell-weekly -- folder:amin/lists/haskell-weekly
-notmuch tag +lists +lists/hackernewsletter -- folder:amin/lists/hackernewsletter
-notmuch tag +lists +lists/notmuch -- folder:amin/lists/notmuch
-notmuch tag +lists +lists/info-gnu-emacs -- folder:amin/lists/info-gnu-emacs
-notmuch tag +lists +lists/help-gnu-emacs -- folder:amin/lists/help-gnu-emacs
-notmuch tag +lists +lists/emacs-devel -- folder:amin/lists/emacs-devel
+
+# <aminb>
+notmuch tag -inbox +lists/hackernewsletter -- folder:amin/lists/hackernewsletter
+notmuch tag -inbox +lists/haskell-weekly   -- folder:amin/lists/haskell-weekly
+
+notmuch tag -inbox +pay -- folder:amin/pay
+notmuch tag -inbox +banking -- folder:amin/banking
+# </aminb>
+
+# <uw>
+notmuch tag -inbox +uw/cs136 -- folder:uwaterloo/lists/cs136
+notmuch tag -inbox +uw/se463 -- folder:uwaterloo/lists/se463
+
+notmuch tag -inbox +lists/clvsingle        -- folder:uwaterloo/lists/Clvsingle
+notmuch tag -inbox +lists/gsa              -- folder:uwaterloo/lists/GSA
+notmuch tag -inbox +lists/math-grad        -- folder:uwaterloo/lists/Math-grad
+notmuch tag -inbox +lists/scs-grads        -- folder:uwaterloo/lists/scs-grads
+notmuch tag -inbox +lists/watform-students -- folder:uwaterloo/lists/Watform-students
+# </uw>
+
+# <gnu>
+notmuch tag -inbox +l/emacs-devel       -- folder:gnu/l/emacs-devel
+notmuch tag -inbox +l/emacs-orgmode     -- folder:gnu/l/emacs-orgmode
+notmuch tag -inbox +l/emacsconf-discuss -- folder:gnu/l/emacsconf-discuss
+notmuch tag -inbox +l/fencepost-users   -- folder:gnu/l/fencepost-users
+notmuch tag -inbox +l/guix-devel        -- folder:gnu/l/guix-devel
+notmuch tag -inbox +l/guile-devel       -- folder:gnu/l/guile-devel
+notmuch tag -inbox +l/help-gnu-emacs    -- folder:gnu/l/help-gnu-emacs
+notmuch tag -inbox +l/info-gnu-emacs    -- folder:gnu/l/info-gnu-emacs
+notmuch tag -inbox +l/www-commits       -- folder:gnu/l/www-commits
+notmuch tag -inbox +l/www-discuss       -- folder:gnu/l/www-discuss
+notmuch tag -inbox +webmasters          -- folder:gnu/webmasters
+
+notmuch tag -inbox +l/deepspec     -- folder:gnu/l/deepspec
+notmuch tag -inbox +l/haskell-cafe -- folder:gnu/l/haskell-cafe
+notmuch tag -inbox +l/haskell-art  -- folder:gnu/l/haskell-art
+notmuch tag -inbox +l/notmuch      -- folder:gnu/l/notmuch
+
+notmuch tag -inbox +l/~aminb/test-priv         -- folder:gnu/l/~aminb/test-priv
+notmuch tag -inbox +l/~sircmpwn/sr.ht-admins   -- folder:gnu/l/~sircmpwn/sr.ht-admins
+notmuch tag -inbox +l/~sircmpwn/sr.ht-announce -- folder:gnu/l/~sircmpwn/sr.ht-announce
+notmuch tag -inbox +l/~sircmpwn/sr.ht-dev      -- folder:gnu/l/~sircmpwn/sr.ht-dev
+notmuch tag -inbox +l/~sircmpwn/sr.ht-discuss  -- folder:gnu/l/~sircmpwn/sr.ht-discuss
+# </gnu>
+
+notmuch tag -inbox -unread +archive/notmuch     -- path:archive/notmuch/**
+notmuch tag -inbox -unread +archive/emacs-devel -- path:archive/emacs-devel/**
 #+end_src
 
 *** notmuch.service
@@ -2296,6 +2444,69 @@ def prime_gpg_agent():
 prime_gpg_agent()
 #+end_src
 
+** pigeonhole
+*** gnu.sieve
+:PROPERTIES:
+:header-args+: :tangle ~/sieve/gnu.sieve :comments none
+:END:
+
+#+begin_src conf
+require [ "regex", "variables", "fileinto", "envelope", "mailbox", "imap4flags", "include" ];
+
+if anyof (
+  address :is "from" "webmasters@gnu.org",
+  address :is "from" "webmasters-comment@gnu.org") {
+  fileinto :create "webmasters";
+  stop;
+}
+
+include :personal "lists";
+#+end_src
+
+*** lists.sieve
+:PROPERTIES:
+:header-args+: :tangle ~/sieve/lists.sieve :comments none
+:END:
+
+#+begin_src conf
+require [ "regex", "variables", "fileinto", "envelope", "mailbox", "imap4flags",
+ "include" ];
+
+if anyof (
+    header :contains "list-id" "<emacs-devel.gnu.org>",
+    header :contains "list-id" "<emacs-orgmode.gnu.org>",
+    header :contains "list-id" "<emacsconf-discuss.gnu.org>",
+    header :contains "list-id" "<fencepost-users.gnu.org>",
+    header :contains "list-id" "<guix-devel.gnu.org>",
+    header :contains "list-id" "<guile-devel.gnu.org>",
+    header :contains "list-id" "<help-gnu-emacs.gnu.org>",
+    header :contains "list-id" "<info-gnu-emacs.gnu.org>",
+    header :contains "list-id" "<www-commits.gnu.org>",
+    header :contains "list-id" "<www-discuss.gnu.org>",
+    header :contains "list-id" "<deepspec.lists.cs.princeton.edu>",
+    header :contains "list-id" "<haskell-cafe.haskell.org>",
+    header :contains "list-id" "<haskell-art.we.lurk.org>",
+    header :contains "list-id" "<notmuch.notmuchmail.org>") {
+    if header :regex "list-id" "<([a-z_0-9-]+)[.@]" {
+        set :lower "listname" "${1}";
+        fileinto :create "l/${listname}";
+    }
+}
+
+if anyof (
+    header :contains "list-id" "<~aminb/test-priv@lists.sr.ht>",
+    header :contains "list-id" "<~sircmpwn/sr.ht-admins@lists.sr.ht>",
+    header :contains "list-id" "<~sircmpwn/sr.ht-announce@lists.sr.ht>",
+    header :contains "list-id" "<~sircmpwn/sr.ht-dev@lists.sr.ht>",
+    header :contains "list-id" "<~sircmpwn/sr.ht-discuss@lists.sr.ht>") {
+    if header :regex "list-id" "(~[a-z_0-9-]+)/([a-z_0-9.-]+)@" {
+        set :lower "username" "${1}";
+        set :lower "listname" "${2}";
+        fileinto :create "l/${username}/${listname}";
+    }
+}
+#+end_src
+
 ** polybar
 
 *** config
@@ -3529,6 +3740,245 @@ switch="Alt+x"
 insert_pass="Alt+n"
 #+end_src
 
+** sway
+:PROPERTIES:
+:header-args+: :tangle ~/.config/sway/config
+:END:
+
+#+begin_src conf
+exec xrdb .Xresources
+exec dunst
+### Variables
+# super
+set $mod Mod4
+# alt
+set $mod2 Mod1
+set $left h
+set $down j
+set $up k
+set $right l
+set $term urxvt
+set $menu rofi -show run -display-run '> ' -display-window ' 🗔 '
+
+### Output configuration
+#
+# Default wallpaper (more resolutions are available in __DATADIR__/backgrounds/sway/)
+output * bg /usr/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill
+#
+# Example configuration:
+#
+#   output HDMI-A-1 resolution 1920x1080 position 1920,0
+#
+# You can get the names of your outputs by running: swaymsg -t get_outputs
+
+### Idle configuration
+#
+# Example configuration:
+#
+#exec swayidle \
+#    timeout 300 'swaylock -c 000000' \
+#    timeout 600 'swaymsg "output * dpms off"' \
+#       resume 'swaymsg "output * dpms on"' \
+#    before-sleep 'swaylock -c 000000'
+#
+# This will lock your screen after 300 seconds of inactivity, then turn off
+# your displays after another 600 seconds, and turn your screens back on when
+# resumed. It will also lock your screen before your computer goes to sleep.
+
+### Input configuration
+
+input "1739:31251:DLL07BE:01_06CB:7A13_Touchpad" {
+    dwt enabled
+    tap enabled
+    natural_scroll enabled
+    middle_emulation enabled
+    click_method clickfinger
+}
+
+input "1:1:AT_Translated_Set_2_keyboard" {
+    repeat_delay 200
+    repeat_rate 45
+    xkb_layout us,ir
+    xkb_options ctrl:nocaps,altwin:swap_alt_win,ctrl:rctrl_ralt,grp:shifts_toggle
+}
+
+
+### Key bindings
+#
+# Basics:
+#
+    # start a terminal
+    bindsym $mod+Return exec $term
+
+    # kill focused window
+    bindsym $mod+Shift+q kill
+
+    # start your launcher
+    bindsym $mod+d exec $menu
+
+    # Drag floating windows by holding down $mod and left mouse button.
+    # Resize them with right mouse button + $mod.
+    # Despite the name, also works for non-floating windows.
+    # Change normal to inverse to use left mouse button for resizing and right
+    # mouse button for dragging.
+    floating_modifier $mod normal
+
+    # reload the configuration file
+    bindsym $mod+Shift+c reload
+
+    # exit sway (logs you out of your wayland session)
+    bindsym $mod+Shift+e exit
+
+    bindsym $mod+apostrophe exec rofi-light        # rofi-based brightness chooser
+    bindsym XF86MonBrightnessUp exec light -A 5    # increase screen brightness
+    bindsym XF86MonBrightnessDown exec light -U 5  # decrease screen brightness
+
+    bindsym XF86AudioRaiseVolume exec pamixer --allow-boost --increase 5
+    bindsym XF86AudioLowerVolume exec pamixer --allow-boost --decrease 5
+    bindsym XF86AudioMute exec pamixer --toggle-mute
+    bindsym XF86AudioMicMute exec pactl set-source-mute 1 toggle
+
+    # original sway workspace switch and window move
+    bindsym $mod+bracketleft workspace prev
+    bindsym $mod+bracketright workspace next
+    bindsym $mod+braceleft move container to workspace prev
+    bindsym $mod+braceright move container to workspace next
+
+    # bspwm-esque workspace switch and window move
+    bindsym $mod2+bracketleft exec sway-ws-util switch prev
+    bindsym $mod2+bracketright exec sway-ws-util switch next
+    bindsym $mod2+braceleft exec sway-ws-util move prev follow
+    bindsym $mod2+braceright exec sway-ws-util move next follow
+#
+# Moving around:
+#
+    # Move your focus around
+    bindsym $mod+$left focus left
+    bindsym $mod+$down focus down
+    bindsym $mod+$up focus up
+    bindsym $mod+$right focus right
+    # or use $mod+[up|down|left|right]
+    bindsym $mod+Left focus left
+    bindsym $mod+Down focus down
+    bindsym $mod+Up focus up
+    bindsym $mod+Right focus right
+
+    # _move_ the focused window with the same, but add Shift
+    bindsym $mod+Shift+$left move left
+    bindsym $mod+Shift+$down move down
+    bindsym $mod+Shift+$up move up
+    bindsym $mod+Shift+$right move right
+    # ditto, with arrow keys
+    bindsym $mod+Shift+Left move left
+    bindsym $mod+Shift+Down move down
+    bindsym $mod+Shift+Up move up
+    bindsym $mod+Shift+Right move right
+#
+# Workspaces:
+#
+    # switch to workspace
+    bindsym $mod+1 workspace 1
+    bindsym $mod+2 workspace 2
+    bindsym $mod+3 workspace 3
+    bindsym $mod+4 workspace 4
+    bindsym $mod+5 workspace 5
+    bindsym $mod+6 workspace 6
+    bindsym $mod+7 workspace 7
+    bindsym $mod+8 workspace 8
+    bindsym $mod+9 workspace 9
+    bindsym $mod+0 workspace 10
+    # move focused container to workspace
+    bindsym $mod+Shift+1 move container to workspace 1
+    bindsym $mod+Shift+2 move container to workspace 2
+    bindsym $mod+Shift+3 move container to workspace 3
+    bindsym $mod+Shift+4 move container to workspace 4
+    bindsym $mod+Shift+5 move container to workspace 5
+    bindsym $mod+Shift+6 move container to workspace 6
+    bindsym $mod+Shift+7 move container to workspace 7
+    bindsym $mod+Shift+8 move container to workspace 8
+    bindsym $mod+Shift+9 move container to workspace 9
+    bindsym $mod+Shift+0 move container to workspace 10
+    # Note: workspaces can have any name you want, not just numbers.
+    # We just use 1-10 as the default.
+#
+# Layout stuff:
+#
+    # You can "split" the current object of your focus with
+    # $mod+b or $mod+v, for horizontal and vertical splits
+    # respectively.
+    bindsym $mod+b splith
+    bindsym $mod+v splitv
+
+    # Switch the current container between different layout styles
+    bindsym $mod+s layout stacking
+    bindsym $mod+w layout tabbed
+    bindsym $mod+e layout toggle split
+
+    # Make the current focus fullscreen
+    bindsym $mod+f fullscreen
+
+    # Toggle the current focus between tiling and floating mode
+    bindsym $mod+Shift+space floating toggle
+
+    # Swap focus between the tiling area and the floating area
+    bindsym $mod+space focus mode_toggle
+
+    # move focus to the parent container
+    bindsym $mod+a focus parent
+#
+# Scratchpad:
+#
+    # Sway has a "scratchpad", which is a bag of holding for windows.
+    # You can send windows there and get them back later.
+
+    # Move the currently focused window to the scratchpad
+    bindsym $mod+Shift+minus move scratchpad
+
+    # Show the next scratchpad window or hide the focused scratchpad window.
+    # If there are multiple scratchpad windows, this command cycles through them.
+    bindsym $mod+minus scratchpad show
+#
+# Resizing containers:
+#
+mode "resize" {
+    # left will shrink the containers width
+    # right will grow the containers width
+    # up will shrink the containers height
+    # down will grow the containers height
+    bindsym $left resize shrink width 10px
+    bindsym $down resize grow height 10px
+    bindsym $up resize shrink height 10px
+    bindsym $right resize grow width 10px
+
+    # ditto, with arrow keys
+    bindsym Left resize shrink width 10px
+    bindsym Down resize grow height 10px
+    bindsym Up resize shrink height 10px
+    bindsym Right resize grow width 10px
+
+    # return to default mode
+    bindsym Return mode "default"
+    bindsym Escape mode "default"
+}
+bindsym $mod+Shift+r mode "resize"
+
+#
+# Status Bar:
+#
+# Read `man 5 sway-bar` for more information about this section.
+bar {
+    position bottom
+    colors {
+        statusline #ffffff
+        background #323232
+        inactive_workspace #32323200 #32323200 #5c5c5c
+    }
+    status_command i3status
+}
+
+include /etc/sway/config.d/*
+#+end_src
+
 ** TLP
 
 *** TODO enigma
@@ -3856,8 +4306,9 @@ RESTORE_DEVICE_STATE_ON_STARTUP=1
 contrary, it's automatically sourced by LightDM, my display manager of
 choice.
 
-#+begin_src sh
+#+begin_src sh :tangle no
 xset -b  # disable bell
+xset r rate 200 45  # repeat delay (ms) and rate (repeats/sec)
 
 # setxkbmap -option compose:ralt
 
@@ -4344,7 +4795,7 @@ zhighlighters=(main brackets pattern)
 #
 
 # Load these ssh identities with the ssh module
-zssh_ids=(id_rsa plasma_id_rsa id_ed25519 id_rsa_aur)
+zssh_ids=(id_ed25519_amin)
 
 
 #
@@ -4488,7 +4939,8 @@ alias scl=systemctl
 alias jcl=journalctl
 alias m="mbsync -Va; getmail; notmuch new"
 alias best="youtube-dl -f best"
-alias ace="mosh amin@ace.aminb.org"
+alias nixx="ssh amin@nix.aminb.org"
+alias fence="ssh aminb@fencepost.gnu.org"
 
 aur() {
    cd ~/usr/build
@@ -4510,6 +4962,34 @@ Xfce's presentation mode which keeps the screen awake, and
 =rofi-light= a small utility that uses [[https://github.com/DaveDavenport/rofi][Rofi]] to ask and [[https://github.com/haikarainen/light][light]] to set an
 exact brightness value.
 
+** battery-percentage-time
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/battery-percentage-time :shebang "#!/bin/sh"
+:END:
+
+#+begin_src sh :tangle no
+dbus_send() {
+       label=$1
+       dbus-send --print-reply=literal --system \
+               --dest=org.freedesktop.UPower \
+               /org/freedesktop/UPower/devices/battery_BAT0 \
+               org.freedesktop.DBus.Properties.Get \
+               string:org.freedesktop.UPower.Device \
+               string:"${label}" | awk '{print $3}'
+}
+
+perc=$(dbus_send 'Percentage')
+state=$(dbus_send 'State')
+
+if [ "$state" -eq 2 ]; then  # Discharging
+       secs=$(dbus_send 'TimeToEmpty')
+elif [ "$state" -eq 1 ]; then  # Charging
+       secs=$(dbus_send 'TimeToFull')
+fi
+
+printf '%s%%%%%2dh%02dm \n' "$perc" $((secs / 3600)) $((secs % 3600 / 60))
+#+end_src
+
 ** rofi-light
 :PROPERTIES:
 :header-args+: :tangle ~/.local/bin/rofi-light :shebang "#!/bin/bash"
@@ -4521,12 +5001,62 @@ val=$(rofi -dmenu -mesg "light    $cur" -p "light -S " -l 0 -width 12)
 light -S $val
 #+end_src
 
+** s (run sway)
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/s :shebang "#!/bin/bash"
+:END:
+
+#+begin_src bash
+export _JAVA_AWT_WM_NONREPARENTING=1
+export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true'
+light -Scrs "intel_backlight" 2
+source $HOME/.zprofile
+sway
+#+end_src
+
+** sway-ws-util
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/sway-ws-util :shebang "#!/bin/bash"
+:END:
+
+#+begin_src bash
+curr_ws=$(swaymsg -t get_workspaces | jq -r '.[] | select(.focused==true).name')
+[[ $curr_ws -eq 1 ]] && prev_ws=10 || prev_ws=$((curr_ws-1))
+[[ $curr_ws -eq 10 ]] && next_ws=1 || next_ws=$((curr_ws+1))
+dest_ws=-1
+op=-1
+
+if [ "$1" = "switch" ] || [ "$1" = "move" ]; then
+  op="$1"
+  if [ "$2" = "prev" ]; then
+    dest_ws="$prev_ws"
+  elif [ "$2" = "next" ]; then
+    dest_ws="$next_ws"
+  else
+    echo "Usage: $0 $1 {prev|next} [follow]"
+    exit 1
+  fi
+else
+  echo "Usage: $0 {switch|move} {prev|next} [follow]"
+  exit 1
+fi
+
+if [ "$op" = "switch" ]; then
+  sway workspace "$dest_ws"
+elif [ "$op" = "move" ]; then
+  sway move container to workspace "$dest_ws"
+  if [ "$3" = "follow" ]; then
+    sway workspace "$dest_ws"
+  fi
+fi
+#+end_src
+
 ** toggle-layout
 :PROPERTIES:
 :header-args+: :tangle ~/.local/bin/toggle-layout :shebang "#!/bin/bash"
 :END:
 
-#+begin_src bash
+#+begin_src bash :tangle no
 lang="$(setxkbmap -print | grep xkb_symbols | cut -d'+' -f 2)"
 
 if [ "$lang" = "us" ]; then
@@ -4542,21 +5072,74 @@ fi
 :header-args+: :tangle ~/.local/bin/toggle-presentation-mode :shebang "#!/bin/bash"
 :END:
 
-#+begin_src bash
+#+begin_src bash :tangle no
 xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/presentation-mode -T
 #+end_src
 
+** toggle-tablet
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/toggle-tablet :shebang "#!/bin/bash"
+:END:
+
+This script toggles between a 'normal' mode and a 'tablet' mode, doing
+a few things:
+
+- rotates the screen using =xrandr=, so that rotating the physical
+  display of my X220t would have the laptop's battery on the right
+  hand side,
+- enables touch screen,
+- properly rotates the stylus pen and touch screen pointers, and
+- toggles between RGB and Vertical BGR sub-pixel order.
+
+#+begin_src bash :tangle no
+case $(xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation) in
+    0)  # Screen is not rotated, we should rotate it right (90°)
+           xrandr -o 3
+           xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation -s 1
+           xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Device_Enabled -s 1
+           xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Wacom_Rotation -s 1
+           xfconf-query -c xsettings -p /Xft/RGBA -s vbgr
+           ;;
+    1)  # Currently top is rotated right, we should set it normal (0°)
+          xrandr -o 0
+          xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation -s 0
+          xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Wacom_Rotation -s 0
+          xfconf-query -c pointers -p /Wacom_ISDv4_E6_Finger_touch/Properties/Device_Enabled -s 0
+          xfconf-query -c xsettings -p /Xft/RGBA -s rgb
+          ;;
+    *)
+           echo "Unknown result from 'xfconf-query -c pointers -p /Wacom_ISDv4_E6_Pen_stylus/Properties/Wacom_Rotation'" >&2
+           exit 1
+           ;;
+esac
+#+end_src
+
 ** unlock-def-gk.py
 :PROPERTIES:
 :header-args+: :tangle ~/.local/bin/unlock-def-gk.py :shebang "#!/usr/bin/env python2"
 :END:
 
-#+begin_src python
+#+begin_src python :tangle no
 import gnomekeyring as gk
 # list_item_ids_sync('login')[0] == 1L
 gk.unlock_sync('Default_keyring',gk.item_get_info_sync('login',1L).get_secret())
 #+end_src
 
+** volume-info
+:PROPERTIES:
+:header-args+: :tangle ~/.local/bin/volume-info :shebang "#!/bin/sh"
+:END:
+
+#+begin_src sh :tangle no
+cur_vol=$(pamixer --get-volume)
+
+if [ $(pamixer --get-mute) = true ]; then
+  printf 'mt \n' "$cur_vol"
+else
+  printf '%02d \n' "$cur_vol"
+fi
+#+end_src
+
 ** wp
 
 My little wallpaper changer script.