aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IDEAS.md43
-rw-r--r--ISSUES.md46
-rw-r--r--README.md629
3 files changed, 356 insertions, 362 deletions
diff --git a/IDEAS.md b/IDEAS.md
index 37857163..d79a635f 100644
--- a/IDEAS.md
+++ b/IDEAS.md
@@ -1,24 +1,25 @@
Ideas
=====
-* A wrapper ksw(1df) (kill-switch) that traps SIGINT to kill a called program
- or loop immediately, rather than aborting a loop (is this possible?)
-* A wrapper sil(1df) or nec(1df) to turn stty -echo off for the duration of a
- paste?
-* I can probably share my psql() completions/shortcuts after sanitizing them
- a bit
-* Wouldn't be too hard to add some HTTP BASIC auth to ix(1df) to make pastes
- manageable
-* Have eds(1df) accept stdin with the "starting content" for the script
-* Convert all the manual pages to mandoc maybe? <https://en.wikipedia.org/wiki/Mandoc>
-* qmp(1df)--quick man page
-* The solution to chn(1df) not running in parallel is probably backgrounded
- processes and mkfifo(1).
-* Write something like hcat(1df) or tcat(1df) that includes filename headings
- for each concatenated file.
-* I can probably get rid of all that nasty templated shell by writing
- something that wraps around td(1df) and generates shell script to run, and
- calls that via `eval`.
-* Ideally, the .awk and/or .sed scripts in the bin and games dirs should be
- syntax-checked or linted. I could at least add some patient application of
- appropriate `gawk --lint` calls for each of the .awk scripts.
+* A wrapper ksw(1df) (kill-switch) that traps SIGINT to kill a called program
+ or loop immediately, rather than aborting a loop (is this possible?)
+* A wrapper sil(1df) or nec(1df) to turn stty -echo off for the duration of a
+ paste?
+* I can probably share my psql() completions/shortcuts after sanitizing them a
+ bit
+* Wouldn't be too hard to add some HTTP BASIC auth to ix(1df) to make pastes
+ manageable
+* Have eds(1df) accept stdin with the "starting content" for the script
+* Convert all the manual pages to mandoc maybe?
+ <https://en.wikipedia.org/wiki/Mandoc>
+* qmp(1df)--quick man page
+* The solution to chn(1df) not running in parallel is probably backgrounded
+ processes and mkfifo(1).
+* Write something like hcat(1df) or tcat(1df) that includes filename headings
+ for each concatenated file.
+* I can probably get rid of all that nasty templated shell by writing something
+ that wraps around td(1df) and generates shell script to run, and calls that
+ via `eval`.
+* Ideally, the .awk and/or .sed scripts in the bin and games dirs should be
+ syntax-checked or linted. I could at least add some patient application of
+ appropriate `gawk --lint` calls for each of the .awk scripts.
diff --git a/ISSUES.md b/ISSUES.md
index 77e0b1d9..80e75039 100644
--- a/ISSUES.md
+++ b/ISSUES.md
@@ -1,26 +1,26 @@
Known issues
============
-* man(1) completion doesn't work on OpenBSD as manpath(1) isn't a thing on
- that system; need to find some way of finding which manual directories
- should be searched at runtime, if there is one.
-* The checks gscr(1df) makes to determine where it is are a bit naïve (don't
- work with bare repos) and could probably be improved with some appropriate
- git-reflog(1) calls
-* dr(6df) is probably more practical in awk
-* Running the block of git(1) commands in the prompt leaves five "stale"
- jobspecs around that flee after a jobs builtin run; only saw this manifest
- after 90dcadf; either I understand job specs really poorly or this may be a
- bug in bash
-* I can't find a clean way of detecting a restricted shell for ksh instances
- to prevent trying to load anything fancy (works for Bash)
- * Zsh, either! $options[restricted] is "off" within the startup file
-* Would be good to complete the Makefile variables for NAME, EMAIL etc with
- educated guesses (`id -u`@`cat /etc/mailname`) etc rather than hardcoding
- my own stuff in there
-* Completion for custom functions e.g. `sd` should ideally respect
- `completion-ignore-case` setting
-* Document `install-conf` target once I'm sure it's not a dumb idea
-* Need to decide whether I care about XDG, and implement it if I do
-* Need to decide whether I'm testing the shell snippets for MPD, Keychain
- etc, and if so how.
+* man(1) completion doesn't work on OpenBSD as manpath(1) isn't a thing on that
+ system; need to find some way of finding which manual directories should be
+ searched at runtime, if there is one.
+* The checks gscr(1df) makes to determine where it is are a bit naïve (don't
+ work with bare repos) and could probably be improved with some appropriate
+ git-reflog(1) calls
+* dr(6df) is probably more practical in awk
+* Running the block of git(1) commands in the prompt leaves five "stale"
+ jobspecs around that flee after a jobs builtin run; only saw this manifest
+ after 90dcadf; either I understand job specs really poorly or this may be a
+ bug in bash
+* I can't find a clean way of detecting a restricted shell for ksh instances to
+ prevent trying to load anything fancy (works for Bash)
+ * Zsh, either! $options[restricted] is "off" within the startup file
+* Would be good to complete the Makefile variables for NAME, EMAIL etc with
+ educated guesses (`id -u`@`cat /etc/mailname`) etc rather than hardcoding my
+ own stuff in there
+* Completion for custom functions e.g. `sd` should ideally respect
+ `completion-ignore-case` setting
+* Document `install-conf` target once I'm sure it's not a dumb idea
+* Need to decide whether I care about XDG, and implement it if I do
+* Need to decide whether I'm testing the shell snippets for MPD, Keychain etc,
+ and if so how.
diff --git a/README.md b/README.md
index 17d1afb3..b9116c06 100644
--- a/README.md
+++ b/README.md
@@ -36,16 +36,16 @@ The default `install` target will install these targets and all their
dependencies. Note that you don't actually have to have any of this except `sh`
installed.
-* `install-bin`
-* `install-bin-man`
-* `install-curl`
-* `install-ex`
-* `install-git`
-* `install-gnupg`
-* `install-less`
-* `install-login-shell`
-* `install-readline`
-* `install-vim`
+* `install-bin`
+* `install-bin-man`
+* `install-curl`
+* `install-ex`
+* `install-git`
+* `install-gnupg`
+* `install-less`
+* `install-login-shell`
+* `install-readline`
+* `install-vim`
The `install-login-shell` looks at your `SHELL` environment variable and tries
to figure out which shell's configuration files to install, falling back on
@@ -59,46 +59,45 @@ Tools
Configuration is included for:
-* Bourne-style POSIX shells, sharing a `.profile`, an `ENV` file, and
- some helper functions:
- * [GNU Bash](https://www.gnu.org/software/bash/) (2.05a or higher)
- * [Korn shell](http://www.kornshell.com/) (`ksh93`, `pdksh`, `mksh`)
- * [Z shell](https://www.zsh.org/)
-* [Abook](http://abook.sourceforge.net/) -- curses address book program
-* [cURL](https://curl.haxx.se/) -- Command-line tool for transferring data
- with URL syntax
-* [Dunst](http://knopwob.org/dunst/) -- A lightweight X11 notification daemon
- that works with `libnotify`
-* `finger(1)` -- User information lookup program
-* [Git](https://git-scm.com/) -- Distributed version control system
-* [GnuPG](https://www.gnupg.org/) -- GNU Privacy Guard, for private
- communication and file encryption
-* [GTK+](https://www.gtk.org/) -- GIMP Toolkit, for graphical user interface
- elements
-* [i3](https://i3wm.org/) -- Tiling window manager
-* [less](https://www.gnu.org/software/less/) -- Terminal pager
-* [Mutt](http://www.mutt.org/) -- Terminal mail user agent
-* [`mysql(1)`](https://linux.die.net/man/1/mysql) -- Command-line MySQL client
-* [Ncmpcpp](https://rybczak.net/ncmpcpp/) -- ncurses music player client
-* [Newsbeuter](https://www.newsbeuter.org/) -- Terminal RSS/Atom feed reader
-* [`psql(1)`](https://linux.die.net/man/1/psql) -- Command-line PostgreSQL
- client
-* [Perl::Critic](http://perlcritic.com/) -- static source code analysis
- engine for Perl
-* [Perl::Tidy](http://perltidy.sourceforge.net/) -- Perl source code
- reformatter
-* [Readline](https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) -- GNU
- library for user input used by Bash, MySQL, and others
-* [rxvt-unicode](http://software.schmorp.de/pkg/rxvt-unicode.html) -- Fork of
- the rxvt terminal emulator with Unicode support
-* [Subversion](https://subversion.apache.org/) -- Apache Subversion, a
- version control system
-* [tidy](http://www.html-tidy.org/) -- HTML/XHTML linter and tidier
-* [tmux](https://tmux.github.io/) -- Terminal multiplexer similar to GNU
- Screen
-* [Vim](http://www.vim.org/) -- Vi IMproved, a text editor
-* [X11](https://www.x.org/wiki/) -- Windowing system with network
- transparency for Unix
+* Bourne-style POSIX shells, sharing a `.profile`, an `ENV` file, and some
+ helper functions:
+ * [GNU Bash](https://www.gnu.org/software/bash/) (2.05a or higher)
+ * [Korn shell](http://www.kornshell.com/) (`ksh93`, `pdksh`, `mksh`)
+ * [Z shell](https://www.zsh.org/)
+* [Abook](http://abook.sourceforge.net/) -- curses address book program
+* [cURL](https://curl.haxx.se/) -- Command-line tool for transferring data with
+ URL syntax
+* [Dunst](http://knopwob.org/dunst/) -- A lightweight X11 notification daemon
+ that works with `libnotify`
+* `finger(1)` -- User information lookup program
+* [Git](https://git-scm.com/) -- Distributed version control system
+* [GnuPG](https://www.gnupg.org/) -- GNU Privacy Guard, for private
+ communication and file encryption
+* [GTK+](https://www.gtk.org/) -- GIMP Toolkit, for graphical user interface
+ elements
+* [i3](https://i3wm.org/) -- Tiling window manager
+* [less](https://www.gnu.org/software/less/) -- Terminal pager
+* [Mutt](http://www.mutt.org/) -- Terminal mail user agent
+* [`mysql(1)`](https://linux.die.net/man/1/mysql) -- Command-line MySQL client
+* [Ncmpcpp](https://rybczak.net/ncmpcpp/) -- ncurses music player client
+* [Newsbeuter](https://www.newsbeuter.org/) -- Terminal RSS/Atom feed reader
+* [`psql(1)`](https://linux.die.net/man/1/psql) -- Command-line PostgreSQL
+ client
+* [Perl::Critic](http://perlcritic.com/) -- static source code analysis engine
+ for Perl
+* [Perl::Tidy](http://perltidy.sourceforge.net/) -- Perl source code
+ reformatter
+* [Readline](https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) -- GNU
+ library for user input used by Bash, MySQL, and others
+* [rxvt-unicode](http://software.schmorp.de/pkg/rxvt-unicode.html) -- Fork of
+ the rxvt terminal emulator with Unicode support
+* [Subversion](https://subversion.apache.org/) -- Apache Subversion, a version
+ control system
+* [tidy](http://www.html-tidy.org/) -- HTML/XHTML linter and tidier
+* [tmux](https://tmux.github.io/) -- Terminal multiplexer similar to GNU Screen
+* [Vim](http://www.vim.org/) -- Vi IMproved, a text editor
+* [X11](https://www.x.org/wiki/) -- Windowing system with network transparency
+ for Unix
The configurations for shells, GnuPG, Mutt, tmux, and Vim are the most
expansive, and most likely to be of interest. The i3 configuration is mostly
@@ -157,12 +156,12 @@ The hostname is elided if not connected via SSH. The working directory with
tilde abbreviation for `$HOME` is always shown. The rest of the prompt expands
based on context to include these elements in this order:
-* Whether in a Git repository if applicable, and punctuation to show
- repository status including reference to upstreams at a glance. Subversion
- support can also be enabled (I need it at work), in which case a `git:` or
- `svn:` prefix is added appropriately.
-* The number of running background jobs, if non-zero.
-* The exit status of the last command, if non-zero.
+* Whether in a Git repository if applicable, and punctuation to show repository
+ status including reference to upstreams at a glance. Subversion support can
+ also be enabled (I need it at work), in which case a `git:` or `svn:` prefix
+ is added appropriately.
+* The number of running background jobs, if non-zero.
+* The exit status of the last command, if non-zero.
You can set `PROMPT_COLOR`, `PROMPT_PREFIX`, and `PROMPT_SUFFIX` too, which all
do about what you'd expect.
@@ -182,59 +181,59 @@ terminals.
If a function can be written in POSIX `sh` without too much hackery, I put it
in `sh/shrc.d` to be loaded by any POSIX interactive shell. Those include:
-* Four functions for using a "marked" directory, which I find a more
- manageable concept than the `pushd`/`popd` directory stack:
- * `md()` marks a given (or the current) directory.
- * `gd()` goes to the marked directory.
- * `pmd()` prints the marked directory.
- * `xd()` swaps the current and marked directories.
-* Ten other directory management and navigation functions:
- * `bd()` changes into a named ancestor of the current directory.
- * `gt()` changes into a directory or into a file's directory.
- * `lgt()` runs `gt()` on the first result from a `loc(1df)` search.
- * `mkcd()` creates a directory and changes into it.
- * `pd()` changes to the argument's parent directory.
- * `rd()` replaces the first instance of its first argument with its
- second argument in `$PWD`, emulating a feature of the Zsh `cd` builtin
- that I like.
- * `scr()` creates a temporary directory and changes into it.
- * `sd()` changes into a sibling of the current directory.
- * `ud()` changes into an indexed ancestor of a directory.
- * `vr()` tries to change to the root directory of a source control
- repository.
-* `bc()` silences startup messages from GNU `bc(1)`.
-* `ed()` tries to get verbose error messages, a prompt, and a Readline
- environment for `ed(1)`.
-* `gdb()` silences startup messages from `gdb(1)`.
-* `gpg()` quietens `gpg(1)` down for most commands.
-* `grep()` tries to apply color and other options good for interactive use if
- available.
-* `hgrep()` allows searching `$HISTFILE`.
-* `keychain()` keeps `$GPG_TTY` up to date if a GnuPG agent is available.
-* `ls()` tries to apply color and other options good for interactive use if
- available.
- * `la()` runs `ls -A` if it can, or `ls -a` otherwise.
- * `ll()` runs `ls -Al` if it can, or `ls -al` otherwise.
-* `path()` manages the contents of `PATH` conveniently.
-* `scp()` tries to detect forgotten hostnames in `scp(1)` command calls.
-* `sudo()` forces `-H` for `sudo(8)` calls so that `$HOME` is never
- preserved; I hate having `root`-owned files in my home directory.
-* `tree()` colorizes GNU `tree(1)` output if possible (without having
- `LS_COLORS` set).
-* `x()` is a one-key shortcut for `exec startx`.
+* Four functions for using a "marked" directory, which I find a more manageable
+ concept than the `pushd`/`popd` directory stack:
+ * `md()` marks a given (or the current) directory.
+ * `gd()` goes to the marked directory.
+ * `pmd()` prints the marked directory.
+ * `xd()` swaps the current and marked directories.
+* Ten other directory management and navigation functions:
+ * `bd()` changes into a named ancestor of the current directory.
+ * `gt()` changes into a directory or into a file's directory.
+ * `lgt()` runs `gt()` on the first result from a `loc(1df)` search.
+ * `mkcd()` creates a directory and changes into it.
+ * `pd()` changes to the argument's parent directory.
+ * `rd()` replaces the first instance of its first argument with its second
+ argument in `$PWD`, emulating a feature of the Zsh `cd` builtin that I
+ like.
+ * `scr()` creates a temporary directory and changes into it.
+ * `sd()` changes into a sibling of the current directory.
+ * `ud()` changes into an indexed ancestor of a directory.
+ * `vr()` tries to change to the root directory of a source control
+ repository.
+* `bc()` silences startup messages from GNU `bc(1)`.
+* `ed()` tries to get verbose error messages, a prompt, and a Readline
+ environment for `ed(1)`.
+* `gdb()` silences startup messages from `gdb(1)`.
+* `gpg()` quietens `gpg(1)` down for most commands.
+* `grep()` tries to apply color and other options good for interactive use if
+ available.
+* `hgrep()` allows searching `$HISTFILE`.
+* `keychain()` keeps `$GPG_TTY` up to date if a GnuPG agent is available.
+* `ls()` tries to apply color and other options good for interactive use if
+ available.
+ * `la()` runs `ls -A` if it can, or `ls -a` otherwise.
+ * `ll()` runs `ls -Al` if it can, or `ls -al` otherwise.
+* `path()` manages the contents of `PATH` conveniently.
+* `scp()` tries to detect forgotten hostnames in `scp(1)` command calls.
+* `sudo()` forces `-H` for `sudo(8)` calls so that `$HOME` is never preserved;
+ I hate having `root`-owned files in my home directory.
+* `tree()` colorizes GNU `tree(1)` output if possible (without having
+ `LS_COLORS` set).
+* `x()` is a one-key shortcut for `exec startx`.
There are a few other little tricks defined for other shells providing
non-POSIX features, as compatibility allows:
-* `keep()` stores ad-hoc shell functions and variables (Bash, Korn Shell 93,
- Z shell).
-* `prompt()` sets up my interactive prompt (Bash, Korn Shell, Z shell).
-* `pushd()` adds a default destination of `$HOME` to the `pushd` builtin
- (Bash).
-* `vared()` allows interactively editing a variable with Readline, emulating
- a Zsh function I like by the same name (Bash).
-* `ver()` prints the current shell's version information (Bash, Korn Shell,
- Z shell).
+* `keep()` stores ad-hoc shell functions and variables (Bash, Korn Shell 93, Z
+ shell).
+* `prompt()` sets up my interactive prompt (Bash, Korn Shell, Z shell).
+* `pushd()` adds a default destination of `$HOME` to the `pushd` builtin
+ (Bash).
+* `vared()` allows interactively editing a variable with Readline, emulating a
+ Zsh function I like by the same name (Bash).
+* `ver()` prints the current shell's version information (Bash, Korn Shell, Z
+ shell).
#### Completion
@@ -246,15 +245,15 @@ startup without a lot of junk functions in my Bash namespace.
I do make some exceptions with completions defined in `.bash_completion.d`
files, for things I really do get tired of typing repeatedly:
-* Bash builtins: commands, help topics, shell options, variables, etc.
-* `find(1)`'s more portable options
-* `ftp(1)` hostnames from `~/.netrc`
-* `git(1)` subcommands, remotes, branches, tags, and addable files
-* `gpg(1)` long options
-* `make(1)` targets read from a `Makefile`
-* `man(1)` page titles
-* `pass(1)` entries
-* `ssh(1)` hostnames from `~/.ssh/config`
+* Bash builtins: commands, help topics, shell options, variables, etc.
+* `find(1)`'s more portable options
+* `ftp(1)` hostnames from `~/.netrc`
+* `git(1)` subcommands, remotes, branches, tags, and addable files
+* `gpg(1)` long options
+* `make(1)` targets read from a `Makefile`
+* `man(1)` page titles
+* `pass(1)` entries
+* `ssh(1)` hostnames from `~/.ssh/config`
For commands that pretty much always want to operate on text, such as text file
or stream editors, I exclude special file types and extensions I know are
@@ -376,216 +375,210 @@ namespace of the user's current shell.
Installed by the `install-bin` target:
-* Three SSH-related scripts:
- * `sls(1df)` prints hostnames read from a `ssh_config(5)` file. It uses
- `slsf(1df)` to read each one.
- * `sra(1df)` runs a command on multiple hosts read from `sls(1df)` and
- prints output.
- * `sta(1df)` runs a command on multiple hosts read from `sls(1df)` and
- prints the hostname if the command returns zero.
-* Five URL-related shortcut scripts:
- * `hurl(1df)` extracts values of `href` attributes of `<a>` tags, sorts
- them uniquely, and writes them to `stdout`; it requires
- [pup](https://github.com/ericchiang/pup).
- * `murl(1df)` converts Markdown documents to HTML with `pandoc(1)` and
- runs the output through `hurl(1df)`.
- * `urlc(1df)` 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(1df)` prints the values for a given HTTP header from a HEAD
- response.
- * `urlmt(1df)` prints the MIME type from the `Content-Type` header as
- retrieved by `urlh(1df)`.
-* Three RFC-related shortcut scripts:
- * `rfcf(1df)` fetches ASCII RFCs from the IETF website.
- * `rfct(1df)` formats ASCII RFCs.
- * `rfcr(1df)` does both, displaying in a pager if appropriate, like a
- `man(1)` reader for RFCs.
-* Five toy random-number scripts (not for sensitive/dead-serious use):
- * `rndi(1df)` gets a random integer within two bounds.
- * `rnds(1df)` attempts to get an optional random seed for `rndi(1df)`.
- * `rnda(1df)` uses `rndi(1df)` to choose a random argument.
- * `rndf(1df)` uses `rnda(1df)` to choose a random file from a directory.
- * `rndl(1df)` uses `rndi(1df)` to choose a random line from files.
-* Four file formatting scripts:
- * `d2u(1df)` converts DOS line endings in files to UNIX ones.
- * `u2d(1df)` converts UNIX line endings in files to DOS ones.
- * `stbl(1df)` strips a trailing blank line from the files in its
- arguments.
- * `stws(1df)` strips trailing spaces from the ends of lines of the files
- in its arguments.
-* Seven stream formatting scripts:
- * `sd2u(1df)` converts DOS line endings in streams to UNIX ones.
- * `su2d(1df)` converts UNIX line endings in streams to DOS ones.
- * `slow(1df)` converts uppercase to lowercase.
- * `supp(1df)` converts lowercase to uppercase.
- * `tl(1df)` tags input lines with a prefix or suffix, basically a
- `sed(1)` shortcut.
- * `tlcs(1df)` executes a command and uses `tl(1df)` to tag standard
- output and standard error lines, and color them if you want.
- * `unf(1df)` joins lines with leading spaces to the previous line.
- Intended for unfolding HTTP headers, but it should work for most RFC
- 822 formats.
-* Six simple aggregate scripts for numbers:
- * `max(1df)` prints the maximum.
- * `mean(1df)` prints the mean.
- * `med(1df)` prints the median.
- * `min(1df)` prints the minimum.
- * `mode(1df)` prints the first encountered mode.
- * `tot(1df)` totals the set.
-* Three quick-and-dirty HTML tools:
- * `htenc(1df)` encodes.
- * `htdec(1df)` decodes.
- * `htrec(1df)` wraps `a` tags around URLs.
-* Two internet message quoting tools:
- * `quo(1df)` indents with quoting right angle-brackets.
- * `wro(1df)` adds a quote attribution header to its input.
-* Six Git-related tools:
- * `fgscr(1df)` finds Git repositories in a directory root and scrubs them
- with `gscr(1df)`.
- * `grc(1df)` quietly tests whether the given directory appears to be a
- Git repository with pending changes.
- * `gscr(1df)` scrubs Git repositories.
- * `isgr(1df)` quietly tests whether the given directory appears to be a
- Git repository.
- * `jfc(1df)` adds and commits lazily to a Git repository.
- * `jfcd(1df)` watches a directory for changes and runs `jfc(1df)` if it
- sees any.
-* Two time duration functions:
- * `hms(1df)` converts seconds to `hh:mm:ss` or `mm:ss` timestamps.
- * `sec(1df)` converts `hh:mm:ss` or `mm:ss` timestamps to seconds.
-* Three pipe interaction tools:
- * `pst(1df)` runs an interactive program on data before passing it along
- a pipeline.
- * `ped(1df)` runs `pst(1df)` with `$EDITOR` or `ed(1)`.
- * `pvi(1df)` runs `pvi(1df)` with `$VISUAL` or `vi(1)`.
-* `ap(1df)` reads arguments for a given command from the standard input,
- prompting if appropriate.
-* `apf(1df)` inserts arguments to a command with ones read from a file,
- intended as a framework for shell wrappers or functions.
-* `ax(1df)` 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.
-* `bcq(1df)` runs `bc(1)`, quieting it down if need be.
-* `bel(1df)` prints a terminal bell character.
-* `bl(1df)` generates a given number of blank lines.
-* `bp(1df)` runs `br(1df)` after prompting for an URL.
-* `br(1df)` launches `$BROWSER`.
-* `ca(1df)` prints a count of its given arguments.
-* `cf(1df)` prints a count of entries in a given directory.
-* `cfr(1df)` does the same as `cf(1df)`, but recurses into subdirectories as
- well.
-* `chc(1df)` caches the output of a command.
-* `chn(1df)` runs a filter over its input a given number of times.
-* `clog(1df)` is a tiny timestamped log system.
-* `clrd(1df)` sets up a per-line file read, clearing the screen first.
-* `clwr(1df)` sets up a per-line file write, clearing the screen before each
- line.
-* `csmw(1df)` prints an English list of monospace-quoted words read from the
- input.
-* `dam(1df)` buffers all its input before emitting it as output.
-* `ddup(1df)` removes duplicate lines from unsorted input.
-* `dmp(1df)` copies a pass(1) entry selected by `dmenu(1)` to the X
- CLIPBOARD.
-* `dub(1df)` lists the biggest entries in a directory.
-* `edda(1df)` provides a means to run `ed(1)` over a set of files preserving
- any options, mostly useful for scripts.
-* `eds(1df)` edits executable script files in `EDSPATH`, defaulting to
- `~/.local/bin`, for personal scripting snippets.
-* `exm(1df)` works around a screen-clearing quirk of Vim's `ex` mode.
-* `finc(1df)` counts the number of results returned from a set of given
- `find(1)` conditions.
-* `fnl(1df)` runs a command and saves its output and error into temporary
- files, printing their paths and line counts.
-* `fnp(1df)` prints the given files to standard output, each with a plain
- text heading with the filename in it.
-* `gms(1df)` runs a set of `getmailrc` files; does much the same thing as the
- script `getmails` in the `getmail` suite, but runs the requests in parallel
- and does up to three silent retries using `try(1df)`.
-* `grec(1df)` is a more logically-named `grep -c`.
-* `gred(1df)` is a more logically-named `grep -v`.
-* `gwp(1df)` searches for alphanumeric words in a similar way to `grep(1)`.
-* `han(1df)` provides a `keywordprg` for Vim's Bash script file type that
- will look for `help` topics. You could use it from the shell too.
-* `igex(1df)` wraps around a command to allow you to ignore error conditions
- that don't actually worry you, exiting with 0 anyway.
-* `ix(1df)` posts its input to the `ix.io` pastebin.
-* `jfp(1df)` prints its input, excluding any shebang on the first line only.
-* `loc(1df)` is a quick-search wrapped around `find(1)`.
-* `maybe(1df)` is like `true(1)` or `false(1)`; given a probability of
- success,
- it exits with success or failure. Good for quick tests.
-* `mex(1df)` makes given filenames in `$PATH` executable.
-* `mi5(1df)` is a crude preprocessor for `m4`.
-* `mftl(1df)` finds usable-looking targets in makefiles.
-* `mkcp(1df)` creates a directory and copies preceding arguments into it.
-* `mkmv(1df)` creates a directory and moves preceding arguments into it.
-* `motd(1df)` shows the system MOTD.
-* `mw(1df)` prints alphabetic space-delimited words from the input one per
- line.
-* `oii(1df)` runs a command on input only if there is any.
-* `onl(1df)` crunches input down to one printable line.
-* `osc(1df)` implements a `netcat(1)`-like wrapper for `openssl(1)`'s
- `s_client` subcommand.
-* `p(1df)` prints concatenated standard input; `cat(1)` as it should always
- have been.
-* `pa(1df)` prints its arguments, one per line.
-* `pp(1df)` prints the full path of each argument using `$PWD`.
-* `pph(1df)` runs `pp(1df)` and includes a leading `$HOSTNAME:`.
-* `paz(1df)` print its arguments terminated by NULL chars.
-* `pit(1df)` runs its input through a pager if its standard output looks like
- a terminal.
-* `plmu(1df)` retrieves a list of installed modules from
- [`plenv`](https://github.com/tokuhirom/plenv), filters out any modules in
- `~/.plenv/non-cpan-modules`, and updates them all.
-* `pwg(1df)` generates just one decent password with `pwgen(1)`.
-* `rep(1df)` repeats a command a given number of times.
-* `rgl(1df)` is a very crude interactive `grep(1)` loop.
-* `shb(1df)` attempts to build shebang lines for scripts from the system
- paths.
-* `sqs(1df)` chops off query strings from filenames, usually downloads.
-* `sshi(1df)` prints human-readable SSH connection details.
-* `stex(1df)` strips extensions from filenames.
-* `sue(8df)` 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.
-* `swr(1df)` allows you to run commands locally specifying remote files in
- `scp(1)`'s HOST:PATH format.
-* `td(1df)` manages a to-do file for you with `$EDITOR` and `git(1)`; I used
- to use Taskwarrior, but found it too complex and buggy.
-* `tm(1df)` runs `tmux(1)` with `attach-session -d` if a session exists, and
- `new-session` if it doesn't.
-* `trs(1df)` replaces strings (not regular expression) in its input.
-* `try(1df)` 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.
-* `umake(1df)` iterates upwards through the directory tree from `$PWD` until
- it finds a Makefile for which to run `make(1)` with the given arguments.
-* `uts(1df)` gets the current UNIX timestamp in an unorthodox way that should
- work on all POSIX-compliant operating systems.
-* `vest(1df)` runs `test(1)` but fails with explicit output via `vex(1df)`.
-* `vex(1df)` runs a command and prints `true` or `false` explicitly to
- `stdout` based on the exit value.
-* `xrbg(1df)` applies the same randomly-selected background to each X screen.
-* `xrq(1df)` gets the values of specific resources out of `xrdb -query`
- output.
+* Three SSH-related scripts:
+ * `sls(1df)` prints hostnames read from a `ssh_config(5)` file. It uses
+ `slsf(1df)` to read each one.
+ * `sra(1df)` runs a command on multiple hosts read from `sls(1df)` and
+ prints output.
+ * `sta(1df)` runs a command on multiple hosts read from `sls(1df)` and
+ prints the hostname if the command returns zero.
+* Five URL-related shortcut scripts:
+ * `hurl(1df)` extracts values of `href` attributes of `<a>` tags, sorts
+ them uniquely, and writes them to `stdout`; it requires
+ [pup](https://github.com/ericchiang/pup).
+ * `murl(1df)` converts Markdown documents to HTML with `pandoc(1)` and runs
+ the output through `hurl(1df)`.
+ * `urlc(1df)` 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(1df)` prints the values for a given HTTP header from a HEAD
+ response.
+ * `urlmt(1df)` prints the MIME type from the `Content-Type` header as
+ retrieved by `urlh(1df)`.
+* Three RFC-related shortcut scripts:
+ * `rfcf(1df)` fetches ASCII RFCs from the IETF website.
+ * `rfct(1df)` formats ASCII RFCs.
+ * `rfcr(1df)` does both, displaying in a pager if appropriate, like a
+ `man(1)` reader for RFCs.
+* Five toy random-number scripts (not for sensitive/dead-serious use):
+ * `rndi(1df)` gets a random integer within two bounds.
+ * `rnds(1df)` attempts to get an optional random seed for `rndi(1df)`.
+ * `rnda(1df)` uses `rndi(1df)` to choose a random argument.
+ * `rndf(1df)` uses `rnda(1df)` to choose a random file from a directory.
+ * `rndl(1df)` uses `rndi(1df)` to choose a random line from files.
+* Four file formatting scripts:
+ * `d2u(1df)` converts DOS line endings in files to UNIX ones.
+ * `u2d(1df)` converts UNIX line endings in files to DOS ones.
+ * `stbl(1df)` strips a trailing blank line from the files in its arguments.
+ * `stws(1df)` strips trailing spaces from the ends of lines of the files in
+ its arguments.
+* Seven stream formatting scripts:
+ * `sd2u(1df)` converts DOS line endings in streams to UNIX ones.
+ * `su2d(1df)` converts UNIX line endings in streams to DOS ones.
+ * `slow(1df)` converts uppercase to lowercase.
+ * `supp(1df)` converts lowercase to uppercase.
+ * `tl(1df)` tags input lines with a prefix or suffix, basically a `sed(1)`
+ shortcut.
+ * `tlcs(1df)` executes a command and uses `tl(1df)` to tag standard output
+ and standard error lines, and color them if you want.
+ * `unf(1df)` joins lines with leading spaces to the previous line. Intended
+ for unfolding HTTP headers, but it should work for most RFC 822 formats.
+* Six simple aggregate scripts for numbers:
+ * `max(1df)` prints the maximum.
+ * `mean(1df)` prints the mean.
+ * `med(1df)` prints the median.
+ * `min(1df)` prints the minimum.
+ * `mode(1df)` prints the first encountered mode.
+ * `tot(1df)` totals the set.
+* Three quick-and-dirty HTML tools:
+ * `htenc(1df)` encodes.
+ * `htdec(1df)` decodes.
+ * `htrec(1df)` wraps `a` tags around URLs.
+* Two internet message quoting tools:
+ * `quo(1df)` indents with quoting right angle-brackets.
+ * `wro(1df)` adds a quote attribution header to its input.
+* Six Git-related tools:
+ * `fgscr(1df)` finds Git repositories in a directory root and scrubs them
+ with `gscr(1df)`.
+ * `grc(1df)` quietly tests whether the given directory appears to be a Git
+ repository with pending changes.
+ * `gscr(1df)` scrubs Git repositories.
+ * `isgr(1df)` quietly tests whether the given directory appears to be a Git
+ repository.
+ * `jfc(1df)` adds and commits lazily to a Git repository.
+ * `jfcd(1df)` watches a directory for changes and runs `jfc(1df)` if it
+ sees any.
+* Two time duration functions:
+ * `hms(1df)` converts seconds to `hh:mm:ss` or `mm:ss` timestamps.
+ * `sec(1df)` converts `hh:mm:ss` or `mm:ss` timestamps to seconds.
+* Three pipe interaction tools:
+ * `pst(1df)` runs an interactive program on data before passing it along a
+ pipeline.
+ * `ped(1df)` runs `pst(1df)` with `$EDITOR` or `ed(1)`.
+ * `pvi(1df)` runs `pvi(1df)` with `$VISUAL` or `vi(1)`.
+* `ap(1df)` reads arguments for a given command from the standard input,
+ prompting if appropriate.
+* `apf(1df)` inserts arguments to a command with ones read from a file,
+ intended as a framework for shell wrappers or functions.
+* `ax(1df)` 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.
+* `bcq(1df)` runs `bc(1)`, quieting it down if need be.
+* `bel(1df)` prints a terminal bell character.
+* `bl(1df)` generates a given number of blank lines.
+* `bp(1df)` runs `br(1df)` after prompting for an URL.
+* `br(1df)` launches `$BROWSER`.
+* `ca(1df)` prints a count of its given arguments.
+* `cf(1df)` prints a count of entries in a given directory.
+* `cfr(1df)` does the same as `cf(1df)`, but recurses into subdirectories as
+ well.
+* `chc(1df)` caches the output of a command.
+* `chn(1df)` runs a filter over its input a given number of times.
+* `clog(1df)` is a tiny timestamped log system.
+* `clrd(1df)` sets up a per-line file read, clearing the screen first.
+* `clwr(1df)` sets up a per-line file write, clearing the screen before each
+ line.
+* `csmw(1df)` prints an English list of monospace-quoted words read from the
+ input.
+* `dam(1df)` buffers all its input before emitting it as output.
+* `ddup(1df)` removes duplicate lines from unsorted input.
+* `dmp(1df)` copies a pass(1) entry selected by `dmenu(1)` to the X CLIPBOARD.
+* `dub(1df)` lists the biggest entries in a directory.
+* `edda(1df)` provides a means to run `ed(1)` over a set of files preserving
+ any options, mostly useful for scripts.
+* `eds(1df)` edits executable script files in `EDSPATH`, defaulting to
+ `~/.local/bin`, for personal scripting snippets.
+* `exm(1df)` works around a screen-clearing quirk of Vim's `ex` mode.
+* `finc(1df)` counts the number of results returned from a set of given
+ `find(1)` conditions.
+* `fnl(1df)` runs a command and saves its output and error into temporary
+ files, printing their paths and line counts.
+* `fnp(1df)` prints the given files to standard output, each with a plain text
+ heading with the filename in it.
+* `gms(1df)` runs a set of `getmailrc` files; does much the same thing as the
+ script `getmails` in the `getmail` suite, but runs the requests in parallel
+ and does up to three silent retries using `try(1df)`.
+* `grec(1df)` is a more logically-named `grep -c`.
+* `gred(1df)` is a more logically-named `grep -v`.
+* `gwp(1df)` searches for alphanumeric words in a similar way to `grep(1)`.
+* `han(1df)` provides a `keywordprg` for Vim's Bash script file type that will
+ look for `help` topics. You could use it from the shell too.
+* `igex(1df)` wraps around a command to allow you to ignore error conditions
+ that don't actually worry you, exiting with 0 anyway.
+* `ix(1df)` posts its input to the `ix.io` pastebin.
+* `jfp(1df)` prints its input, excluding any shebang on the first line only.
+* `loc(1df)` is a quick-search wrapped around `find(1)`.
+* `maybe(1df)` is like `true(1)` or `false(1)`; given a probability of success,
+ it exits with success or failure. Good for quick tests.
+* `mex(1df)` makes given filenames in `$PATH` executable.
+* `mi5(1df)` is a crude preprocessor for `m4`.
+* `mftl(1df)` finds usable-looking targets in makefiles.
+* `mkcp(1df)` creates a directory and copies preceding arguments into it.
+* `mkmv(1df)` creates a directory and moves preceding arguments into it.
+* `motd(1df)` shows the system MOTD.
+* `mw(1df)` prints alphabetic space-delimited words from the input one per
+ line.
+* `oii(1df)` runs a command on input only if there is any.
+* `onl(1df)` crunches input down to one printable line.
+* `osc(1df)` implements a `netcat(1)`-like wrapper for `openssl(1)`'s
+ `s_client` subcommand.
+* `p(1df)` prints concatenated standard input; `cat(1)` as it should always
+ have been.
+* `pa(1df)` prints its arguments, one per line.
+* `pp(1df)` prints the full path of each argument using `$PWD`.
+* `pph(1df)` runs `pp(1df)` and includes a leading `$HOSTNAME:`.
+* `paz(1df)` print its arguments terminated by NULL chars.
+* `pit(1df)` runs its input through a pager if its standard output looks like a
+ terminal.
+* `plmu(1df)` retrieves a list of installed modules from
+ [`plenv`](https://github.com/tokuhirom/plenv), filters out any modules in
+ `~/.plenv/non-cpan-modules`, and updates them all.
+* `pwg(1df)` generates just one decent password with `pwgen(1)`.
+* `rep(1df)` repeats a command a given number of times.
+* `rgl(1df)` is a very crude interactive `grep(1)` loop.
+* `shb(1df)` attempts to build shebang lines for scripts from the system paths.
+* `sqs(1df)` chops off query strings from filenames, usually downloads.
+* `sshi(1df)` prints human-readable SSH connection details.
+* `stex(1df)` strips extensions from filenames.
+* `sue(8df)` 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.
+* `swr(1df)` allows you to run commands locally specifying remote files in
+ `scp(1)`'s HOST:PATH format.
+* `td(1df)` manages a to-do file for you with `$EDITOR` and `git(1)`; I used to
+ use Taskwarrior, but found it too complex and buggy.
+* `tm(1df)` runs `tmux(1)` with `attach-session -d` if a session exists, and
+ `new-session` if it doesn't.
+* `trs(1df)` replaces strings (not regular expression) in its input.
+* `try(1df)` 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.
+* `umake(1df)` iterates upwards through the directory tree from `$PWD` until it
+ finds a Makefile for which to run `make(1)` with the given arguments.
+* `uts(1df)` gets the current UNIX timestamp in an unorthodox way that should
+ work on all POSIX-compliant operating systems.
+* `vest(1df)` runs `test(1)` but fails with explicit output via `vex(1df)`.
+* `vex(1df)` runs a command and prints `true` or `false` explicitly to `stdout`
+ based on the exit value.
+* `xrbg(1df)` applies the same randomly-selected background to each X screen.
+* `xrq(1df)` gets the values of specific resources out of `xrdb -query` output.
There's some silly stuff in `install-games`:
-* `aaf(6df)` gets a random [ASCII Art Farts](http://www.asciiartfarts.com/)
+* `aaf(6df)` gets a random [ASCII Art Farts](http://www.asciiartfarts.com/)
comic.
-* `acq(6df)` allows you to interrogate AC, the interplanetary computer.
-* `aesth(6df)` converts English letters to their full width CJK analogues,
+* `acq(6df)` allows you to interrogate AC, the interplanetary computer.
+* `aesth(6df)` converts English letters to their full width CJK analogues,
for AESTHETIC PURPOSES.
-* `squ(6df)` makes a reduced Latin square out of each line of input.
-* `kvlt(6df)` translates input to emulate a style of typing unique to black
+* `squ(6df)` makes a reduced Latin square out of each line of input.
+* `kvlt(6df)` translates input to emulate a style of typing unique to black
metal communities on the internet.
-* `philsay(6df)` shows a picture to accompany `pks(6df)` output.
-* `pks(6df)` laughs at a randomly selected word.
-* `rndn(6df)` implements an esoteric random number generation algorithm.
-* `strik(6df)` outputs s̶t̶r̶i̶k̶e̶d̶ ̶o̶u̶t̶ struck out text.
-* `rot13(6df)` rotates the Latin letters in its input.
-* `xyzzy(6df)` teleports to a marked location on the filesystem.
-* `zs(6df)` prefixes "z" case-appropriately to every occurrence of "s" in the
+* `philsay(6df)` shows a picture to accompany `pks(6df)` output.
+* `pks(6df)` laughs at a randomly selected word.
+* `rndn(6df)` implements an esoteric random number generation algorithm.
+* `strik(6df)` outputs s̶t̶r̶i̶k̶e̶d̶ ̶o̶u̶t̶ struck out text.
+* `rot13(6df)` rotates the Latin letters in its input.
+* `xyzzy(6df)` teleports to a marked location on the filesystem.
+* `zs(6df)` prefixes "z" case-appropriately to every occurrence of "s" in the
text on its standard input.
Manuals