aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2016-08-14 21:29:17 +1200
committerTom Ryder <tom@sanctum.geek.nz>2016-08-14 21:29:17 +1200
commitcc308cf2b396249da58a897e40e5c829de4c4d78 (patch)
tree76c109e485e59d98e9b1a83f106e2ad7d1d7656c
parentMerge branch 'master' into freebsd (diff)
parentgit push.default from "matching" to "current" (diff)
downloaddotfiles-cc308cf2b396249da58a897e40e5c829de4c4d78.tar.gz
dotfiles-cc308cf2b396249da58a897e40e5c829de4c4d78.zip
Merge branch 'master' into freebsd
-rw-r--r--.gitignore3
-rw-r--r--Makefile26
-rw-r--r--README.markdown32
-rw-r--r--X/xbindkeysrc7
-rw-r--r--bash/bashrc.d/prompt.bash28
-rwxr-xr-xbin/br2
-rw-r--r--bin/brxs3
-rwxr-xr-xbin/dmp28
-rw-r--r--bin/sd2u.sed2
-rw-r--r--bin/su2d.sed2
-rw-r--r--bin/unf.sed17
-rwxr-xr-xbin/urlh30
-rwxr-xr-xbin/urlmt3
-rwxr-xr-xbin/xgo33
-rw-r--r--bin/xgoc3
-rw-r--r--git/gitconfig.m42
-rw-r--r--man/man1/br.112
-rw-r--r--man/man1/brxs.117
-rw-r--r--man/man1/d2u.12
-rw-r--r--man/man1/dmp.115
-rw-r--r--man/man1/sd2u.121
-rw-r--r--man/man1/su2d.120
-rw-r--r--man/man1/u2d.12
-rw-r--r--man/man1/unf.122
-rw-r--r--man/man1/urlh.117
-rw-r--r--man/man1/urlmt.115
-rw-r--r--man/man1/xgo.114
-rw-r--r--man/man1/xgoc.113
28 files changed, 336 insertions, 55 deletions
diff --git a/.gitignore b/.gitignore
index 3b1703a5..45f195cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
+bin/sd2u
+bin/su2d
+bin/unf
games/acq
games/kvlt
games/zs
diff --git a/Makefile b/Makefile
index 937e9528..8e724663 100644
--- a/Makefile
+++ b/Makefile
@@ -60,10 +60,13 @@ EMAIL := tom@sanctum.geek.nz
KEY := 0xC14286EA77BB8872
SENDMAIL := /usr/bin/msmtp
-all : git/gitconfig gnupg/gpg.conf
+all : bin/sd2u bin/su2d bin/unf git/gitconfig gnupg/gpg.conf
clean distclean :
rm -f \
+ bin/sd2u \
+ bin/su2d \
+ bin/unf \
games/acq \
games/kvlt \
games/zs \
@@ -73,6 +76,18 @@ clean distclean :
mutt/muttrc \
tmux/tmux.conf
+bin/sd2u : bin/sd2u.sed
+ bin/shb bin/sd2u.sed sed -f > "$@"
+ chmod +x "$@"
+
+bin/su2d : bin/su2d.sed
+ bin/shb bin/su2d.sed sed -f > "$@"
+ chmod +x "$@"
+
+bin/unf : bin/unf.sed
+ bin/shb bin/unf.sed sed -f > "$@"
+ chmod +x "$@"
+
games/acq : games/acq.sed
bin/shb games/acq.sed sed -f > "$@"
chmod +x "$@"
@@ -145,9 +160,14 @@ install-bash-completion : install-bash
install -pm 0644 -- bash/bash_completion "$(HOME)"/.config/bash_completion
install -pm 0644 -- bash/bash_completion.d/* "$(HOME)"/.bash_completion.d
-install-bin : test-bin install-bin-man
+install-bin : bin/sd2u bin/su2d bin/unf test-bin install-bin-man
install -m 0755 -d -- "$(HOME)"/.local/bin
- install -m 0755 -- bin/* "$(HOME)"/.local/bin
+ for name in bin/* ; do \
+ case $$name in \
+ *.sed) ;; \
+ *) install -m 0755 -- "$$name" "$(HOME)"/.local/bin ;; \
+ esac \
+ done
install-bin-man :
install -m 0755 -d -- \
diff --git a/README.markdown b/README.markdown
index 4d3bf251..191371f4 100644
--- a/README.markdown
+++ b/README.markdown
@@ -298,7 +298,7 @@ Installed by the `install-bin` target:
output.
* `sta(1)` runs a command on multiple hosts read from `sls(1)` and prints
the hostname if the command returns zero.
-* Three URL-related shorcut scripts:
+* Five URL-related shortcut scripts:
* `hurl(1)` extracts values of `href` attributes of `<a>` tags, sorts
them uniquely, and writes them to `stdout`; it requires
[pup](https://github.com/ericchiang/pup).
@@ -307,6 +307,10 @@ Installed by the `install-bin` target:
* `urlc(1)` accepts a list of URLs on `stdin` and writes error messages
to `stderr` if any of the URLs are broken, redirecting, or are insecure
and have working secure versions; requires `curl(1)`.
+ * `urlh(1)` prints the values for a given HTTP header from a HEAD
+ response.
+ * `urlmt(1)` prints the MIME type from the `Content-Type` header as
+ retrieved by `urlh(1)`.
* Three RFC-related shortcut scripts:
* `rfcf(1)` fetches ASCII RFCs from the IETF website.
* `rfct(1)` formats ASCII RFCs.
@@ -318,19 +322,34 @@ Installed by the `install-bin` target:
* `rnda(1)` uses `rndi(1)` to choose a random argument.
* `rndf(1)` uses `rnda(1)` to choose a random file from a directory.
* `rndl(1)` uses `rndi(1)` to choose a random line from files.
-* Two file formatting scripts:
+* Four file formatting scripts:
* `d2u(1)` converts DOS line endings in files to UNIX ones.
* `u2d(1)` converts UNIX line endings in files to DOS ones.
+ * `stbl(1)` strips a trailing blank line from the files in its arguments.
+ * `stws(1)` strips trailing spaces from the ends of lines of the files in
+ its arguments.
+* Five stream formatting scripts:
+ * `sd2u(1)` converts DOS line endings in streams to UNIX ones.
+ * `su2d(1)` converts UNIX line endings in streams to DOS ones.
+ * `tl(1)` tags input lines with a prefix or suffix, basically a `sed(1)`
+ shortcut.
+ * `tlcs(1)` executes a command and uses `tl(1)` to tag stdout and stderr
+ lines, and color them if you want.
+ * `unf(1)` joins lines with leading spaces to the previous line. Intended
+ for unfolding HTTP headers, but it should work for most RFC 822
+ formats.
* `apf(1)` prepends arguments to a command with ones read from a file,
intended as a framework for shell functions.
* `ax(1)` evaluates an awk expression given on the command line; this is
intended as a quick way to test how Awk would interpret a given expression.
* `bel(1)` prints a terminal bell character.
-* `br(1)` launches $BROWSER.
+* `br(1)` launches $BROWSER, or a more suitable application for an URL if it
+ knows of one.
* `ca(1)` prints a count of its given arguments.
* `cf(1)` prints a count of entries in a given directory.
* `clrd(1)` sets up a per-line file read, clearing the screen first.
* `clwr(1)` sets up a per-line file write, clearing the screen before each line
+* `dmp(1)` copies a pass(1) entry selected by `dmenu(1)` to the X CLIPBOARD.
* `dub(1)` lists the biggest entries in a directory.
* `edda(1)` provides a means to run `ed(1)` over a set of files preserving
any options, mostly useful for scripts.
@@ -367,19 +386,12 @@ Installed by the `install-bin` target:
* `rmrej(1)` deletes rejected hunks from a failed `patch(1)` run.
* `shb(1)` attempts to build shebang lines for scripts from `$PATH`.
* `spr(1)` posts its input to the sprunge.us pastebin.
-* `stbl(1)` strips a trailing blank line from the files in its arguments.
* `stex(1)` strips extensions from filenames.
-* `stws(1)` strips trailing spaces from the ends of lines of the files in its
- arguments.
* `sue(8)` execs `sudoedit(8)` as the owner of all the file arguments given,
perhaps in cases where you may not necessarily have `root` `sudo(8)`
privileges.
* `td(1)` manages a to-do file for you with `$EDITOR` and `git(1)`; I used to
use Taskwarrior, but found it too complex and buggy.
-* `tl(1)` tags input lines with a prefix or suffix, basically a `sed(1)`
- shortcut.
-* `tlcs(1)` executes a command and uses `tl(1)` to tag stdout and stderr
- lines, and color them if you want.
* `try(1)` repeats a command up to a given number of times until it succeeds,
only printing error output if all three attempts failed. Good for
tolerating blips or temporary failures in `cron(8)` scripts.
diff --git a/X/xbindkeysrc b/X/xbindkeysrc
index a329fe7c..ee58eb35 100644
--- a/X/xbindkeysrc
+++ b/X/xbindkeysrc
@@ -4,15 +4,18 @@
"exec br"
Mod4 + b
-"exec dmenu_run -fn 'terminus-iso8860-1-12' -nb '#111111' -nf '#eeeeee' -sb '#285577' -sf '#ffffff'"
+"exec dmenu_run"
Mod4 + d
-"exec brxs"
+"exec xgoc"
Mod4 + g
"exec gimp"
Mod4 + i
+"exec dmp"
+ Mod4 + p
+
"exec i3lock --color=#000000 --image ~/.i3/lock.png --nofork"
Mod4 + slash
diff --git a/bash/bashrc.d/prompt.bash b/bash/bashrc.d/prompt.bash
index feae7833..b5ac74b1 100644
--- a/bash/bashrc.d/prompt.bash
+++ b/bash/bashrc.d/prompt.bash
@@ -18,21 +18,23 @@ prompt() {
# Set up pre-prompt command
PROMPT_COMMAND='PROMPT_RETURN=$? ; history -a'
- # Set up prompt, including optional PROMPT_PREFIX and PROMPT_SUFFIX
- # variables
- PS1='[\u@\h:\w]'
- PS1=$PS1'$(prompt vcs)'
- PS1=$PS1'$(prompt job)'
- PS1=$PS1'$(prompt ret)'
- PS1='${PROMPT_PREFIX}'$PS1
- PS1=$PS1'${PROMPT_SUFFIX}'
- PS1=$PS1'\$'
-
# If Bash 4.0 is available, trim very long paths in prompt
if ((BASH_VERSINFO[0] >= 4)) ; then
PROMPT_DIRTRIM=4
fi
+ # Basic prompt shape
+ PS1='[\u@\h:\w]'
+
+ # Add sub-commands; VCS, job, and return status checks
+ PS1=$PS1'$(prompt vcs)$(prompt job)$(prompt ret)'
+
+ # Add prefix and suffix
+ PS1='${PROMPT_PREFIX}'$PS1'${PROMPT_SUFFIX}'
+
+ # Add terminating "$" or "#" sign
+ PS1=$PS1'\$'
+
# Count available colors
local -i colors
colors=$( {
@@ -95,6 +97,7 @@ prompt() {
PS4='+ '
;;
+ # Git prompt function
git)
# Bail if we have no git(1)
if ! hash git 2>/dev/null ; then
@@ -112,6 +115,7 @@ prompt() {
fi
branch=${branch##*/}
+ # Collect symbols representing repository state
local state
if ! git diff-files --quiet ; then
state=${state}!
@@ -120,9 +124,9 @@ prompt() {
state=${state}+
fi
if [[ -n $(git ls-files --others --exclude-standard) ]] ; then
- state=${state}?
+ state=${state}\?
fi
- if git rev-parse --verify refs/stash >/dev/null 2>&1 ; then
+ if git rev-parse --quiet --verify refs/stash >/dev/null ; then
state=${state}^
fi
diff --git a/bin/br b/bin/br
index 1d982c04..399c6038 100755
--- a/bin/br
+++ b/bin/br
@@ -1,3 +1,3 @@
#!/bin/sh
-# Launch $BROWSER
+# Just launch $BROWSER with any given arguments
exec "$BROWSER" "$@"
diff --git a/bin/brxs b/bin/brxs
deleted file mode 100644
index 5324885d..00000000
--- a/bin/brxs
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-# Run $BROWSER with an URL retrieved from X's PRIMARY select
-exec br "$(xsel)"
diff --git a/bin/dmp b/bin/dmp
new file mode 100755
index 00000000..9ef58f67
--- /dev/null
+++ b/bin/dmp
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+# Get the password store directory, bail if we can't
+pwsd=${PASSWORD_STORE_DIR:-$HOME/.password-store}
+pwsd=${pwsd%/}
+[ -n "$pwsd" ] || exit
+
+# Get the password; get all the names from find(1)
+pw=$(
+ cd -- "$pwsd" || exit
+ # Get all the names from find(1)
+ find ./ -name \*.gpg |
+ # Sort them
+ sort |
+ # Strip the leading directory and the trailing .gpg
+ sed '
+s_^\./__
+s_\.gpg$__
+ ' |
+ # Use dmenu(1) to prompt the user to select one
+ dmenu
+) || exit
+
+# Bail if we don't have a password
+[ -n "$pw" ] || exit
+
+# Pump the password into the clipboard xsel(2); allow 10 seconds
+pass show "$pw" | xsel -ibt 10000
diff --git a/bin/sd2u.sed b/bin/sd2u.sed
new file mode 100644
index 00000000..14588623
--- /dev/null
+++ b/bin/sd2u.sed
@@ -0,0 +1,2 @@
+# Convert DOS line endings to UNIX ones
+s/\r$//g
diff --git a/bin/su2d.sed b/bin/su2d.sed
new file mode 100644
index 00000000..06998986
--- /dev/null
+++ b/bin/su2d.sed
@@ -0,0 +1,2 @@
+# Convert UNIX line endings to DOS ones
+/[^\r]$/s/$/\r/g
diff --git a/bin/unf.sed b/bin/unf.sed
new file mode 100644
index 00000000..23270fc6
--- /dev/null
+++ b/bin/unf.sed
@@ -0,0 +1,17 @@
+# Unfold lines with leading spaces (e.g. RFC 822 headers)
+/^[ \t]/!{
+ 1!{
+ x
+ p
+ x
+ }
+ h
+}
+/^[ \t]/{
+ H
+ x
+ s/[\r\n]//g
+ x
+}
+$!d
+x
diff --git a/bin/urlh b/bin/urlh
new file mode 100755
index 00000000..2c547ad0
--- /dev/null
+++ b/bin/urlh
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Get values for HTTP headers for the given URL
+
+# Check arguments
+if [ "$#" -ne 2 ] ; then
+ printf 'urlt: Need an URL and a header name\n'
+ exit 2
+fi
+url=$1 header=$2
+
+# Run cURL header request
+curl -I -- "$url" |
+
+# Unfold the headers
+unf |
+
+# Change the line endings to UNIX format
+sd2u |
+
+# Use awk to find any values for the header case-insensitively
+awk -v header="$header" '
+BEGIN {
+ FS=": *"
+ header = tolower(header)
+}
+tolower($1) == header {
+ sub(/^[^ ]*: */, "")
+ print
+}
+'
diff --git a/bin/urlmt b/bin/urlmt
new file mode 100755
index 00000000..465ff588
--- /dev/null
+++ b/bin/urlmt
@@ -0,0 +1,3 @@
+#!/bin/sh
+# Get the MIME type for a given URL
+urlh "$1" Content-Type | sed 's/; .*//'
diff --git a/bin/xgo b/bin/xgo
new file mode 100755
index 00000000..56bbb0f9
--- /dev/null
+++ b/bin/xgo
@@ -0,0 +1,33 @@
+#!/bin/sh
+# Test and open a clipboard URL with an apt program
+
+# Check arguments
+if [ "$#" -eq 0 ] ; then
+ printf 2>&1 'xgo: At least one URL required\n'
+fi
+
+# Iterate over the URL arguments
+for url ; do (
+
+ # If it's a YouTube video without a given start time, load it in mpv(1)
+ case $url in
+ *youtube.com/watch*[?\&]t=) ;;
+ *youtube.com/watch*)
+ mpv -- "$url" && continue
+ ;;
+ esac
+
+ # If the MIME type is an image, load it in feh(1)
+ case $mt in
+ image/gif) ;;
+ image/*)
+ curl -- "$url" | feh - && continue
+ ;;
+ esac
+
+ # Get the MIME type data
+ mt=$(urlmt "$url")
+
+ # Otherwise, just pass it to br(1)
+ br "$url"
+) & done
diff --git a/bin/xgoc b/bin/xgoc
new file mode 100644
index 00000000..9e4b0929
--- /dev/null
+++ b/bin/xgoc
@@ -0,0 +1,3 @@
+#!/bin/sh
+# Run xgo(1) with the contents of the X clipboard
+xgo "$(xsel)"
diff --git a/git/gitconfig.m4 b/git/gitconfig.m4
index 060740a2..616fdad8 100644
--- a/git/gitconfig.m4
+++ b/git/gitconfig.m4
@@ -25,7 +25,7 @@
ff = false
[push]
- default = matching
+ default = current
[sendemail]
confirm = compose
diff --git a/man/man1/br.1 b/man/man1/br.1
index 5d4d928b..ad841750 100644
--- a/man/man1/br.1
+++ b/man/man1/br.1
@@ -12,10 +12,14 @@ BROWSER=firefox
.B br
.SH DESCRIPTION
.B br
-execs the program in the $BROWSER environment variable. That's it. It was
-written so the browser could safely be launched from xbindkeys(1) and similar
-programs.
+run with no arguments just execs the program in the $BROWSER environment
+variable. If given a single URL, it tries to get its MIME type from a HEAD
+request and matches on the URL and/or the MIME type to see if any more suitable
+programs could open it. Otherwise, it falls back on $BROWSER.
+.P
+At the time of writing, it tries to load image types with feh(1), and YouTube
+URLs without a start time with mpv(1).
.SH SEE ALSO
-brxs(1)
+brxs(1), urlh(1), urlmt(1), feh(1), mpv(1)
.SH AUTHOR
Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/brxs.1 b/man/man1/brxs.1
deleted file mode 100644
index fe6adb95..00000000
--- a/man/man1/brxs.1
+++ /dev/null
@@ -1,17 +0,0 @@
-.TH BRXS 1 "August 2016" "Manual page for brxs"
-.SH NAME
-.B brxs
-\- launch "$BROWSER" with the contents of the X clipboard as the sole argument
-.SH SYNOPSIS
-.B brxs
-BROWSER=firefox
-.B brxs
-.SH DESCRIPTION
-.B brxs
-runs br(1) with the contents of the X selection buffer as retrieved by xsel(1)
-as its sole argument. The intent is to have a quick way to fire up the browser
-to look at an URL you have in your clipboard.
-.SH SEE ALSO
-br(1)
-.SH AUTHOR
-Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/d2u.1 b/man/man1/d2u.1
index 33e07cb5..d42b87b9 100644
--- a/man/man1/d2u.1
+++ b/man/man1/d2u.1
@@ -8,6 +8,6 @@
Applies ed(1) to change DOS \\r\\n (CRLF) line endings to UNIX \\n line
endings. Files already in UNIX format should be unchanged.
.SH SEE ALSO
-ed(1), u2d(1)
+ed(1), u2d(1), sd2u(1), su2d(1)
.SH AUTHOR
Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/dmp.1 b/man/man1/dmp.1
new file mode 100644
index 00000000..2d9111d6
--- /dev/null
+++ b/man/man1/dmp.1
@@ -0,0 +1,15 @@
+.TH DMP 1 "May 2014" "Manual page for dmp"
+.SH NAME
+.B dmp
+\- pick a pass(1) password with dmenu(1)
+.SH SYNOPSIS
+.B dmp
+.SH DESCRIPTION
+.B dmp
+applies dmenu(1) to pick a password entry
+from a pass(1) store and put it into the X
+CLIPBOARD for up to 10 seconds.
+.SH SEE ALSO
+dmenu(1), pass(1)
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/sd2u.1 b/man/man1/sd2u.1
new file mode 100644
index 00000000..2903447c
--- /dev/null
+++ b/man/man1/sd2u.1
@@ -0,0 +1,21 @@
+.TH SD2U 1 "August 2016" "Manual page for sd2u"
+.SH NAME
+.B sd2u
+\- change text stream from DOS to UNIX format
+.SH USAGE
+.B sd2u
+FILE1 [FILE2 ...]
+.br
+.B sd2u
+< FILE
+.br
+program |
+.B sd2u
+.B sd2u
+.SH DESCRIPTION
+Applies sed(1) to change DOS \\r\\n (CRLF) line endings to UNIX \\n line
+endings. Lines already in UNIX format should be unchanged.
+.SH SEE ALSO
+sed(1), su2d(1), d2u(1), u2d(1)
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/su2d.1 b/man/man1/su2d.1
new file mode 100644
index 00000000..6dc71787
--- /dev/null
+++ b/man/man1/su2d.1
@@ -0,0 +1,20 @@
+.TH SU2D 1 "August 2016" "Manual page for su2d"
+.SH NAME
+.B su2d
+\- change text files from UNIX to DOS format
+.SH USAGE
+.B su2d
+FILE1 [FILE2 ...]
+.br
+.B su2d
+< FILE
+.br
+program |
+.B su2d
+.SH DESCRIPTION
+Applies sed(1) to change UNIX \\n line endings to DOS \\r\\n (CRLF) line
+endings. Lines already in DOS format should be unchanged.
+.SH SEE ALSO
+sed(1), sd2u(1), d2u(1), u2d(1)
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/u2d.1 b/man/man1/u2d.1
index 48dfaeb5..271b28ac 100644
--- a/man/man1/u2d.1
+++ b/man/man1/u2d.1
@@ -8,6 +8,6 @@
Applies ed(1) to change UNIX \\n line endings to DOS \\r\\n (CRLF) line
endings. Files already in DOS format should be unchanged.
.SH SEE ALSO
-ed(1), d2u(1)
+ed(1), d2u(1), sd2u(1), su2d(1)
.SH AUTHOR
Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/unf.1 b/man/man1/unf.1
new file mode 100644
index 00000000..709e7d2b
--- /dev/null
+++ b/man/man1/unf.1
@@ -0,0 +1,22 @@
+.TH UNF 1 "August 2016" "Manual page for unf"
+.SH NAME
+.B unf
+\- join lines with leading spaces to the previous line
+.SH USAGE
+.B unf
+FILE
+.br
+.B unf
+<FILE
+.br
+.B unf
+FILE1 FILE2...
+.br
+curl -I http://www.example.net/ |
+.B
+unf
+.SH DESCRIPTION
+Joins lines with leading spaces in the output to the previous line,
+such as folded header fields in RFC 822 format messages.
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/urlh.1 b/man/man1/urlh.1
new file mode 100644
index 00000000..5066c7d0
--- /dev/null
+++ b/man/man1/urlh.1
@@ -0,0 +1,17 @@
+.TH URLH 1 "August 2016" "Manual page for urlh"
+.SH NAME
+.B urlh
+\- search for URL header values by name
+.SH SYNOPSIS
+.B urlh
+https://www.sanctum.geek.nz/
+Content-Type
+.SH DESCRIPTION
+.B urlh
+makes a cURL HEAD request for the given URL, and searches the headers for a key
+matching the given name, case-insensitively. It prints any matching values to
+stdout.
+.SH SEE ALSO
+curl(1), urlmt(1)
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/urlmt.1 b/man/man1/urlmt.1
new file mode 100644
index 00000000..843f7d81
--- /dev/null
+++ b/man/man1/urlmt.1
@@ -0,0 +1,15 @@
+.TH URLMT 1 "August 2016" "Manual page for urlmt"
+.SH NAME
+.B urlmt
+\- try to get the MIME type of the document at the given URL
+.SH SYNOPSIS
+.B urlmt
+https://www.sanctum.geek.nz/
+.SH DESCRIPTION
+.B urlmt
+uses urlh(1) to search for a Content-Type header for the given URL, and prints
+it with any trailing data (e.g. charset) trimmed off.
+.SH SEE ALSO
+curl(1), urlh(1)
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/xgo.1 b/man/man1/xgo.1
new file mode 100644
index 00000000..13cbdd37
--- /dev/null
+++ b/man/man1/xgo.1
@@ -0,0 +1,14 @@
+.TH XGO 1 "August 2016" "Manual page for xgo"
+.SH NAME
+.B xgo
+\- view the given URL in an appropriate program, falling back on $BROWSER
+.SH SYNOPSIS
+.B xgo
+.SH DESCRIPTION
+.B xgo
+examines each of its arguments and opens an appropriate program to view it,
+falling back on $BROWSER.
+.SH SEE ALSO
+br(1), xgoc(1)
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/xgoc.1 b/man/man1/xgoc.1
new file mode 100644
index 00000000..a4c23571
--- /dev/null
+++ b/man/man1/xgoc.1
@@ -0,0 +1,13 @@
+.TH XGOC 1 "August 2016" "Manual page for xgoc"
+.SH NAME
+.B xgoc
+\- view an URL in the X clipboard in an appropriate program
+.SH SYNOPSIS
+.B xgoc
+.SH DESCRIPTION
+.B xgoc
+reads an URL from the X clipboard with xsel(1) and runs xgo(1) on it.
+.SH SEE ALSO
+br(1), xgoc(1)
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>