52107888f30a

Merge.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Mon, 14 Jan 2019 12:31:12 -0500
parents a8a82a63b876 (current diff) c3b026046776 (diff)
children ea3cc427437e
branches/tags (none)
files bin/conj bin/lilypond bin/longass bin/maven bin/scheme bin/sort-scala-imports fish/functions/backfor.fish fish/functions/clonedown.fish fish/functions/deact.fish fish/functions/dump.fish fish/functions/edit-pasteboard.fish fish/functions/empty-trash.fish fish/functions/fabric.fish fish/functions/fcowlol.fish fish/functions/fix-open-with.fish fish/functions/fzf-fish.fish fish/functions/gigfor.fish fish/functions/hex.fish fish/functions/hey-virtualbox-shut-down-or-i-will-fucking-cut-you.fish fish/functions/hi.fish fish/functions/isen.fish fish/functions/md.fish fish/functions/oldgcc.fish fish/functions/path_this.fish fish/functions/ppj.fish fish/functions/quietly.fish fish/functions/sc.fish fish/functions/skim.fish fish/functions/spotlight-off.fish fish/functions/spotlight-on.fish fish/functions/spotlight-tail.fish fish/functions/thanks.fish fish/functions/vp.fish fish/functions/wo.fish fish/functions/ydl.fish fish/virtualenv.fish vim/custom-dictionary.utf-8.add vim/vimrc

Changes

--- a/bin/conj	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-#!/Users/sjl/.virtualenvs/webscraping/bin/python3
-
-import sys
-import requests
-from bs4 import BeautifulSoup
-
-
-en_url = 'http://conjugator.reverso.net/conjugation-english-verb-%s.html'
-is_url = 'http://www.verbix.com/webverbix/go.php?T1=%s&Submit=Go&D1=28&H1=128'
-
-def english(word):
-    resp = requests.get(en_url % word).text
-    soup = BeautifulSoup(resp, "html.parser")
-
-    ws = [t.text.strip()
-          for t in soup.find_all(class_="indicative-wrap")[0]
-                       .div
-                       .find_all("i")[1:]]
-    ws[8] = "y'all"
-
-    # fix third person singular
-    v = ws[5]
-    ws[4:6] = ['he', v, 'she', v, 'it', v]
-
-    # fix third person plural
-    v = ws[15]
-    ws[14:15] = ['they ♂', v, 'they ♀', v, 'they ∅', v]
-    vals = [a + ' ' + b for a, b in zip(ws[::2], ws[1::2])]
-
-    return vals
-
-def icelandic(word):
-    resp = requests.get(is_url % word).text
-    soup = BeautifulSoup(resp, "html.parser")
-
-    ws = [t.text.strip()
-          for t in soup.find_all(class_='pure-u-1-2')[0]
-                       .find_all('span')]
-
-    # fix third person singular
-    v = ws[5]
-    ws[4:6] = ['hann', v, 'hún', v, 'það', v]
-
-    v = ws[15]
-    ws[14:15] = ['þeir', v, 'þær', v, 'þau', v]
-    vals = [a + ' ' + b for a, b in zip(ws[::2], ws[1::2])]
-
-    return vals
-
-eng_word = sys.argv[1]
-ice_word = sys.argv[2]
-
-print('to %s\tað %s' % (eng_word, ice_word))
-
-eng = english(eng_word)
-ice = icelandic(ice_word)
-
-for e, i in zip(eng, ice):
-    print('%s\t%s' % (e, i))
-
-print('to %s / að %s\t' % (eng_word, ice_word), end='')
-print('<table>', end='')
-for e, i in zip(eng, ice):
-    e1, e2 = e.rsplit(' ', 1)
-    i1, i2 = i.split(' ')
-
-    print('<tr>', end='')
-    print('<td>%s</td><td>%s</td><td>%s</td><td><b>%s</b></td>' % (e1, e2, i1, i2), end='')
-    print('</tr>', end='')
-print('</table>')
--- a/bin/lilypond	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-#!/bin/bash
-exec /Applications/LilyPond.app/Contents/Resources/bin/lilypond "$@"
--- a/bin/longass	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-
-if len(sys.argv) > 1:
-    n = int(sys.argv[1]) - 1
-else:
-    n = 20
-
-print r'''
-_______
-   \   \
-    \   \
-''',
-print '     |   |\n' * n,
-print r'''     |   |
-    /   /
-___/___/
-'''
-
--- a/bin/maven	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-mvn "$@" | grep --line-buffered -Ev 'Including.*in the shaded jar' | grcat ~/.grc/conf.maven
--- a/bin/mount-encrypted-stick	Mon Jan 14 12:30:39 2019 -0500
+++ b/bin/mount-encrypted-stick	Mon Jan 14 12:31:12 2019 -0500
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-set -euo pipefail
+set -xeuo pipefail
 
 sudo cryptsetup luksOpen "/dev/$1" "$1_crypt"
 sudo mkdir -p "/media/sjl/encrypted_drive_$1"
--- a/bin/pbpaste	Mon Jan 14 12:30:39 2019 -0500
+++ b/bin/pbpaste	Mon Jan 14 12:31:12 2019 -0500
@@ -1,2 +1,3 @@
 #!/usr/bin/env bash
+
 xclip -selection clipboard -o
--- a/bin/quicklisp-update	Mon Jan 14 12:30:39 2019 -0500
+++ b/bin/quicklisp-update	Mon Jan 14 12:31:12 2019 -0500
@@ -1,3 +1,3 @@
 #!/usr/bin/env bash
 
-sbcl --eval '(ql:update-client)' --eval '(ql:update-all-dists)' --eval '(quit)'
+sbcl --eval '(ql:update-client)' --eval '(ql:update-all-dists)' --quit
--- a/bin/sbcl	Mon Jan 14 12:30:39 2019 -0500
+++ b/bin/sbcl	Mon Jan 14 12:31:12 2019 -0500
@@ -1,4 +1,4 @@
 #!/usr/bin/env bash
 
 set -e
-rlwrap-lisp /usr/local/bin/sbcl --noinform "$@"
+rlwrap-lisp /usr/local/bin/sbcl --dynamic-space-size 4096 --noinform "$@"
--- a/bin/scheme	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-rlwrap mit-scheme "$@"
--- a/bin/sort-scala-imports	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-#!/usr/bin/env python
-
-import re, sys
-from operator import attrgetter
-
-
-bracket_padding = None
-MAX_LINE_WIDTH = 100
-
-def next_line():
-    return sys.stdin.readline().rstrip('\n')
-
-l = next_line()
-
-while not l.startswith('import '):
-    sys.stdout.write(l + '\n')
-    l = next_line()
-
-class ImportGroup(object):
-    def __init__(self, line):
-        self.main_line = line.rstrip()
-        self.prefix = None
-        self.guts = []
-
-    def set_line(self):
-        """Set the main_line and guts for the given prefix and guts.
-
-        If the import will fit into 100 chars, the short group syntax will be
-        used.  Otherwise the longer one will be used.
-
-        """
-        prefix = self.prefix
-        guts = self.guts
-        guts.sort(key=lambda s: s.lower())
-
-        if not prefix:
-            # This is just a single-line, single-item import, so we don't need
-            # to do any setup.
-            return
-
-        single = '%s{%s%s%s}' % (prefix,
-                                 bracket_padding,
-                                 ', '.join(guts),
-                                 bracket_padding)
-        if len(single) > MAX_LINE_WIDTH:
-            self.main_line = prefix + '{'
-            self.guts = guts
-        else:
-            self.main_line = single
-            self.guts = []
-
-    def slurp(self):
-        global l, bracket_padding
-
-        line = self.main_line
-        if self.main_line.endswith('}'):
-            # This is a line like: import foo.{ a, b, c }
-            if bracket_padding is None:
-                if line[line.index("{") + 1] == " ":
-                    bracket_padding = " "
-                else:
-                    bracket_padding = ""
-
-            prefix, rest = line.split('{', 1)
-
-            guts = re.findall(r"\w+ *=> *\w+|\w+", rest)
-
-            self.prefix = prefix
-            self.guts = guts
-
-            l = next_line()
-        elif line.endswith('{'):
-            # This is the first line of a multi-line set
-            prefix = line.rstrip('{')
-            guts = []
-            while True:
-                l = next_line()
-                if l.rstrip().endswith('}'):
-                    l = next_line()
-                    break
-                else:
-                    guts.append(l.strip().rstrip(','))
-
-            self.prefix = prefix
-            self.guts = guts
-        else:
-            # Just a normal single import line, pass it on.
-            l = next_line()
-
-    def spit(self):
-        self.set_line()
-
-        sys.stdout.write(self.main_line + '\n')
-
-        if self.guts:
-            self.guts.sort(key=lambda g: g.lower())
-            sys.stdout.write('  ' +
-                             ',\n  '.join(self.guts) +
-                             '\n}\n')
-
-    def key(self):
-        return self.main_line.lower().replace('{', '@')
-
-imports = []
-while l.startswith('import '):
-    ig = ImportGroup(l)
-    ig.slurp()
-    imports.append(ig)
-
-if bracket_padding is None:
-    bracket_padding = " "
-
-imports.sort(key=lambda ig: ig.key())
-
-for i in imports:
-    i.spit()
-
-sys.stdout.write(l + '\n')
-
-for l in sys.stdin.readlines():
-    sys.stdout.write(l)
-
--- a/fish/config.fish	Mon Jan 14 12:30:39 2019 -0500
+++ b/fish/config.fish	Mon Jan 14 12:31:12 2019 -0500
@@ -102,9 +102,6 @@
 # Python {{{
 
 set -g -x PIP_DOWNLOAD_CACHE "$HOME/.pip/cache"
-set -g -x WORKON_HOME "$HOME/lib/virtualenvs"
-# eval (/usr/bin/python -m virtualfish)
-
 set -g -x PYTHONPATH ""
 set PYTHONPATH "$HOME/lib/hg/hg:$PYTHONPATH"
 
--- a/fish/functions/backfor.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function backfor
-    cp ~/Dropbox/tasks/backpack-archive ~/Dropbox/tasks/backpack.txt
-end
--- a/fish/functions/clonedown.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function clonedown -d "clone a repo down"
-    cd ~/src
-    git clone $argv
-    cd (echo "$argv" | sed -Ee 's_.*/__')
-end
--- a/fish/functions/deact.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function deact -d "deactivate"
-    deactivate
-end
--- a/fish/functions/dump.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-function dump -d "dump to/from the internet"
-    hg -R ~/.plan push
-    hg -R ~/.plan push git
-
-    hg -R ~/src/cl-nrepl push
-
-    hg -R ~/src/ru push
-
-    hg -R ~/src/temperance push
-    hg -R ~/src/temperance push git
-
-    hg -R ~/src/scully push
-    hg -R ~/src/scully push git
-
-    hg -R ~/src/mazes push
-    hg -R ~/src/mazes push git
-
-    hg -R ~/src/cl-ggp push
-    hg -R ~/src/cl-ggp push git
-
-    hg -R ~/src/sand push
-    hg -R ~/src/sand push git
-
-    hg -R ~/src/hype push
-    hg -R ~/src/hype push git
-
-    hg -R ~/src/cl-losh push
-    hg -R ~/src/cl-losh push git
-
-    hg -R ~/src/beast push
-    hg -R ~/src/beast push git
-
-    hg -R ~/src/vex push
-    hg -R ~/src/vex push git
-
-    hg -R ~/src/cl-digraph push
-    hg -R ~/src/cl-digraph push git
-
-    hg -R ~/src/magitek push
-    hg -R ~/src/magitek push git
-
-    hg -R ~/src/chancery push
-    hg -R ~/src/chancery push git
-
-    hg -R ~/src/dotfiles push
-
-    offlineimap -qf INBOX
-end
--- a/fish/functions/edit-pasteboard.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function edit-pasteboard
-    pbpaste | vipe | pbcopy
-end
--- a/fish/functions/empty-trash.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function emptytrash -d "Empty the OS X trash folders"
-    sudo rm -rfv /Volumes/*/.Trashes
-    sudo rm -rfv ~/.Trash
-    sudo rm -rfv /private/var/log/asl/*.asl
-end
--- a/fish/functions/fabric.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function fabric -d "fab with my SSH identity"
-    fab -i ~/.ssh/stevelosh $argv
-end
--- a/fish/functions/fcowlol.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function fcowlol -d "Show a fun twitch banner" --wraps "figlet"
-    figlet -f ogre -w9999 $argv | cowsay -W 9999 -n -p | lolcat
-end
--- a/fish/functions/fix-open-with.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-function fix-open-with -d "Fix the shitty OS X Open With menu duplicates"
-    /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain user
-    killall Finder
-    echo "Open With has been rebuilt, Finder will relaunch"
-end
-
-
--- a/fish/functions/fzf-fish.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-function fzf-fish
-  set -q FZF_FIND_FILE_COMMAND
-  or set -l FZF_FIND_FILE_COMMAND "ffind --semi-restricted --depth=15 --follow"
-  fish -c "$FZF_FIND_FILE_COMMAND" | fzf -m --height 15 | read -l selects
-  and commandline -i "\"$selects\""
-  commandline -f repaint
-end
-
-# https://github.com/fisherman/fzf/blob/master/key_bindings.fish
--- a/fish/functions/gigfor.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function gigfor
-    cp ~/Dropbox/tasks/gig-archive ~/Dropbox/tasks/gig.txt
-end
--- a/fish/functions/hex.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function hex -d "Open a file in Hex Fiend"
-    open -a Hex\ Fiend $argv
-end
--- a/fish/functions/hey-virtualbox-shut-down-or-i-will-fucking-cut-you.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function hey-virtualbox-shut-down-or-i-will-fucking-cut-you
-    VBoxManage controlvm $argv poweroff
-end
-
--- a/fish/functions/hi.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-function hi --argument pattern -d "Highlight a pattern in a stream of text"
-    grep -E --color=always --line-buffered "$pattern|\$"
-end
-
--- a/fish/functions/isen.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function isen -d "Translate from Icelandic to English" --wraps "trans"
-    trans -b -u firefox is:en $argv
-end
--- a/fish/functions/md.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function md -d "mkdir" --wrap "mkdir"
-    mkdir -p $argv
-end
--- a/fish/functions/oldgcc.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function oldgcc -d "Set \$CC to the old GCC"
-    set -g CC /usr/bin/gcc-4.0
-end
--- a/fish/functions/path_this.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function path_this -d "Add the cwd to the front of PATH"
-    set PATH (pwd) $PATH
-end
--- a/fish/functions/ppj.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function ppj -d "Prettify Pasteboard JSON"
-    pbp | pj
-end
--- a/fish/functions/quietly.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function quietly -d "Run a command and hide the output"
-    eval $argv >/dev/null ^/dev/null
-end
--- a/fish/functions/sc.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function sc -d "Launch a Scala console"
-    mvn scala:console $argv
-end
--- a/fish/functions/skim.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function skim -d "Open file in Skim.app"
-    open -a Skim $argv
-end
--- a/fish/functions/spotlight-off.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function spotlight-off -d "Turn off Spotlight indexing"
-    sudo mdutil -a -i off
-    and sudo mv /System/Library/CoreServices/Search.bundle/ /System/Library/CoreServices/SearchOff.bundle/
-    and killall SystemUIServer
-end
--- a/fish/functions/spotlight-on.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-function spotlight-on -d "Turn on Spotlight indexing"
-    sudo mdutil -a -i on
-    and sudo mv /System/Library/CoreServices/SearchOff.bundle/ /System/Library/CoreServices/Search.bundle/
-    and killall SystemUIServer
-end
--- a/fish/functions/spotlight-tail.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function spotlight-tail -d "Watch what Spotlight is doing"
-    sudo fs_usage -w -f filesys mdworker | grep "open"
-end
--- a/fish/functions/thanks.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function thanks
-    clear; and fcowlol 'Thanks!'
-end
--- a/fish/functions/vp.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function vp -d "Vim Pasteboard"
-  pbpaste | vim -
-end
--- a/fish/functions/wo.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function wo -d "workon"
-    workon $argv
-end
--- a/fish/functions/ydl.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function ydl -d "Youtube-DL" --wraps "youtube-dl"
-    youtube-dl $argv
-end
--- a/fish/virtualenv.fish	Mon Jan 14 12:30:39 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-# mostly from http://coderseye.com/2010/using-virtualenv-with-fish-shell.html
-
-function workon -d "Activate virtual environment in $WORKON_HOME"
-  set tgt {$WORKON_HOME}/$argv[1]
-
-  if [ ! -d $tgt ]
-    mkdir -p "$WORKON_HOME"
-    virtualenv $tgt
-  end
-
-  if [ -d $tgt ]
-    cd $tgt
-
-    deactivate
-
-    set -gx VIRTUAL_ENV "$tgt"
-    set -gx _OLD_VIRTUAL_PATH $PATH
-    set -gx PATH "$VIRTUAL_ENV/bin" $PATH
-
-    # unset PYTHONHOME if set
-    if set -q PYTHONHOME
-       set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
-       set -e PYTHONHOME
-    end
-
-    cd -
-    echo "activated $tgt"
-  else
-    echo "$tgt not found"
-  end
-end
-
-complete -c workon -a "(cd $WORKON_HOME; ls -d *)"
-
-function deactivate -d "Exit virtualenv and return to normal shell environment"
-    # reset old environment variables
-    if test -n "$_OLD_VIRTUAL_PATH"
-        set -gx PATH $_OLD_VIRTUAL_PATH
-        set -e _OLD_VIRTUAL_PATH
-    end
-    if test -n "$_OLD_VIRTUAL_PYTHONHOME"
-        set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
-        set -e _OLD_VIRTUAL_PYTHONHOME
-    end
-    set -e VIRTUAL_ENV
-end
-
--- a/lisp/build-binary	Mon Jan 14 12:30:39 2019 -0500
+++ b/lisp/build-binary	Mon Jan 14 12:31:12 2019 -0500
@@ -6,4 +6,4 @@
 BINARY=$(basename "$1" .lisp)
 shift
 
-sbcl --load "$LISP" --eval "(sb-ext:save-lisp-and-die \"$BINARY\" :executable t :save-runtime-options t :toplevel 'toplevel)" "$@"
+sbcl --load "$LISP" --eval "(sb-ext:save-lisp-and-die \"$BINARY\" :executable t :save-runtime-options t :toplevel '$BINARY:toplevel)" "$@"
--- a/lisp/build-manual	Mon Jan 14 12:30:39 2019 -0500
+++ b/lisp/build-manual	Mon Jan 14 12:31:12 2019 -0500
@@ -7,4 +7,4 @@
 OUT="$NAME.1"
 shift
 
-sbcl --disable-debugger --load "$LISP" --eval "(with-open-file (f \"$OUT\" :direction :output :if-exists :supersede) (adopt:print-manual *ui* :stream f))" --quit "$@"
+sbcl --disable-debugger --load "$LISP" --eval "(with-open-file (f \"$OUT\" :direction :output :if-exists :supersede) (adopt:print-manual $NAME:*ui* :stream f))" --quit "$@"
--- a/lisp/clhs.lisp	Mon Jan 14 12:30:39 2019 -0500
+++ b/lisp/clhs.lisp	Mon Jan 14 12:31:12 2019 -0500
@@ -4,6 +4,12 @@
   (ql:quickload '(:adopt :drakma :plump :clss :alexandria)
                 :silent t))
 
+(defpackage :clhs
+  (:use :cl)
+  (:export :toplevel :*ui*))
+
+(in-package :clhs)
+
 
 ;;;; Config -------------------------------------------------------------------
 (defparameter *default-hyperspec-url* "http://www.lispworks.com/documentation/HyperSpec/")
--- a/lisp/example.lisp	Mon Jan 14 12:30:39 2019 -0500
+++ b/lisp/example.lisp	Mon Jan 14 12:31:12 2019 -0500
@@ -1,6 +1,12 @@
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (ql:quickload '(:adopt) :silent t))
 
+(defpackage :example
+  (:use :cl)
+  (:export :toplevel :*ui*))
+
+(in-package :example)
+
 ;;;; Config -------------------------------------------------------------------
 (defparameter *default-name* "World")
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/genpass.lisp	Mon Jan 14 12:31:12 2019 -0500
@@ -0,0 +1,169 @@
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (ql:quickload '(:adopt :series :iterate :str) :silent t))
+
+(defpackage :genpass
+  (:use :cl :iterate)
+  (:export :toplevel :*ui*))
+
+(in-package :genpass)
+
+;;;; Functionality ------------------------------------------------------------
+(defparameter *passphrase-sep* " ")
+(defparameter *words* nil)
+
+(defmacro -<> (value &body forms)
+  (reduce (lambda (val expression)
+            (subst val '<> expression))
+          forms
+          :initial-value value))
+
+(defun safep (char)
+  (or (char<= #\a char #\z)
+      (char<= #\A char #\Z)
+      (char<= #\0 char #\9)))
+
+(defun word-list ()
+  (unless *words*
+    (setf *words*
+          (iterate
+            (for line :in-file "/usr/share/dict/words" :using #'read-line)
+            (when (every #'safep line)
+              (collect line :result-type vector)))))
+  *words*)
+
+(defun random-unsigned-byte-32 ()
+  (with-open-file (urandom "/dev/urandom" :element-type '(unsigned-byte 8))
+    (logior (ash (read-byte urandom) 0)
+            (ash (read-byte urandom) 8)
+            (ash (read-byte urandom) 16)
+            (ash (read-byte urandom) 24))))
+
+(defun urandom (limit)
+  (check-type limit (integer 0 (#.(expt 2 32))))
+  (iterate
+    (with threshold = (mod (expt 2 32) limit))
+    (for candidate = (random-unsigned-byte-32))
+    (finding (mod candidate limit) :such-that (>= candidate threshold))))
+
+(defun random-elt (sequence)
+  (elt sequence (urandom (length sequence))))
+
+(defun random-words (n)
+  (iterate
+    (with words = (word-list))
+    (repeat n)
+    (collect (random-elt words))))
+
+(defun random-sentence% (words)
+  (str:join *passphrase-sep* (mapcar #'string-capitalize (random-words words))))
+
+(defun random-sentence (words length)
+  (iterate
+    (for candidate = (random-sentence% words))
+    (finding candidate :such-that (<= (length candidate) length))))
+
+(defun random-garbage (length)
+  (with-open-file (urandom "/dev/urandom" :element-type '(unsigned-byte 8))
+    (-<> urandom
+      (series:scan-stream <> #'read-byte)
+      (series:map-fn t #'code-char <>)
+      (series:choose-if #'safep <>)
+      (series:subseries <> 0 length)
+      (series:collect 'string <>))))
+
+(defun random-smart (words length)
+  (check-type words (integer 1))
+  (format nil "~A~A~D"
+          (random-sentence words (- length 1 (length *passphrase-sep*)))
+          *passphrase-sep*
+          (urandom 10)))
+
+
+;;;; Run ----------------------------------------------------------------------
+(defun run (length words smart smush?)
+  (let ((*passphrase-sep* (if smush? "" " ")))
+    (write-string
+      (cond
+        ((zerop words) (random-garbage length))
+        (smart (random-smart words length))
+        (t (random-sentence words length))))))
+
+
+;;;; User Interface -----------------------------------------------------------
+(adopt:define-string *documentation*
+  "Generate a random password.")
+
+(defparameter *examples*
+  '(("Generate a random passphrase no longer than 24 characters:"
+     . "genpass --length 24")
+    ("Generate a more random, harder to type password:"
+     . "genpass --no-words")
+    ("Generate a six word passphrase with no spaces:"
+     . "genpass --words 6 --smush")))
+
+(adopt:define-interface *ui*
+    (:name "genpass"
+     :usage "[OPTIONS]"
+     :summary "Generate a random password."
+     :documentation *documentation*
+     :examples *examples*)
+  ((help)
+   :documentation "Display help and exit."
+   :long "help"
+   :short #\h
+   :reduce (constantly t))
+  ((length)
+   :documentation "Ensure password is no longer than N characters (default 40)."
+   :long "length"
+   :short #\l
+   :parameter "N"
+   :initial-value 40
+   :reduce #'adopt:newest
+   :key #'parse-integer)
+  ((words)
+   :documentation "If non-zero, generate passphrases of N words instead of opaque strings (default 4)."
+   :long "words"
+   :short #\w
+   :parameter "N"
+   :initial-value 4
+   :reduce #'adopt:newest
+   :key #'parse-integer)
+  ((no-words words)
+   :documentation "Shorthand for --words=0."
+   :long "no-words"
+   :short #\W
+   :reduce (constantly 0))
+  ((smart)
+   :documentation "Smart mode (the default).  Generate as with --words, but add a number on the end to satisfy the red tape on many sites."
+   :long "smart"
+   :short #\s
+   :initial-value t
+   :reduce (constantly t))
+  ((no-smart smart)
+   :documentation "Turn off smart mode."
+   :long "no-smart"
+   :short #\S
+   :reduce (constantly nil))
+  ((smush)
+   :documentation "Don't include spaces in passphrases."
+   :long "smush"
+   :short #\m
+   :reduce (constantly t))
+  ((no-smush smush)
+   :documentation "Include spaces in passphrases (the default)."
+   :long "no-smush"
+   :short #\M
+   :reduce (constantly nil)))
+
+(defun toplevel ()
+  (handler-case
+      (multiple-value-bind (arguments options) (adopt:parse-options *ui*)
+        (when (gethash 'help options)
+          (adopt:print-usage-and-exit *ui*))
+        (when arguments
+          (error "Unrecognized command line arguments: ~S" arguments))
+        (run (gethash 'length options)
+             (gethash 'words options)
+             (gethash 'smart options)
+             (gethash 'smush options)))
+    (error (c) (adopt:print-error-and-exit c))))
--- a/lisp/lispindent.lisp	Mon Jan 14 12:30:39 2019 -0500
+++ b/lisp/lispindent.lisp	Mon Jan 14 12:31:12 2019 -0500
@@ -4,6 +4,12 @@
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (ql:quickload '(:adopt) :silent t))
 
+(defpackage :lispindent
+  (:use :cl)
+  (:export :toplevel :*ui*))
+
+(in-package :lispindent)
+
 
 ;Dorai Sitaram
 ;Oct 8, 1999
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/search.lisp	Mon Jan 14 12:31:12 2019 -0500
@@ -0,0 +1,92 @@
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (ql:quickload '(:adopt :cl-ppcre) :silent t))
+
+(defpackage :search
+  (:use :cl)
+  (:export :toplevel :*ui*))
+
+(in-package :search)
+
+;;;; Functionality ------------------------------------------------------------
+(defun make-scanner (pattern &key literal)
+  (let ((ppcre:*use-bmh-matchers* t)
+        (ppcre:*optimize-char-classes* :charmap)
+        (ppcre:*regex-char-code-limit* 128))
+    (ppcre:create-scanner (if literal
+                            `(:sequence ,pattern)
+                            (ppcre:parse-string pattern)))))
+
+(defun search-stream (scanner stream &key invert)
+  (loop
+    :for line = (read-line stream nil nil nil)
+    :while line
+    :when (eq invert (not (ppcre:scan scanner line)))
+    :do (write-line line)))
+
+(defun search-file (scanner path &key invert)
+  (with-open-file (stream path :external-format '(:ascii :replacement #\?))
+    (search-stream scanner stream :invert invert)))
+
+(defun run (pattern paths &key literal invert)
+  (loop
+    :with scanner = (make-scanner pattern :literal literal)
+    :for path :in paths
+    :do (if (string= "-" path)
+          (search-stream scanner *standard-input* :invert invert)
+          (search-file scanner path :invert invert))))
+
+
+;;;; CLI ----------------------------------------------------------------------
+(adopt:define-string *documentation*
+  "A simple reimplementation of grep in Common Lisp.  FILEs will be searched ~
+  for lines that match PATTERN and matching lines will be printed.~@
+  ~@
+  Perl-compatible regular expressions are supported.~@
+  ~@
+  If no FILEs are given, standard input will be searched.  Standard input can ~
+  also be searched by specifying - as a filename.")
+
+(adopt:define-interface *ui*
+    (:name "search"
+     :usage "PATTERN [FILE...]"
+     :summary "Print lines that match a regular expression."
+     :documentation *documentation*)
+  (help
+    :documentation "display help and exit"
+    :long "help"
+    :short #\h
+    :reduce (constantly t))
+  (literal
+    :documentation "treat PATTERN as a literal string instead of a regex"
+    :long "literal"
+    :short #\l
+    :reduce (constantly t))
+  ((no-literal literal)
+   :documentation "treat PATTERN as a regex (the default)"
+   :long "no-literal"
+   :short #\L
+   :reduce (constantly nil))
+  (invert
+    :documentation "print non-matching lines"
+    :long "invert"
+    :short #\v
+    :initial-value nil
+    :reduce (constantly t))
+  ((no-invert invert)
+   :documentation "print matching lines (the default)"
+   :long "no-invert"
+   :short #\V
+   :reduce (constantly nil)))
+
+(defun toplevel ()
+  (handler-case
+      (multiple-value-bind (arguments options) (adopt:parse-options *ui*)
+        (when (gethash 'help options)
+          (adopt:print-usage-and-exit *ui*))
+        (when (null arguments)
+          (error "PATTERN is required"))
+        (destructuring-bind (pattern . paths) arguments
+          (run pattern (or paths (list "-"))
+               :literal (gethash 'literal options)
+               :invert (gethash 'invert options))))
+    (error (c) (adopt:print-error-and-exit c))))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/man/man1/brows.1	Mon Jan 14 12:31:12 2019 -0500
@@ -0,0 +1,1 @@
+/home/sjl/src/brows/bin/brows.1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/man/man1/cacl.1	Mon Jan 14 12:31:12 2019 -0500
@@ -0,0 +1,1 @@
+/home/sjl/src/cacl/build/cacl.1
\ No newline at end of file
--- a/restic/excludes.txt	Mon Jan 14 12:30:39 2019 -0500
+++ b/restic/excludes.txt	Mon Jan 14 12:31:12 2019 -0500
@@ -6,7 +6,13 @@
 /home/sjl/.mozilla
 /home/sjl/.dropbox
 /home/sjl/.steam
+/home/sjl/.quicklisp
+/home/sjl/.virtualenvs
 /home/sjl/.local/share
+/home/sjl/.local/lib/python*
 /home/sjl/.config/chromium
+/home/sjl/.config/libreoffice
+/home/sjl/.config/discord
+/home/sjl/.dropbox-dist
 /home/sjl/Dropbox/.dropbox.cache
 
--- a/stumpwmrc	Mon Jan 14 12:30:39 2019 -0500
+++ b/stumpwmrc	Mon Jan 14 12:31:12 2019 -0500
@@ -14,6 +14,7 @@
       *input-window-gravity* :center
       *debug-level* 0
       *resize-increment* 75
+      *new-frame-action* :empty
       *window-format* "(%n%m%20t)"
       *window-name-source* :title
       *shell-program* "/bin/bash")
--- a/vim/custom-dictionary.utf-8.add	Mon Jan 14 12:30:39 2019 -0500
+++ b/vim/custom-dictionary.utf-8.add	Mon Jan 14 12:31:12 2019 -0500
@@ -272,3 +272,5 @@
 healthchecks
 Nginx
 architecting
+CACL
+shaders
--- a/vim/vimrc	Mon Jan 14 12:30:39 2019 -0500
+++ b/vim/vimrc	Mon Jan 14 12:31:12 2019 -0500
@@ -2637,7 +2637,7 @@
 
     " Keys for Lisp files
     au FileType lisp nnoremap <buffer> <localleader>e :call vlime#plugin#Compile(vlime#ui#CurTopExpr(v:true))<cr>
-    au FileType lisp nnoremap <buffer> <localleader>f :call vlime#plugin#CompileFile(expand("%:p"))<cr>
+    au FileType lisp nnoremap <buffer> <localleader>f :w<cr>:call vlime#plugin#CompileFile(expand("%:p"))<cr>
     au FileType lisp nnoremap <buffer> <localleader>S :call vlime#plugin#SendToREPL(vlime#ui#CurTopExpr())<cr>
     au FileType lisp nnoremap <buffer> <localleader>i :call vlime#plugin#Inspect(vlime#ui#CurExprOrAtom())<cr>
     au FileType lisp nnoremap <buffer> <nowait> <localleader>I :call vlime#plugin#Inspect()<cr>
@@ -2652,6 +2652,10 @@
     " Keys for the Inspector
     au FileType vlime_inspector nnoremap <buffer> <2-LeftMouse> :call vlime#ui#inspector#InspectorSelect()<cr>
 
+    " Keys for the Preview
+    au FileType vlime_preview nnoremap <buffer> <localleader>p :call vlime#plugin#SetPackage()<cr>
+    au FileType vlime_preview nnoremap <buffer> <localleader>m1 :call vlime#plugin#ExpandMacro(vlime#ui#CurExpr(), "one")<cr>
+
     " Universal keys, for all kinds of Vlime windows
     au FileType lisp,vlime_repl,vlime_inspector,vlime_sldb,vlime_notes,vlime_xref,vlime_preview call MapVlimeKeys()
 
--- a/w3m-keymap	Mon Jan 14 12:30:39 2019 -0500
+++ b/w3m-keymap	Mon Jan 14 12:31:12 2019 -0500
@@ -1,2 +1,4 @@
 keymap  q       EXIT
 keymap  K       EXIT
+keymap  H       PREV_PAGE
+keymap  L       NEXT_PAGE