aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore9
-rw-r--r--.gitmodules77
-rw-r--r--IDEAS.md26
-rw-r--r--ISSUES.md32
-rw-r--r--Makefile256
-rw-r--r--README.md557
-rw-r--r--TABS.md26
-rw-r--r--VERSION4
-rw-r--r--X/Xresources2
-rw-r--r--X/Xresources.d/URxvt32
-rw-r--r--X/Xresources.d/XTerm24
-rw-r--r--X/redshift.conf10
-rw-r--r--X/sxhkdrc47
-rw-r--r--X/xinitrc17
-rw-r--r--X/xinitrc.d/browser.sh24
-rw-r--r--X/xinitrc.d/dunst.sh3
-rw-r--r--X/xinitrc.d/redshift.sh3
-rw-r--r--X/xinitrc.d/ssh.sh4
-rw-r--r--X/xinitrc.d/sxhkd.sh3
-rw-r--r--X/xinitrc.d/urxvt.sh3
-rw-r--r--X/xinitrc.d/xkb.sh5
-rw-r--r--X/xinitrc.d/xrbg.sh2
-rw-r--r--bash/bash_completion.d/_ssh_config_hosts.bash29
-rw-r--r--bash/bash_completion.d/mosh.bash5
-rw-r--r--bash/bash_completion.d/path.bash1
-rw-r--r--bash/bashrc4
-rw-r--r--bash/bashrc.d/keep.bash4
-rw-r--r--bash/bashrc.d/prompt.bash34
-rw-r--r--bin/clog.sh3
-rw-r--r--bin/dmp.sh31
-rw-r--r--bin/gscr.sh9
-rw-r--r--bin/han.bash23
-rw-r--r--bin/mked.sh1
-rw-r--r--bin/mktd.sh2
-rw-r--r--bin/mkvi.sh1
-rw-r--r--[-rwxr-xr-x]bin/msc.sh0
-rw-r--r--bin/osc.sh2
-rwxr-xr-xbin/plmu28
-rw-r--r--bin/qat.sh1
-rw-r--r--bin/rndi.awk3
-rw-r--r--bin/sls.sh3
-rw-r--r--bin/slsf.awk29
-rw-r--r--bin/td.sh2
-rw-r--r--bin/tm.sh9
-rw-r--r--bin/uts.awk1
-rw-r--r--bin/xgo.sh15
-rw-r--r--bin/xsnap.sh24
-rw-r--r--cabal/cabal.sh3
-rw-r--r--cabal/profile.d/cabal.sh2
-rw-r--r--cargo/profile.d/cargo.sh2
-rw-r--r--check/urxvt.sh3
-rw-r--r--check/x.sh1
-rw-r--r--check/xinit.sh6
-rw-r--r--check/xsession.sh1
-rw-r--r--cpanm/profile.d/cpanm.sh3
-rw-r--r--dunst/dunstrc46
-rw-r--r--finger/pgpkey8
-rw-r--r--finger/plan2
-rw-r--r--git/config.mi511
-rw-r--r--gtk/gtk-3.0/settings.ini2
-rw-r--r--gtk/gtkrc-2.01
-rw-r--r--i3/config37
-rw-r--r--i3/status6
-rw-r--r--keychain/profile.d/keychain.sh5
-rw-r--r--keychain/shrc.d/keychain.sh3
-rw-r--r--ksh/kshrc.d/keep.ksh4
-rw-r--r--ksh/kshrc.d/prompt.ksh12
-rw-r--r--ksh/shrc.d/ksh.sh3
-rw-r--r--lint/bash.sh2
-rw-r--r--lint/bin.sh4
-rw-r--r--lint/games.sh2
-rw-r--r--lint/git-template-hooks.sh2
-rw-r--r--lint/ksh.sh4
-rw-r--r--lint/sh.sh2
-rw-r--r--lint/urxvt.sh5
-rw-r--r--lint/x.sh1
-rw-r--r--lint/xinit.sh4
-rw-r--r--lint/xsession.sh1
-rw-r--r--logrotate/config5
-rw-r--r--logrotate/systemd/user/logrotate.service10
-rw-r--r--logrotate/systemd/user/logrotate.timer10
-rw-r--r--man/man1/bp.1df2
-rw-r--r--man/man1/br.1df2
-rw-r--r--man/man1/dmp.1df17
-rw-r--r--man/man1/sls.1df8
-rw-r--r--man/man1/slsf.1df8
-rw-r--r--man/man1/xrbg.1df4
-rw-r--r--man/man1/xrq.1df4
-rw-r--r--man/man1/xsnap.1df16
-rw-r--r--man/man6/pks.6df4
-rw-r--r--man/man7/dotfiles.7df948
-rw-r--r--mpd/mpdconf15
-rw-r--r--mpd/profile.d/mpd.sh3
-rw-r--r--mpv/mpv.conf32
-rw-r--r--mutt/muttrc11
-rw-r--r--[-rwxr-xr-x]mutt/muttrc.d/src.sh (renamed from mutt/muttrc.d/src)2
-rw-r--r--ncmpcpp/config9
-rw-r--r--newsboat/systemd/user/newsboat.service10
-rw-r--r--newsboat/systemd/user/reload-newsboat.service11
-rw-r--r--newsboat/systemd/user/reload-newsboat.timer10
-rw-r--r--parcellite/parcelliterc41
-rw-r--r--parcellite/xsession.d/parcellite.sh2
-rw-r--r--perlcritic/perlcriticrc5
-rw-r--r--plenv/profile.d/plenv.sh7
-rw-r--r--plenv/shrc.d/plenv.sh1
-rw-r--r--pyenv/profile.d/pyenv.sh7
-rw-r--r--pyenv/shrc.d/pyenv.sh1
-rw-r--r--rbenv/profile.d/rbenv.sh7
-rw-r--r--rbenv/shrc.d/rbenv.sh1
-rw-r--r--readline/inputrc7
-rw-r--r--redshift/redshift.conf6
-rw-r--r--redshift/xsession.d/redshift.sh2
-rw-r--r--rofi/bin/rofi_pass.sh92
-rw-r--r--sh/profile41
-rw-r--r--sh/profile.d/browser.sh4
-rw-r--r--sh/profile.d/downloads.sh33
-rw-r--r--sh/profile.d/editor.sh25
-rw-r--r--sh/profile.d/games.sh3
-rw-r--r--sh/profile.d/lang.sh4
-rw-r--r--sh/profile.d/os.sh3
-rw-r--r--sh/profile.d/pager.sh7
-rw-r--r--sh/profile.d/timezone.sh3
-rw-r--r--sh/profile.d/visual.sh14
-rw-r--r--sh/profile.d/welcome.sh53
-rw-r--r--sh/shrc4
-rw-r--r--sh/shrc.d/ed.sh2
-rw-r--r--sh/shrc.d/gdb.sh2
-rw-r--r--sh/shrc.d/ls.sh10
-rw-r--r--sh/shrc.d/path.sh8
-rw-r--r--sh/shrc.d/pd.sh2
-rw-r--r--sh/shrc.d/prompt.sh7
-rw-r--r--sh/shrc.d/rd.sh1
-rw-r--r--sh/shrc.d/sd.sh1
-rw-r--r--sh/shrc.d/sudo.sh8
-rw-r--r--sh/shrc.d/tor.sh33
-rw-r--r--sh/shrc.d/which.sh2
-rw-r--r--sxhkd/sxhkdrc53
-rw-r--r--sxhkd/xsession.d/sxhkd.sh2
-rw-r--r--systemd/profile.d/systemd.sh3
-rw-r--r--systemd/user/notify-email@.service2
-rw-r--r--systemd/user/notify-email@.service.d/50-notify-email.conf2
-rw-r--r--systemd/user/run-.service.d/50-notify-email.conf5
-rw-r--r--systemd/user/service.d/50-notify-email.conf2
-rw-r--r--terminfo/putty-256color.ti7
-rw-r--r--terminfo/putty.ti128
-rw-r--r--terminfo/rxvt-256color.ti8
-rw-r--r--terminfo/rxvt-unicode-256color.ti4
-rw-r--r--terminfo/rxvt-unicode.ti160
-rw-r--r--terminfo/rxvt.ti151
-rw-r--r--terminfo/screen-256color.ti7
-rw-r--r--terminfo/screen.ti100
-rw-r--r--tmux/bin/tmux.sh11
-rw-r--r--tmux/profile.d/tmux.sh4
-rw-r--r--tmux/systemd/user/tmux.service11
-rw-r--r--tmux/tmux.conf21
-rw-r--r--urxvt/ext/select.pl93
-rw-r--r--vim/after/ftplugin/python.vim35
-rw-r--r--vim/after/indent/vim.vim6
-rw-r--r--vim/after/indent/yaml.vim2
-rw-r--r--vim/after/plugin/dist.vim1
-rw-r--r--vim/autoload/getenv.vim17
-rw-r--r--vim/autoload/has.vim34
-rw-r--r--vim/autoload/html/timestamp.vim2
-rw-r--r--vim/autoload/indent.vim20
-rw-r--r--vim/autoload/patch.vim35
-rw-r--r--vim/autoload/xdg.vim24
m---------vim/bundle/copy_linebreak0
m---------vim/bundle/detect_indent0
m---------vim/bundle/html_spelllang0
m---------vim/bundle/put_date0
m---------vim/bundle/redact_pass0
m---------vim/bundle/spellfile_local0
m---------vim/bundle/strip_trailing_whitespace0
-rw-r--r--vim/compiler/pyflakes.vim9
-rw-r--r--vim/compiler/pylint.vim9
-rw-r--r--vim/filetype.vim160
-rw-r--r--vim/ftplugin/textarea.vim12
-rw-r--r--vim/plugin/dist.vim2
-rw-r--r--vim/plugin/matchit.vim2
-rw-r--r--vim/scripts.vim10
-rw-r--r--vim/syntax/jinja2.vim2
-rw-r--r--vim/vimrc660
-rw-r--r--vim/vimrc.stub27
-rw-r--r--x/Xresources106
-rw-r--r--x/logrotate/config.d/xsession7
-rw-r--r--x/shrc.d/x.sh (renamed from sh/shrc.d/x.sh)0
-rw-r--r--x/xsession.sh64
-rw-r--r--x/xsessionrc17
-rw-r--r--zsh/zshrc2
-rw-r--r--zsh/zshrc.d/keep.zsh4
-rw-r--r--zsh/zshrc.d/prompt.zsh12
191 files changed, 2383 insertions, 2880 deletions
diff --git a/.gitignore b/.gitignore
index 126c3f52..417741c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,7 +25,6 @@
/bin/dfv
/bin/dfv.m4
/bin/dfv.sh
-/bin/dmp
/bin/dub
/bin/edda
/bin/edda.m4
@@ -156,6 +155,7 @@
/bin/xgoc
/bin/xrbg
/bin/xrq
+/bin/xsnap
/dillo/dillorc
/dillo/dillorc.m4
/emacs/bin/emacsm
@@ -177,12 +177,15 @@
/games/zs
/git/config
/git/config.m4
+/git/template/hooks/post-update
/git/template/hooks/pre-commit
/git/template/hooks/prepare-commit-msg
-/git/template/hooks/post-update
/gnupg/profile.d/gnupg.sh
/gnupg/profile.d/gnupg.sh.m4
/include/mktd.m4
/less/less
/mutt/filters/markdown-to-html
-/urxvt/ext/select
+/mutt/muttrc.d/src
+/rofi/bin/rofi_pass
+/tmux/bin/tmux
+/x/xsession
diff --git a/.gitmodules b/.gitmodules
index e892cefb..e0ef1bf5 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,116 +1,119 @@
# Vim plugins
[submodule "vim/bundle/alternate_filetypes"]
path = vim/bundle/alternate_filetypes
- url = https://sanctum.geek.nz/code/vim-alternate-filetypes.git
+ url = https://dev.sanctum.geek.nz/code/vim-alternate-filetypes.git
[submodule "vim/bundle/big_file_options"]
path = vim/bundle/big_file_options
- url = https://sanctum.geek.nz/code/vim-big-file-options.git
+ url = https://dev.sanctum.geek.nz/code/vim-big-file-options.git
[submodule "vim/bundle/colon_operator"]
path = vim/bundle/colon_operator
- url = https://sanctum.geek.nz/code/vim-colon-operator.git
+ url = https://dev.sanctum.geek.nz/code/vim-colon-operator.git
[submodule "vim/bundle/copy_linebreak"]
path = vim/bundle/copy_linebreak
- url = https://sanctum.geek.nz/code/vim-copy-linebreak.git
+ url = https://dev.sanctum.geek.nz/code/vim-copy-linebreak.git
[submodule "vim/bundle/cursorline_current"]
path = vim/bundle/cursorline_current
- url = https://sanctum.geek.nz/code/vim-cursorline-current.git
+ url = https://dev.sanctum.geek.nz/code/vim-cursorline-current.git
[submodule "vim/bundle/detect_indent"]
path = vim/bundle/detect_indent
- url = https://sanctum.geek.nz/code/vim-detect-indent.git
+ url = https://dev.sanctum.geek.nz/code/vim-detect-indent.git
[submodule "vim/bundle/digraph_search"]
path = vim/bundle/digraph_search
- url = https://sanctum.geek.nz/code/vim-digraph-search.git
+ url = https://dev.sanctum.geek.nz/code/vim-digraph-search.git
[submodule "vim/bundle/equalalways_resized"]
path = vim/bundle/equalalways_resized
- url = https://sanctum.geek.nz/code/vim-equalalways-resized.git
+ url = https://dev.sanctum.geek.nz/code/vim-equalalways-resized.git
[submodule "vim/bundle/foldlevelstart_stdin"]
path = vim/bundle/foldlevelstart_stdin
- url = https://sanctum.geek.nz/code/vim-foldlevelstart-stdin.git
+ url = https://dev.sanctum.geek.nz/code/vim-foldlevelstart-stdin.git
+[submodule "vim/bundle/html_spelllang"]
+ path = vim/bundle/html_spelllang
+ url = https://dev.sanctum.geek.nz/code/vim-html-spelllang.git
[submodule "vim/bundle/insert_cancel"]
path = vim/bundle/insert_cancel
- url = https://sanctum.geek.nz/code/vim-insert-cancel.git
+ url = https://dev.sanctum.geek.nz/code/vim-insert-cancel.git
[submodule "vim/bundle/insert_suspend_hlsearch"]
path = vim/bundle/insert_suspend_hlsearch
- url = https://sanctum.geek.nz/code/vim-insert-suspend-hlsearch.git
+ url = https://dev.sanctum.geek.nz/code/vim-insert-suspend-hlsearch.git
[submodule "vim/bundle/insert_timeout"]
path = vim/bundle/insert_timeout
- url = https://sanctum.geek.nz/code/vim-insert-timeout.git
+ url = https://dev.sanctum.geek.nz/code/vim-insert-timeout.git
[submodule "vim/bundle/keep_position"]
path = vim/bundle/keep_position
- url = https://sanctum.geek.nz/code/vim-keep-position.git
+ url = https://dev.sanctum.geek.nz/code/vim-keep-position.git
[submodule "vim/bundle/paste_insert"]
path = vim/bundle/paste_insert
- url = https://sanctum.geek.nz/code/vim-paste-insert.git
+ url = https://dev.sanctum.geek.nz/code/vim-paste-insert.git
[submodule "vim/bundle/put_blank_lines"]
path = vim/bundle/put_blank_lines
- url = https://sanctum.geek.nz/code/vim-put-blank-lines.git
+ url = https://dev.sanctum.geek.nz/code/vim-put-blank-lines.git
[submodule "vim/bundle/put_date"]
path = vim/bundle/put_date
- url = https://sanctum.geek.nz/code/vim-put-date.git
+ url = https://dev.sanctum.geek.nz/code/vim-put-date.git
[submodule "vim/bundle/quickfix_auto_open"]
path = vim/bundle/quickfix_auto_open
- url = https://sanctum.geek.nz/code/vim-quickfix-auto-open.git
+ url = https://dev.sanctum.geek.nz/code/vim-quickfix-auto-open.git
[submodule "vim/bundle/redact_pass"]
path = vim/bundle/redact_pass
- url = https://sanctum.geek.nz/code/vim-redact-pass.git
+ url = https://dev.sanctum.geek.nz/code/vim-redact-pass.git
[submodule "vim/bundle/regex_escape"]
path = vim/bundle/regex_escape
- url = https://sanctum.geek.nz/code/vim-regex-escape.git
+ url = https://dev.sanctum.geek.nz/code/vim-regex-escape.git
[submodule "vim/bundle/replace_operator"]
path = vim/bundle/replace_operator
- url = https://sanctum.geek.nz/code/vim-replace-operator.git
+ url = https://dev.sanctum.geek.nz/code/vim-replace-operator.git
[submodule "vim/bundle/scratch_buffer"]
path = vim/bundle/scratch_buffer
- url = https://sanctum.geek.nz/code/vim-scratch-buffer.git
+ url = https://dev.sanctum.geek.nz/code/vim-scratch-buffer.git
[submodule "vim/bundle/select_old_files"]
path = vim/bundle/select_old_files
- url = https://sanctum.geek.nz/code/vim-select-old-files.git
+ url = https://dev.sanctum.geek.nz/code/vim-select-old-files.git
[submodule "vim/bundle/shebang_change_filetype"]
path = vim/bundle/shebang_change_filetype
- url = https://sanctum.geek.nz/code/vim-shebang-change-filetype.git
+ url = https://dev.sanctum.geek.nz/code/vim-shebang-change-filetype.git
[submodule "vim/bundle/shebang_create_exec"]
path = vim/bundle/shebang_create_exec
- url = https://sanctum.geek.nz/code/vim-shebang-create-exec.git
+ url = https://dev.sanctum.geek.nz/code/vim-shebang-create-exec.git
[submodule "vim/bundle/spellfile_local"]
path = vim/bundle/spellfile_local
- url = https://sanctum.geek.nz/code/vim-spellfile-local.git
+ url = https://dev.sanctum.geek.nz/code/vim-spellfile-local.git
[submodule "vim/bundle/squeeze_repeat_blanks"]
path = vim/bundle/squeeze_repeat_blanks
- url = https://sanctum.geek.nz/code/vim-squeeze-repeat-blanks.git
+ url = https://dev.sanctum.geek.nz/code/vim-squeeze-repeat-blanks.git
[submodule "vim/bundle/strip_trailing_whitespace"]
path = vim/bundle/strip_trailing_whitespace
- url = https://sanctum.geek.nz/code/vim-strip-trailing-whitespace.git
+ url = https://dev.sanctum.geek.nz/code/vim-strip-trailing-whitespace.git
[submodule "vim/bundle/toggle_flags"]
path = vim/bundle/toggle_flags
- url = https://sanctum.geek.nz/code/vim-toggle-flags.git
+ url = https://dev.sanctum.geek.nz/code/vim-toggle-flags.git
[submodule "vim/bundle/undofileskip"]
path = vim/bundle/undofileskip
- url = https://sanctum.geek.nz/code/vim-undofileskip.git
+ url = https://dev.sanctum.geek.nz/code/vim-undofileskip.git
[submodule "vim/bundle/vertical_region"]
path = vim/bundle/vertical_region
- url = https://sanctum.geek.nz/code/vim-vertical-region.git
+ url = https://dev.sanctum.geek.nz/code/vim-vertical-region.git
[submodule "vim/bundle/vimrc_reload_filetype"]
path = vim/bundle/vimrc_reload_filetype
- url = https://sanctum.geek.nz/code/vim-vimrc-reload-filetype.git
+ url = https://dev.sanctum.geek.nz/code/vim-vimrc-reload-filetype.git
[submodule "vim/bundle/write_mkpath"]
path = vim/bundle/write_mkpath
- url = https://sanctum.geek.nz/code/vim-write-mkpath.git
+ url = https://dev.sanctum.geek.nz/code/vim-write-mkpath.git
# Vim filetype plugins
[submodule "vim/bundle/diff_prune"]
path = vim/bundle/diff_prune
- url = https://sanctum.geek.nz/code/vim-diff-prune.git
+ url = https://dev.sanctum.geek.nz/code/vim-diff-prune.git
[submodule "vim/bundle/make_target"]
path = vim/bundle/make_target
- url = https://sanctum.geek.nz/code/vim-make-target.git
+ url = https://dev.sanctum.geek.nz/code/vim-make-target.git
[submodule "vim/bundle/perl_version_bump"]
path = vim/bundle/perl_version_bump
- url = https://sanctum.geek.nz/code/vim-perl-version-bump.git
+ url = https://dev.sanctum.geek.nz/code/vim-perl-version-bump.git
# Vim colorschemes
[submodule "vim/bundle/juvenile"]
path = vim/bundle/juvenile
- url = https://sanctum.geek.nz/code/vim-juvenile.git
+ url = https://dev.sanctum.geek.nz/code/vim-juvenile.git
[submodule "vim/bundle/sahara"]
path = vim/bundle/sahara
- url = https://sanctum.geek.nz/code/vim-sahara.git
+ url = https://dev.sanctum.geek.nz/code/vim-sahara.git
diff --git a/IDEAS.md b/IDEAS.md
index 8bb8214c..e15d284e 100644
--- a/IDEAS.md
+++ b/IDEAS.md
@@ -1,31 +1,31 @@
Ideas
=====
-* A wrapper `ksw(1df)` (kill-switch) that traps `SIGINT` to kill a called
+- 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?)
-* I can probably share my `psql()` completions/shortcuts after sanitizing them
+- I can probably share my `psql()` completions/shortcuts after sanitizing them
a bit
-* Wouldn't be too hard to add some HTTP BASIC authentication to `ix(1df)` to
+- Wouldn't be too hard to add some HTTP BASIC authentication to `ix(1df)` to
make pastes manageable
-* Have `eds(1df)` accept standard input with the "starting content" for the
+- Have `eds(1df)` accept standard input with the "starting content" for the
script
-* Convert all the manual pages to Mandoc format maybe?
+- Convert all the manual pages to Mandoc format maybe?
<https://en.wikipedia.org/wiki/Mandoc>
-* `qmp(1df)`--quick man page
-* The solution to `chn(1df)` not running in parallel is probably backgrounded
+- `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
+- 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
+- I can probably get rid of all that nasty templated shell by writing something
that wraps around `mktd(1df)` and generates shell script to run, and calls
that via `eval`.
-* Ideally, the AWK and/or sed scripts in the bin and games directories should
+- Ideally, the AWK and/or sed scripts in the bin and games directories 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.
-* Write a ftplugin for Perl to switch between punctuation variable names and
+- Write a ftplugin for Perl to switch between punctuation variable names and
English variable names., i.e. \e on `$?` would change to `$CHILD_ERROR`, and
vice-versa.
-* Almost definitely going to want to try a runparts layout for Git hooks at
+- Almost definitely going to want to try a runparts layout for Git hooks at
some point
-* I'd like a Git hook that pre-fills out "Version X.Y.Z" if making an annotated
+- I'd like a Git hook that pre-fills out "Version X.Y.Z" if making an annotated
tag named `vX.Y.Z`.
diff --git a/ISSUES.md b/ISSUES.md
index 1d4a33b9..0a4abd4d 100644
--- a/ISSUES.md
+++ b/ISSUES.md
@@ -1,36 +1,38 @@
Known issues
============
-* `man(1)` completion doesn't work on OpenBSD as `manpath(1)` isn't a thing on
+- `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
+- 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"
+- `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
+- 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
+ - 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
-* 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.
-* The custom shell functions really should be documented, but it's not clear to
+- Need to decide whether I care about XDG, and implement it if I do
+- The custom shell functions really should be documented, but it's not clear to
me exactly where this should happen, because the commands' availability
depends on which shell you're using; the `sd` function isn't available when
you're not using Bash. Maybe I should try to extend `help` without breaking
it?
-* The `b:undo\_indent` definition for the `perl` filetype can probably be
+- The `b:undo\_indent` definition for the `perl` filetype can probably be
pushed upstream.
-* The `_text_filenames` completion handler for Bash won't work on files with
+- The `_text_filenames` completion handler for Bash won't work on files with
newlines in their names. Can it be made to?
-* Highlighting the variable name in e.g. `unset -v VARNAME` works with `bash`
+- Highlighting the variable name in e.g. `unset -v VARNAME` works with `bash`
highlighting, but not with `sh` highlighting
-* The Markdown underline functions should count screen columns, not characters
+- The Markdown underline functions should count screen columns, not characters
or bytes
+- > $ lesskey --output less/less less/lesskey
+ > NOTE: lesskey is deprecated.
+ > It is no longer necessary to run lesskey, when using less version 582 and
+ > later.
diff --git a/Makefile b/Makefile
index a7bae4e6..9f98ce20 100644
--- a/Makefile
+++ b/Makefile
@@ -9,10 +9,11 @@
install-bash-completion \
install-bin \
install-bin-man \
+ install-cabal \
+ install-cargo \
install-cpanm \
install-curl \
install-dillo \
- install-dunst \
install-emacs \
install-ex \
install-finger \
@@ -20,19 +21,19 @@
install-games-man \
install-git \
install-gnupg \
- install-gtk \
install-i3 \
+ install-init \
install-ksh \
install-less \
install-login-shell \
install-mail \
install-man \
- install-mpd \
install-mpv \
install-mutt \
install-mysql \
- install-ncmcpp \
+ install-ncmpcpp \
install-newsboat \
+ install-parcellite \
install-perlcritic \
install-perltidy \
install-plenv \
@@ -40,18 +41,21 @@
install-pyenv \
install-rbenv \
install-readline \
+ install-redshift \
+ install-rofi \
+ install-scrot \
install-sh \
install-subversion \
+ install-sxhkd \
install-systemd \
- install-terminfo \
install-tidy \
install-tmux \
- install-urxvt \
install-vim \
install-vim-gui \
install-vint \
install-wget \
install-x \
+ install-xsession \
install-zsh \
check \
check-bash \
@@ -62,8 +66,8 @@
check-login-shell \
check-man \
check-sh \
- check-urxvt \
- check-xinit \
+ check-x \
+ check-xsession \
check-zsh \
lint \
lint-bash \
@@ -72,9 +76,9 @@
lint-git-template-hooks \
lint-ksh \
lint-sh \
- lint-urxvt \
lint-vim \
- lint-xinit
+ lint-x \
+ lint-xsession
.SUFFIXES:
.SUFFIXES: .awk .bash .m4 .mi5 .pl .sed .sh
@@ -110,7 +114,6 @@ BINS = bin/ap \
bin/ddup \
bin/defang \
bin/dfv \
- bin/dmp \
bin/dub \
bin/edda \
bin/eds \
@@ -221,7 +224,8 @@ BINS = bin/ap \
bin/xgo \
bin/xgoc \
bin/xrbg \
- bin/xrq
+ bin/xrq \
+ bin/xsnap
BINS_M4 = bin/chn.m4 \
bin/dfv.m4 \
@@ -272,7 +276,9 @@ all: $(BINS) \
$(GIT_TEMPLATE_HOOKS) \
git/config \
gnupg/profile.d/gnupg.sh \
- less/less
+ less/less \
+ tmux/bin/tmux \
+ x/xsession
clean distclean:
rm -f -- \
@@ -290,8 +296,9 @@ clean distclean:
include/mktd.m4 \
less/less \
mutt/filters/markdown-to-html \
- urxvt/ext/select \
- vim/dist/*
+ mutt/muttrc.d/src \
+ tmux/bin/tmux \
+ x/xsession
.awk:
sh bin/shb.sh awk -f < $< > $@
@@ -341,7 +348,7 @@ git/config: git/config.m4
-D NAME=$(NAME) \
-D EMAIL=$(EMAIL) \
-D GPG_KEYID=$(GPG_KEYID) \
- -D XDG_CONFIG_HOME=$(XDG_CONFIG_HOME) \
+ -D XDG_DATA_HOME=$(XDG_DATA_HOME) \
git/config.m4 > $@
less/less: less/lesskey
@@ -359,6 +366,7 @@ install: install-bin \
install-ex \
install-git \
install-gnupg \
+ install-init \
install-less \
install-login-shell \
install-man \
@@ -372,7 +380,7 @@ install-abook:
mkdir -p -- $(HOME)/.abook
cp -p -- abook/abookrc $(HOME)/.abook
-install-bash: check-bash install-sh bin/han
+install-bash: check-bash install-sh bin/han
mkdir -p -- $(HOME)/.bashrc.d $(HOME)/.local/bin
cp -p -- bash/bashrc $(HOME)/.bashrc
cp -p -- bash/bashrc.d/*.bash $(HOME)/.bashrc.d
@@ -394,20 +402,22 @@ install-bin-man:
cp -p -- man/man1/*.1df $(XDG_DATA_HOME)/man/man1
cp -p -- man/man8/*.8df $(XDG_DATA_HOME)/man/man8
+install-cabal:
+ cp -p -- cabal/profile.d/cabal.sh $(HOME)/.profile.d
+
+install-cargo:
+ cp -p -- cargo/profile.d/cargo.sh $(HOME)/.profile.d
+
install-cpanm:
- cp -p -- cpanm/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- cpanm/profile.d/cpanm.sh $(HOME)/.profile.d
install-curl:
cp -p -- curl/curlrc $(HOME)/.curlrc
-install-dillo: dillo/dillorc install-x
+install-dillo: dillo/dillorc
mkdir -p -- $(HOME)/.dillo
cp -p -- dillo/dillorc $(HOME)/.dillo/dillorc
-install-dunst: install-x
- mkdir -p -- $(XDG_CONFIG_HOME)/dunst
- cp -p -- dunst/dunstrc $(XDG_CONFIG_HOME)/dunst
-
install-emacs: emacs/bin/emacsm install-sh
mkdir -p -- $(HOME)/.local/bin
cp -p -- emacs/emacs $(HOME)/.emacs
@@ -433,35 +443,39 @@ install-games-man:
install-git: git/config $(GIT_TEMPLATE_HOOKS)
mkdir -p -- $(XDG_CONFIG_HOME)/git
cp -p -- git/config $(XDG_CONFIG_HOME)/git/config
- mkdir -p -- $(XDG_CONFIG_HOME)/git/template
+ mkdir -p -- $(XDG_DATA_HOME)/git/template
cp -pR -- git/template/description \
- $(XDG_CONFIG_HOME)/git/template/description
- mkdir -p -- $(XDG_CONFIG_HOME)/git/template/hooks
+ $(XDG_DATA_HOME)/git/template/description
+ mkdir -p -- $(XDG_DATA_HOME)/git/template/hooks
cp -pR -- $(GIT_TEMPLATE_HOOKS) \
- $(XDG_CONFIG_HOME)/git/template/hooks
+ $(XDG_DATA_HOME)/git/template/hooks
install-gnupg: gnupg/profile.d/gnupg.sh install-sh
- cp -p -- gnupg/profile.d/*.sh $(HOME)/.profile.d
-
-install-gtk:
- mkdir -p -- $(XDG_CONFIG_HOME)/gtk-3.0
- cp -p -- gtk/gtkrc-2.0 $(HOME)/.gtkrc-2.0
- cp -p -- gtk/gtk-3.0/settings.ini $(XDG_CONFIG_HOME)/gtk-3.0
+ cp -p -- gnupg/profile.d/gnupg.sh $(HOME)/.profile.d
install-i3: install-x
mkdir -p -- $(XDG_CONFIG_HOME)/i3
- cp -p -- i3/* $(XDG_CONFIG_HOME)/i3
+ cp -p -- i3/config $(XDG_CONFIG_HOME)/i3
+ mkdir -p -- $(XDG_CONFIG_HOME)/i3status
+ cp -p -- i3/status $(XDG_CONFIG_HOME)/i3status/config
-install-keychain: install-sh
- cp -p -- keychain/profile.d/*.sh $(HOME)/.profile.d
- cp -p -- keychain/shrc.d/*.sh $(HOME)/.shrc.d
+install-init:
+ if test -d /run/systemd/system ; then make install-systemd ; fi
install-less: less/less
mkdir -p -- $(HOME)/.profile.d
- cp -- less/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- less/profile.d/less.sh $(HOME)/.profile.d
mkdir -p -- $(XDG_CONFIG_HOME)/less
cp -p -- less/less $(XDG_CONFIG_HOME)/less/key
+install-logrotate: install-systemd
+ mkdir -p -- $(XDG_CONFIG_HOME)/logrotate \
+ $(XDG_CONFIG_HOME)/logrotate/config.d
+ cp -p -- logrotate/config $(XDG_CONFIG_HOME)/logrotate
+ cp -p -- logrotate/systemd/user/logrotate.service \
+ logrotate/systemd/user/logrotate.timer \
+ $(XDG_DATA_HOME)/systemd/user
+
install-mail:
cp -p -- mail/signature $(HOME)/.signature
@@ -469,16 +483,13 @@ install-man:
mkdir -p -- $(XDG_DATA_HOME)/man/man7
cp -p -- man/man7/dotfiles.7df $(XDG_DATA_HOME)/man/man7
-install-mpd: install-sh
- mkdir -p -- $(HOME)/.mpd/playlists
- cp -p -- mpd/profile.d/*.sh $(HOME)/.profile.d
- cp -p -- mpd/mpdconf $(HOME)/.mpdconf
-
install-mpv:
- mkdir -p -- $(XDG_CONFIG_HOME)/mpv
- cp -p -- mpv/* $(XDG_CONFIG_HOME)/mpv
+ mkdir -p -- \
+ $(XDG_CONFIG_HOME)/mpv \
+ $(XDG_DATA_HOME)/mpv/screenshots
+ cp -p -- mpv/mpv.conf $(XDG_CONFIG_HOME)/mpv
-install-mutt: install-gnupg install-mail mutt/filters/markdown-to-html
+install-mutt: install-gnupg install-mail mutt/filters/markdown-to-html mutt/muttrc.d/src
mkdir -p -- \
$(XDG_CONFIG_HOME)/mutt \
$(XDG_CONFIG_HOME)/mutt/muttrc.d \
@@ -494,101 +505,117 @@ install-mutt: install-gnupg install-mail mutt/filters/markdown-to-html
cp -p -- mutt/filters/markdown-to-html \
$(HOME)/.local/libexec/mutt/filters
-install-ncmcpp: install-mpd
- mkdir -p -- $(HOME)/.ncmpcpp
- cp -p -- ncmpcpp/config $(HOME)/.ncmpcpp
+install-ncmpcpp:
+ mkdir -p -- $(XDG_CONFIG_HOME)/ncmpcpp
+ cp -p -- ncmpcpp/config $(XDG_CONFIG_HOME)/ncmpcpp
install-newsboat: install-systemd
- mkdir -p -- $(XDG_CONFIG_HOME)/newsboat $(XDG_DATA_HOME)/newsboat
- cp -p -- newsboat/config $(XDG_CONFIG_HOME)/newsboat
- -command -v systemctl >/dev/null 2>&1 \
- && mkdir -p -- $(XDG_CONFIG_HOME)/systemd/user \
- && cp -p -- newsboat/systemd/user/* $(XDG_CONFIG_HOME)/systemd/user \
- && systemctl --user daemon-reload \
- && systemctl --user start reload-newsboat.timer \
- && systemctl --user enable reload-newsboat.timer
+ mkdir -p -- $(XDG_CONFIG_HOME)/newsboat \
+ $(XDG_DATA_HOME)/newsboat
+ cp -p -- newsboat/config \
+ $(XDG_CONFIG_HOME)/newsboat
+ cp -p -- newsboat/systemd/user/newsboat.service \
+ $(XDG_DATA_HOME)/systemd/user
install-mysql:
cp -p -- mysql/my.cnf $(HOME)/.my.cnf
install-ksh: check-ksh install-sh
mkdir -p -- $(HOME)/.kshrc.d
- cp -p -- ksh/shrc.d/*.sh $(HOME)/.shrc.d
+ cp -p -- ksh/shrc.d/ksh.sh $(HOME)/.shrc.d
cp -p -- ksh/kshrc $(HOME)/.kshrc
cp -p -- ksh/kshrc.d/*.ksh $(HOME)/.kshrc.d
install-login-shell: check-login-shell
sh install/login-shell.sh
+install-parcellite: install-x
+ cp -p -- parcellite/parcelliterc $(XDG_CONFIG_HOME)
+ cp -p -- parcellite/xsession.d/parcellite.sh $(HOME)/.xsession.d
+
install-perlcritic: install-sh
- cp -p -- perlcritic/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- perlcritic/profile.d/perlcritic.sh $(HOME)/.profile.d
mkdir -p -- $(XDG_CONFIG_HOME)/perlcritic
cp -p -- perlcritic/perlcriticrc $(XDG_CONFIG_HOME)/perlcritic/perlcriticrc
install-perltidy: install-sh
- cp -p -- perltidy/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- perltidy/profile.d/perltidy.sh $(HOME)/.profile.d
mkdir -p -- $(XDG_CONFIG_HOME)/perltidy
cp -p -- perltidy/perltidyrc $(XDG_CONFIG_HOME)/perltidy/perltidyrc
install-plenv: install-sh install-cpanm
- cp -p -- plenv/profile.d/*.sh $(HOME)/.profile.d
- cp -p -- plenv/shrc.d/*.sh $(HOME)/.shrc.d
+ cp -p -- plenv/profile.d/plenv.sh $(HOME)/.profile.d
+ cp -p -- plenv/shrc.d/plenv.sh $(HOME)/.shrc.d
install-psql:
cp -p -- psql/psqlrc $(HOME)/.psqlrc
install-pyenv: install-sh
- cp -p -- pyenv/profile.d/*.sh $(HOME)/.profile.d
- cp -p -- pyenv/shrc.d/*.sh $(HOME)/.shrc.d
+ cp -p -- pyenv/profile.d/pyenv.sh $(HOME)/.profile.d
+ cp -p -- pyenv/shrc.d/pyenv.sh $(HOME)/.shrc.d
install-rbenv: install-sh
- cp -p -- rbenv/profile.d/*.sh $(HOME)/.profile.d
- cp -p -- rbenv/shrc.d/*.sh $(HOME)/.shrc.d
+ cp -p -- rbenv/profile.d/rbenv.sh $(HOME)/.profile.d
+ cp -p -- rbenv/shrc.d/rbenv.sh $(HOME)/.shrc.d
install-readline:
cp -p -- readline/inputrc $(HOME)/.inputrc
+install-redshift: install-x
+ cp -p -- redshift/redshift.conf $(XDG_CONFIG_HOME)
+ cp -p -- redshift/xsession.d/redshift.sh $(HOME)/.xsession.d
+
+install-rofi: rofi/bin/rofi_pass
+ mkdir -p -- $(HOME)/.local/bin
+ cp -p -- rofi/bin/rofi_pass $(HOME)/.local/bin
+
+install-scrot:
+ mkdir -p -- $(XDG_DATA_HOME)/scrot/screenshots
+
install-sh: check-sh
- mkdir -p -- $(HOME)/.profile.d $(HOME)/.shrc.d
cp -p -- sh/profile $(HOME)/.profile
+ mkdir -p -- $(HOME)/.profile.d
cp -p -- sh/profile.d/*.sh $(HOME)/.profile.d
cp -p -- sh/shinit $(HOME)/.shinit
cp -p -- sh/shrc $(HOME)/.shrc
+ mkdir -p -- $(HOME)/.shrc.d
cp -p -- sh/shrc.d/*.sh $(HOME)/.shrc.d
install-subversion:
mkdir -p -- $(HOME)/.subversion
cp -p -- subversion/config $(HOME)/.subversion
-install-systemd:
- -command -v systemctl >/dev/null 2>&1 \
- && mkdir -p -- $(XDG_CONFIG_HOME)/systemd/user \
- && cp -p -- systemd/user/* $(XDG_CONFIG_HOME)/systemd/user \
- && systemctl --user daemon-reload \
-
-# Need to install these in appropriate order to meet dependencies; could trust
-# the system glob, but a fixed list is just more straightforward
-install-terminfo:
- tic terminfo/putty.ti
- tic terminfo/putty-256color.ti
- tic terminfo/rxvt.ti
- tic terminfo/rxvt-256color.ti
- tic terminfo/rxvt-unicode.ti
- tic terminfo/rxvt-unicode-256color.ti
- tic terminfo/screen.ti
- tic terminfo/screen-256color.ti
+install-sxhkd: install-scrot install-x
+ mkdir -p -- $(XDG_CONFIG_HOME)/sxhkd
+ cp -p -- sxhkd/sxhkdrc $(XDG_CONFIG_HOME)/sxhkd
+ cp -p -- sxhkd/xsession.d/sxhkd.sh $(HOME)/.xsession.d
+
+install-systemd: install-sh
+ cp -p -- systemd/profile.d/systemd.sh $(HOME)/.profile.d
+ mkdir -p -- $(XDG_DATA_HOME)/systemd/user
+ cp -p -- systemd/user/notify-email@.service \
+ $(XDG_DATA_HOME)/systemd/user
+ mkdir -p -- $(XDG_DATA_HOME)/systemd/user/service.d
+ cp -p -- systemd/user/service.d/50-notify-email.conf \
+ $(XDG_DATA_HOME)/systemd/user/service.d
+ mkdir -p -- $(XDG_DATA_HOME)/systemd/user/notify-email@.service.d
+ cp -p -- systemd/user/notify-email@.service.d/50-notify-email.conf \
+ $(XDG_DATA_HOME)/systemd/user/notify-email@.service.d
+ mkdir -p -- $(XDG_DATA_HOME)/systemd/user/run-.service.d
+ cp -p -- systemd/user/run-.service.d/50-notify-email.conf \
+ $(XDG_DATA_HOME)/systemd/user/run-.service.d
install-tidy: install-sh
- cp -p -- tidy/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- tidy/profile.d/tidy.sh $(HOME)/.profile.d
mkdir -p -- $(XDG_CONFIG_HOME)/tidy
cp -p -- tidy/tidyrc $(XDG_CONFIG_HOME)/tidy/tidyrc
-install-tmux: tmux/tmux.conf install-terminfo
+install-tmux: tmux/bin/tmux tmux/tmux.conf install-systemd
+ cp -p -- tmux/bin/tmux $(HOME)/.local/bin
+ cp -p -- tmux/profile.d/tmux.sh $(HOME)/.profile.d
cp -p -- tmux/tmux.conf $(HOME)/.tmux.conf
-
-install-urxvt: urxvt/ext/select
- mkdir -p -- $(HOME)/.urxvt/ext
- cp -- urxvt/ext/select $(HOME)/.urxvt/ext
+ cp -p -- tmux/systemd/user/tmux.service \
+ $(XDG_DATA_HOME)/systemd/user
VIM = vim
VIMDIR = $(HOME)/.vim
@@ -617,31 +644,29 @@ install-vim:
GVIMRC = $(HOME)/.gvimrc
install-vim-gui: install-vim
- cp -- vim/gvimrc $(GVIMRC)
+ cp -p -- vim/gvimrc $(GVIMRC)
install-vint:
cp -p -- vint/vintrc.yaml $(HOME)/.vintrc.yaml
install-wget: install-sh
- cp -p -- wget/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- wget/profile.d/wget.sh $(HOME)/.profile.d
mkdir -p -- $(XDG_CACHE_HOME)/wget $(XDG_CONFIG_HOME)/wget
cp -p -- wget/wgetrc $(XDG_CONFIG_HOME)/wget/wgetrc
-install-x: check-xinit
- mkdir -p -- \
- $(XDG_CONFIG_HOME)/sxhkd \
- $(HOME)/.xinitrc.d \
- $(HOME)/.Xresources.d
- cp -p -- X/redshift.conf $(XDG_CONFIG_HOME)
- cp -p -- X/sxhkdrc $(XDG_CONFIG_HOME)/sxhkd
- cp -p -- X/xinitrc $(HOME)/.xinitrc
- cp -p -- X/xinitrc.d/*.sh $(HOME)/.xinitrc.d
- cp -p -- X/Xresources $(HOME)/.Xresources
- cp -p -- X/Xresources.d/*.sh $(HOME)/.Xresources.d
+install-x: check-x install-logrotate install-sh
+ cp -p -- x/Xresources $(HOME)/.Xresources
+ cp -p -- x/shrc.d/x.sh $(HOME)/.shrc.d
+ mkdir -p -- $(HOME)/.xsession.d
+
+install-xsession: x/xsession check-xsession install-x
+ cp -p -- x/xsession $(HOME)/.xsession
+ mkdir -p -- $(XDG_CONFIG_HOME)/log/xsession
+ cp -p -- x/logrotate/config.d/xsession $(XDG_CONFIG_HOME)/logrotate/config.d
install-zsh: check-zsh install-sh
mkdir -p -- $(HOME)/.zshrc.d
- cp -p -- zsh/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- zsh/profile.d/zsh.sh $(HOME)/.profile.d
cp -p -- zsh/zprofile $(HOME)/.zprofile
cp -p -- zsh/zshrc $(HOME)/.zshrc
cp -p -- zsh/zshrc.d/*.zsh $(HOME)/.zshrc.d
@@ -652,7 +677,7 @@ check: check-bin \
check-man \
check-sh
-check-bash:
+check-bash: bin/han
sh check/bash.sh
check-bin: $(BINS)
@@ -676,11 +701,11 @@ check-login-shell:
check-sh:
sh check/sh.sh
-check-urxvt: urxvt/ext/select
- sh check/urxvt.sh
+check-x:
+ sh check/x.sh
-check-xinit:
- sh check/xinit.sh
+check-xsession: x/xsession
+ sh check/xsession.sh
check-zsh:
sh check/zsh.sh
@@ -691,9 +716,8 @@ lint: lint-bash \
lint-git-template-hooks \
lint-ksh \
lint-sh \
- lint-urxvt \
lint-vim \
- lint-xinit
+ lint-x
lint-bash: check-bash
sh lint/bash.sh
@@ -713,11 +737,11 @@ lint-ksh: check-ksh
lint-sh: check-sh
sh lint/sh.sh
-lint-urxvt: check-urxvt
- sh lint/urxvt.sh
-
lint-vim:
sh lint/vim.sh
-lint-xinit: check-xinit
- sh lint/xinit.sh
+lint-x: check-x
+ sh lint/x.sh
+
+lint-xsession: x/xsession check-xsession
+ sh lint/xsession.sh
diff --git a/README.md b/README.md
index 1a25d102..6861776a 100644
--- a/README.md
+++ b/README.md
@@ -11,9 +11,9 @@ into a personal suite of custom Unix tools.
Installation
------------
- $ mkdir -p ~/.local/share
- $ git clone https://sanctum.geek.nz/code/dotfiles.git ~/.local/share/dotfiles
- $ cd ~/.local/share/dotfiles
+ $ mkdir -p ~/.local/src
+ $ git clone https://dev.sanctum.geek.nz/code/dotfiles.git ~/.local/src/dotfiles
+ $ cd ~/.local/src/dotfiles
$ git submodule init
$ git submodule update
$ make
@@ -36,16 +36,16 @@ a temporary directory first, so you can explore:
The default `install` target will install these targets and all their
dependencies:
-* `install-bin`
-* `install-curl`
-* `install-ex`
-* `install-git`
-* `install-gnupg`
-* `install-less`
-* `install-login-shell`
-* `install-man`
-* `install-readline`
-* `install-vim`
+- `install-bin`
+- `install-curl`
+- `install-ex`
+- `install-git`
+- `install-gnupg`
+- `install-less`
+- `install-login-shell`
+- `install-man`
+- `install-readline`
+- `install-vim`
The `install-login-shell` target looks at your `SHELL` environment variable,
and tries to figure out which shell's configuration files to install, falling
@@ -66,66 +66,61 @@ settings for the `Makefile`, too:
install-bash
install-bin
EMAIL=you@example.com
- $ make -C .local/share/dotfiles install-conf
+ $ make -C .local/src/dotfiles install-conf
Tools
-----
Configuration is included for:
-* Bourne-style POSIX shells, sharing a `.profile`, an `ENV` file, and some
+- Bourne-style POSIX shells, sharing a `.profile`, an `ENV` file, and some
helper functions:
- * [GNU Bash](https://www.gnu.org/software/bash/) (v3.0 or newer)
- * [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
+ - [GNU Bash](https://www.gnu.org/software/bash/) (v3.0 or newer)
+ - [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
-* [Dillo](https://www.dillo.org/)---A lightweight web browser
-* [Dunst](https://dunst-project.org/)---A lightweight X11 notification daemon
- that works with `libnotify`
-* `finger(1)`---User information lookup program
-* [Git](https://git-scm.com/)---Distributed version control system
-* [GNU Emacs](https://www.gnu.org/software/emacs/)---Extensible text editor
-* [GnuPG](https://www.gnupg.org/)---GNU Privacy Guard, for private
+- [Dillo](https://www.dillo.org/)---A lightweight web browser
+- `finger(1)`---User information lookup program
+- [Git](https://git-scm.com/)---Distributed version control system
+- [GNU Emacs](https://www.gnu.org/software/emacs/)---Extensible text editor
+- [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
-* [mpv](https://mpv.io/)---Media player
-* [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
-* [Newsboat](https://newsboat.org/)---Terminal RSS/Atom feed reader
-* [`psql(1)`](https://linux.die.net/man/1/psql)---Command-line PostgreSQL
+- [i3](https://i3wm.org/)---Tiling window manager
+- [less](https://www.gnu.org/software/less/)---Terminal pager
+- [mpv](https://mpv.io/)---Media player
+- [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 based MPD client inspired
+ by ncmpc
+- [Newsboat](https://newsboat.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
+- [Parcellite](http://parcellite.sourceforge.net/)---clipboard manager for X
+- [Perl::Critic](http://perlcritic.com/)---static source code analysis engine
for Perl
-* [Perl::Tidy](http://perltidy.sourceforge.net/)---reformats Perl source code
-* [Readline](https://tiswww.case.edu/php/chet/readline/rltop.html)---GNU
+- [Perl::Tidy](http://perltidy.sourceforge.net/)---reformats Perl source code
+- [Readline](https://tiswww.case.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
+- [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](https://www.vim.org/)---Vi IMproved, a text editor
-* [X11](https://www.x.org/wiki/)---Windowing system with network transparency
+- [tidy](http://www.html-tidy.org/)---HTML/XHTML linter and tidier
+- [tmux](https://tmux.github.io/)---Terminal multiplexer similar to GNU Screen
+- [Vim](https://www.vim.org/)---Vi IMproved, a text editor
+- [X11](https://www.x.org/wiki/)---Windowing system with network transparency
for Unix
There is also some slightly customized support for multi-version environment
management for three major scripting languages:
-* [plenv](https://github.com/tokuhirom/plenv)---Perl
-* [pyenv](https://github.com/pyenv/pyenv)---Python
-* [rbenv](https://github.com/rbenv/rbenv)---Ruby
+- [plenv](https://github.com/tokuhirom/plenv)---Perl
+- [pyenv](https://github.com/pyenv/pyenv)---Python
+- [rbenv](https://github.com/rbenv/rbenv)---Ruby
The configurations for shells, Mutt, tmux, and Vim are the most likely to be of
interest. The i3 configuration is limited mainly to changing window switching
-key bindings to match Vim's. There are a fair few resources defined for
-rxvt-unicode.
+key bindings to match Vim's.
### Shell
@@ -168,29 +163,29 @@ These are set only after testing `BASH_VERSINFO` appropriately.
A terminal session with my prompt looks something like this:
~$ ssh remote
- remote:~$ cd .local/share/dotfiles
- remote:~/.local/share/dotfiles(master+!)$ git status
+ remote:~$ cd .local/src/dotfiles
+ remote:~/.local/src/dotfiles(master+!)$ git status
M README.md
M bash/bashrc.d/prompt.bash
A init
- remote:~/.local/share/dotfiles(master+!)$ foobar
+ remote:~/.local/src/dotfiles(master+!)$ foobar
foobar: command not found
- remote:~/.local/share/dotfiles(master+!)<127>$ sleep 5 &
+ remote:~/.local/src/dotfiles(master+!)<127>$ sleep 5 &
[1] 28937
- remote:~/.local/share/dotfiles(master+!){1}$
+ remote:~/.local/src/dotfiles(master+!){1}$
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,
+- Whether in a Git repository if applicable,
-* The current version control branch, tag, or commit/revision if applicable,
+- The current version control branch, tag, or commit/revision if applicable,
and punctuation to show repository status including reference to upstreams at
a glance. Subversion support can also be enabled, in which case a `git:` or
`svn:` prefix is added appropriately for disambiguation.
-* The number of running background jobs, if non-zero.
-* The exit status of the last command, if non-zero.
+- 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.
@@ -209,60 +204,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
+- 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
+ - `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
+ - `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.
-* Two editor wrapper functions:
- * `e()` invokes `$EDITOR`, or `ed(1)` if not set.
- * `v()` invokes `$VISUAL`, or `vi(1)` if not set.
-* `bc()` silences startup messages from GNU `bc(1)`.
-* `ed()` tries to get verbose error messages, a prompt, and a Readline
+- Two editor wrapper functions:
+ - `e()` invokes `$EDITOR`, or `ed(1)` if not set.
+ - `v()` invokes `$VISUAL`, or `vi(1)` if not set.
+- `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)`.
-* `grep()` tries to apply color and other options good for interactive use if
+- `gdb()` silences startup messages from `gdb(1)`.
+- `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
+- `hgrep()` allows searching `$HISTFILE`.
+- `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
+ - `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.
+- `tor()` is just a terse shortcut for using Torsocks to anonymize TCP
+ connections from the current shell.
+- `tree()` colorizes GNU `tree(1)` output if possible (without having
`LS_COLORS` set).
-* `x()` is a one-key shortcut for `exec startx`.
+- `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
+- `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
+- `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
+- `vared()` allows interactively editing a variable with Readline, emulating a
Z shell function I like by the same name (Bash).
-* `ver()` prints the current shell's version information (Bash, Korn Shell, Z
+- `ver()` prints the current shell's version information (Bash, Korn Shell, Z
shell).
#### Completion
@@ -275,13 +269,13 @@ startup without a lot of junk functions in my Bash namespace.
I do make some exceptions with completions defined in files in
`~/.bash_completion.d` 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
-* `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
+- `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
@@ -316,22 +310,12 @@ be using a PGP implementation, and I encrypt whenever I have a public key
available for them. The GnuPG and S/MIME interfacing is done with
[GPGme](https://www.gnupg.org/related_software/gpgme/), rather than defining
commands for each crypto operation. I wrote [an article about this
-setup](https://sanctum.geek.nz/arabesque/gnu-linux-crypto-email/) if it sounds
+setup](https://blog.sanctum.geek.nz/gnu-linux-crypto-email/) if it sounds
appealing.
You'll need Abook installed if you want to use the `query_command` I have
defined, and msmtp for the `sendmail` command.
-### rxvt-unicode
-
-I've butchered the URxvt Perl extensions `selection-to-clipboard` and
-`selection` into a single `select` extension in `~/.urxvt/ext`, which is the
-only extension I define in `~/.Xresources`.
-
-The included `.Xresources` file assumes that `urxvt` can use 256 colors and
-Perl extensions. If you're missing functionality, try changing
-`perl-ext-common` to `default`.
-
### tmux
These are just generally vi-friendly settings, and there isn't much out of the
@@ -413,220 +397,219 @@ interactive shells.
These scripts are installed by the `install-bin` target:
-* Three SSH-related scripts:
- * `sls(1df)` prints hostnames read from a `ssh_config(5)` file. It uses
+- Three SSH-related scripts:
+ - `sls(1df)` prints hostnames read from `ssh_config(5)` files. It uses
`slsf(1df)` to read each one.
- * `sra(1df)` runs a command on multiple hosts read from `sls(1df)` and
+ - `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
+ - `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
+- 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
+ - `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
+ - `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
+ - `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
+ - `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
+- 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
+- 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)`
+- 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
+ - `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.
+ - `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
+- 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
+ - `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
+ - `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
+ - `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
+- 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)`.
-* Two editor wrapper tools:
- * `mked(1df)` creates paths to all its arguments before invoking `$EDITOR`.
- * `mkvi(1df)` creates paths to all its arguments before invoking `$VISUAL`.
-* `ap(1df)` reads arguments for a given command from the standard input,
+ - `ped(1df)` runs `pst(1df)` with `$EDITOR` or `ed(1)`.
+ - `pvi(1df)` runs `pvi(1df)` with `$VISUAL` or `vi(1)`.
+- Two editor wrapper tools:
+ - `mked(1df)` creates paths to all its arguments before invoking `$EDITOR`.
+ - `mkvi(1df)` creates paths to all its arguments before invoking `$VISUAL`.
+- `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,
+- `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
+- `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
+- `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
+- `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
+- `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.
-* `defang(1df)` prevents dangerous URLs from being made into clickable links.
-* `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
+- `dam(1df)` buffers all its input before emitting it as output.
+- `ddup(1df)` removes duplicate lines from unsorted input.
+- `defang(1df)` prevents dangerous URLs from being made into clickable links.
+- `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
+- `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
+- `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
+- `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
+- `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
+- `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
+- `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
+- `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,
+- `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`.
-* `mim(1df)` starts an interactive Mutt message with its input.
-* `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.
-* `msc(1df)` crudely counts messages in an mbox.
-* `mw(1df)` prints alphabetic space-delimited words from the input one per
+- `mex(1df)` makes given filenames in `$PATH` executable.
+- `mi5(1df)` is a crude preprocessor for `m4`.
+- `mim(1df)` starts an interactive Mutt message with its input.
+- `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.
+- `msc(1df)` crudely counts messages in an mbox.
+- `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
+- `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` sub-command.
-* `p(1df)` prints concatenated standard input; `cat(1)` as it should always
+- `p(1df)` prints concatenated standard input; `cat(1)` as it should always
have been.
-* `pa(1df)` prints its arguments, one per line.
-* `phpcsff(1df)` wraps around
+- `pa(1df)` prints its arguments, one per line.
+- `phpcsff(1df)` wraps around
[PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to make it
a source code filter suitable for use as an `equalprg` in Vim.
-* `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
+- `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.
-* `pwg(1df)` generates just one decent password with `pwgen(1)`.
-* `qat(1df)` disables `stty echo` for the duration of a paste.
-* `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,
+- `pwg(1df)` generates just one decent password with `pwgen(1)`.
+- `qat(1df)` disables `stty echo` for the duration of a paste.
+- `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
+- `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
+- `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
+- `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,
+- `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
+- `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
+- `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`
+- `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.
-* `vic(1df)` tries to run a POSIX-compliant `vi(1)`.
-* `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.
+- `vic(1df)` tries to run a POSIX-compliant `vi(1)`.
+- `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.
-* `uuu(6df)` uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu.
-* `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.
+- `uuu(6df)` uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu.
+- `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
@@ -647,17 +630,15 @@ functionality (yet).
There are also optional `lint` targets, if you have the appropriate tools
available to run them:
-* [ShellCheck](https://www.shellcheck.net/):
- * `lint-bash`
- * `lint-bin`
- * `lint-games`
- * `lint-ksh`
- * `lint-sh`
- * `lint-xinit`
-* Perl::Critic:
- * `lint-urxvt`
-* [Vint](https://github.com/Kuniwak/vint):
- * `lint-vim`
+- [ShellCheck](https://www.shellcheck.net/):
+ - `lint-bash`
+ - `lint-bin`
+ - `lint-games`
+ - `lint-ksh`
+ - `lint-sh`
+ - `lint-x`
+- [Vint](https://github.com/Kuniwak/vint):
+ - `lint-vim`
Future development
------------------
@@ -677,7 +658,7 @@ simple scripts, so do whatever you like with it if any of it's useful to you.
If you're feeling generous, please join and/or donate to a free software
advocacy group, and let me know you did it because of this project:
-* [Free Software Foundation](https://www.fsf.org/)
-* [Software in the Public Interest](https://www.spi-inc.org/)
-* [FreeBSD Foundation](https://www.freebsdfoundation.org/)
-* [OpenBSD Foundation](https://www.openbsdfoundation.org/)
+- [Free Software Foundation](https://www.fsf.org/)
+- [Software in the Public Interest](https://www.spi-inc.org/)
+- [FreeBSD Foundation](https://www.freebsdfoundation.org/)
+- [OpenBSD Foundation](https://www.openbsdfoundation.org/)
diff --git a/TABS.md b/TABS.md
deleted file mode 100644
index 80c81294..00000000
--- a/TABS.md
+++ /dev/null
@@ -1,26 +0,0 @@
-Spaces to tabs
-==============
-
-If you prefer tabs to spaces, the following recipe seems to convert everything
-pretty nicely:
-
- $ find . -name .git -prune -o -name vim -prune -o -type f \
- -exec sh -c \
- 'for f;do unexpand -t4 "$f">"$f".tmp;mv "$f".tmp "$f";done' \
- _ {} +
-
- $ find vim -name bundle -prune -o -type f \
- -exec sh -c \
- 'for f;do unexpand -t2 "$f">"$f".tmp;mv "$f".tmp "$f";done' \
- _ {} +
-
-If you have GNU `unexpand(1)` and can add `--first-only` to each of those
-calls, the results seem perfect.
-
-You can configure Vim to accommodate this by removing the settings in
-vim/vimrc.vim for:
-
-* `'expandtab'`
-* `'shiftwidth'`
-* `'smarttab'`
-* `'softtabstop'`
diff --git a/VERSION b/VERSION
index 3438f26f..f677da70 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-tejr dotfiles v10.10.0
-Sat, 19 Sep 2020 08:18:20 +0000
+tejr dotfiles v12.41.0
+Wed, 02 Aug 2023 21:39:23 +0000
diff --git a/X/Xresources b/X/Xresources
deleted file mode 100644
index 3f586a87..00000000
--- a/X/Xresources
+++ /dev/null
@@ -1,2 +0,0 @@
-#include ".Xresources.d/URxvt"
-#include ".Xresources.d/XTerm"
diff --git a/X/Xresources.d/URxvt b/X/Xresources.d/URxvt
deleted file mode 100644
index f4c30d54..00000000
--- a/X/Xresources.d/URxvt
+++ /dev/null
@@ -1,32 +0,0 @@
-! URxvt
-URxvt.cursorBlink: on
-URxvt.cutchars: <>│
-URxvt.internalBorder: 0
-URxvt.iso14755: false
-URxvt.iso14755_52: false
-URxvt.perl-ext-common: select
-URxvt.pointerBlank: true
-URxvt.saveLines: 10000
-URxvt.scrollBar: false
-URxvt.scrollTTyKeypress: true
-URxvt.scrollTTyOutput: false
-URxvt.secondaryScroll: true
-URxvt.urgentOnBell: true
-URxvt.background: #030303
-URxvt.foreground: #E0E0E0
-URxvt.color0: #030303
-URxvt.color1: #CC0000
-URxvt.color2: #3EAA06
-URxvt.color3: #C4A000
-URxvt.color4: #3465A4
-URxvt.color5: #75507B
-URxvt.color6: #06989A
-URxvt.color7: #D3D7CF
-URxvt.color8: #303030
-URxvt.color9: #EF2929
-URxvt.color10: #7AF234
-URxvt.color11: #FCE94F
-URxvt.color12: #729FCF
-URxvt.color13: #AD7FA8
-URxvt.color14: #34E2E2
-URxvt.color15: #EEEEEC
diff --git a/X/Xresources.d/XTerm b/X/Xresources.d/XTerm
deleted file mode 100644
index f991ec91..00000000
--- a/X/Xresources.d/XTerm
+++ /dev/null
@@ -1,24 +0,0 @@
-! XTerm
-XTerm.termName: xterm-256color
-XTerm.vt100.bellIsUrgent: true
-XTerm.vt100.internalBorder: 0
-XTerm.vt100.eightBitInput: false
-XTerm.vt100.metaSendsEscape: true
-XTerm.vt100.background: #030303
-XTerm.vt100.foreground: #E0E0E0
-XTerm.vt100.color0: #030303
-XTerm.vt100.color1: #CC0000
-XTerm.vt100.color2: #3EAA06
-XTerm.vt100.color3: #C4A000
-XTerm.vt100.color4: #3465A4
-XTerm.vt100.color5: #75507B
-XTerm.vt100.color6: #06989A
-XTerm.vt100.color7: #D3D7CF
-XTerm.vt100.color8: #303030
-XTerm.vt100.color9: #EF2929
-XTerm.vt100.color10: #7AF234
-XTerm.vt100.color11: #FCE94F
-XTerm.vt100.color12: #729FCF
-XTerm.vt100.color13: #AD7FA8
-XTerm.vt100.color14: #34E2E2
-XTerm.vt101.color15: #EEEEEC
diff --git a/X/redshift.conf b/X/redshift.conf
deleted file mode 100644
index 1e1de4ee..00000000
--- a/X/redshift.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-[redshift]
-adjustment-method=randr
-location-provider=manual
-temp-day=5700
-temp-night=3500
-transition=1
-
-[manual]
-lat=-40.352306
-lon=175.608215
diff --git a/X/sxhkdrc b/X/sxhkdrc
deleted file mode 100644
index 9d9884c9..00000000
--- a/X/sxhkdrc
+++ /dev/null
@@ -1,47 +0,0 @@
-super + Return
- urxvtcd
-
-super + control + Return
- urxvtcd -e sh
-
-super + shift + Return
- urxvtcd -e ksh
-
-super + alt + Return
- urxvtcd -e zsh
-
-super + b
- br
-
-super + d
- dmenu_run
-
-super + g
- xgoc
-
-super + i
- gimp
-
-super + m
- urxvtcd -e tm
-
-super + p
- dmp
-
-super + v
- urxvtcd -e "$VISUAL"
-
-super + slash
- i3lock --color=#000000 --image ~/.i3/lock.png --nofork
-
-XF86AudioMute
- amixer -q sset Master toggle
-
-XF86AudioRaiseVolume
- amixer -q sset Master 5%+ unmute
-
-XF86AudioLowerVolume
- amixer -q sset Master 5%- unmute
-
-XF86Calculator
- urxvtcd -e bcq
diff --git a/X/xinitrc b/X/xinitrc
deleted file mode 100644
index e86cac4d..00000000
--- a/X/xinitrc
+++ /dev/null
@@ -1,17 +0,0 @@
-# If a file ~/.xrandrrc exists for monitor setup, source that first
-[ -e "$HOME"/.xrandrrc ] && . "$HOME"/.xrandrrc
-
-# Read X resources
-xrdb "$HOME"/.Xresources
-
-# Faster mouse acceleration with a natural threshold
-xset mouse 5/2 0
-
-# Load all supplementary scripts in ~/.xinitrc.d
-for sh in "$HOME"/.xinitrc.d/*.sh ; do
- [ -e "$sh" ] && . "$sh"
-done
-unset -v sh
-
-# Start window manager
-exec i3
diff --git a/X/xinitrc.d/browser.sh b/X/xinitrc.d/browser.sh
deleted file mode 100644
index 0153fba9..00000000
--- a/X/xinitrc.d/browser.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-# Choose a GUI browser with some rough heuristics
-
-# If Firefox is available, start by assuming that
-if command -v firefox >/dev/null 2>&1 ; then
- BROWSER=firefox
-fi
-
-# Consider a switch to Dillo...
-if (
- # No output, please
- exec >/dev/null 2>&1
- # Don't switch if it's not there
- command -v dillo || exit
- # Switch if Firefox isn't there
- command -v firefox || exit 0
- # Switch if procfs says we have less than 2GB of RAM
- awk '$1=="MemTotal:"&&$2<2^20{m++}END{exit!m}' < /proc/meminfo
-) ; then
- BROWSER=dillo
-fi
-
-# Export our choice of browser, if it isn't empty
-[ -n "$BROWSER" ] || return
-export BROWSER
diff --git a/X/xinitrc.d/dunst.sh b/X/xinitrc.d/dunst.sh
deleted file mode 100644
index bddaa1fe..00000000
--- a/X/xinitrc.d/dunst.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Start dunst(1) to display libnotify messages
-command -v dunst >/dev/null 2>&1 || return
-dunst &
diff --git a/X/xinitrc.d/redshift.sh b/X/xinitrc.d/redshift.sh
deleted file mode 100644
index d5d58d8a..00000000
--- a/X/xinitrc.d/redshift.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Start redshift(1)
-command -v redshift >/dev/null 2>&1 || return
-redshift &
diff --git a/X/xinitrc.d/ssh.sh b/X/xinitrc.d/ssh.sh
deleted file mode 100644
index 005743fe..00000000
--- a/X/xinitrc.d/ssh.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-# Set SSH_ASKPASS if we can find one
-command -v ssh-askpass >/dev/null 2>&1 || return
-SSH_ASKPASS=$(command -v ssh-askpass)
-export SSH_ASKPASS
diff --git a/X/xinitrc.d/sxhkd.sh b/X/xinitrc.d/sxhkd.sh
deleted file mode 100644
index 132d8f8a..00000000
--- a/X/xinitrc.d/sxhkd.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Start sxhkd(1)
-command -v sxhkd >/dev/null 2>&1 || return
-sxhkd &
diff --git a/X/xinitrc.d/urxvt.sh b/X/xinitrc.d/urxvt.sh
deleted file mode 100644
index a5eb0940..00000000
--- a/X/xinitrc.d/urxvt.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Start urxvtd(1)
-command -v urxvtd >/dev/null 2>&1 || return
-urxvtd -o -q &
diff --git a/X/xinitrc.d/xkb.sh b/X/xinitrc.d/xkb.sh
deleted file mode 100644
index a5142398..00000000
--- a/X/xinitrc.d/xkb.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-# Map Caps Lock as a Ctrl key, use right alt as Compose, kill X server with
-# Ctrl+Alt+Backspace
-# <https://en.wikipedia.org/wiki/Compose_key#Common_compose_combinations>
-command -v setxkbmap >/dev/null 2>&1 || return
-setxkbmap -option compose:ralt,ctrl:nocaps,terminate:ctrl_alt_bksp
diff --git a/X/xinitrc.d/xrbg.sh b/X/xinitrc.d/xrbg.sh
deleted file mode 100644
index 0e4ec278..00000000
--- a/X/xinitrc.d/xrbg.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-# Apply a random background image
-xrbg
diff --git a/bash/bash_completion.d/_ssh_config_hosts.bash b/bash/bash_completion.d/_ssh_config_hosts.bash
index 0959f52b..16265e8a 100644
--- a/bash/bash_completion.d/_ssh_config_hosts.bash
+++ b/bash/bash_completion.d/_ssh_config_hosts.bash
@@ -3,23 +3,28 @@ _ssh_config_hosts() {
# Iterate through SSH client config paths
local config
- for config in "$HOME"/.ssh/config /etc/ssh/ssh_config ; do
+ for config in /etc/ssh/ssh_config.d/*.conf /etc/ssh/ssh_config \
+ "$HOME"/.ssh/config.d/*.conf "$HOME"/.ssh/config ; do
[[ -e $config ]] || continue
- # Read 'Host' options and their first value from file
- local option value ci
- while read -r option value _ ; do
+ # Read 'Host' options and their patterns from file
+ local option value patterns pattern ci
+ while read -r option value ; do
[[ $option == Host ]] || continue
+ read -a patterns -r \
+ < <(printf '%s\n' "$value")
# Check host value
- case $value in
- # No empties
- '') ;;
- # No wildcards
- *'*'*) ;;
- # Found a match; print it
- "$2"*) COMPREPLY[ci++]=$value ;;
- esac
+ for pattern in "${patterns[@]}" ; do
+ case $pattern in
+ # No empties
+ '') ;;
+ # No wildcards
+ *'*'*) ;;
+ # Found a match; print it
+ "$2"*) COMPREPLY[ci++]=$pattern ;;
+ esac
+ done
done < "$config"
done
diff --git a/bash/bash_completion.d/mosh.bash b/bash/bash_completion.d/mosh.bash
new file mode 100644
index 00000000..17d72ca1
--- /dev/null
+++ b/bash/bash_completion.d/mosh.bash
@@ -0,0 +1,5 @@
+# Completion for mosh(1) with ssh_config(5) hostnames
+if ! declare -F _ssh_config_hosts >/dev/null ; then
+ source "$HOME"/.bash_completion.d/_ssh_config_hosts.bash
+fi
+complete -F _ssh_config_hosts -o bashdefault -o default mosh
diff --git a/bash/bash_completion.d/path.bash b/bash/bash_completion.d/path.bash
index 9224506a..9234f132 100644
--- a/bash/bash_completion.d/path.bash
+++ b/bash/bash_completion.d/path.bash
@@ -62,6 +62,7 @@ _path() {
fi
# Break PATH into parts
+ declare -a paths
IFS=: read -a paths -d '' -r \
< <(printf '%s\0' "$PATH")
diff --git a/bash/bashrc b/bash/bashrc
index 6e4c31a9..5d3a7bbc 100644
--- a/bash/bashrc
+++ b/bash/bashrc
@@ -28,8 +28,8 @@ fi
# Clear away command_not_found_handle if a system bashrc file set it up
unset -f command_not_found_handle
-# Keep around 32K lines of history in file
-HISTFILESIZE=$((1 << 15))
+# Keep around 128K lines of history in file
+HISTFILESIZE=131072
# Ignore duplicate commands
HISTCONTROL=ignoredups
diff --git a/bash/bashrc.d/keep.bash b/bash/bashrc.d/keep.bash
index 2e2424a3..26a84f5b 100644
--- a/bash/bashrc.d/keep.bash
+++ b/bash/bashrc.d/keep.bash
@@ -89,8 +89,8 @@ EOF
case $name in
# NAME must start with letters or an underscore, and contain no
- # characters besides letters, numbers, or underscores
- *[!a-zA-Z0-9_]*|[!a-zA-Z_]*)
+ # characters besides letters, numbers, underscores, or dashes
+ [!a-zA-Z_]*|*[!a-zA-Z0-9_-]*)
printf 'bash: %s: %s not a valid NAME\n' \
"${FUNCNAME[0]}" "$name" >&2
((errors++))
diff --git a/bash/bashrc.d/prompt.bash b/bash/bashrc.d/prompt.bash
index f9678f20..e0a03438 100644
--- a/bash/bashrc.d/prompt.bash
+++ b/bash/bashrc.d/prompt.bash
@@ -7,29 +7,32 @@ prompt() {
# Turn complex, colored PS1 and debugging PS4 prompts on
on)
# Set up pre-prompt command
- PROMPT_COMMAND='history -a'
+ PROMPT_COMMAND='PROMPT_RETURN=$?;history -a'
# 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 depends on whether we're in SSH or not
+ # Prompt has hostname via SSH outside of screen/tmux
PS1=
- if [[ -n $SSH_CLIENT || -n $SSH_CONNECTION ]] ; then
+ if [[ -n $SSH_CLIENT && -z $STY && -z $TMUX ]] ; then
PS1=$PS1'\h:'
fi
PS1=$PS1'\w'
- # Add sub-commands; VCS, job, and return status checks
- PS1=$PS1'$(ret=$?;prompt vcs;prompt job;prompt ret)'
-
# Add a helpful prefix if this shell appears to be exotic
case ${SHELL##*/} in
(bash) ;;
(*) PS1=bash:$PS1 ;;
esac
+ # Add sub-commands:
+ ## Preload libraries as prefix
+ PS1='$(prompt preload)'$PS1
+ ## VCS, job, and return status checks as suffixes
+ PS1=$PS1'$(prompt vcs;prompt job;prompt ret)'
+
# Add prefix and suffix
PS1='${PROMPT_PREFIX}'$PS1'${PROMPT_SUFFIX}'
@@ -92,6 +95,21 @@ prompt() {
fi
;;
+ # Analyze LD_PRELOAD to see if we should report anything loaded
+ preload)
+ printf '%s:' "$LD_PRELOAD" |
+ while read -d : -r ; do
+ case $REPLY in
+ (*/libip2unix.so)
+ printf '[IP2Unix]'
+ ;;
+ (*/libtorsocks.so)
+ printf '[Tor]'
+ ;;
+ esac
+ done
+ ;;
+
# Git prompt function
git)
@@ -249,8 +267,8 @@ prompt() {
# Show return status of previous command in angle brackets, if not zero
ret)
# shellcheck disable=SC2154
- ((ret)) || return
- printf '<%u>' "${ret//\\/\\\\}"
+ ((PROMPT_RETURN)) || return
+ printf '<%u>' "${PROMPT_RETURN//\\/\\\\}"
;;
# Show the count of background jobs in curly brackets, if not zero
diff --git a/bin/clog.sh b/bin/clog.sh
index 3269c508..a5c777e8 100644
--- a/bin/clog.sh
+++ b/bin/clog.sh
@@ -3,7 +3,8 @@
# Build the cat(1) command we'll run, wrapping it in rlwrap(1) if available and
# applicable.
if [ "$#" -eq 0 ] && [ -t 0 ] && command -v rlwrap >/dev/null 2>&1 ; then
- set -- rlwrap --history-filename=/dev/null cat -- "${@:--}"
+ set -- rlwrap --history-filename=/dev/null --no-warnings \
+ cat -- "${@:--}"
else
set -- cat -- "${@:--}"
fi
diff --git a/bin/dmp.sh b/bin/dmp.sh
deleted file mode 100644
index ab09c20e..00000000
--- a/bin/dmp.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-# Pick a pass(1) password with dmenu(1)
-
-# 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)
-# shellcheck disable=SC2016
-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 first line of the password into the clipboard
-pass show "$pw" | sed 1q | xsel -ib || exit
-
-# If we have notify-send(1), alert that the password has been copied
-if command -v notify-send >/dev/null >&2 ; then
- notify-send "$(printf '%s in clipboard' "$pw")"
-fi
diff --git a/bin/gscr.sh b/bin/gscr.sh
index 2fbee05a..26eafb12 100644
--- a/bin/gscr.sh
+++ b/bin/gscr.sh
@@ -16,11 +16,16 @@ for arg in "${@:-.}" ; do (
;;
esac
+ # Remove any original refs from a prior rewrite
+ if [ -e refs/original ] ; then
+ rm -r -- refs/original || exit
+ fi
+
# Check for bad references or other integrity/sanity problems
- git fsck || exit
+ git fsck --full --no-reflogs || exit
# Expire dangling references
- git reflog expire --expire=now || exit
+ git reflog expire --all --expire=now --expire-unreachable=now || exit
# Remove dangling references
git gc --prune=now --aggressive || exit
diff --git a/bin/han.bash b/bin/han.bash
index 6ab0b3e7..5e5d67c2 100644
--- a/bin/han.bash
+++ b/bin/han.bash
@@ -1,5 +1,4 @@
# Abstract calls to Bash help vs man(1)
-self=han
# Ensure we're using at least version 3.0
# shellcheck disable=SC2128
@@ -13,22 +12,6 @@ if ((BASH_VERSINFO[0] >= 4)) ; then
helpopts=(-m)
fi
-# Create a temporary directory with name in $td, and a trap to remove it when
-# the script exits
-td=
-cleanup() {
- [[ -n $td ]] && rm -fr -- "$td"
-}
-trap cleanup EXIT
-td=$(mktd "$self") || exit
-
-# If we have exactly one argument and a call to the help builtin with that
-# argument succeeds, display its output with `pager -s`
-if (($# == 1)) &&
- help "${helpopts[@]}" "$1" >"$td"/"$1".help 2>/dev/null ; then
- (cd -- "$td" && "$PAGER" -s -- "$1".help)
-
-# Otherwise, just pass all the arguments to man(1)
-else
- man "$@"
-fi
+# Call `help`, with the `-m` flag if available; if it errors out (discard
+# stderr), run `man` instead
+help "${helpopts[@]}" -- "$@" 2>/dev/null || man -- "$@"
diff --git a/bin/mked.sh b/bin/mked.sh
index 93e21573..24a61de8 100644
--- a/bin/mked.sh
+++ b/bin/mked.sh
@@ -1,4 +1,3 @@
-#!/bin/sh
# Create paths to all files before invoking editor
for file do
mkdir -p -- "${file%/*}" || exit
diff --git a/bin/mktd.sh b/bin/mktd.sh
index 72375873..c2ba2ee2 100644
--- a/bin/mktd.sh
+++ b/bin/mktd.sh
@@ -2,7 +2,7 @@
# Build the intended directory name, with the last element a random integer
# from 1..2^31
-lim=$((2 << 31))
+lim=2147483648
dn=${TMPDIR:-/tmp}/${1:-mktd}.$$.$(rndi 1 "$lim")
# Create the directory and print its name if successful
diff --git a/bin/mkvi.sh b/bin/mkvi.sh
index c5974383..ac5c6229 100644
--- a/bin/mkvi.sh
+++ b/bin/mkvi.sh
@@ -1,4 +1,3 @@
-#!/bin/sh
# Create paths to all files before invoking editor
for file do
mkdir -p -- "${file%/*}" || exit
diff --git a/bin/msc.sh b/bin/msc.sh
index 051f104a..051f104a 100755..100644
--- a/bin/msc.sh
+++ b/bin/msc.sh
diff --git a/bin/osc.sh b/bin/osc.sh
index 5def12ff..2853f1a5 100644
--- a/bin/osc.sh
+++ b/bin/osc.sh
@@ -17,7 +17,7 @@ serv=${2:-https}
set --
## If we have rlwrap, use it, but don't complain if we don't
if command -v rlwrap >/dev/null 2>&1 ; then
- set -- "$@" rlwrap --history-filename=/dev/null
+ set -- "$@" rlwrap --history-filename=/dev/null --no-warnings
fi
## The actual openssl(1ssl) and subcommand call
set -- "$@" openssl s_client
diff --git a/bin/plmu b/bin/plmu
deleted file mode 100755
index bac2e434..00000000
--- a/bin/plmu
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-# Upgrade plenv modules with cpanm(1)
-
-# Set up exceptions file if it exists
-def="$HOME"/.plenv/non-cpanm-modules
-if [ -e "$def" ] ; then
- ef=$def
-else
- ef=/dev/null
-fi
-
-# Check that exceptions file is sorted
-if ! LC_COLLATE=C sort -c -- "$ef" ; then
- printf >&2 '%s not sorted\n' "$ef"
- exit 1
-fi
-
-# Get the list of modules; sort them in case our current locale disagrees on
-# the existing sorting
-plenv list-modules | LC_COLLATE=C sort |
-
-# Exclude any modules in ~/.plenv/non-cpanm-modules if it exists
-LC_COLLATE=C comm -23 -- - "$ef" |
-
-# Read that list of modules to upgrade and upgrade them one by one
-while read -r module ; do
- cpanm --notest --quiet -- "$module"
-done
diff --git a/bin/qat.sh b/bin/qat.sh
index 31f5e8dd..19acbf5a 100644
--- a/bin/qat.sh
+++ b/bin/qat.sh
@@ -1,4 +1,3 @@
-#!/bin/sh
restore() {
if [ -n "$stty" ] ; then
stty "$stty"
diff --git a/bin/rndi.awk b/bin/rndi.awk
index 7d9c640b..44989d11 100644
--- a/bin/rndi.awk
+++ b/bin/rndi.awk
@@ -30,9 +30,6 @@ BEGIN {
# Print a random integer bounded by the first and second arguments
print int(lower + rand() * (upper - lower + 1))
-
- # Bail before processing any lines
- exit
}
# Bailout function
diff --git a/bin/sls.sh b/bin/sls.sh
index 55c1dfc7..9741144a 100644
--- a/bin/sls.sh
+++ b/bin/sls.sh
@@ -3,7 +3,8 @@
# If we weren't given a file explicitly, we'll try to read both /etc/ssh_config
# and ~/.ssh_config in that order if they exist
if [ "$#" -eq 0 ] ; then
- for cfg in /etc/ssh_config "$HOME"/.ssh/config ; do
+ for cfg in /etc/ssh_config.d/*.conf /etc/ssh_config \
+ "$HOME"/.ssh/config.d/*.conf "$HOME"/.ssh/config ; do
[ -e "$cfg" ] || continue
set -- "$@" "$cfg"
done
diff --git a/bin/slsf.awk b/bin/slsf.awk
index 3d5c190f..75efe7a4 100644
--- a/bin/slsf.awk
+++ b/bin/slsf.awk
@@ -1,9 +1,28 @@
-# Print the first non-glob "Host" name from each line of ssh_config(5) files
+# Print all the hosts from ssh_config(1) files
# Manage the processing flag (starts set in each file)
-FNR == 1 || /### sls/ { sls = 1 }
+BEGIN { sls = 1 }
+FNR == 1 { sls = 1 }
+/### sls/ { sls = 1 }
/### nosls/ { sls = 0 }
-# If processing flag set, directive is "Host", and hostname has no wildcards,
-# then print it
-sls && $1 == "Host" && $2 !~ /\*/ { print $2 }
+# Skip if we're ignoring hosts
+!sls { next }
+# Skip if this isn't a host line
+$1 != "Host" { next }
+
+# Add all the patterns after the keyword that don't have wildcards
+{
+ for (i = 2; i <= NF; i++) {
+ if ($i !~ /[?*]/) {
+ hosts[$i]++
+ }
+ }
+}
+
+# Print the complete list of hosts, sorted
+END {
+ for (host in hosts) {
+ print host | "sort"
+ }
+}
diff --git a/bin/td.sh b/bin/td.sh
index a5a4ab30..6dfbebc0 100644
--- a/bin/td.sh
+++ b/bin/td.sh
@@ -1,7 +1,7 @@
# Manage to-do files with just $EDITOR and git(1)
# Specify the path and file
-dir=${TODO_DIR:-"$HOME"/Todo}
+dir=${TODO_DIR:-"$HOME"/todo}
# If the directory doesn't exist, create it
[ -d "$dir" ] || mkdir -p -- "$dir" || exit
diff --git a/bin/tm.sh b/bin/tm.sh
index d5422869..6bdce20b 100644
--- a/bin/tm.sh
+++ b/bin/tm.sh
@@ -1,5 +1,10 @@
# Attach to existing tmux session rather than create a new one if possible
+# Source config if it exists (just the session name, really)
+if [ -e "${XDG_CONFIG_HOME:-"$HOME"/.config}"/tm/config ] ; then
+ . "${XDG_CONFIG_HOME:-"$HOME"/.config}"/tm/config || exit
+fi
+
# If given any arguments, just use them as they are
if [ "$#" -gt 0 ] ; then
:
@@ -10,8 +15,8 @@ elif tmux has-session 2>/dev/null ; then
# Create a new session with an appropriate name
else
- set -- new-session -s "${TMUX_SESSION:-default}"
+ set -- new-session -s "${default_session_name:-default}"
fi
# Execute with concluded arguments
-tmux "$@"
+exec tmux "$@"
diff --git a/bin/uts.awk b/bin/uts.awk
index 3aaec2ab..a7b3ef5d 100644
--- a/bin/uts.awk
+++ b/bin/uts.awk
@@ -2,5 +2,4 @@
BEGIN {
srand()
print srand()
- exit
}
diff --git a/bin/xgo.sh b/bin/xgo.sh
index 6d6586ef..c59409a5 100644
--- a/bin/xgo.sh
+++ b/bin/xgo.sh
@@ -39,7 +39,7 @@ for url do (
# mpv(1)
(*[/.]youtube.com/watch*[?\&]t=) ;;
(*[/.]youtube.com/watch*)
- exec mpv -- "$url"
+ exec mpv --force-window --no-terminal -- "$url"
;;
esac
@@ -59,14 +59,15 @@ for url do (
)
;;
- # Open audio and video in mpv(1); force a window even for audio so I
- # can control it
+ # Open audio and video in mpv(1)
(audio/*|video/*)
- exec mpv --force-window -- "$url"
+ exec mpv --force-window --no-terminal -- "$url"
;;
- # If the MIME type is an image that is not a GIF, load it in feh(1)
- (image/gif) ;;
+ # Open GIFs with a looping mpv(1), and all other images with feh(1)
+ (image/gif)
+ exec mpv --force-window --loop=inf --no-terminal -- "$url"
+ ;;
(image/*)
exec curl -- "$url" | feh -
;;
@@ -74,7 +75,7 @@ for url do (
# Open plain text in a terminal view(1)
(text/plain)
# shellcheck disable=SC2016
- exec urxvt -e sh -c 'curl -- "$1" | view -' _ "$url"
+ exec x-terminal-emulator -e sh -c 'curl -- "$1" | view -' _ "$url"
;;
# Otherwise, just pass it to br(1df)
diff --git a/bin/xsnap.sh b/bin/xsnap.sh
new file mode 100644
index 00000000..7a9d0c38
--- /dev/null
+++ b/bin/xsnap.sh
@@ -0,0 +1,24 @@
+# Wrapper for scrot(1) for use in recording screenshots
+date=$(date +%Y/%m/%d) || exit
+dir=${XDG_DATA_HOME:-"$HOME"/.local/share}/scrot/screenshots/$date
+mkdir -p -- "$dir" || exit
+cd -- "$dir" || exit
+for ent in * ; do
+ [ -e "$ent" ] || continue
+ case $ent in
+ *.png) ;;
+ *) continue ;;
+ esac
+ basename=${ent%.png}
+ case $basename in
+ *[!0-9]*) continue ;;
+ esac
+ last=$basename
+done
+number=$(printf '%s' "$last" | sed 's/^0*//') # Avoid octal
+id=$((number + 1))
+name=$(printf '%05d' "$id").png
+path=$dir/$name
+scrot --file="$path" --overwrite "$@" || exit
+xclip -selection clipboard -target image/png "$path" || exit
+notify-send "Saved: $date/$name"
diff --git a/cabal/cabal.sh b/cabal/cabal.sh
new file mode 100644
index 00000000..b5730916
--- /dev/null
+++ b/cabal/cabal.sh
@@ -0,0 +1,3 @@
+# Include user-built Haskell programs if the dir exists
+[ -d "$HOME"/.cabal/bin ] || return
+PATH=$HOME/.cabal/bin:$PATH
diff --git a/cabal/profile.d/cabal.sh b/cabal/profile.d/cabal.sh
new file mode 100644
index 00000000..638f8d04
--- /dev/null
+++ b/cabal/profile.d/cabal.sh
@@ -0,0 +1,2 @@
+# Include user-built Haskell programs
+PATH=$HOME/.cabal/bin:$PATH
diff --git a/cargo/profile.d/cargo.sh b/cargo/profile.d/cargo.sh
new file mode 100644
index 00000000..89bcd524
--- /dev/null
+++ b/cargo/profile.d/cargo.sh
@@ -0,0 +1,2 @@
+# Include user-built Rust programs
+PATH=$HOME/.cargo/bin:$PATH
diff --git a/check/urxvt.sh b/check/urxvt.sh
deleted file mode 100644
index e64ba1e5..00000000
--- a/check/urxvt.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-for perl in urxvt/ext/*.pl ; do
- perl -c "${perl%.pl}" || exit
-done
diff --git a/check/x.sh b/check/x.sh
new file mode 100644
index 00000000..f88f11a1
--- /dev/null
+++ b/check/x.sh
@@ -0,0 +1 @@
+sh -n -- x/xsessionrc x/shrc.d/*.sh
diff --git a/check/xinit.sh b/check/xinit.sh
deleted file mode 100644
index a354422a..00000000
--- a/check/xinit.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-set \
- X/xinitrc \
- X/xinitrc.d/*.sh
-for xinit do
- sh -n -- "$xinit" || exit
-done
diff --git a/check/xsession.sh b/check/xsession.sh
new file mode 100644
index 00000000..0b72d8a6
--- /dev/null
+++ b/check/xsession.sh
@@ -0,0 +1 @@
+sh -n -- x/xsession
diff --git a/cpanm/profile.d/cpanm.sh b/cpanm/profile.d/cpanm.sh
index 98b685e3..a860162e 100644
--- a/cpanm/profile.d/cpanm.sh
+++ b/cpanm/profile.d/cpanm.sh
@@ -1,2 +1,3 @@
-PERL_CPANM_HOME=${XDG_CACHE_HOME:-$HOME/.config}/cpanm
+# Set home directory for cpanm files to be XDG-conformant
+PERL_CPANM_HOME=${XDG_CACHE_HOME:-$HOME/.cache}/cpanm
export PERL_CPANM_HOME
diff --git a/dunst/dunstrc b/dunst/dunstrc
deleted file mode 100644
index e3e3e43f..00000000
--- a/dunst/dunstrc
+++ /dev/null
@@ -1,46 +0,0 @@
-[global]
-galignment = left
-gallow_markup = no
-gbounce_freq = 0
-gdmenu = dmenu -p dunst:
-gfollow = mouse
-gformat = "%s %b"
-ggeometry = "350x5-0-17"
-ghistory_length = 20
-ghorizontal_padding = 8
-gicon_position = off
-gidle_threshold = 0
-gignore_newline = no
-gindicate_hidden = no
-gline_height = 0
-gmonitor = 0
-gpadding = 8
-gseparator_color = frame
-gseparator_height = 0
-gshow_age_threshold = -1
-gshow_indicators = no
-gshrink = no
-gsort = yes
-gstartup_notification = false
-gsticky_history = yes
-gtransparency = 0
-gword_wrap = yes
-
-[frame]
-gwidth = 1
-gcolor = "#333333"
-
-[urgency_low]
-gbackground = "#222222"
-gforeground = "#bbbbbb"
-gtimeout = 10
-
-[urgency_normal]
-gbackground = "#285577"
-gforeground = "#ffffff"
-gtimeout = 10
-
-[urgency_critical]
-gbackground = "#900000"
-gforeground = "#ffffff"
-gtimeout = 0
diff --git a/finger/pgpkey b/finger/pgpkey
index 330dba69..f9569c8f 100644
--- a/finger/pgpkey
+++ b/finger/pgpkey
@@ -1,4 +1,4 @@
-pub rsa4096 2013-03-12 [SC] [expires: 2020-10-06]
+pub rsa4096 2013-03-12 [SC] [expires: 2024-06-16]
FA09 C06E 1B67 0CD0 B2F5 DE60 C142 86EA 77BB 8872
uid [ultimate] Thomas Ryder (tyrmored, tejr) <tom@sanctum.geek.nz>
uid [ultimate] Thomas Ryder <tejr@echo-n.nz>
@@ -6,6 +6,6 @@ uid [ultimate] Thomas Ryder <secretary@plug.org.nz>
uid [ultimate] Thomas Ryder (TEJR) <tejr@cpan.org>
uid [ultimate] Thomas Ryder <tyrmored@inspire.net.nz>
uid [ultimate] Thomas Ryder <tej.ryder@gmail.com>
-sub rsa4096 2013-03-12 [E] [expires: 2020-10-06]
-sub rsa4096 2013-03-12 [S] [expires: 2020-10-06]
-sub rsa4096 2019-08-06 [A] [expires: 2020-10-06]
+sub rsa4096 2013-03-12 [E] [expires: 2024-06-16]
+sub rsa4096 2013-03-12 [S] [expires: 2024-06-16]
+sub rsa4096 2019-08-06 [A] [expires: 2024-06-16]
diff --git a/finger/plan b/finger/plan
index b4562cd8..ec8a1d3d 100644
--- a/finger/plan
+++ b/finger/plan
@@ -1,3 +1,3 @@
> I am his Highness' dog at Kew.
> Pray tell me, Sir: whose dog are you?
- -- Pope
+ ---Pope
diff --git a/git/config.mi5 b/git/config.mi5
index 304be811..efdbc277 100644
--- a/git/config.mi5
+++ b/git/config.mi5
@@ -4,15 +4,15 @@
[diff]
algorithm = patience
-[fetch]
- output = compact
+[format]
+ pretty = fuller
[init]
- templateDir = <% XDG_CONFIG_HOME %>/git/template
+ defaultBranch = master
+ templateDir = <% XDG_DATA_HOME %>/git/template
[log]
date = local
- decorate = short
[merge]
ff = false
@@ -30,6 +30,9 @@
[status]
short = true
+[tag]
+ sort = -taggerdate
+
[user]
name = <% NAME %>
email = <% EMAIL %>
diff --git a/gtk/gtk-3.0/settings.ini b/gtk/gtk-3.0/settings.ini
deleted file mode 100644
index 4f93dfe4..00000000
--- a/gtk/gtk-3.0/settings.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[Settings]
-gtk-theme-name = Clearlooks-Phenix
diff --git a/gtk/gtkrc-2.0 b/gtk/gtkrc-2.0
deleted file mode 100644
index 99fb22e2..00000000
--- a/gtk/gtkrc-2.0
+++ /dev/null
@@ -1 +0,0 @@
-gtk-theme-name = "Clearlooks-Phenix"
diff --git a/i3/config b/i3/config
index 0840f1c8..1e641b9f 100644
--- a/i3/config
+++ b/i3/config
@@ -4,8 +4,8 @@ set $mod Mod4
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
-# No title bar
-new_window 1pixel
+# Use a nice Unicode-aware condensed font
+font pango:Noto Sans 10
# Mod+Shift+r restarts i3wm
bindsym $mod+Shift+r restart
@@ -50,22 +50,22 @@ bindsym $mod+a focus parent
bindsym $mod+z focus child
# Mod+<n> switches to a workspace
-bindsym $mod+1 workspace 1:main
-bindsym $mod+2 workspace 2:home
-bindsym $mod+3 workspace 3:work
-bindsym $mod+4 workspace 4:soc
-bindsym $mod+5 workspace 5:tor
+bindsym $mod+1 workspace 1
+bindsym $mod+2 workspace 2
+bindsym $mod+3 workspace 3
+bindsym $mod+4 workspace 4
+bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
# Mod+Shift+<n> moves a container to a workspace
-bindsym $mod+Shift+1 move container to workspace 1:main
-bindsym $mod+Shift+2 move container to workspace 2:home
-bindsym $mod+Shift+3 move container to workspace 3:work
-bindsym $mod+Shift+4 move container to workspace 4:soc
-bindsym $mod+Shift+5 move container to workspace 5:tor
+bindsym $mod+Shift+1 move container to workspace 1
+bindsym $mod+Shift+2 move container to workspace 2
+bindsym $mod+Shift+3 move container to workspace 3
+bindsym $mod+Shift+4 move container to workspace 4
+bindsym $mod+Shift+5 move container to workspace 5
bindsym $mod+Shift+6 move container to workspace 6
bindsym $mod+Shift+7 move container to workspace 7
bindsym $mod+Shift+8 move container to workspace 8
@@ -84,17 +84,10 @@ mode "resize" {
# i3bar at bottom of screen
bar {
- position bottom
- status_command i3status --config ~/.config/i3/status
- workspace_buttons yes
-
+ separator_symbol "—"
+ status_command i3status
+ tray_padding 0
colors {
background #111111
- statusline #eeeeee
-
- focused_workspace #ffffff #285577
- active_workspace #ffffff #333333
- inactive_workspace #888888 #222222
- urgent_workspace #ffffff #900000
}
}
diff --git a/i3/status b/i3/status
index 9c9b60d6..534b1f8f 100644
--- a/i3/status
+++ b/i3/status
@@ -2,7 +2,6 @@
order += "load"
order += "tztime local"
-order += "battery 0"
load {
format = "%1min/%5min/%15min"
@@ -10,8 +9,3 @@ load {
tztime local {
format = "%Y-%m-%d %H:%M:%S"
}
-battery 0 {
- format = "%status %percentage %remaining %emptytime"
- path = "/sys/class/power_supply/BAT%d/uevent"
- low_threshold = 15
-}
diff --git a/keychain/profile.d/keychain.sh b/keychain/profile.d/keychain.sh
deleted file mode 100644
index 63eb613a..00000000
--- a/keychain/profile.d/keychain.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-# keychain setup
-command -v keychain >/dev/null 2>&1 || return
-eval "$(TERM=${TERM:-ansi} keychain \
- --eval --ignore-missing --quick --quiet \
- id_dsa id_rsa id_ecdsa id_ed25519)"
diff --git a/keychain/shrc.d/keychain.sh b/keychain/shrc.d/keychain.sh
deleted file mode 100644
index 1c0e780e..00000000
--- a/keychain/shrc.d/keychain.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Update GPG_TTY for clean use of pinentry(1) etc
-GPG_TTY=$(command -p tty) || return
-export GPG_TTY
diff --git a/ksh/kshrc.d/keep.ksh b/ksh/kshrc.d/keep.ksh
index f61a7a4d..861e1b2b 100644
--- a/ksh/kshrc.d/keep.ksh
+++ b/ksh/kshrc.d/keep.ksh
@@ -100,8 +100,8 @@ EOF
case $name in
# NAME must start with letters or an underscore, and contain no
- # characters besides letters, numbers, or underscores
- *[!a-zA-Z0-9_]*|[!a-zA-Z_]*)
+ # characters besides letters, numbers, underscores, or dashes
+ [!a-zA-Z_]*|*[!a-zA-Z0-9_-]*)
printf 'ksh: %s: %s not a valid NAME\n' \
"$self" "$name" >&2
((errors++))
diff --git a/ksh/kshrc.d/prompt.ksh b/ksh/kshrc.d/prompt.ksh
index 64e22e8e..99d999de 100644
--- a/ksh/kshrc.d/prompt.ksh
+++ b/ksh/kshrc.d/prompt.ksh
@@ -12,16 +12,12 @@ function prompt {
# Turn complex, colored PS1 and debugging PS4 prompts on
on)
- # Basic prompt shape depends on whether we're in SSH or not
+ # Prompt has hostname via SSH outside of screen/tmux
PS1=
- if [[ -n $SSH_CLIENT || -n $SSH_CONNECTION ]] ; then
+ if [[ -n $SSH_CLIENT && -z $STY && -z $TMUX ]] ; then
PS1=$PS1'${HOSTNAME%%.*}:'
fi
- # Add sub-commands; working directory with ~ abbreviation, VCS, job
- # count, and previous command return value
- PS1=$PS1'$(ret=$?;jobc=$(jobs -p|sed -n '\''$='\'');prompt pwd;prompt vcs;prompt job;prompt ret;:)'
-
# Add a helpful prefix if this shell appears to be exotic
typeset ksh
case $KSH_VERSION in
@@ -34,6 +30,10 @@ function prompt {
(*) PS1=$ksh:$PS1 ;;
esac
+ # Add sub-commands:
+ ## VCS, job, and return status checks as suffixes
+ PS1=$PS1'$(ret=$?;jobc=$(jobs -p|sed -n '\''$='\'');prompt pwd;prompt vcs;prompt job;prompt ret;:)'
+
# Add prefix and suffix
PS1='${PROMPT_PREFIX}'$PS1'${PROMPT_SUFFIX}'
diff --git a/ksh/shrc.d/ksh.sh b/ksh/shrc.d/ksh.sh
index 9e032756..f074c832 100644
--- a/ksh/shrc.d/ksh.sh
+++ b/ksh/shrc.d/ksh.sh
@@ -21,10 +21,11 @@ if [ -z "$KSH_VERSION" ] ; then
# Test whether we have content in the .sh.version variable. Suppress
# errors and run it in a subshell to work around parsing error precedence.
- # shellcheck disable=SC2234
+ # shellcheck disable=SC2234,SC2296
( test -n "${.sh.version}" ) 2>/dev/null || return
# If that peculiarly named variable was set, then that's our KSH_VERSION
+ # shellcheck disable=SC2296
KSH_VERSION=${.sh.version}
fi
diff --git a/lint/bash.sh b/lint/bash.sh
index 13754a3f..2b6342ae 100644
--- a/lint/bash.sh
+++ b/lint/bash.sh
@@ -5,4 +5,4 @@ set \
bash/bash_profile \
bash/bashrc \
bash/bashrc.d/*.bash
-shellcheck -e SC1090 -s bash -- "$@" || exit
+shellcheck -e SC1090 -e SC1091 -s bash -- "$@" || exit
diff --git a/lint/bin.sh b/lint/bin.sh
index a98c6a73..f80f44d2 100644
--- a/lint/bin.sh
+++ b/lint/bin.sh
@@ -3,7 +3,7 @@ set --
for bin in bin/*.sh ; do
set -- "$@" "${bin%.sh}"
done
-shellcheck -e SC1090 -- "$@" || exit
+shellcheck -e SC1090 -e SC1091 -- "$@" || exit
# GNU Bash
if command -v bash >/dev/null 2>&1 ; then
@@ -11,5 +11,5 @@ if command -v bash >/dev/null 2>&1 ; then
for bin in bin/*.bash ; do
set -- "$@" "${bin%.bash}"
done
- shellcheck -e SC1090 -- "$@" || exit
+ shellcheck -e SC1090 -e SC1091 -- "$@" || exit
fi
diff --git a/lint/games.sh b/lint/games.sh
index e9690d8d..aa680035 100644
--- a/lint/games.sh
+++ b/lint/games.sh
@@ -3,4 +3,4 @@ set --
for game in games/*.sh ; do
set -- "$@" "${game%.sh}"
done
-shellcheck -e SC1090 -- "$@" || exit
+shellcheck -e SC1090 -e SC1091 -- "$@" || exit
diff --git a/lint/git-template-hooks.sh b/lint/git-template-hooks.sh
index 74f20fc6..a0f7ef1a 100644
--- a/lint/git-template-hooks.sh
+++ b/lint/git-template-hooks.sh
@@ -2,4 +2,4 @@ set --
for bin in git/template/hooks/*.sh ; do
set -- "$@" "${bin%.sh}"
done
-shellcheck -e SC1090 -- "$@" || exit
+shellcheck -e SC1090 -e SC1091 -- "$@" || exit
diff --git a/lint/ksh.sh b/lint/ksh.sh
index 117909b3..164c4672 100644
--- a/lint/ksh.sh
+++ b/lint/ksh.sh
@@ -1,5 +1,5 @@
set \
ksh/kshrc \
ksh/kshrc.d/*.ksh
-shellcheck -e SC1090 -s ksh -- "$@" || exit
-shellcheck -e SC1090 -s sh -- ksh/shrc.d/ksh.sh || exit
+shellcheck -e SC1090 -e SC1091 -s ksh -- "$@" || exit
+shellcheck -e SC1090 -e SC1091 -s sh -- ksh/shrc.d/ksh.sh || exit
diff --git a/lint/sh.sh b/lint/sh.sh
index 5884a1ed..e15b5504 100644
--- a/lint/sh.sh
+++ b/lint/sh.sh
@@ -4,4 +4,4 @@ set \
sh/shrc \
*/profile.d/*.sh \
*/shrc.d/*.sh
-shellcheck -e SC1090 -s sh -- "$@" || exit
+shellcheck -e SC1090 -e SC1091 -s sh -- "$@" || exit
diff --git a/lint/urxvt.sh b/lint/urxvt.sh
deleted file mode 100644
index 6e5fb503..00000000
--- a/lint/urxvt.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-set --
-for pl in urxvt/ext/*.pl ; do
- set -- "$@" "${pl%.pl}"
-done
-perlcritic --brutal -- "${pl%.pl}"
diff --git a/lint/x.sh b/lint/x.sh
new file mode 100644
index 00000000..0625369b
--- /dev/null
+++ b/lint/x.sh
@@ -0,0 +1 @@
+shellcheck -e SC1090 -e SC1091 -s sh -- x/xsessionrc x/shrc.d/*.sh
diff --git a/lint/xinit.sh b/lint/xinit.sh
deleted file mode 100644
index 0fab84d2..00000000
--- a/lint/xinit.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-set \
- X/xinitrc \
- X/xinitrc.d/*.sh
-shellcheck -e SC1090 -s sh -- "$@"
diff --git a/lint/xsession.sh b/lint/xsession.sh
new file mode 100644
index 00000000..5544e1be
--- /dev/null
+++ b/lint/xsession.sh
@@ -0,0 +1 @@
+shellcheck -e SC1090 -e SC1091 -s sh -- x/xsession
diff --git a/logrotate/config b/logrotate/config
new file mode 100644
index 00000000..5a703a46
--- /dev/null
+++ b/logrotate/config
@@ -0,0 +1,5 @@
+compress
+create 0600
+delaycompress
+
+include ~/.config/logrotate/config.d
diff --git a/logrotate/systemd/user/logrotate.service b/logrotate/systemd/user/logrotate.service
new file mode 100644
index 00000000..0193d5be
--- /dev/null
+++ b/logrotate/systemd/user/logrotate.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=user log rotation
+
+[Service]
+Type=oneshot
+ConfigurationDirectory=%p %p/config.d
+StateDirectory=%p
+ExecStartPre=/bin/mkdir -pv -- %h/.local/state/%p
+ExecStart=/usr/sbin/logrotate --state=%h/.local/state/%p/status -- %E/%p/config
+TimeoutStartSec=20m
diff --git a/logrotate/systemd/user/logrotate.timer b/logrotate/systemd/user/logrotate.timer
new file mode 100644
index 00000000..077aeac9
--- /dev/null
+++ b/logrotate/systemd/user/logrotate.timer
@@ -0,0 +1,10 @@
+[Unit]
+Description=user log rotation schedule
+
+[Timer]
+OnBootSec=1h
+OnUnitActiveSec=6h
+RandomizedDelaySec=5m
+
+[Install]
+WantedBy=timers.target
diff --git a/man/man1/bp.1df b/man/man1/bp.1df
index 93f08f74..835ffaf6 100644
--- a/man/man1/bp.1df
+++ b/man/man1/bp.1df
@@ -5,7 +5,7 @@
.SH SYNOPSIS
.B bp
.br
-BROWSER=firefox
+BROWSER=librewolf
.B bp
.SH DESCRIPTION
.B bp
diff --git a/man/man1/br.1df b/man/man1/br.1df
index a84a55d3..1690af5c 100644
--- a/man/man1/br.1df
+++ b/man/man1/br.1df
@@ -8,7 +8,7 @@
.B br
http://www.example.com/
.br
-BROWSER=firefox
+BROWSER=librewolf
.B br
.SH DESCRIPTION
.B br
diff --git a/man/man1/dmp.1df b/man/man1/dmp.1df
deleted file mode 100644
index d663e3d0..00000000
--- a/man/man1/dmp.1df
+++ /dev/null
@@ -1,17 +0,0 @@
-.TH DMP 1df "August 2016" "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 a period of time.
-.P
-If notify-send(1) is installed, a notification with the default priority will
-be written when the password is successfully clipped.
-.SH SEE ALSO
-dmenu(1), notify-send(1), pass(1), xsel(1)
-.SH AUTHOR
-Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man1/sls.1df b/man/man1/sls.1df
index 83c13201..dde8e622 100644
--- a/man/man1/sls.1df
+++ b/man/man1/sls.1df
@@ -1,4 +1,4 @@
-.TH SLS 1df "May 2014" "Manual page for sls"
+.TH SLS 1df "August 2022" "Manual page for sls"
.SH NAME
.B sls
\- list the first hostname on each line of an ssh_config(5) file
@@ -10,9 +10,9 @@ ssh_config_alt1 ssh_config_alt2
.SH DESCRIPTION
.B sls
runs slsf(1df) on the given set of ssh_config(5) files to print the first
-non-wildcard hostname on each "Host" line, defaulting to /etc/ssh/ssh_config
-and ~/.ssh/config if they exist. Suitable for use in batch scripts like
-sra(1df).
+non-wildcard hostname on each "Host" line, defaulting to
+/etc/ssh/ssh_config.d/*.conf, /etc/ssh/ssh_config, ~/.ssh/config.d/*.conf, and
+~/.ssh/config if they exist. Suitable for use in batch scripts like sra(1df).
.SH SEE ALSO
slsf(1df), sra(1df), sta(1df), ssh(1), ssh_config(5)
.SH AUTHOR
diff --git a/man/man1/slsf.1df b/man/man1/slsf.1df
index 31453dca..6d59ba3d 100644
--- a/man/man1/slsf.1df
+++ b/man/man1/slsf.1df
@@ -1,4 +1,4 @@
-.TH SLSF 1df "July 2016" "Manual page for slsf"
+.TH SLSF 1df "August 2022" "Manual page for slsf"
.SH NAME
.B slsf
\- list the first hostname on each line of ssh_config(5) files
@@ -10,9 +10,9 @@ cat ~/.ssh_config |
.br
.SH DESCRIPTION
.B slsf
-iterates through the ssh_config(5) files given as its input and prints the
-first name given on each "Host" line, as long as it contains no wildcards.
-Most users will probably want the sls(1df) frontend.
+iterates through the ssh_config(5) files given as its input and prints a unique
+list of the patterns given on each "Host" line containing no wildcards. Most
+users will probably want the sls(1df) frontend instead.
.P
Within the file, a comment "### nosls" on its own line will exclude all
following output unless an "### sls" comment is read to resume it again:
diff --git a/man/man1/xrbg.1df b/man/man1/xrbg.1df
index 14bfbc7d..9c067ff9 100644
--- a/man/man1/xrbg.1df
+++ b/man/man1/xrbg.1df
@@ -11,8 +11,8 @@ XBACKGROUNDS=/path/to/images
.B xrbg
searches for images in the directory named in the XBACKGROUNDS environment
variable (defaults to ~/.xbackgrounds), chooses a random one with rndf(1df),
-and applies it with feh(1). It's designed for use in ~/.xinitrc, but it seems
-to work when called manually from within an X session too.
+and applies it with feh(1). It's designed for use in X startup files, but it
+seems to work when called manually from within an X session too.
.SH SEE ALSO
feh(1), rndf(1df)
.SH AUTHOR
diff --git a/man/man1/xrq.1df b/man/man1/xrq.1df
index 9dd7f0d1..184aa186 100644
--- a/man/man1/xrq.1df
+++ b/man/man1/xrq.1df
@@ -1,4 +1,4 @@
-.TH XRQ 1df "January 2017" "Manual page for xrq"
+.TH XRQ 1df "February 2023" "Manual page for xrq"
.SH NAME
.B xrq
\- query X resource values
@@ -7,7 +7,7 @@
Xft.hintstyle
.br
.B xrq
-URxvt.color0 URxvt.color9
+XTerm.vt100.color0 XTerm.vt100.color9
.SH DESCRIPTION
.B xrq
runs xrdb(1) with the -query option and filters for the values of the named
diff --git a/man/man1/xsnap.1df b/man/man1/xsnap.1df
new file mode 100644
index 00000000..276e27b3
--- /dev/null
+++ b/man/man1/xsnap.1df
@@ -0,0 +1,16 @@
+.TH XSNAP 1df "May 2022" "Manual page for xsnap"
+.SH NAME
+.B xsnap
+\- wrapper around scrot(1) for serialized recorded screenshots
+.SH SYNOPSIS
+.B xsnap
+.br
+.B xsnap
+\--select
+.SH DESCRIPTION
+.B xsnap
+takes a PNG screenshot with scrot(1), passing any options thereto, saving the
+image into a date-stamped path ~/.local/share/scrot/screenshots/YYYY-MM-DD,
+with increasing integer filenames for that day.
+.SH AUTHOR
+Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man6/pks.6df b/man/man6/pks.6df
index 8de04491..b0f15d24 100644
--- a/man/man6/pks.6df
+++ b/man/man6/pks.6df
@@ -1,4 +1,4 @@
-.TH PKS 6df "July 2017" "Manual page for pks"
+.TH PKS 6df "March 2021" "Manual page for pks"
.SH NAME
.B pks
\- select and laugh at a random word from a system dictionary or fileset
@@ -24,6 +24,6 @@ A hyphen character "-" can be given as an argument to select standard input.
.SH SEE ALSO
philsay(6df)
.br
-<https://www.youtube.com/watch?v=F8ID1KJQxB8>
+<https://www.youtube.com/watch?v=FKmHtw0vDrs>
.SH AUTHOR
Tom Ryder <tom@sanctum.geek.nz>
diff --git a/man/man7/dotfiles.7df b/man/man7/dotfiles.7df
index 899cacb1..83616552 100644
--- a/man/man7/dotfiles.7df
+++ b/man/man7/dotfiles.7df
@@ -1,12 +1,26 @@
-.\" Automatically generated by Pandoc 2.2.1
+.\" Automatically generated by Pandoc 2.17.1.1
.\"
-.TH "DOTFILES" "7" "October 2017" "Tom Ryder's personal scripts and configuration" ""
+.\" Define V font for inline verbatim, using C font in formats
+.\" that render this, and otherwise B font.
+.ie "\f[CB]x\f[]"x" \{\
+. ftr V B
+. ftr VI BI
+. ftr VB B
+. ftr VBI BI
+.\}
+.el \{\
+. ftr V CR
+. ftr VI CI
+. ftr VB CB
+. ftr VBI CBI
+.\}
+.TH "DOTFILES" "7" "October 2017" "Tom Ryder\[cq]s personal scripts and configuration" ""
.hy
.SH Dotfiles (Tom Ryder)
.PP
This is my personal repository of configuration files and scripts for
-\f[C]$HOME\f[], including most of the settings that migrate well between
-machines.
+\f[V]$HOME\f[R], including most of the settings that migrate well
+between machines.
.PP
This repository began as a simple way to share Vim and tmux
configuration, but a lot of scripts and shell configuration have been
@@ -15,111 +29,109 @@ added over time, making it into a personal suite of custom Unix tools.
.IP
.nf
\f[C]
-$\ mkdir\ \-p\ ~/.local/share
-$\ git\ clone\ https://sanctum.geek.nz/code/dotfiles.git\ ~/.local/share/dotfiles
-$\ cd\ ~/.local/share/dotfiles
-$\ git\ submodule\ init
-$\ git\ submodule\ update
-$\ make
-$\ make\ \-n\ install\ \ #\ Check\ output\ carefully
-$\ make\ install
-\f[]
+$ mkdir -p \[ti]/.local/src
+$ git clone https://dev.sanctum.geek.nz/code/dotfiles.git \[ti]/.local/src/dotfiles
+$ cd \[ti]/.local/src/dotfiles
+$ git submodule init
+$ git submodule update
+$ make
+$ make -n install # Check output carefully
+$ make install
+\f[R]
.fi
.PP
-For the default \f[C]all\f[] target, you'll need a POSIX\-fearing
-userland, including \f[C]make(1)\f[] and \f[C]m4(1)\f[].
+For the default \f[V]all\f[R] target, you\[cq]ll need a POSIX-fearing
+userland, including \f[V]make(1)\f[R] and \f[V]m4(1)\f[R].
.PP
-The installation \f[C]Makefile\f[] overwrites things standing in the way
-of its installed files without backing them up, so read the output of
-\f[C]make\ \-n\ install\f[] before running \f[C]make\ install\f[]
-carefully, to make sure you aren't going to lose anything unexpected.
-If you're still not sure, install it in a temporary directory first, so
-you can explore:
+The installation \f[V]Makefile\f[R] overwrites things standing in the
+way of its installed files without backing them up, so read the output
+of \f[V]make -n install\f[R] before running \f[V]make install\f[R]
+carefully, to make sure you aren\[cq]t going to lose anything
+unexpected.
+If you\[cq]re still not sure, install it in a temporary directory first,
+so you can explore:
.IP
.nf
\f[C]
-$\ tmpdir=$(mktemp\ \-d)
-$\ make\ install\ HOME="$tmpdir"
-$\ env\ \-i\ HOME="$tmpdir"\ TERM="$TERM"\ "$SHELL"\ \-l
-\f[]
+$ tmpdir=$(mktemp -d)
+$ make install HOME=\[dq]$tmpdir\[dq]
+$ env -i HOME=\[dq]$tmpdir\[dq] TERM=\[dq]$TERM\[dq] \[dq]$SHELL\[dq] -l
+\f[R]
.fi
.PP
-The default \f[C]install\f[] target will install these targets and all
+The default \f[V]install\f[R] target will install these targets and all
their dependencies:
.IP \[bu] 2
-\f[C]install\-bin\f[]
+\f[V]install-bin\f[R]
.IP \[bu] 2
-\f[C]install\-curl\f[]
+\f[V]install-curl\f[R]
.IP \[bu] 2
-\f[C]install\-ex\f[]
+\f[V]install-ex\f[R]
.IP \[bu] 2
-\f[C]install\-git\f[]
+\f[V]install-git\f[R]
.IP \[bu] 2
-\f[C]install\-gnupg\f[]
+\f[V]install-gnupg\f[R]
.IP \[bu] 2
-\f[C]install\-less\f[]
+\f[V]install-less\f[R]
.IP \[bu] 2
-\f[C]install\-login\-shell\f[]
+\f[V]install-login-shell\f[R]
.IP \[bu] 2
-\f[C]install\-man\f[]
+\f[V]install-man\f[R]
.IP \[bu] 2
-\f[C]install\-readline\f[]
+\f[V]install-readline\f[R]
.IP \[bu] 2
-\f[C]install\-vim\f[]
+\f[V]install-vim\f[R]
.PP
-The \f[C]install\-login\-shell\f[] target looks at your \f[C]SHELL\f[]
-environment variable, and tries to figure out which shell's
-configuration files to install, falling back on \f[C]install\-sh\f[].
+The \f[V]install-login-shell\f[R] target looks at your \f[V]SHELL\f[R]
+environment variable, and tries to figure out which shell\[cq]s
+configuration files to install, falling back on \f[V]install-sh\f[R].
.PP
-The remaining files can be installed with the other \f[C]install\-*\f[]
+The remaining files can be installed with the other \f[V]install-*\f[R]
targets.
-Try \f[C]awk\ \-f\ bin/mftl.awk\ Makefile\f[] in the project's root
+Try \f[V]awk -f bin/mftl.awk Makefile\f[R] in the project\[cq]s root
directory to see a list.
.SS Configuration
.PP
-To keep a set of \f[C]make\f[] targets useful for a specific user or
-host, you can list them in a newline\-separated file
-\f[C]~/.config/dotfiles/config\f[], and install using that with the
-special \f[C]install\-conf\f[] target.
-This can include macro settings for the \f[C]Makefile\f[], too:
+To keep a set of \f[V]make\f[R] targets useful for a specific user or
+host, you can list them in a newline-separated file
+\f[V]\[ti]/.config/dotfiles/config\f[R], and install using that with the
+special \f[V]install-conf\f[R] target.
+This can include macro settings for the \f[V]Makefile\f[R], too:
.IP
.nf
\f[C]
-$\ cd
-$\ cat\ .config/dotfiles/config
-install\-bash
-install\-bin
-EMAIL=you\@example.com
-$\ make\ \-C\ .local/share/dotfiles\ install\-conf
-\f[]
+$ cd
+$ cat .config/dotfiles/config
+install-bash
+install-bin
+EMAIL=you\[at]example.com
+$ make -C .local/src/dotfiles install-conf
+\f[R]
.fi
.SS Tools
.PP
Configuration is included for:
.IP \[bu] 2
-Bourne\-style POSIX shells, sharing a \f[C]\&.profile\f[], an
-\f[C]ENV\f[] file, and some helper functions:
+Bourne-style POSIX shells, sharing a \f[V].profile\f[R], an
+\f[V]ENV\f[R] file, and some helper functions:
.RS 2
.IP \[bu] 2
GNU Bash (https://www.gnu.org/software/bash/) (v3.0 or newer)
.IP \[bu] 2
-Korn shell (http://www.kornshell.com/) (\f[C]ksh93\f[], \f[C]pdksh\f[],
-\f[C]mksh\f[])
+Korn shell (http://www.kornshell.com/) (\f[V]ksh93\f[R],
+\f[V]pdksh\f[R], \f[V]mksh\f[R])
.IP \[bu] 2
Z shell (https://www.zsh.org/)
.RE
.IP \[bu] 2
Abook (http://abook.sourceforge.net/)\[em]curses address book program
.IP \[bu] 2
-cURL (https://curl.haxx.se/)\[em]Command\-line tool for transferring
-data with URL syntax
+cURL (https://curl.haxx.se/)\[em]Command-line tool for transferring data
+with URL syntax
.IP \[bu] 2
Dillo (https://www.dillo.org/)\[em]A lightweight web browser
.IP \[bu] 2
-Dunst (https://dunst-project.org/)\[em]A lightweight X11 notification
-daemon that works with \f[C]libnotify\f[]
-.IP \[bu] 2
-\f[C]finger(1)\f[]\[em]User information lookup program
+\f[V]finger(1)\f[R]\[em]User information lookup program
.IP \[bu] 2
Git (https://git-scm.com/)\[em]Distributed version control system
.IP \[bu] 2
@@ -129,9 +141,6 @@ editor
GnuPG (https://www.gnupg.org/)\[em]GNU Privacy Guard, for private
communication and file encryption
.IP \[bu] 2
-GTK+ (https://www.gtk.org/)\[em]GIMP Toolkit, for graphical user
-interface elements
-.IP \[bu] 2
i3 (https://i3wm.org/)\[em]Tiling window manager
.IP \[bu] 2
less (https://www.gnu.org/software/less/)\[em]Terminal pager
@@ -140,16 +149,20 @@ mpv (https://mpv.io/)\[em]Media player
.IP \[bu] 2
Mutt (http://www.mutt.org/)\[em]Terminal mail user agent
.IP \[bu] 2
-\f[C]mysql(1)\f[] (https://linux.die.net/man/1/mysql)\[em]Command\-line
+\f[V]mysql(1)\f[R] (https://linux.die.net/man/1/mysql)\[em]Command-line
MySQL client
.IP \[bu] 2
-Ncmpcpp (https://rybczak.net/ncmpcpp/)\[em]ncurses music player client
+ncmpcpp (https://rybczak.net/ncmpcpp/)\[em]ncurses based MPD client
+inspired by ncmpc
.IP \[bu] 2
Newsboat (https://newsboat.org/)\[em]Terminal RSS/Atom feed reader
.IP \[bu] 2
-\f[C]psql(1)\f[] (https://linux.die.net/man/1/psql)\[em]Command\-line
+\f[V]psql(1)\f[R] (https://linux.die.net/man/1/psql)\[em]Command-line
PostgreSQL client
.IP \[bu] 2
+Parcellite (http://parcellite.sourceforge.net/)\[em]clipboard manager
+for X
+.IP \[bu] 2
Perl::Critic (http://perlcritic.com/)\[em]static source code analysis
engine for Perl
.IP \[bu] 2
@@ -159,9 +172,6 @@ code
Readline (https://tiswww.case.edu/php/chet/readline/rltop.html)\[em]GNU
library for user input used by Bash, MySQL, and others
.IP \[bu] 2
-rxvt\-unicode (http://software.schmorp.de/pkg/rxvt-unicode.html)\[em]Fork
-of the rxvt terminal emulator with Unicode support
-.IP \[bu] 2
Subversion (https://subversion.apache.org/)\[em]Apache Subversion, a
version control system
.IP \[bu] 2
@@ -175,7 +185,7 @@ Vim (https://www.vim.org/)\[em]Vi IMproved, a text editor
X11 (https://www.x.org/wiki/)\[em]Windowing system with network
transparency for Unix
.PP
-There is also some slightly customized support for multi\-version
+There is also some slightly customized support for multi-version
environment management for three major scripting languages:
.IP \[bu] 2
plenv (https://github.com/tokuhirom/plenv)\[em]Perl
@@ -187,28 +197,27 @@ rbenv (https://github.com/rbenv/rbenv)\[em]Ruby
The configurations for shells, Mutt, tmux, and Vim are the most likely
to be of interest.
The i3 configuration is limited mainly to changing window switching key
-bindings to match Vim's.
-There are a fair few resources defined for rxvt\-unicode.
+bindings to match Vim\[cq]s.
.SS Shell
.PP
On GNU/Linux, I use Bash; on *BSD, I use some variant of Korn Shell,
-preferably \f[C]ksh93\f[] if it's available.
+preferably \f[V]ksh93\f[R] if it\[cq]s available.
.SS POSIX core
.PP
-My \f[C]~/.profile\f[] and other files in \f[C]sh\f[] are written in
-POSIX shell script, so they \f[I]should\f[] work in most
-POSIX\-conforming \f[C]sh(1)\f[] implementations.
-Please email me if you find a case where they don't!
+My \f[V]\[ti]/.profile\f[R] and other files in \f[V]sh\f[R] are written
+in POSIX shell script, so they \f[I]should\f[R] work in most
+POSIX-conforming \f[V]sh(1)\f[R] implementations.
+Please email me if you find a case where they don\[cq]t!
.PP
Further shell snippets to run on login are sourced from
-\f[C]~/.profile.d\f[] by \f[C]~/.profile\f[].
+\f[V]\[ti]/.profile.d\f[R] by \f[V]\[ti]/.profile\f[R].
Most of these boil down to exporting variables appropriate to the system
and the software it has available.
.PP
Configuration that should be sourced for all conforming
-\f[I]interactive\f[] shells is kept in \f[C]~/.shrc\f[], with subscripts
-read from \f[C]~/.shrc.d\f[].
-There's a \f[C]~/.shinit\f[] shim to act as \f[C]ENV\f[].
+\f[I]interactive\f[R] shells is kept in \f[V]\[ti]/.shrc\f[R], with
+subscripts read from \f[V]\[ti]/.shrc.d\f[R].
+There\[cq]s a \f[V]\[ti]/.shinit\f[R] shim to act as \f[V]ENV\f[R].
.SS GNU Bash
.PP
My Bash scripts are written to work with GNU Bash v3.0 or
@@ -218,45 +227,45 @@ items to arrays:
.IP
.nf
\f[C]
-array[${#array[\@]}]=$item
-\f[]
+array[${#array[\[at]]}]=$item
+\f[R]
.fi
.PP
-This doesn't work for arrays with sparse indices; compare this to the
-much nicer syntax available since 3.1\-alpha1, which does:
+This doesn\[cq]t work for arrays with sparse indices; compare this to
+the much nicer syntax available since 3.1-alpha1, which does:
.IP
.nf
\f[C]
-array+=("$item")
-\f[]
+array+=(\[dq]$item\[dq])
+\f[R]
.fi
.PP
I do use some features that are only available in versions after v3.0,
-such as newer \f[C]shopt\f[] options like \f[C]dirspell\f[], or
-variables like \f[C]PROMPT_DIRTRIM\f[].
-These are set only after testing \f[C]BASH_VERSINFO\f[] appropriately.
+such as newer \f[V]shopt\f[R] options like \f[V]dirspell\f[R], or
+variables like \f[V]PROMPT_DIRTRIM\f[R].
+These are set only after testing \f[V]BASH_VERSINFO\f[R] appropriately.
.SS Prompt
.PP
A terminal session with my prompt looks something like this:
.IP
.nf
\f[C]
-~$\ ssh\ remote
-remote:~$\ cd\ .local/share/dotfiles
-remote:~/.local/share/dotfiles(master+!)$\ git\ status
-\ M\ README.md
-M\ \ bash/bashrc.d/prompt.bash
-A\ \ init
-remote:~/.local/share/dotfiles(master+!)$\ foobar
-foobar:\ command\ not\ found
-remote:~/.local/share/dotfiles(master+!)<127>$\ sleep\ 5\ &
-[1]\ 28937
-remote:~/.local/share/dotfiles(master+!){1}$
-\f[]
+\[ti]$ ssh remote
+remote:\[ti]$ cd .local/src/dotfiles
+remote:\[ti]/.local/src/dotfiles(master+!)$ git status
+ M README.md
+M bash/bashrc.d/prompt.bash
+A init
+remote:\[ti]/.local/src/dotfiles(master+!)$ foobar
+foobar: command not found
+remote:\[ti]/.local/src/dotfiles(master+!)<127>$ sleep 5 &
+[1] 28937
+remote:\[ti]/.local/src/dotfiles(master+!){1}$
+\f[R]
.fi
.PP
The hostname is elided if not connected via SSH.
-The working directory with tilde abbreviation for \f[C]$HOME\f[] is
+The working directory with tilde abbreviation for \f[V]$HOME\f[R] is
always shown.
The rest of the prompt expands based on context to include these
elements, in this order:
@@ -266,191 +275,192 @@ Whether in a Git repository if applicable,
The current version control branch, tag, or commit/revision if
applicable, and punctuation to show repository status including
reference to upstreams at a glance.
-Subversion support can also be enabled, in which case a \f[C]git:\f[] or
-\f[C]svn:\f[] prefix is added appropriately for disambiguation.
+Subversion support can also be enabled, in which case a \f[V]git:\f[R]
+or \f[V]svn:\f[R] prefix is added appropriately for disambiguation.
.IP \[bu] 2
-The number of running background jobs, if non\-zero.
+The number of running background jobs, if non-zero.
.IP \[bu] 2
-The exit status of the last command, if non\-zero.
+The exit status of the last command, if non-zero.
.PP
-You can set \f[C]PROMPT_COLOR\f[], \f[C]PROMPT_PREFIX\f[], and
-\f[C]PROMPT_SUFFIX\f[] too, which all do about what you'd expect.
+You can set \f[V]PROMPT_COLOR\f[R], \f[V]PROMPT_PREFIX\f[R], and
+\f[V]PROMPT_SUFFIX\f[R] too, which all do about what you\[cq]d expect.
.PP
-If you start up GNU Bash, Korn shell, or Z shell, and that doesn't match
-your login shell, the prompt should display an appropriate prefix.
+If you start up GNU Bash, Korn shell, or Z shell, and that doesn\[cq]t
+match your login shell, the prompt should display an appropriate prefix.
.PP
-This is all managed within the \f[C]prompt\f[] function.
-There's some mildly hacky logic on \f[C]tput\f[] codes included such
-that it should work correctly for most common terminals using both
-\f[C]termcap(5)\f[] and \f[C]terminfo(5)\f[], including *BSD systems.
-It's also designed to degrade gracefully for eight\-color and no\-color
-terminals.
+This is all managed within the \f[V]prompt\f[R] function.
+There\[cq]s some mildly hacky logic on \f[V]tput\f[R] codes included
+such that it should work correctly for most common terminals using both
+\f[V]termcap(5)\f[R] and \f[V]terminfo(5)\f[R], including *BSD systems.
+It\[cq]s also designed to degrade gracefully for eight-color and
+no-color terminals.
.SS Functions
.PP
-If a function can be written in POSIX \f[C]sh\f[] without too much
-hackery, I put it in \f[C]sh/shrc.d\f[] to be loaded by any POSIX
+If a function can be written in POSIX \f[V]sh\f[R] without too much
+hackery, I put it in \f[V]sh/shrc.d\f[R] to be loaded by any POSIX
interactive shell.
Those include:
.IP \[bu] 2
Four functions for using a \[lq]marked\[rq] directory, which I find a
-more manageable concept than the \f[C]pushd\f[]/\f[C]popd\f[] directory
-stack:
+more manageable concept than the \f[V]pushd\f[R]/\f[V]popd\f[R]
+directory stack:
.RS 2
.IP \[bu] 2
-\f[C]md()\f[] marks a given (or the current) directory.
+\f[V]md()\f[R] marks a given (or the current) directory.
.IP \[bu] 2
-\f[C]gd()\f[] goes to the marked directory.
+\f[V]gd()\f[R] goes to the marked directory.
.IP \[bu] 2
-\f[C]pmd()\f[] prints the marked directory.
+\f[V]pmd()\f[R] prints the marked directory.
.IP \[bu] 2
-\f[C]xd()\f[] swaps the current and marked directories.
+\f[V]xd()\f[R] swaps the current and marked directories.
.RE
.IP \[bu] 2
Ten other directory management and navigation functions:
.RS 2
.IP \[bu] 2
-\f[C]bd()\f[] changes into a named ancestor of the current directory.
+\f[V]bd()\f[R] changes into a named ancestor of the current directory.
.IP \[bu] 2
-\f[C]gt()\f[] changes into a directory or into a file's directory.
+\f[V]gt()\f[R] changes into a directory or into a file\[cq]s directory.
.IP \[bu] 2
-\f[C]lgt()\f[] runs \f[C]gt()\f[] on the first result from a
-\f[C]loc(1df)\f[] search.
+\f[V]lgt()\f[R] runs \f[V]gt()\f[R] on the first result from a
+\f[V]loc(1df)\f[R] search.
.IP \[bu] 2
-\f[C]mkcd()\f[] creates a directory and changes into it.
+\f[V]mkcd()\f[R] creates a directory and changes into it.
.IP \[bu] 2
-\f[C]pd()\f[] changes to the argument's parent directory.
+\f[V]pd()\f[R] changes to the argument\[cq]s parent directory.
.IP \[bu] 2
-\f[C]rd()\f[] replaces the first instance of its first argument with its
-second argument in \f[C]$PWD\f[], emulating a feature of the Zsh
-\f[C]cd\f[] builtin that I like.
+\f[V]rd()\f[R] replaces the first instance of its first argument with
+its second argument in \f[V]$PWD\f[R], emulating a feature of the Zsh
+\f[V]cd\f[R] builtin that I like.
.IP \[bu] 2
-\f[C]scr()\f[] creates a temporary directory and changes into it.
+\f[V]scr()\f[R] creates a temporary directory and changes into it.
.IP \[bu] 2
-\f[C]sd()\f[] changes into a sibling of the current directory.
+\f[V]sd()\f[R] changes into a sibling of the current directory.
.IP \[bu] 2
-\f[C]ud()\f[] changes into an indexed ancestor of a directory.
+\f[V]ud()\f[R] changes into an indexed ancestor of a directory.
.IP \[bu] 2
-\f[C]vr()\f[] tries to change to the root directory of a source control
+\f[V]vr()\f[R] tries to change to the root directory of a source control
repository.
.RE
.IP \[bu] 2
Two editor wrapper functions:
.RS 2
.IP \[bu] 2
-\f[C]e()\f[] invokes \f[C]$EDITOR\f[], or \f[C]ed(1)\f[] if not set.
+\f[V]e()\f[R] invokes \f[V]$EDITOR\f[R], or \f[V]ed(1)\f[R] if not set.
.IP \[bu] 2
-\f[C]v()\f[] invokes \f[C]$VISUAL\f[], or \f[C]vi(1)\f[] if not set.
+\f[V]v()\f[R] invokes \f[V]$VISUAL\f[R], or \f[V]vi(1)\f[R] if not set.
.RE
.IP \[bu] 2
-\f[C]bc()\f[] silences startup messages from GNU \f[C]bc(1)\f[].
+\f[V]bc()\f[R] silences startup messages from GNU \f[V]bc(1)\f[R].
.IP \[bu] 2
-\f[C]ed()\f[] tries to get verbose error messages, a prompt, and a
-Readline environment for \f[C]ed(1)\f[].
+\f[V]ed()\f[R] tries to get verbose error messages, a prompt, and a
+Readline environment for \f[V]ed(1)\f[R].
.IP \[bu] 2
-\f[C]gdb()\f[] silences startup messages from \f[C]gdb(1)\f[].
+\f[V]gdb()\f[R] silences startup messages from \f[V]gdb(1)\f[R].
.IP \[bu] 2
-\f[C]grep()\f[] tries to apply color and other options good for
+\f[V]grep()\f[R] tries to apply color and other options good for
interactive use if available.
.IP \[bu] 2
-\f[C]hgrep()\f[] allows searching \f[C]$HISTFILE\f[].
+\f[V]hgrep()\f[R] allows searching \f[V]$HISTFILE\f[R].
.IP \[bu] 2
-\f[C]keychain()\f[] keeps \f[C]$GPG_TTY\f[] up to date if a GnuPG agent
-is available.
-.IP \[bu] 2
-\f[C]ls()\f[] tries to apply color and other options good for
+\f[V]ls()\f[R] tries to apply color and other options good for
interactive use if available.
.RS 2
.IP \[bu] 2
-\f[C]la()\f[] runs \f[C]ls\ \-A\f[] if it can, or \f[C]ls\ \-a\f[]
+\f[V]la()\f[R] runs \f[V]ls -A\f[R] if it can, or \f[V]ls -a\f[R]
otherwise.
.IP \[bu] 2
-\f[C]ll()\f[] runs \f[C]ls\ \-Al\f[] if it can, or \f[C]ls\ \-al\f[]
+\f[V]ll()\f[R] runs \f[V]ls -Al\f[R] if it can, or \f[V]ls -al\f[R]
otherwise.
.RE
.IP \[bu] 2
-\f[C]path()\f[] manages the contents of \f[C]PATH\f[] conveniently.
+\f[V]path()\f[R] manages the contents of \f[V]PATH\f[R] conveniently.
.IP \[bu] 2
-\f[C]scp()\f[] tries to detect forgotten hostnames in \f[C]scp(1)\f[]
+\f[V]scp()\f[R] tries to detect forgotten hostnames in \f[V]scp(1)\f[R]
command calls.
.IP \[bu] 2
-\f[C]sudo()\f[] forces \f[C]\-H\f[] for \f[C]sudo(8)\f[] calls so that
-\f[C]$HOME\f[] is never preserved; I hate having \f[C]root\f[]\-owned
+\f[V]sudo()\f[R] forces \f[V]-H\f[R] for \f[V]sudo(8)\f[R] calls so that
+\f[V]$HOME\f[R] is never preserved; I hate having \f[V]root\f[R]-owned
files in my home directory.
.IP \[bu] 2
-\f[C]tree()\f[] colorizes GNU \f[C]tree(1)\f[] output if possible
-(without having \f[C]LS_COLORS\f[] set).
+\f[V]tor()\f[R] is just a terse shortcut for using Torsocks to anonymize
+TCP connections from the current shell.
+.IP \[bu] 2
+\f[V]tree()\f[R] colorizes GNU \f[V]tree(1)\f[R] output if possible
+(without having \f[V]LS_COLORS\f[R] set).
.IP \[bu] 2
-\f[C]x()\f[] is a one\-key shortcut for \f[C]exec\ startx\f[].
+\f[V]x()\f[R] is a one-key shortcut for \f[V]exec startx\f[R].
.PP
There are a few other little tricks defined for other shells providing
-non\-POSIX features, as compatibility allows:
+non-POSIX features, as compatibility allows:
.IP \[bu] 2
-\f[C]keep()\f[] stores ad\-hoc shell functions and variables (Bash, Korn
+\f[V]keep()\f[R] stores ad-hoc shell functions and variables (Bash, Korn
Shell 93, Z shell).
.IP \[bu] 2
-\f[C]prompt()\f[] sets up my interactive prompt (Bash, Korn Shell, Z
+\f[V]prompt()\f[R] sets up my interactive prompt (Bash, Korn Shell, Z
shell).
.IP \[bu] 2
-\f[C]pushd()\f[] adds a default destination of \f[C]$HOME\f[] to the
-\f[C]pushd\f[] builtin (Bash).
+\f[V]pushd()\f[R] adds a default destination of \f[V]$HOME\f[R] to the
+\f[V]pushd\f[R] builtin (Bash).
.IP \[bu] 2
-\f[C]vared()\f[] allows interactively editing a variable with Readline,
+\f[V]vared()\f[R] allows interactively editing a variable with Readline,
emulating a Z shell function I like by the same name (Bash).
.IP \[bu] 2
-\f[C]ver()\f[] prints the current shell's version information (Bash,
-Korn Shell, Z shell).
+\f[V]ver()\f[R] prints the current shell\[cq]s version information
+(Bash, Korn Shell, Z shell).
.SS Completion
.PP
-I find the \f[C]bash\-completion\f[] package a bit too heavy for my
+I find the \f[V]bash-completion\f[R] package a bit too heavy for my
tastes, and turn it off using a stub file installed in
-\f[C]~/.config/bash_completion\f[].
+\f[V]\[ti]/.config/bash_completion\f[R].
The majority of the time I just want to complete paths anyway, and this
makes for a quicker startup without a lot of junk functions in my Bash
namespace.
.PP
I do make some exceptions with completions defined in files in
-\f[C]~/.bash_completion.d\f[] for things I really do get tired of typing
-repeatedly:
+\f[V]\[ti]/.bash_completion.d\f[R] for things I really do get tired of
+typing repeatedly:
.IP \[bu] 2
Bash builtins: commands, help topics, shell options, variables, etc.
.IP \[bu] 2
-\f[C]find(1)\f[]'s more portable options
+\f[V]find(1)\f[R]\[cq]s more portable options
.IP \[bu] 2
-\f[C]gpg(1)\f[] long options
+\f[V]gpg(1)\f[R] long options
.IP \[bu] 2
-\f[C]make(1)\f[] targets read from a \f[C]Makefile\f[]
+\f[V]make(1)\f[R] targets read from a \f[V]Makefile\f[R]
.IP \[bu] 2
-\f[C]man(1)\f[] page titles
+\f[V]man(1)\f[R] page titles
.IP \[bu] 2
-\f[C]pass(1)\f[] entries
+\f[V]pass(1)\f[R] entries
.IP \[bu] 2
-\f[C]ssh(1)\f[] hostnames from \f[C]~/.ssh/config\f[]
+\f[V]ssh(1)\f[R] hostnames from \f[V]\[ti]/.ssh/config\f[R]
.PP
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 binary.
-I don't actually read the file, so this is more of a heuristic thing,
-and sometimes it will get things wrong.
+I don\[cq]t actually read the file, so this is more of a heuristic
+thing, and sometimes it will get things wrong.
.PP
I also add completions for my own scripts and functions where useful.
The completions are dynamically loaded if Bash is version 4.0 or
greater.
-Otherwise, they're all loaded on startup.
+Otherwise, they\[cq]re all loaded on startup.
.SS Korn shell
.PP
These are experimental; they are mostly used to tinker with MirBSD
-\f[C]mksh\f[], AT&T \f[C]ksh93\f[], and OpenBSD \f[C]pdksh\f[].
+\f[V]mksh\f[R], AT&T \f[V]ksh93\f[R], and OpenBSD \f[V]pdksh\f[R].
All shells in this family default to a yellow prompt if detected.
.SS Z shell
.PP
These are experimental; I do not like Z shell much at the moment.
-The files started as a joke (\f[C]exec\ bash\f[]).
-\f[C]zsh\f[] shells default to having a prompt colored cyan.
+The files started as a joke (\f[V]exec bash\f[R]).
+\f[V]zsh\f[R] shells default to having a prompt colored cyan.
.SS Mutt
.PP
-My mail is kept in individual Maildir\-format directories under
-\f[C]~/mail\f[], with the system mail spool in e.g.
-\f[C]/var/mail/tejr\f[] being where most unfiltered new mail is spooled.
+My mail is kept in individual Maildir-format directories under
+\f[V]\[ti]/mail\f[R], with the system mail spool in
+e.g.\ \f[V]/var/mail/tejr\f[R] being where most unfiltered new mail is
+spooled.
I use Getmail (http://pyropus.ca/software/getmail/),
maildrop (https://www.courier-mta.org/maildrop/), and
msmtp (https://marlam.de/msmtp/); the configurations for these are not
@@ -462,203 +472,194 @@ The GnuPG and S/MIME interfacing is done with
GPGme (https://www.gnupg.org/related_software/gpgme/), rather than
defining commands for each crypto operation.
I wrote an article about this
-setup (https://sanctum.geek.nz/arabesque/gnu-linux-crypto-email/) if it
+setup (https://blog.sanctum.geek.nz/gnu-linux-crypto-email/) if it
sounds appealing.
.PP
-You'll need Abook installed if you want to use the
-\f[C]query_command\f[] I have defined, and msmtp for the
-\f[C]sendmail\f[] command.
-.SS rxvt\-unicode
-.PP
-I've butchered the URxvt Perl extensions
-\f[C]selection\-to\-clipboard\f[] and \f[C]selection\f[] into a single
-\f[C]select\f[] extension in \f[C]~/.urxvt/ext\f[], which is the only
-extension I define in \f[C]~/.Xresources\f[].
-.PP
-The included \f[C]\&.Xresources\f[] file assumes that \f[C]urxvt\f[] can
-use 256 colors and Perl extensions.
-If you're missing functionality, try changing \f[C]perl\-ext\-common\f[]
-to \f[C]default\f[].
+You\[cq]ll need Abook installed if you want to use the
+\f[V]query_command\f[R] I have defined, and msmtp for the
+\f[V]sendmail\f[R] command.
.SS tmux
.PP
-These are just generally vi\-friendly settings, and there isn't much out
-of the ordinary.
-Note that the configuration presently uses a hard\-coded 256\-color
-color scheme, and uses non\-login shells, with an attempt to control the
+These are just generally vi-friendly settings, and there isn\[cq]t much
+out of the ordinary.
+Note that the configuration presently uses a hard-coded 256-color color
+scheme, and uses non-login shells, with an attempt to control the
environment to stop shells thinking they have access to an X display.
.PP
-The shell scripts in \f[C]bin\f[] include \f[C]tm(1df)\f[], a shortcut
-to make \f[C]attach\f[] into the default command if no arguments are
+The shell scripts in \f[V]bin\f[R] include \f[V]tm(1df)\f[R], a shortcut
+to make \f[V]attach\f[R] into the default command if no arguments are
given and sessions do already exist.
-My \f[C]~/.inputrc\f[] file binds Alt+M to run that, and Tmux in turn
-binds the same key combination to detach.
+My \f[V]\[ti]/.inputrc\f[R] file binds Alt+M to run that, and Tmux in
+turn binds the same key combination to detach.
.SS Vim
.PP
The majority of the Vim configuration is just setting options, with a
-fair few mappings and remappings, both global and buffer\-local.
-It's extensively commented.
+fair few mappings and remappings, both global and buffer-local.
+It\[cq]s extensively commented.
.SS XDG Basedirs
.PP
The XDG Base Directory
-Specification (https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)'s
+Specification (https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)\[cq]s
environment variables are checked on startup, and appropriate
directories are added to the start and end of
-\f[C]\[aq]runtimepath\[aq]\f[].
-I use these separate directories for machine\-local configuration,
-usually in \f[C]~/.config/vim\f[], while all the files that this suite
-installs land in \f[C]~/.vim\f[].
+\f[V]\[aq]runtimepath\[aq]\f[R].
+I use these separate directories for machine-local configuration,
+usually in \f[V]\[ti]/.config/vim\f[R], while all the files that this
+suite installs land in \f[V]\[ti]/.vim\f[R].
Backups, swap files, persistent undo data, saved views, and the
-\f[C]viminfo\f[] file all live under \f[C]XDG_CACHE_HOME\f[], normally
-\f[C]~/.cache/vim\f[].
+\f[V]viminfo\f[R] file all live under \f[V]XDG_CACHE_HOME\f[R], normally
+\f[V]\[ti]/.cache/vim\f[R].
.SS Filetypes
.PP
-I define my own \f[C]filetype.vim\f[] and \f[C]scripts.vim\f[], so that
-filetype detection works in a way I like, and loads quickly.
+I define my own \f[V]filetype.vim\f[R] and \f[V]scripts.vim\f[R], so
+that filetype detection works in a way I like, and loads quickly.
They are unlikely to suit you as they are, but if you want to use it,
you can extend them with your favorite filetypes in custom
-\f[C]ftdetect\f[] rules.
+\f[V]ftdetect\f[R] rules.
.SS Plugins
.PP
If the logic for doing something involves more than a few lines or any
-structures like functions that can be decoupled from \f[C]$MYVIMRC\f[],
-I like to implement it as a plugin in \f[C]~/.vim/plugin\f[] and/or
-\f[C]~/.vim/autoload\f[], with documentation for each in
-\f[C]~/.vim/doc\f[].
+structures like functions that can be decoupled from \f[V]$MYVIMRC\f[R],
+I like to implement it as a plugin in \f[V]\[ti]/.vim/plugin\f[R] and/or
+\f[V]\[ti]/.vim/autoload\f[R], with documentation for each in
+\f[V]\[ti]/.vim/doc\f[R].
.PP
They eventually get either discarded if I stop using them, or spun off
into their own repositories and added to this repository as submodules
-under \f[C]vim/bundle\f[] if I don't.
+under \f[V]vim/bundle\f[R] if I don\[cq]t.
Some of them I upload to
vim.org (https://www.vim.org/account/profile.php?user_id=73687).
.SS Filetype plugins
.PP
I apply some replacement or supplementary configuration specific to file
-types I often edit in \f[C]~/.vim\f[] and \f[C]~/.vim/after\f[], in the
-\f[C]ftplugin\f[], \f[C]indent\f[], and \f[C]syntax\f[] subdirectories.
+types I often edit in \f[V]\[ti]/.vim\f[R] and
+\f[V]\[ti]/.vim/after\f[R], in the \f[V]ftplugin\f[R], \f[V]indent\f[R],
+and \f[V]syntax\f[R] subdirectories.
Some of these filetype plugins or extensions may also eventually be
removed to be separately distributed, and installed via submodules
instead.
.SS Compilers
.PP
-I define a few of my own \f[C]:compiler\f[] scripts for
-\f[C]~/.vim/compiler\f[] to check and lint appropriate filetypes.
+I define a few of my own \f[V]:compiler\f[R] scripts for
+\f[V]\[ti]/.vim/compiler\f[R] to check and lint appropriate filetypes.
I bind checking\[em]\[lq]does it run?\[rq]\[em]and linting\[em]\[lq]is
it good?\[rq]\[em]with separate local leader maps; for example, for
-\f[C]perl\f[] filetypes, \f[C]<LocalLeader>c\f[] switches
-\f[C]makeprg\f[] to \f[C]perl\ \-c\f[] for checking, and
-\f[C]<LocalLeader>l\f[] to \f[C]perlcritic\f[] for linting.
+\f[V]perl\f[R] filetypes, \f[V]<LocalLeader>c\f[R] switches
+\f[V]makeprg\f[R] to \f[V]perl -c\f[R] for checking, and
+\f[V]<LocalLeader>l\f[R] to \f[V]perlcritic\f[R] for linting.
.SS No Neovim support
.PP
-The configuration doesn't explicitly support Neovim, although most of it
-will probably work; you would probably just comment out the settings for
-a few of the removed options.
+The configuration doesn\[cq]t explicitly support Neovim, although most
+of it will probably work; you would probably just comment out the
+settings for a few of the removed options.
.SS Scripts
.PP
Where practical, I make short scripts into POSIX (but not Bourne)
-\f[C]sh(1)\f[], \f[C]awk(1)\f[], or \f[C]sed(1)\f[] scripts in
-\f[C]~/.local/bin\f[].
+\f[V]sh(1)\f[R], \f[V]awk(1)\f[R], or \f[V]sed(1)\f[R] scripts in
+\f[V]\[ti]/.local/bin\f[R].
I try to use shell functions only when I actually need to, which tends
-to be when I need to change the state of the user's current shell, or to
-limit a change in behavior only to interactive shells.
+to be when I need to change the state of the user\[cq]s current shell,
+or to limit a change in behavior only to interactive shells.
.PP
-These scripts are installed by the \f[C]install\-bin\f[] target:
+These scripts are installed by the \f[V]install-bin\f[R] target:
.IP \[bu] 2
-Three SSH\-related scripts:
+Three SSH-related scripts:
.RS 2
.IP \[bu] 2
-\f[C]sls(1df)\f[] prints hostnames read from a \f[C]ssh_config(5)\f[]
-file.
-It uses \f[C]slsf(1df)\f[] to read each one.
+\f[V]sls(1df)\f[R] prints hostnames read from \f[V]ssh_config(5)\f[R]
+files.
+It uses \f[V]slsf(1df)\f[R] to read each one.
.IP \[bu] 2
-\f[C]sra(1df)\f[] runs a command on multiple hosts read from
-\f[C]sls(1df)\f[] and prints output.
+\f[V]sra(1df)\f[R] runs a command on multiple hosts read from
+\f[V]sls(1df)\f[R] and prints output.
.IP \[bu] 2
-\f[C]sta(1df)\f[] runs a command on multiple hosts read from
-\f[C]sls(1df)\f[] and prints the hostname if the command returns zero.
+\f[V]sta(1df)\f[R] runs a command on multiple hosts read from
+\f[V]sls(1df)\f[R] and prints the hostname if the command returns zero.
.RE
.IP \[bu] 2
-Five URL\-related shortcut scripts:
+Five URL-related shortcut scripts:
.RS 2
.IP \[bu] 2
-\f[C]hurl(1df)\f[] extracts values of \f[C]href\f[] attributes of
-\f[C]<a>\f[] tags, sorts them uniquely, and writes them to
-\f[C]stdout\f[]; it requires pup (https://github.com/ericchiang/pup).
+\f[V]hurl(1df)\f[R] extracts values of \f[V]href\f[R] attributes of
+\f[V]<a>\f[R] tags, sorts them uniquely, and writes them to
+\f[V]stdout\f[R]; it requires pup (https://github.com/ericchiang/pup).
.IP \[bu] 2
-\f[C]murl(1df)\f[] converts Markdown documents to HTML with
-\f[C]pandoc(1)\f[] and runs the output through \f[C]hurl(1df)\f[].
+\f[V]murl(1df)\f[R] converts Markdown documents to HTML with
+\f[V]pandoc(1)\f[R] and runs the output through \f[V]hurl(1df)\f[R].
.IP \[bu] 2
-\f[C]urlc(1df)\f[] accepts a list of URLs on \f[C]stdin\f[] and writes
-error messages to \f[C]stderr\f[] if any of the URLs are broken,
+\f[V]urlc(1df)\f[R] accepts a list of URLs on \f[V]stdin\f[R] and writes
+error messages to \f[V]stderr\f[R] if any of the URLs are broken,
redirecting, or are insecure and have working secure versions; requires
-\f[C]curl(1)\f[].
+\f[V]curl(1)\f[R].
.IP \[bu] 2
-\f[C]urlh(1df)\f[] prints the values for a given HTTP header from a HEAD
-response.
+\f[V]urlh(1df)\f[R] prints the values for a given HTTP header from a
+HEAD response.
.IP \[bu] 2
-\f[C]urlmt(1df)\f[] prints the MIME type from the \f[C]Content\-Type\f[]
-header as retrieved by \f[C]urlh(1df)\f[].
+\f[V]urlmt(1df)\f[R] prints the MIME type from the
+\f[V]Content-Type\f[R] header as retrieved by \f[V]urlh(1df)\f[R].
.RE
.IP \[bu] 2
-Three RFC\-related shortcut scripts:
+Three RFC-related shortcut scripts:
.RS 2
.IP \[bu] 2
-\f[C]rfcf(1df)\f[] fetches ASCII RFCs from the IETF website.
+\f[V]rfcf(1df)\f[R] fetches ASCII RFCs from the IETF website.
.IP \[bu] 2
-\f[C]rfct(1df)\f[] formats ASCII RFCs.
+\f[V]rfct(1df)\f[R] formats ASCII RFCs.
.IP \[bu] 2
-\f[C]rfcr(1df)\f[] does both, displaying in a pager if appropriate, like
-a \f[C]man(1)\f[] reader for RFCs.
+\f[V]rfcr(1df)\f[R] does both, displaying in a pager if appropriate,
+like a \f[V]man(1)\f[R] reader for RFCs.
.RE
.IP \[bu] 2
-Five toy random\-number scripts (not for sensitive/dead\-serious use):
+Five toy random-number scripts (not for sensitive/dead-serious use):
.RS 2
.IP \[bu] 2
-\f[C]rndi(1df)\f[] gets a random integer within two bounds.
+\f[V]rndi(1df)\f[R] gets a random integer within two bounds.
.IP \[bu] 2
-\f[C]rnds(1df)\f[] attempts to get an optional random seed for
-\f[C]rndi(1df)\f[].
+\f[V]rnds(1df)\f[R] attempts to get an optional random seed for
+\f[V]rndi(1df)\f[R].
.IP \[bu] 2
-\f[C]rnda(1df)\f[] uses \f[C]rndi(1df)\f[] to choose a random argument.
+\f[V]rnda(1df)\f[R] uses \f[V]rndi(1df)\f[R] to choose a random
+argument.
.IP \[bu] 2
-\f[C]rndf(1df)\f[] uses \f[C]rnda(1df)\f[] to choose a random file from
-a directory.
+\f[V]rndf(1df)\f[R] uses \f[V]rnda(1df)\f[R] to choose a random file
+from a directory.
.IP \[bu] 2
-\f[C]rndl(1df)\f[] uses \f[C]rndi(1df)\f[] to choose a random line from
-files.
+\f[V]rndl(1df)\f[R] uses \f[V]rndi(1df)\f[R] to choose a random line
+from files.
.RE
.IP \[bu] 2
Four file formatting scripts:
.RS 2
.IP \[bu] 2
-\f[C]d2u(1df)\f[] converts DOS line endings in files to UNIX ones.
+\f[V]d2u(1df)\f[R] converts DOS line endings in files to UNIX ones.
.IP \[bu] 2
-\f[C]u2d(1df)\f[] converts UNIX line endings in files to DOS ones.
+\f[V]u2d(1df)\f[R] converts UNIX line endings in files to DOS ones.
.IP \[bu] 2
-\f[C]stbl(1df)\f[] strips a trailing blank line from the files in its
+\f[V]stbl(1df)\f[R] strips a trailing blank line from the files in its
arguments.
.IP \[bu] 2
-\f[C]stws(1df)\f[] strips trailing spaces from the ends of lines of the
+\f[V]stws(1df)\f[R] strips trailing spaces from the ends of lines of the
files in its arguments.
.RE
.IP \[bu] 2
Seven stream formatting scripts:
.RS 2
.IP \[bu] 2
-\f[C]sd2u(1df)\f[] converts DOS line endings in streams to UNIX ones.
+\f[V]sd2u(1df)\f[R] converts DOS line endings in streams to UNIX ones.
.IP \[bu] 2
-\f[C]su2d(1df)\f[] converts UNIX line endings in streams to DOS ones.
+\f[V]su2d(1df)\f[R] converts UNIX line endings in streams to DOS ones.
.IP \[bu] 2
-\f[C]slow(1df)\f[] converts uppercase to lowercase.
+\f[V]slow(1df)\f[R] converts uppercase to lowercase.
.IP \[bu] 2
-\f[C]supp(1df)\f[] converts lowercase to uppercase.
+\f[V]supp(1df)\f[R] converts lowercase to uppercase.
.IP \[bu] 2
-\f[C]tl(1df)\f[] tags input lines with a prefix or suffix, basically a
-\f[C]sed(1)\f[] shortcut.
+\f[V]tl(1df)\f[R] tags input lines with a prefix or suffix, basically a
+\f[V]sed(1)\f[R] shortcut.
.IP \[bu] 2
-\f[C]tlcs(1df)\f[] executes a command and uses \f[C]tl(1df)\f[] to tag
+\f[V]tlcs(1df)\f[R] executes a command and uses \f[V]tl(1df)\f[R] to tag
standard output and standard error lines, and color them if you want.
.IP \[bu] 2
-\f[C]unf(1df)\f[] joins lines with leading spaces to the previous line.
+\f[V]unf(1df)\f[R] joins lines with leading spaces to the previous line.
Intended for unfolding HTTP headers, but it should work for most RFC 822
formats.
.RE
@@ -666,383 +667,379 @@ formats.
Six simple aggregate scripts for numbers:
.RS 2
.IP \[bu] 2
-\f[C]max(1df)\f[] prints the maximum.
+\f[V]max(1df)\f[R] prints the maximum.
.IP \[bu] 2
-\f[C]mean(1df)\f[] prints the mean.
+\f[V]mean(1df)\f[R] prints the mean.
.IP \[bu] 2
-\f[C]med(1df)\f[] prints the median.
+\f[V]med(1df)\f[R] prints the median.
.IP \[bu] 2
-\f[C]min(1df)\f[] prints the minimum.
+\f[V]min(1df)\f[R] prints the minimum.
.IP \[bu] 2
-\f[C]mode(1df)\f[] prints the first encountered mode.
+\f[V]mode(1df)\f[R] prints the first encountered mode.
.IP \[bu] 2
-\f[C]tot(1df)\f[] totals the set.
+\f[V]tot(1df)\f[R] totals the set.
.RE
.IP \[bu] 2
-Three quick\-and\-dirty HTML tools:
+Three quick-and-dirty HTML tools:
.RS 2
.IP \[bu] 2
-\f[C]htenc(1df)\f[] encodes.
+\f[V]htenc(1df)\f[R] encodes.
.IP \[bu] 2
-\f[C]htdec(1df)\f[] decodes.
+\f[V]htdec(1df)\f[R] decodes.
.IP \[bu] 2
-\f[C]htrec(1df)\f[] wraps \f[C]a\f[] tags around URLs.
+\f[V]htrec(1df)\f[R] wraps \f[V]a\f[R] tags around URLs.
.RE
.IP \[bu] 2
Two internet message quoting tools:
.RS 2
.IP \[bu] 2
-\f[C]quo(1df)\f[] indents with quoting right angle\-brackets.
+\f[V]quo(1df)\f[R] indents with quoting right angle-brackets.
.IP \[bu] 2
-\f[C]wro(1df)\f[] adds a quote attribution header to its input.
+\f[V]wro(1df)\f[R] adds a quote attribution header to its input.
.RE
.IP \[bu] 2
-Six Git\-related tools:
+Six Git-related tools:
.RS 2
.IP \[bu] 2
-\f[C]fgscr(1df)\f[] finds Git repositories in a directory root and
-scrubs them with \f[C]gscr(1df)\f[].
+\f[V]fgscr(1df)\f[R] finds Git repositories in a directory root and
+scrubs them with \f[V]gscr(1df)\f[R].
.IP \[bu] 2
-\f[C]grc(1df)\f[] quietly tests whether the given directory appears to
+\f[V]grc(1df)\f[R] quietly tests whether the given directory appears to
be a Git repository with pending changes.
.IP \[bu] 2
-\f[C]gscr(1df)\f[] scrubs Git repositories.
+\f[V]gscr(1df)\f[R] scrubs Git repositories.
.IP \[bu] 2
-\f[C]isgr(1df)\f[] quietly tests whether the given directory appears to
+\f[V]isgr(1df)\f[R] quietly tests whether the given directory appears to
be a Git repository.
.IP \[bu] 2
-\f[C]jfc(1df)\f[] adds and commits lazily to a Git repository.
+\f[V]jfc(1df)\f[R] adds and commits lazily to a Git repository.
.IP \[bu] 2
-\f[C]jfcd(1df)\f[] watches a directory for changes and runs
-\f[C]jfc(1df)\f[] if it sees any.
+\f[V]jfcd(1df)\f[R] watches a directory for changes and runs
+\f[V]jfc(1df)\f[R] if it sees any.
.RE
.IP \[bu] 2
Two time duration functions:
.RS 2
.IP \[bu] 2
-\f[C]hms(1df)\f[] converts seconds to \f[C]hh:mm:ss\f[] or
-\f[C]mm:ss\f[] timestamps.
+\f[V]hms(1df)\f[R] converts seconds to \f[V]hh:mm:ss\f[R] or
+\f[V]mm:ss\f[R] timestamps.
.IP \[bu] 2
-\f[C]sec(1df)\f[] converts \f[C]hh:mm:ss\f[] or \f[C]mm:ss\f[]
+\f[V]sec(1df)\f[R] converts \f[V]hh:mm:ss\f[R] or \f[V]mm:ss\f[R]
timestamps to seconds.
.RE
.IP \[bu] 2
Three pipe interaction tools:
.RS 2
.IP \[bu] 2
-\f[C]pst(1df)\f[] runs an interactive program on data before passing it
+\f[V]pst(1df)\f[R] runs an interactive program on data before passing it
along a pipeline.
.IP \[bu] 2
-\f[C]ped(1df)\f[] runs \f[C]pst(1df)\f[] with \f[C]$EDITOR\f[] or
-\f[C]ed(1)\f[].
+\f[V]ped(1df)\f[R] runs \f[V]pst(1df)\f[R] with \f[V]$EDITOR\f[R] or
+\f[V]ed(1)\f[R].
.IP \[bu] 2
-\f[C]pvi(1df)\f[] runs \f[C]pvi(1df)\f[] with \f[C]$VISUAL\f[] or
-\f[C]vi(1)\f[].
+\f[V]pvi(1df)\f[R] runs \f[V]pvi(1df)\f[R] with \f[V]$VISUAL\f[R] or
+\f[V]vi(1)\f[R].
.RE
.IP \[bu] 2
Two editor wrapper tools:
.RS 2
.IP \[bu] 2
-\f[C]mked(1df)\f[] creates paths to all its arguments before invoking
-\f[C]$EDITOR\f[].
+\f[V]mked(1df)\f[R] creates paths to all its arguments before invoking
+\f[V]$EDITOR\f[R].
.IP \[bu] 2
-\f[C]mkvi(1df)\f[] creates paths to all its arguments before invoking
-\f[C]$VISUAL\f[].
+\f[V]mkvi(1df)\f[R] creates paths to all its arguments before invoking
+\f[V]$VISUAL\f[R].
.RE
.IP \[bu] 2
-\f[C]ap(1df)\f[] reads arguments for a given command from the standard
+\f[V]ap(1df)\f[R] reads arguments for a given command from the standard
input, prompting if appropriate.
.IP \[bu] 2
-\f[C]apf(1df)\f[] inserts arguments to a command with ones read from a
+\f[V]apf(1df)\f[R] inserts arguments to a command with ones read from a
file, intended as a framework for shell wrappers or functions.
.IP \[bu] 2
-\f[C]ax(1df)\f[] evaluates an AWK expression given on the command line;
+\f[V]ax(1df)\f[R] 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.
.IP \[bu] 2
-\f[C]bcq(1df)\f[] runs \f[C]bc(1)\f[], quieting it down if need be.
+\f[V]bcq(1df)\f[R] runs \f[V]bc(1)\f[R], quieting it down if need be.
.IP \[bu] 2
-\f[C]bel(1df)\f[] prints a terminal bell character.
+\f[V]bel(1df)\f[R] prints a terminal bell character.
.IP \[bu] 2
-\f[C]bl(1df)\f[] generates a given number of blank lines.
+\f[V]bl(1df)\f[R] generates a given number of blank lines.
.IP \[bu] 2
-\f[C]bp(1df)\f[] runs \f[C]br(1df)\f[] after prompting for an URL.
+\f[V]bp(1df)\f[R] runs \f[V]br(1df)\f[R] after prompting for an URL.
.IP \[bu] 2
-\f[C]br(1df)\f[] launches \f[C]$BROWSER\f[].
+\f[V]br(1df)\f[R] launches \f[V]$BROWSER\f[R].
.IP \[bu] 2
-\f[C]ca(1df)\f[] prints a count of its given arguments.
+\f[V]ca(1df)\f[R] prints a count of its given arguments.
.IP \[bu] 2
-\f[C]cf(1df)\f[] prints a count of entries in a given directory.
+\f[V]cf(1df)\f[R] prints a count of entries in a given directory.
.IP \[bu] 2
-\f[C]cfr(1df)\f[] does the same as \f[C]cf(1df)\f[], but recurses into
+\f[V]cfr(1df)\f[R] does the same as \f[V]cf(1df)\f[R], but recurses into
subdirectories as well.
.IP \[bu] 2
-\f[C]chc(1df)\f[] caches the output of a command.
+\f[V]chc(1df)\f[R] caches the output of a command.
.IP \[bu] 2
-\f[C]chn(1df)\f[] runs a filter over its input a given number of times.
+\f[V]chn(1df)\f[R] runs a filter over its input a given number of times.
.IP \[bu] 2
-\f[C]clog(1df)\f[] is a tiny timestamped log system.
+\f[V]clog(1df)\f[R] is a tiny timestamped log system.
.IP \[bu] 2
-\f[C]clrd(1df)\f[] sets up a per\-line file read, clearing the screen
+\f[V]clrd(1df)\f[R] sets up a per-line file read, clearing the screen
first.
.IP \[bu] 2
-\f[C]clwr(1df)\f[] sets up a per\-line file write, clearing the screen
+\f[V]clwr(1df)\f[R] sets up a per-line file write, clearing the screen
before each line.
.IP \[bu] 2
-\f[C]csmw(1df)\f[] prints an English list of monospace\-quoted words
+\f[V]csmw(1df)\f[R] prints an English list of monospace-quoted words
read from the input.
.IP \[bu] 2
-\f[C]dam(1df)\f[] buffers all its input before emitting it as output.
+\f[V]dam(1df)\f[R] buffers all its input before emitting it as output.
.IP \[bu] 2
-\f[C]ddup(1df)\f[] removes duplicate lines from unsorted input.
+\f[V]ddup(1df)\f[R] removes duplicate lines from unsorted input.
.IP \[bu] 2
-\f[C]defang(1df)\f[] prevents dangerous URLs from being made into
+\f[V]defang(1df)\f[R] prevents dangerous URLs from being made into
clickable links.
.IP \[bu] 2
-\f[C]dmp(1df)\f[] copies a pass(1) entry selected by \f[C]dmenu(1)\f[]
-to the X CLIPBOARD.
+\f[V]dub(1df)\f[R] lists the biggest entries in a directory.
.IP \[bu] 2
-\f[C]dub(1df)\f[] lists the biggest entries in a directory.
+\f[V]edda(1df)\f[R] provides a means to run \f[V]ed(1)\f[R] over a set
+of files preserving any options, mostly useful for scripts.
.IP \[bu] 2
-\f[C]edda(1df)\f[] provides a means to run \f[C]ed(1)\f[] over a set of
-files preserving any options, mostly useful for scripts.
+\f[V]eds(1df)\f[R] edits executable script files in \f[V]EDSPATH\f[R],
+defaulting to \f[V]\[ti]/.local/bin\f[R], for personal scripting
+snippets.
.IP \[bu] 2
-\f[C]eds(1df)\f[] edits executable script files in \f[C]EDSPATH\f[],
-defaulting to \f[C]~/.local/bin\f[], for personal scripting snippets.
+\f[V]exm(1df)\f[R] works around a screen-clearing quirk of Vim\[cq]s
+\f[V]ex\f[R] mode.
.IP \[bu] 2
-\f[C]exm(1df)\f[] works around a screen\-clearing quirk of Vim's
-\f[C]ex\f[] mode.
+\f[V]finc(1df)\f[R] counts the number of results returned from a set of
+given \f[V]find(1)\f[R] conditions.
.IP \[bu] 2
-\f[C]finc(1df)\f[] counts the number of results returned from a set of
-given \f[C]find(1)\f[] conditions.
-.IP \[bu] 2
-\f[C]fnl(1df)\f[] runs a command and saves its output and error into
+\f[V]fnl(1df)\f[R] runs a command and saves its output and error into
temporary files, printing their paths and line counts.
.IP \[bu] 2
-\f[C]fnp(1df)\f[] prints the given files to standard output, each with a
-plain text heading with the filename in it.
+\f[V]fnp(1df)\f[R] prints the given files to standard output, each with
+a plain text heading with the filename in it.
.IP \[bu] 2
-\f[C]gms(1df)\f[] runs a set of \f[C]getmailrc\f[] files; does much the
-same thing as the script \f[C]getmails\f[] in the \f[C]getmail\f[]
+\f[V]gms(1df)\f[R] runs a set of \f[V]getmailrc\f[R] files; does much
+the same thing as the script \f[V]getmails\f[R] in the \f[V]getmail\f[R]
suite, but runs the requests in parallel and does up to three silent
-retries using \f[C]try(1df)\f[].
+retries using \f[V]try(1df)\f[R].
.IP \[bu] 2
-\f[C]grec(1df)\f[] is a more logically\-named \f[C]grep\ \-c\f[].
+\f[V]grec(1df)\f[R] is a more logically-named \f[V]grep -c\f[R].
.IP \[bu] 2
-\f[C]gred(1df)\f[] is a more logically\-named \f[C]grep\ \-v\f[].
+\f[V]gred(1df)\f[R] is a more logically-named \f[V]grep -v\f[R].
.IP \[bu] 2
-\f[C]gwp(1df)\f[] searches for alphanumeric words in a similar way to
-\f[C]grep(1)\f[].
+\f[V]gwp(1df)\f[R] searches for alphanumeric words in a similar way to
+\f[V]grep(1)\f[R].
.IP \[bu] 2
-\f[C]han(1df)\f[] provides a \f[C]keywordprg\f[] for Vim's Bash script
-file type that will look for \f[C]help\f[] topics.
+\f[V]han(1df)\f[R] provides a \f[V]keywordprg\f[R] for Vim\[cq]s Bash
+script file type that will look for \f[V]help\f[R] topics.
You could use it from the shell too.
.IP \[bu] 2
-\f[C]igex(1df)\f[] wraps around a command to allow you to ignore error
-conditions that don't actually worry you, exiting with 0 anyway.
+\f[V]igex(1df)\f[R] wraps around a command to allow you to ignore error
+conditions that don\[cq]t actually worry you, exiting with 0 anyway.
.IP \[bu] 2
-\f[C]ix(1df)\f[] posts its input to the \f[C]ix.io\f[] pastebin.
+\f[V]ix(1df)\f[R] posts its input to the \f[V]ix.io\f[R] pastebin.
.IP \[bu] 2
-\f[C]jfp(1df)\f[] prints its input, excluding any shebang on the first
+\f[V]jfp(1df)\f[R] prints its input, excluding any shebang on the first
line only.
.IP \[bu] 2
-\f[C]loc(1df)\f[] is a quick\-search wrapped around \f[C]find(1)\f[].
+\f[V]loc(1df)\f[R] is a quick-search wrapped around \f[V]find(1)\f[R].
.IP \[bu] 2
-\f[C]maybe(1df)\f[] is like \f[C]true(1)\f[] or \f[C]false(1)\f[]; given
-a probability of success, it exits with success or failure.
+\f[V]maybe(1df)\f[R] is like \f[V]true(1)\f[R] or \f[V]false(1)\f[R];
+given a probability of success, it exits with success or failure.
Good for quick tests.
.IP \[bu] 2
-\f[C]mex(1df)\f[] makes given filenames in \f[C]$PATH\f[] executable.
+\f[V]mex(1df)\f[R] makes given filenames in \f[V]$PATH\f[R] executable.
.IP \[bu] 2
-\f[C]mi5(1df)\f[] is a crude preprocessor for \f[C]m4\f[].
+\f[V]mi5(1df)\f[R] is a crude preprocessor for \f[V]m4\f[R].
.IP \[bu] 2
-\f[C]mim(1df)\f[] starts an interactive Mutt message with its input.
+\f[V]mim(1df)\f[R] starts an interactive Mutt message with its input.
.IP \[bu] 2
-\f[C]mftl(1df)\f[] finds usable\-looking targets in Makefiles.
+\f[V]mftl(1df)\f[R] finds usable-looking targets in Makefiles.
.IP \[bu] 2
-\f[C]mkcp(1df)\f[] creates a directory and copies preceding arguments
+\f[V]mkcp(1df)\f[R] creates a directory and copies preceding arguments
into it.
.IP \[bu] 2
-\f[C]mkmv(1df)\f[] creates a directory and moves preceding arguments
+\f[V]mkmv(1df)\f[R] creates a directory and moves preceding arguments
into it.
.IP \[bu] 2
-\f[C]motd(1df)\f[] shows the system MOTD.
+\f[V]motd(1df)\f[R] shows the system MOTD.
.IP \[bu] 2
-\f[C]msc(1df)\f[] crudely counts messages in an mbox.
+\f[V]msc(1df)\f[R] crudely counts messages in an mbox.
.IP \[bu] 2
-\f[C]mw(1df)\f[] prints alphabetic space\-delimited words from the input
+\f[V]mw(1df)\f[R] prints alphabetic space-delimited words from the input
one per line.
.IP \[bu] 2
-\f[C]oii(1df)\f[] runs a command on input only if there is any.
+\f[V]oii(1df)\f[R] runs a command on input only if there is any.
.IP \[bu] 2
-\f[C]onl(1df)\f[] crunches input down to one printable line.
+\f[V]onl(1df)\f[R] crunches input down to one printable line.
.IP \[bu] 2
-\f[C]osc(1df)\f[] implements a \f[C]netcat(1)\f[]\-like wrapper for
-\f[C]openssl(1)\f[]'s \f[C]s_client\f[] sub\-command.
+\f[V]osc(1df)\f[R] implements a \f[V]netcat(1)\f[R]-like wrapper for
+\f[V]openssl(1)\f[R]\[cq]s \f[V]s_client\f[R] sub-command.
.IP \[bu] 2
-\f[C]p(1df)\f[] prints concatenated standard input; \f[C]cat(1)\f[] as
+\f[V]p(1df)\f[R] prints concatenated standard input; \f[V]cat(1)\f[R] as
it should always have been.
.IP \[bu] 2
-\f[C]pa(1df)\f[] prints its arguments, one per line.
+\f[V]pa(1df)\f[R] prints its arguments, one per line.
.IP \[bu] 2
-\f[C]phpcsff(1df)\f[] wraps around
-PHP\-CS\-Fixer (https://github.com/FriendsOfPHP/PHP-CS-Fixer) to make it
-a source code filter suitable for use as an \f[C]equalprg\f[] in Vim.
+\f[V]phpcsff(1df)\f[R] wraps around
+PHP-CS-Fixer (https://github.com/FriendsOfPHP/PHP-CS-Fixer) to make it a
+source code filter suitable for use as an \f[V]equalprg\f[R] in Vim.
.IP \[bu] 2
-\f[C]pp(1df)\f[] prints the full path of each argument using
-\f[C]$PWD\f[].
+\f[V]pp(1df)\f[R] prints the full path of each argument using
+\f[V]$PWD\f[R].
.IP \[bu] 2
-\f[C]pph(1df)\f[] runs \f[C]pp(1df)\f[] and includes a leading
-\f[C]$HOSTNAME:\f[].
+\f[V]pph(1df)\f[R] runs \f[V]pp(1df)\f[R] and includes a leading
+\f[V]$HOSTNAME:\f[R].
.IP \[bu] 2
-\f[C]paz(1df)\f[] print its arguments terminated by NULL chars.
+\f[V]paz(1df)\f[R] print its arguments terminated by NULL chars.
.IP \[bu] 2
-\f[C]pit(1df)\f[] runs its input through a pager if its standard output
+\f[V]pit(1df)\f[R] runs its input through a pager if its standard output
looks like a terminal.
.IP \[bu] 2
-\f[C]pwg(1df)\f[] generates just one decent password with
-\f[C]pwgen(1)\f[].
+\f[V]pwg(1df)\f[R] generates just one decent password with
+\f[V]pwgen(1)\f[R].
.IP \[bu] 2
-\f[C]qat(1df)\f[] disables \f[C]stty\ echo\f[] for the duration of a
+\f[V]qat(1df)\f[R] disables \f[V]stty echo\f[R] for the duration of a
paste.
.IP \[bu] 2
-\f[C]rep(1df)\f[] repeats a command a given number of times.
+\f[V]rep(1df)\f[R] repeats a command a given number of times.
.IP \[bu] 2
-\f[C]rgl(1df)\f[] is a very crude interactive \f[C]grep(1)\f[] loop.
+\f[V]rgl(1df)\f[R] is a very crude interactive \f[V]grep(1)\f[R] loop.
.IP \[bu] 2
-\f[C]shb(1df)\f[] attempts to build shebang lines for scripts from the
+\f[V]shb(1df)\f[R] attempts to build shebang lines for scripts from the
system paths.
.IP \[bu] 2
-\f[C]sqs(1df)\f[] chops off query strings from filenames, usually
+\f[V]sqs(1df)\f[R] chops off query strings from filenames, usually
downloads.
.IP \[bu] 2
-\f[C]sshi(1df)\f[] prints human\-readable SSH connection details.
+\f[V]sshi(1df)\f[R] prints human-readable SSH connection details.
.IP \[bu] 2
-\f[C]stex(1df)\f[] strips extensions from filenames.
+\f[V]stex(1df)\f[R] strips extensions from filenames.
.IP \[bu] 2
-\f[C]sue(8df)\f[] execs \f[C]sudoedit(8)\f[] as the owner of all the
+\f[V]sue(8df)\f[R] execs \f[V]sudoedit(8)\f[R] as the owner of all the
file arguments given, perhaps in cases where you may not necessarily
-have \f[C]root\f[] \f[C]sudo(8)\f[] privileges.
+have \f[V]root\f[R] \f[V]sudo(8)\f[R] privileges.
.IP \[bu] 2
-\f[C]swr(1df)\f[] allows you to run commands locally specifying remote
-files in \f[C]scp(1)\f[]'s HOST:PATH format.
+\f[V]swr(1df)\f[R] allows you to run commands locally specifying remote
+files in \f[V]scp(1)\f[R]\[cq]s HOST:PATH format.
.IP \[bu] 2
-\f[C]td(1df)\f[] manages a to\-do file for you with \f[C]$EDITOR\f[] and
-\f[C]git(1)\f[]; I used to use Taskwarrior, but found it too complex and
-buggy.
+\f[V]td(1df)\f[R] manages a to-do file for you with \f[V]$EDITOR\f[R]
+and \f[V]git(1)\f[R]; I used to use Taskwarrior, but found it too
+complex and buggy.
.IP \[bu] 2
-\f[C]tm(1df)\f[] runs \f[C]tmux(1)\f[] with
-\f[C]attach\-session\ \-d\f[] if a session exists, and
-\f[C]new\-session\f[] if it doesn't.
+\f[V]tm(1df)\f[R] runs \f[V]tmux(1)\f[R] with
+\f[V]attach-session -d\f[R] if a session exists, and
+\f[V]new-session\f[R] if it doesn\[cq]t.
.IP \[bu] 2
-\f[C]trs(1df)\f[] replaces strings (not regular expression) in its
+\f[V]trs(1df)\f[R] replaces strings (not regular expression) in its
input.
.IP \[bu] 2
-\f[C]try(1df)\f[] repeats a command up to a given number of times until
+\f[V]try(1df)\f[R] 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 \f[C]cron(8)\f[]
+Good for tolerating blips or temporary failures in \f[V]cron(8)\f[R]
scripts.
.IP \[bu] 2
-\f[C]umake(1df)\f[] iterates upwards through the directory tree from
-\f[C]$PWD\f[] until it finds a Makefile for which to run
-\f[C]make(1)\f[] with the given arguments.
+\f[V]umake(1df)\f[R] iterates upwards through the directory tree from
+\f[V]$PWD\f[R] until it finds a Makefile for which to run
+\f[V]make(1)\f[R] with the given arguments.
.IP \[bu] 2
-\f[C]uts(1df)\f[] gets the current UNIX timestamp in an unorthodox way
-that should work on all POSIX\-compliant operating systems.
+\f[V]uts(1df)\f[R] gets the current UNIX timestamp in an unorthodox way
+that should work on all POSIX-compliant operating systems.
.IP \[bu] 2
-\f[C]vest(1df)\f[] runs \f[C]test(1)\f[] but fails with explicit output
-via \f[C]vex(1df)\f[].
+\f[V]vest(1df)\f[R] runs \f[V]test(1)\f[R] but fails with explicit
+output via \f[V]vex(1df)\f[R].
.IP \[bu] 2
-\f[C]vex(1df)\f[] runs a command and prints \f[C]true\f[] or
-\f[C]false\f[] explicitly to \f[C]stdout\f[] based on the exit value.
+\f[V]vex(1df)\f[R] runs a command and prints \f[V]true\f[R] or
+\f[V]false\f[R] explicitly to \f[V]stdout\f[R] based on the exit value.
.IP \[bu] 2
-\f[C]vic(1df)\f[] tries to run a POSIX\-compliant \f[C]vi(1)\f[].
+\f[V]vic(1df)\f[R] tries to run a POSIX-compliant \f[V]vi(1)\f[R].
.IP \[bu] 2
-\f[C]xrbg(1df)\f[] applies the same randomly\-selected background to
+\f[V]xrbg(1df)\f[R] applies the same randomly-selected background to
each X screen.
.IP \[bu] 2
-\f[C]xrq(1df)\f[] gets the values of specific resources out of
-\f[C]xrdb\ \-query\f[] output.
+\f[V]xrq(1df)\f[R] gets the values of specific resources out of
+\f[V]xrdb -query\f[R] output.
.PP
-There's some silly stuff in \f[C]install\-games\f[]:
+There\[cq]s some silly stuff in \f[V]install-games\f[R]:
.IP \[bu] 2
-\f[C]aaf(6df)\f[] gets a random ASCII Art
+\f[V]aaf(6df)\f[R] gets a random ASCII Art
Farts (http://www.asciiartfarts.com/) comic.
.IP \[bu] 2
-\f[C]acq(6df)\f[] allows you to interrogate AC, the interplanetary
+\f[V]acq(6df)\f[R] allows you to interrogate AC, the interplanetary
computer.
.IP \[bu] 2
-\f[C]aesth(6df)\f[] converts English letters to their full width CJK
-analogues, for aesthetic purposes.
+\f[V]aesth(6df)\f[R] converts English letters to their full width CJK
+analogues, for
+\[uFF41]\[uFF45]\[uFF53]\[uFF54]\[uFF48]\[uFF45]\[uFF54]\[uFF49]\[uFF43]
+purposes.
.IP \[bu] 2
-\f[C]squ(6df)\f[] makes a reduced Latin square out of each line of
+\f[V]squ(6df)\f[R] makes a reduced Latin square out of each line of
input.
.IP \[bu] 2
-\f[C]kvlt(6df)\f[] translates input to emulate a style of typing unique
+\f[V]kvlt(6df)\f[R] translates input to emulate a style of typing unique
to black metal communities on the internet.
.IP \[bu] 2
-\f[C]philsay(6df)\f[] shows a picture to accompany \f[C]pks(6df)\f[]
+\f[V]philsay(6df)\f[R] shows a picture to accompany \f[V]pks(6df)\f[R]
output.
.IP \[bu] 2
-\f[C]pks(6df)\f[] laughs at a randomly selected word.
+\f[V]pks(6df)\f[R] laughs at a randomly selected word.
.IP \[bu] 2
-\f[C]rndn(6df)\f[] implements an esoteric random number generation
+\f[V]rndn(6df)\f[R] implements an esoteric random number generation
algorithm.
.IP \[bu] 2
-\f[C]strik(6df)\f[] outputs s̶t̶r̶i̶k̶e̶d̶ ̶o̶u̶t̶ struck out text.
+\f[V]strik(6df)\f[R] outputs
+s\[u0336]t\[u0336]r\[u0336]i\[u0336]k\[u0336]e\[u0336]d\[u0336]
+\[u0336]o\[u0336]u\[u0336]t\[u0336] struck out text.
.IP \[bu] 2
-\f[C]rot13(6df)\f[] rotates the Latin letters in its input.
+\f[V]rot13(6df)\f[R] rotates the Latin letters in its input.
.IP \[bu] 2
-\f[C]uuu(6df)\f[] uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu.
+\f[V]uuu(6df)\f[R] uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu.
.IP \[bu] 2
-\f[C]xyzzy(6df)\f[] teleports to a marked location on the filesystem.
+\f[V]xyzzy(6df)\f[R] teleports to a marked location on the filesystem.
.IP \[bu] 2
-\f[C]zs(6df)\f[] prefixes \[lq]z\[rq] case\-appropriately to every
+\f[V]zs(6df)\f[R] prefixes \[lq]z\[rq] case-appropriately to every
occurrence of \[lq]s\[rq] in the text on its standard input.
.SS Manuals
.PP
-The \f[C]install\-bin\f[] and \f[C]install\-games\f[] targets install
+The \f[V]install-bin\f[R] and \f[V]install-games\f[R] targets install
manuals for each script.
If you want to read the manuals, you may need to add
-\f[C]~/.local/share/man\f[] to your \f[C]~/.manpath\f[] or
-\f[C]/etc/manpath\f[] configuration, depending on your system.
+\f[V]\[ti]/.local/share/man\f[R] to your \f[V]\[ti]/.manpath\f[R] or
+\f[V]/etc/manpath\f[R] configuration, depending on your system.
.SS Testing
.PP
You can check that both sets of shell scripts are syntactically correct
-with \f[C]make\ check\-bash\f[] or \f[C]make\ check\-sh\f[], or
-\f[C]make\ check\f[] for everything including the scripts in
-\f[C]bin\f[] and \f[C]games\f[].
-There's no proper test suite for the actual functionality (yet).
+with \f[V]make check-bash\f[R] or \f[V]make check-sh\f[R], or
+\f[V]make check\f[R] for everything including the scripts in
+\f[V]bin\f[R] and \f[V]games\f[R].
+There\[cq]s no proper test suite for the actual functionality (yet).
.PP
-There are also optional \f[C]lint\f[] targets, if you have the
+There are also optional \f[V]lint\f[R] targets, if you have the
appropriate tools available to run them:
.IP \[bu] 2
ShellCheck (https://www.shellcheck.net/):
.RS 2
.IP \[bu] 2
-\f[C]lint\-bash\f[]
-.IP \[bu] 2
-\f[C]lint\-bin\f[]
+\f[V]lint-bash\f[R]
.IP \[bu] 2
-\f[C]lint\-games\f[]
+\f[V]lint-bin\f[R]
.IP \[bu] 2
-\f[C]lint\-ksh\f[]
+\f[V]lint-games\f[R]
.IP \[bu] 2
-\f[C]lint\-sh\f[]
+\f[V]lint-ksh\f[R]
.IP \[bu] 2
-\f[C]lint\-xinit\f[]
-.RE
-.IP \[bu] 2
-Perl::Critic:
-.RS 2
+\f[V]lint-sh\f[R]
.IP \[bu] 2
-\f[C]lint\-urxvt\f[]
+\f[V]lint-x\f[R]
.RE
.IP \[bu] 2
Vint (https://github.com/Kuniwak/vint):
.RS 2
.IP \[bu] 2
-\f[C]lint\-vim\f[]
+\f[V]lint-vim\f[R]
.RE
.SS Future development
.PP
@@ -1052,11 +1049,12 @@ See IDEAS.md.
See ISSUES.md.
.SS License
.PP
-Public domain; see the included \f[C]UNLICENSE\f[] file.
-It's just configuration and simple scripts, so do whatever you like with
-it if any of it's useful to you.
-If you're feeling generous, please join and/or donate to a free software
-advocacy group, and let me know you did it because of this project:
+Public domain; see the included \f[V]UNLICENSE\f[R] file.
+It\[cq]s just configuration and simple scripts, so do whatever you like
+with it if any of it\[cq]s useful to you.
+If you\[cq]re feeling generous, please join and/or donate to a free
+software advocacy group, and let me know you did it because of this
+project:
.IP \[bu] 2
Free Software Foundation (https://www.fsf.org/)
.IP \[bu] 2
diff --git a/mpd/mpdconf b/mpd/mpdconf
deleted file mode 100644
index 8dd88810..00000000
--- a/mpd/mpdconf
+++ /dev/null
@@ -1,15 +0,0 @@
-bind_to_address "~/.mpd/socket"
-
-db_file "~/.mpd/database"
-log_file "~/.mpd/log"
-
-music_directory "/mnt/media/shares/music"
-playlist_directory "~/.mpd/playlists"
-pid_file "~/.mpd/pid"
-state_file "~/.mpd/state"
-sticker_file "~/.mpd/sticker.sql"
-
-audio_output {
- type "pulse"
- name "PulseAudio"
-}
diff --git a/mpd/profile.d/mpd.sh b/mpd/profile.d/mpd.sh
deleted file mode 100644
index 5a14aef2..00000000
--- a/mpd/profile.d/mpd.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Start an mpd process if one isn't already running
-command -v mpd >/dev/null 2>&1 || return
-[ -s "$HOME"/.mpd/pid ] || mpd
diff --git a/mpv/mpv.conf b/mpv/mpv.conf
index 5a2a05c4..553d73b7 100644
--- a/mpv/mpv.conf
+++ b/mpv/mpv.conf
@@ -1,2 +1,34 @@
# Don't try to show me album covers when I play FLAC
no-audio-display
+
+# Use yt-dlp instead of youtube-dl, as the latter project appears to have been
+# abandonded for some time as at 2022-05-08.
+#
+# * <https://github.com/ytdl-org/youtube-dl/issues/29965>
+# * <https://web.archive.org/web/20220212025407/https://github.com/ytdl-org/youtube-dl/issues/29965>
+#
+script-opts-append="ytdl_hook-ytdl_path=yt-dlp"
+
+# Save screenshot images into XDG-respecting location
+screenshot-directory="~/.local/share/mpv/screenshots"
+
+# Use PNG (lossless) for screenshots rather than the default JPEG
+screenshot-format="png"
+
+# Keep the screenshots in directories named after the media file, with the
+# screenshot filename including the media filename, the timestamp within it,
+# and a numeric suffix to guarantee uniqueness. Full paths look like this:
+#
+# ~/.local/share/mpv/screenshots/Red Dwarf S01E01.mkv/mpv_Red Dwarf S01E01.mkv_00:08:20.461_0001.png
+#
+screenshot-template="%f/mpv_%f_%P_%04n"
+
+# Don't try to find external subtitles for me; I'll specify if I want them.
+sub-auto=no
+
+# Get somewhat lower-resolution (<=640kps), lower-bitrate (<=500kbps) videos,
+# so that they come down quicker and slower systems are less likely to stutter
+# while playing them at busy times; if I want archival quality, I'll just
+# invoke yt-dlp directly.
+#
+ytdl-format="[height<=?640][tbr<=?500]"
diff --git a/mutt/muttrc b/mutt/muttrc
index 504ce9a9..aba87363 100644
--- a/mutt/muttrc
+++ b/mutt/muttrc
@@ -23,7 +23,8 @@ set alias_file \
source $alias_file
# Don't send terminal bells on errors, but do send them when new mail arrives,
-# because that should light up my tmux window label and/or urxvt window.
+# because that should light up either my terminal emulator window or my tmux
+# window label.
#
unset beep
set beep_new
@@ -47,8 +48,8 @@ set header_cache \
# I really want is to be able to run the same commands again even after I quit
# Mutt. We can afford to keep 2^8 of these, since it's the future and all.
#
-set history_file = \
- ~/.cache/mutt/history
+set history_file \
+ = ~/.cache/mutt/history
set history = 256
set save_history = $history
@@ -64,8 +65,8 @@ set index_format = '%4C %Z %{%b %d %Y} %-15.15L (%?l?%4l&%4c?) %?H?[%H] ?%s'
# Set a custom mailcap, rather than leaning on the system's
#
-set mailcap_path = \
- ~/.config/mutt/mailcap
+set mailcap_path \
+ = ~/.config/mutt/mailcap
# When displaying messages with multiple alternatives for display, prefer any
# plain text one, but failing that, fall back to enriched text (hey, it could
diff --git a/mutt/muttrc.d/src b/mutt/muttrc.d/src.sh
index 47cb2df1..60e0c566 100755..100644
--- a/mutt/muttrc.d/src
+++ b/mutt/muttrc.d/src.sh
@@ -1,5 +1,3 @@
-#!/bin/sh
-
# Build groups from address lists
for rc in "$HOME"/.config/mutt/muttrc.d/groups/*.list ; do
[ -e "$rc" ] || continue
diff --git a/ncmpcpp/config b/ncmpcpp/config
index 7e865a8f..48f5137a 100644
--- a/ncmpcpp/config
+++ b/ncmpcpp/config
@@ -1,8 +1 @@
-# Configuration directory
-ncmpcpp_directory = "~/.ncmpcpp"
-
-# Server specifics
-mpd_host = "~/.mpd/socket"
-
-# No mouse, it confuses tmux/urxvt, and I never use it anyway
-mouse_support = "no"
+enable_window_title = no
diff --git a/newsboat/systemd/user/newsboat.service b/newsboat/systemd/user/newsboat.service
new file mode 100644
index 00000000..020ba328
--- /dev/null
+++ b/newsboat/systemd/user/newsboat.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Newsboat news reader
+
+[Service]
+Environment=TERM=screen-256color
+ExecStart=/usr/bin/dtach -N %t/newsboat.socket /usr/bin/newsboat --log-file=%L/newsboat/%p.log --log-level=2
+Restart=always
+
+[Install]
+WantedBy=default.target
diff --git a/newsboat/systemd/user/reload-newsboat.service b/newsboat/systemd/user/reload-newsboat.service
deleted file mode 100644
index f495e67b..00000000
--- a/newsboat/systemd/user/reload-newsboat.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=fetch new Newsboat articles
-OnFailure=notify-email@%n
-ConditionPathExists=!%h/.local/share/newsboat/cache.db.lock
-
-[Service]
-Type=oneshot
-LogsDirectory=newsboat
-LogsDirectoryMode=0700
-ExecStart=newsboat --execute=reload --log-file=%L/newsboat/%p.log --log-level=5
-TimeoutStartSec=5m
diff --git a/newsboat/systemd/user/reload-newsboat.timer b/newsboat/systemd/user/reload-newsboat.timer
deleted file mode 100644
index c3c0cb00..00000000
--- a/newsboat/systemd/user/reload-newsboat.timer
+++ /dev/null
@@ -1,10 +0,0 @@
-[Unit]
-Description=fetch new Newsboat articles schedule
-
-[Timer]
-OnBootSec=10m
-OnUnitActiveSec=10m
-RandomizedDelaySec=2m
-
-[Install]
-WantedBy=timers.target
diff --git a/parcellite/parcelliterc b/parcellite/parcelliterc
new file mode 100644
index 00000000..fad0493e
--- /dev/null
+++ b/parcellite/parcelliterc
@@ -0,0 +1,41 @@
+[rc]
+RCVersion=1
+use_copy=true
+use_primary=true
+synchronize=false
+save_history=true
+history_pos=false
+history_x=1
+history_y=1
+history_limit=64
+data_size=0
+item_size=8
+automatic_paste=false
+auto_key=false
+auto_mouse=true
+key_input=false
+restore_empty=true
+rc_edit=false
+type_search=false
+case_search=false
+ignore_whiteonly=false
+trim_wspace_begend=false
+trim_newline=false
+hyperlinks_only=false
+confirm_clear=true
+current_on_top=true
+single_line=true
+reverse_history=true
+item_length=50
+persistent_history=false
+persistent_separate=false
+persistent_on_top=false
+persistent_delim=\\n
+nonprint_disp=false
+ellipsize=2
+multi_user=true
+icon_name=parcellite
+menu_key=
+history_key=
+phistory_key=
+actions_key=
diff --git a/parcellite/xsession.d/parcellite.sh b/parcellite/xsession.d/parcellite.sh
new file mode 100644
index 00000000..39fb6c4e
--- /dev/null
+++ b/parcellite/xsession.d/parcellite.sh
@@ -0,0 +1,2 @@
+# Start X clipboard manager
+parcellite &
diff --git a/perlcritic/perlcriticrc b/perlcritic/perlcriticrc
index 0bd59c98..37f033fe 100644
--- a/perlcritic/perlcriticrc
+++ b/perlcritic/perlcriticrc
@@ -20,6 +20,11 @@ add_exceptions = inet4 inet6 ipv4 ipv6
# Cool story, bro
[-Editor::RequireEmacsFileVariables]
+# Postfix dereferencing like $foo->@* causes false positives for this policy,
+# a known bug; it's not fixed yet, so we'll just block this policy in the
+# meantime: <https://github.com/Perl-Critic/Perl-Critic/issues/578>
+[-References::ProhibitDoubleSigils]
+
# Soften this rather harsh policy a fair bit; tolerate negative one, all the
# single-digit integers as literals, three powers of 10 (for percentages,
# milliseconds etc), 60 (for angles and clocks), and 1900 (for localtime)
diff --git a/plenv/profile.d/plenv.sh b/plenv/profile.d/plenv.sh
index b2b491e1..5bfc2d24 100644
--- a/plenv/profile.d/plenv.sh
+++ b/plenv/profile.d/plenv.sh
@@ -1,5 +1,2 @@
-# Add plenv to PATH and MANPATH if it appears to be in use
-[ -d "$HOME"/.plenv ] || return
-PATH=$HOME/.plenv/shims:$HOME/.plenv/bin:$PATH
-MANPATH=$HOME/.plenv/versions/$(perl -e 'print substr($^V,1)')/man:$MANPATH
-export MANPATH
+# Add plenv bindir and shims to PATH
+PATH=$HOME/.plenv/bin:$HOME/.plenv/shims:$PATH
diff --git a/plenv/shrc.d/plenv.sh b/plenv/shrc.d/plenv.sh
index bb52ffe2..938bcbf6 100644
--- a/plenv/shrc.d/plenv.sh
+++ b/plenv/shrc.d/plenv.sh
@@ -1,5 +1,4 @@
# POSIX-compatible version of the plenv Bash shell wrapper
-[ -d "$HOME"/.plenv ] || return
plenv() {
case $1 in
rehash)
diff --git a/pyenv/profile.d/pyenv.sh b/pyenv/profile.d/pyenv.sh
index 296df3ac..ea2455fb 100644
--- a/pyenv/profile.d/pyenv.sh
+++ b/pyenv/profile.d/pyenv.sh
@@ -1,5 +1,2 @@
-# Define env vars for pyenv if it appears to be in use
-[ -d "$HOME"/.pyenv ] || return
-PATH=$HOME/.pyenv/shims:$HOME/.pyenv/bin:$PATH
-MANPATH=$HOME/.pyenv/versions/$(python -V|cut -d' ' -f2)/share/man:$MANPATH
-export MANPATH
+# Add pyenv bindir and shims to PATH
+PATH=$HOME/.pyenv/bin:$HOME/.pyenv/shims:$PATH
diff --git a/pyenv/shrc.d/pyenv.sh b/pyenv/shrc.d/pyenv.sh
index 0a946164..60ed8ac7 100644
--- a/pyenv/shrc.d/pyenv.sh
+++ b/pyenv/shrc.d/pyenv.sh
@@ -1,5 +1,4 @@
# POSIX-compatible version of the pyenv Bash shell wrapper
-[ -d "$HOME"/.pyenv ] || return
pyenv() {
case $1 in
rehash)
diff --git a/rbenv/profile.d/rbenv.sh b/rbenv/profile.d/rbenv.sh
index 52787b4d..5295584c 100644
--- a/rbenv/profile.d/rbenv.sh
+++ b/rbenv/profile.d/rbenv.sh
@@ -1,5 +1,2 @@
-# Add rbenv to PATH and MANPATH if it appears to be in use
-[ -d "$HOME"/.rbenv ] || return
-PATH=$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH
-MANPATH=$HOME/.rbenv/versions/$(ruby -e 'print "#{ RUBY_VERSION }"')/man:$MANPATH
-export MANPATH
+# Add rbenv bindir and shims to PATH
+PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH
diff --git a/rbenv/shrc.d/rbenv.sh b/rbenv/shrc.d/rbenv.sh
index ed9ddd03..14403680 100644
--- a/rbenv/shrc.d/rbenv.sh
+++ b/rbenv/shrc.d/rbenv.sh
@@ -1,5 +1,4 @@
# POSIX-compatible version of the rbenv Bash shell wrapper
-[ -d "$HOME"/.rbenv ] || return
rbenv() {
case $1 in
rehash)
diff --git a/readline/inputrc b/readline/inputrc
index 0da55708..90c53633 100644
--- a/readline/inputrc
+++ b/readline/inputrc
@@ -1,13 +1,6 @@
-# Don't mess with the eighth bit of characters
-set input-meta on
-set output-meta on
-
# Never ring any sort of bell during line reading
set bell-style none
-# Let readline do stuff like word killing, not stty(1)
-set bind-tty-special-chars off
-
# Color files by type in the same way as `ls`
set colored-stats on
diff --git a/redshift/redshift.conf b/redshift/redshift.conf
new file mode 100644
index 00000000..0c2f5cfb
--- /dev/null
+++ b/redshift/redshift.conf
@@ -0,0 +1,6 @@
+[redshift]
+location-provider=manual
+
+[manual]
+lat=-36.8487484
+lon=174.7600435
diff --git a/redshift/xsession.d/redshift.sh b/redshift/xsession.d/redshift.sh
new file mode 100644
index 00000000..503877dc
--- /dev/null
+++ b/redshift/xsession.d/redshift.sh
@@ -0,0 +1,2 @@
+# Start X color temperature manager
+redshift &
diff --git a/rofi/bin/rofi_pass.sh b/rofi/bin/rofi_pass.sh
new file mode 100644
index 00000000..fb31a454
--- /dev/null
+++ b/rofi/bin/rofi_pass.sh
@@ -0,0 +1,92 @@
+# Pick password from local or remote password-store with rofi's dmenu emulation
+# mode, and write it to the active X11 window. Optionally, prefix it with the
+# username, being the last part of the slash-delimited password's name, and
+# a TAB press to move to the next field in a form.
+#
+self=rofi_pass
+
+# Abstraction to handle running shell commands (args or stdin) in either
+# a remote or local shell. If the environment variable PASSWORD_STORE_HOST is
+# set, it's used as the destination SSH hostname to the password store.
+#
+pass_shell() {
+ [ "$#" -le 1 ] || return
+ if [ -n "$PASSWORD_STORE_HOST" ] ; then
+ ssh -o StrictHostKeyChecking=yes -T -X -- \
+ "$PASSWORD_STORE_HOST" "$@"
+ elif [ "$#" -eq 1 ] ; then
+ "${SHELL:-/bin/sh}" -c "$1"
+ else
+ "${SHELL:-/bin/sh}" -s
+ fi
+}
+
+# Get a list of all the password paths, relative to the password store root,
+# including leading dot-slash and trailing .gpg extension.
+#
+get_paths() {
+ pass_shell <<-'EOF'
+ dir=${PASSWORD_STORE_DIR:-"$HOME"/.password-store}
+ cd -- "$dir" || exit
+ find . -name \*.gpg -type f || exit
+ EOF
+}
+
+# Get a list of all the password names, bytewise-sorted, with leading dot-slash
+# and trailing .gpg extension removed.
+#
+get_names() {
+ get_paths |
+ sed -e 's_^[.]/__' -e 's_[.]gpg$__' |
+ LC_COLLATE=C sort -f
+}
+
+# Write a password name to a shell to retrieve it, and read its first line;
+# write the name safely to the shell's input rather than as an argument.
+#
+get_password() {
+ name=$1
+ [ -n "$name" ] || return
+ printf '%s\n' "$name" |
+ pass_shell 'IFS= read -r name ; pass show "$name"' |
+ head -n 1
+}
+
+# Check for --login/-l option to paste a username-password combo, not just the
+# password (defaults to the latter).
+#
+login=0
+case $1 in
+ --login|-l) login=1 ;;
+esac
+
+# Apply rofi -dmenu to pick a password name. Use case-insensitive matching,
+# and don't accept arbitrary input.
+#
+name=$(get_names | rofi -dmenu -i -no-lazy-grab -only_match -p pass) || exit
+[ -n "$name" ] || exit
+
+# Retrieve the username for the chosen password, and then the secret itself;
+# check that we actually got more than an empty string back in both cases.
+#
+username=${name##*/}
+[ -n "$username" ] || exit
+password=$(get_password "$name") || exit
+[ -n "$password" ] || exit
+
+# Have xdotool type either the username-TAB-password, or just the password;
+# receiving it on its standard input rather than its arguments, for security.
+#
+if [ "$login" -eq 1 ] ; then
+ printf '%s\t%s' \
+ "$username" "$password"
+else
+ printf '%s' \
+ "$password"
+fi | xdotool type --clearmodifiers --delay=0 --file - || exit
+
+# Tell the user we wrote the password out, in case they're typing a password
+# into a field with echo turned off.
+#
+notify-send --app-name="$self" --icon=gcr-password -- \
+ 'Password typed' "$name"
diff --git a/sh/profile b/sh/profile
index 7f16cb32..5b835458 100644
--- a/sh/profile
+++ b/sh/profile
@@ -1,17 +1,38 @@
-# Add ~/.local/bin to PATH if it exists
-if [ -d "$HOME"/.local/bin ] ; then
- PATH=$HOME/.local/bin:$PATH
-fi
+# Use lynx as our terminal browser
+BROWSER=lynx
+export BROWSER
-# Load all supplementary scripts in ~/.profile.d
+# Use ed as our line editor and vi as our visual editor
+EDITOR=ed
+VISUAL=vi
+export EDITOR VISUAL
+
+# Set the POSIX interactive startup file to ~/.shinit
+ENV=$HOME/.shinit
+export ENV
+
+# Use NZ English, but bytewise sorting
+LANG=en_NZ.UTF-8
+LANGUAGE=en_NZ:en
+LC_COLLATE=C
+export LANG LANGUAGE LC_COLLATE
+
+# Use less as my pager
+PAGER=less
+export PAGER
+
+# Assume I'm at home unless something overrides it
+TZ=Pacific/Auckland
+export TZ
+
+# Source all scripts in ~/.profile.d; many of them will be modifying $PATH, so
+# we'll get that sorted out first
for sh in "$HOME"/.profile.d/*.sh ; do
[ -e "$sh" ] || continue
. "$sh"
done
unset -v sh
-# If ~/.shinit exists, set ENV to that
-if [ -f "$HOME"/.shinit ] ; then
- ENV=$HOME/.shinit
- export ENV
-fi
+# Add ~/.local/bin and ~/.local/games to the very front of PATH, so that it
+# overrides everything else
+PATH=$HOME/.local/bin:$HOME/.local/games:$PATH
diff --git a/sh/profile.d/browser.sh b/sh/profile.d/browser.sh
deleted file mode 100644
index 2c724505..00000000
--- a/sh/profile.d/browser.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-# Set command-line browser to lynx; ~/.xinitrc will change this to something
-# graphical instead
-BROWSER=lynx
-export BROWSER
diff --git a/sh/profile.d/downloads.sh b/sh/profile.d/downloads.sh
deleted file mode 100644
index 1a89bc3f..00000000
--- a/sh/profile.d/downloads.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-# Only if shell is interactive
-case $- in
- *i*) ;;
- *) return ;;
-esac
-
-# Only if not in a tmux window
-[ -z "$TMUX" ] || return
-
-# Not if ~/.hushlogin exists
-! [ -e "$HOME"/.hushlogin ] || return
-
-# Not if ~/.downloads doesn't
-[ -f "$HOME"/.downloads ] || return
-
-# Count files in each directory, report if greater than zero
-(
- lc=0
- while IFS= read -r dir ; do
- case $dir in
- '#'*) continue ;;
- esac
- [ -d "$dir" ] || continue
- set -- "$dir"/*
- [ -e "$1" ] || shift
- [ "$#" -gt 0 ] || continue
- printf 'You have %u unsorted files in %s.\n' "$#" "$dir"
- lc=$((lc+1))
- done < "$HOME"/.downloads
- if [ "$lc" -gt 0 ] ; then
- printf '\n'
- fi
-)
diff --git a/sh/profile.d/editor.sh b/sh/profile.d/editor.sh
deleted file mode 100644
index 37146fb9..00000000
--- a/sh/profile.d/editor.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-# Ideally, we'd use plain old ed(1), but many Linux distributions don't install
-# it by default
-if command -v ed >/dev/null 2>&1 ; then
- EDITOR='ed'
-
-# Failing that, if the system's implementation of ex(1) looks like Vim and we
-# have exm(1df) in our $PATH, use the latter to work around Vim's ex mode
-# screen-clearing
-elif (
- command -v ex >/dev/null 2>&1 || exit 1
- command -v exm >/dev/null 2>&1 || exit 1
- ver=$(ex --version 2>/dev/null | awk '{print $1;exit}')
- case $ver in
- (VIM) exit 0 ;;
- (*) exit 1 ;;
- esac
-) >/dev/null 2>&1 ; then
- EDITOR='exm'
-
-# Otherwise, we can just call ex(1) directly
-else
- EDITOR='ex'
-fi
-
-export EDITOR
diff --git a/sh/profile.d/games.sh b/sh/profile.d/games.sh
deleted file mode 100644
index 956d1de1..00000000
--- a/sh/profile.d/games.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Add ~/.local/games to PATH if it exists
-[ -d "$HOME"/.local/games ] || return
-PATH=$PATH:$HOME/.local/games
diff --git a/sh/profile.d/lang.sh b/sh/profile.d/lang.sh
deleted file mode 100644
index 21f67d5b..00000000
--- a/sh/profile.d/lang.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-# Always use bytewise sorting if not already set
-[ -z "$LC_COLLATE" ] || return
-LC_COLLATE=C
-export LC_COLLATE
diff --git a/sh/profile.d/os.sh b/sh/profile.d/os.sh
deleted file mode 100644
index f9d5a79b..00000000
--- a/sh/profile.d/os.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Store the operating system in an environment variable
-OS=$(uname)
-export OS
diff --git a/sh/profile.d/pager.sh b/sh/profile.d/pager.sh
deleted file mode 100644
index f0c4fab4..00000000
--- a/sh/profile.d/pager.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-# If we don't have less(1), we'll just use whatever pager the application or
-# system deems fit
-command -v less >/dev/null 2>&1 || return
-
-# Use less(1) as my PAGER
-PAGER=less
-export PAGER
diff --git a/sh/profile.d/timezone.sh b/sh/profile.d/timezone.sh
deleted file mode 100644
index cbd33539..00000000
--- a/sh/profile.d/timezone.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Timezone
-TZ=Pacific/Auckland
-export TZ
diff --git a/sh/profile.d/visual.sh b/sh/profile.d/visual.sh
deleted file mode 100644
index eb3c1143..00000000
--- a/sh/profile.d/visual.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-# For a visual editor, use Vim explicitly if we've got it, but otherwise any vi
-# implementation will be fine
-if command -v vim >/dev/null 2>&1 ; then
- VISUAL='vim'
-else
- VISUAL='vi'
-fi
-export VISUAL
-
-# If systemctl is installed, use $VISUAL as its editor, not $EDITOR
-if command -v systemctl >/dev/null 2>&1 ; then
- SYSTEMD_EDITOR=$VISUAL
- export SYSTEMD_EDITOR
-fi
diff --git a/sh/profile.d/welcome.sh b/sh/profile.d/welcome.sh
deleted file mode 100644
index 19231c2e..00000000
--- a/sh/profile.d/welcome.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-# Only if shell is interactive
-case $- in
- *i*) ;;
- *) return ;;
-esac
-
-# Only if not in a tmux window
-[ -z "$TMUX" ] || return
-
-# Only if ~/.hushlogin doesn't exist
-! [ -e "$HOME"/.hushlogin ] || return
-
-# Run all of this in a subshell to clear it away afterwards
-(
- # Temporary helper function
- welcome() {
- test -e "${XDG_CONFIG_HOME:-"$HOME"/.config}"/welcome/"$1"
- }
-
- # Show a fortune
- if welcome fortune ; then
- if [ -z "$FORTUNE_PATH" ] ; then
- FORTUNE_PATH=${XDG_DATA_HOME:-$HOME}/.local/share/fortune
- set -- "$FORTUNE_PATH"/*.dat
- if ! [ -e "$1" ] ; then
- FORTUNE_PATH=
- fi
- fi
- fortune -s "$FORTUNE_PATH"
- printf '\n'
- fi
-
- # Print today's reminders with asterisks
- if welcome rem ; then
- rem -hq | sed 's/^/* /'
- printf '\n'
- fi
-
- # Run verse(1) if we haven't seen it already today
- if welcome verse ; then
- cache=${XDG_CACHE_HOME:-$HOME/.cache}/welcome
- mkdir -p -- "$cache" || return
- if [ -f "$cache"/verse ] ; then
- read -r last <"$cache"/verse
- fi
- now=$(date +%Y%m%d)
- if [ "$now" -gt "${last:-0}" ] ; then
- verse
- printf '\n'
- printf '%s\n' "$now" >"$cache"/verse
- fi
- fi
-)
diff --git a/sh/shrc b/sh/shrc
index 26f69c0c..353120f5 100644
--- a/sh/shrc
+++ b/sh/shrc
@@ -4,8 +4,8 @@ command -p mesg n 2>/dev/null
# Turn off flow control and control character echo
command -p stty -ixon -ctlecho 2>/dev/null
-# Keep around 4K lines of history in memory
-HISTSIZE=$((1 << 12))
+# Keep around 16K lines of history in memory
+HISTSIZE=16384
# If HOSTNAME isn't set by this shell, we'll do it
if [ -z "$HOSTNAME" ] ; then
diff --git a/sh/shrc.d/ed.sh b/sh/shrc.d/ed.sh
index dc8433f6..0591e18d 100644
--- a/sh/shrc.d/ed.sh
+++ b/sh/shrc.d/ed.sh
@@ -22,7 +22,7 @@ ed() {
# Run in rlwrap(1) if available
set -- ed "$@"
if command -v rlwrap >/dev/null 2>&1 ; then
- set -- rlwrap --history-filename=/dev/null "$@"
+ set -- rlwrap --history-filename=/dev/null --no-warnings "$@"
fi
# Run determined command
diff --git a/sh/shrc.d/gdb.sh b/sh/shrc.d/gdb.sh
index ec9d4137..4fb459cb 100644
--- a/sh/shrc.d/gdb.sh
+++ b/sh/shrc.d/gdb.sh
@@ -1,4 +1,4 @@
# Don't print the GDB copyright message on every invocation
gdb() {
- command gdb -q "$@"
+ command gdb --quiet "$@"
}
diff --git a/sh/shrc.d/ls.sh b/sh/shrc.d/ls.sh
index c6558fc3..6fbfbf61 100644
--- a/sh/shrc.d/ls.sh
+++ b/sh/shrc.d/ls.sh
@@ -41,16 +41,6 @@ ls() {
set -- --time-style='+%Y-%m-%d %H:%M:%S' "$@"
fi
- # If the operating system is FreeBSD, there are some specific options we
- # can add that might mean different things to e.g. GNU ls(1)
- case $OS in
- FreeBSD)
- # -D: Timestamp format
- # -G: Use color
- set -- -D '%Y-%m-%d %H:%M:%S' -G "$@"
- ;;
- esac
-
# Run ls(1) with the concluded arguments
command ls "$@"
}
diff --git a/sh/shrc.d/path.sh b/sh/shrc.d/path.sh
index a854e148..812f5f0f 100644
--- a/sh/shrc.d/path.sh
+++ b/sh/shrc.d/path.sh
@@ -130,7 +130,7 @@ path(): Manage contents of PATH variable
USAGE:
path [list]
- Print the current directories in PATH, one per line (default command)
+ Print the current directories in PATH, one per line (default)
path insert [DIR]
Add directory DIR (default $PWD) to the front of PATH
path append [DIR]
@@ -142,7 +142,7 @@ USAGE:
path pop
Remove the last directory from PATH
path check [DIR]
- Return whether directory DIR (default $PWD) is a component of PATH
+ Return whether directory DIR (default $PWD) is in PATH
path help
Print this help message
EOF
@@ -150,7 +150,9 @@ EOF
# Command not found
*)
- printf >&2 'path(): %s: Unknown command (try "help")\n' "$1"
+ printf >&2 \
+ 'path(): %s: Unknown command (try "help")\n' \
+ "$1"
return 2
;;
esac
diff --git a/sh/shrc.d/pd.sh b/sh/shrc.d/pd.sh
index 77f6bae9..e99049d3 100644
--- a/sh/shrc.d/pd.sh
+++ b/sh/shrc.d/pd.sh
@@ -2,8 +2,6 @@
# use when you've got a file path in a variable, or in history, or in Alt+.,
# and want to quickly move to its containing directory. In the absence of an
# argument, this just shifts up a directory, i.e. `cd ..`
-#
-# Note this is equivalent to `ud 1`.
pd() {
# Check arguments; default to $PWD
diff --git a/sh/shrc.d/prompt.sh b/sh/shrc.d/prompt.sh
index cb32c113..72cf59b6 100644
--- a/sh/shrc.d/prompt.sh
+++ b/sh/shrc.d/prompt.sh
@@ -11,8 +11,7 @@ PS3='? '
unset PS4
PS4='+ '
-# If we have an SSH_CLIENT or SSH_CONNECTION environment variable, put the
-# hostname in PS1 too.
-if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_CONNECTION" ] ; then
- PS1=$(hostname -s)'$ '
+# Prompt has hostname via SSH outside of screen/tmux
+if [ -n "$SSH_CLIENT" ] && [ -z "$STY" ] && [ -z "$TMUX" ] ; then
+ PS1=$(hostname -s)$PS1
fi
diff --git a/sh/shrc.d/rd.sh b/sh/shrc.d/rd.sh
index e6d761a6..3e1b4d9c 100644
--- a/sh/shrc.d/rd.sh
+++ b/sh/shrc.d/rd.sh
@@ -11,6 +11,7 @@
# $ rd usr opt
# $ pwd
# /opt/bin
+#
rd() {
# Check argument count
diff --git a/sh/shrc.d/sd.sh b/sh/shrc.d/sd.sh
index 10597832..1fe748c4 100644
--- a/sh/shrc.d/sd.sh
+++ b/sh/shrc.d/sd.sh
@@ -30,6 +30,7 @@
# /tmp/tmp.ZSunna5Eup/a
#
# Seems to work for symbolic links.
+#
sd() {
# Check argument count
diff --git a/sh/shrc.d/sudo.sh b/sh/shrc.d/sudo.sh
deleted file mode 100644
index d9e30bc4..00000000
--- a/sh/shrc.d/sudo.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-# Add the -H parameter to sudo(8) calls, always use the target user's $HOME
-sudo() {
- case $1 in
- -v) ;;
- *) set -- -H "$@" ;;
- esac
- command sudo "$@"
-}
diff --git a/sh/shrc.d/tor.sh b/sh/shrc.d/tor.sh
new file mode 100644
index 00000000..e6e31341
--- /dev/null
+++ b/sh/shrc.d/tor.sh
@@ -0,0 +1,33 @@
+# Manage Torsocks for the current shell
+tor() {
+
+ # Check first argument to figure out operation
+ case $1 in
+
+ # Show whether Torsocks
+ show|'')
+ case $LD_PRELOAD: in
+ (*/libtorsocks.so:*)
+ printf 'on\n'
+ ;;
+ (*)
+ printf 'off\n'
+ ;;
+ esac
+ ;;
+
+ # Turn Torsocks on or off
+ on|off)
+ command -v torsocks >/dev/null 2>&1 || return
+ . "$(command -v torsocks)"
+ ;;
+
+ # Command not found
+ *)
+ printf >&2 \
+ 'tor(): %s: Unknown command (try "help")\n' \
+ "$1"
+ return 2
+ ;;
+ esac
+}
diff --git a/sh/shrc.d/which.sh b/sh/shrc.d/which.sh
index 9d8c899a..528e5048 100644
--- a/sh/shrc.d/which.sh
+++ b/sh/shrc.d/which.sh
@@ -1,3 +1,5 @@
+# Try to stop me using the non-standard `which`:
+# <http://mywiki.wooledge.org/BadUtils#which>
which() {
printf >&2 'Whichcraft detected! Did you mean: command -v %s\n' "$*"
return 2
diff --git a/sxhkd/sxhkdrc b/sxhkd/sxhkdrc
new file mode 100644
index 00000000..b4f823b6
--- /dev/null
+++ b/sxhkd/sxhkdrc
@@ -0,0 +1,53 @@
+super + Return
+ exec x-terminal-emulator
+
+super + {control,shift,alt} + Return
+ exec x-terminal-emulator -e {sh,ksh,zsh}
+
+super + b
+ exec x-www-browser
+
+super + d
+ exec rofi -modi drun -show drun
+
+super + g
+ exec xgoc
+
+super + i
+ exec gimp
+
+super + m
+ exec x-terminal-emulator -title tm -e tm
+
+super + p
+ exec rofi_pass
+
+super + shift + p
+ exec rofi_pass --login
+
+super + t
+ exec thunar
+
+super + v
+ exec x-terminal-emulator -title "$VISUAL" -e "$VISUAL"
+
+Print
+ exec xsnap
+
+control + Print
+ exec xsnap --freeze --select
+
+super + Print
+ exec xsnap --focused
+
+Pause
+ exec xlock
+
+XF86AudioMute
+ exec pactl set-sink-mute @DEFAULT_SINK@ toggle
+
+XF86Audio{Lower,Raise}Volume
+ exec pactl set-sink-volume @DEFAULT_SINK@ {-5%,+5%}
+
+XF86Calculator
+ exec x-terminal-emulator -title bcq -e bcq
diff --git a/sxhkd/xsession.d/sxhkd.sh b/sxhkd/xsession.d/sxhkd.sh
new file mode 100644
index 00000000..ca0e27e3
--- /dev/null
+++ b/sxhkd/xsession.d/sxhkd.sh
@@ -0,0 +1,2 @@
+# Start X hotkey daemon
+sxhkd &
diff --git a/systemd/profile.d/systemd.sh b/systemd/profile.d/systemd.sh
new file mode 100644
index 00000000..b5f05c24
--- /dev/null
+++ b/systemd/profile.d/systemd.sh
@@ -0,0 +1,3 @@
+# Use $VISUAL for editing systemd unit files, not $EDITOR
+SYSTEMD_EDITOR=$VISUAL
+export SYSTEMD_EDITOR
diff --git a/systemd/user/notify-email@.service b/systemd/user/notify-email@.service
index fba9cdaf..2d356c79 100644
--- a/systemd/user/notify-email@.service
+++ b/systemd/user/notify-email@.service
@@ -3,5 +3,5 @@ Description=unit status mailer service for %i
[Service]
Type=oneshot
-ExecStart=sh -c 'systemctl --user status %i | mail -a "X-systemd: %H %m %b" -s "[systemd] %i failure" %u'
+ExecStart=sh -c 'systemctl --user status --full %i | mail -a "X-systemd: %H %m %b" -s "[systemd] %i failure" %u'
TimeoutStartSec=1m
diff --git a/systemd/user/notify-email@.service.d/50-notify-email.conf b/systemd/user/notify-email@.service.d/50-notify-email.conf
new file mode 100644
index 00000000..dc548c73
--- /dev/null
+++ b/systemd/user/notify-email@.service.d/50-notify-email.conf
@@ -0,0 +1,2 @@
+[Unit]
+OnFailure=
diff --git a/systemd/user/run-.service.d/50-notify-email.conf b/systemd/user/run-.service.d/50-notify-email.conf
new file mode 100644
index 00000000..e5a45b8c
--- /dev/null
+++ b/systemd/user/run-.service.d/50-notify-email.conf
@@ -0,0 +1,5 @@
+[Unit]
+OnFailure=
+
+[Service]
+ExecStopPost=sh -c 'systemctl --user status --full %n | mail -a "X-systemd: %H %m %b" -s "[systemd] %n completed" %u'
diff --git a/systemd/user/service.d/50-notify-email.conf b/systemd/user/service.d/50-notify-email.conf
new file mode 100644
index 00000000..11b8b2f2
--- /dev/null
+++ b/systemd/user/service.d/50-notify-email.conf
@@ -0,0 +1,2 @@
+[Unit]
+OnFailure=notify-email@%N.service
diff --git a/terminfo/putty-256color.ti b/terminfo/putty-256color.ti
deleted file mode 100644
index 09d022b8..00000000
--- a/terminfo/putty-256color.ti
+++ /dev/null
@@ -1,7 +0,0 @@
-putty-256color| PuTTY with 256 colors,
- use=putty,
- colors#256,
- initc@,
- pairs#32767,
- setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
- setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
diff --git a/terminfo/putty.ti b/terminfo/putty.ti
deleted file mode 100644
index 068dbbd5..00000000
--- a/terminfo/putty.ti
+++ /dev/null
@@ -1,128 +0,0 @@
-putty| PuTTY,
- acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
- am,
- bce,
- bel=^G,
- blink=\E[5m,
- bold=\E[1m,
- bw,
- cbt=\E[Z,
- ccc,
- civis=\E[?25l,
- clear=\E[H\E[J,
- cnorm=\E[?25h,
- colors#8,
- cr=^M,
- csr=\E[%i%p1%d;%p2%dr,
- cub1=^H,
- cub=\E[%p1%dD,
- cud1=\ED,
- cud=\E[%p1%dB,
- cuf1=\E[C,
- cuf=\E[%p1%dC,
- cup=\E[%i%p1%d;%p2%dH,
- cuu1=\EM,
- cuu=\E[%p1%dA,
- dch1=\E[P,
- dch=\E[%p1%dP,
- dispc=%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G\342\227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e%p1%{13}%=%t\E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G\342\231\253\E%%@%e%p1%{15}%=%t\E%%G\342\230\274\E%%@%e%p1%{27}%=%t\E%%G\342\206\220\E%%@%e%p1%{155}%=%t\E%%G\340\202\242\E%%@%e%p1%c%;,
- dl1=\E[M,
- dl=\E[%p1%dM,
- dsl=\E]0;\007,
- ech=\E[%p1%dX,
- ed=\E[J,
- el1=\E[1K,
- el=\E[K,
- enacs=\E(B\E)0,
- flash=\E[?5h\E[?5l,
- fsl=^G,
- home=\E[H,
- hpa=\E[%i%p1%dG,
- hs,
- ht=^I,
- hts=\EH,
- il1=\E[L,
- il=\E[%p1%dL,
- ind=^J,
- indn=\E[%p1%dS,
- initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,
- is2=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R,
- it#8,
- kb2=\E[G,
- kbs=\177,
- kcbt=\E[Z,
- kcub1=\E[D,
- kcud1=\E[B,
- kcuf1=\E[C,
- kcuu1=\E[A,
- kdch1=\E[3~,
- kend=\E[4~,
- kf10=\E[21~,
- kf11=\E[23~,
- kf12=\E[24~,
- kf13=\E[25~,
- kf14=\E[26~,
- kf15=\E[28~,
- kf16=\E[29~,
- kf17=\E[31~,
- kf18=\E[32~,
- kf19=\E[33~,
- kf1=\E[11~,
- kf20=\E[34~,
- kf2=\E[12~,
- kf3=\E[13~,
- kf4=\E[14~,
- kf5=\E[15~,
- kf6=\E[17~,
- kf7=\E[18~,
- kf8=\E[19~,
- kf9=\E[20~,
- khome=\E[1~,
- kich1=\E[2~,
- kmous=\E[M,
- knp=\E[6~,
- kpp=\E[5~,
- kspd=^Z,
- mir,
- msgr,
- ncv#22,
- nel=^M^J,
- oc=\E]R,
- op=\E[39;49m,
- pairs#64,
- rc=\E8,
- rev=\E[7m,
- ri=\EM,
- rin=\E[%p1%dT,
- rmacs=^O,
- rmam=\E[?7l,
- rmcup=\E[2J\E[?47l,
- rmir=\E[4l,
- rmpch=\E[10m,
- rmso=\E[27m,
- rmul=\E[24m,
- rs2=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l,
- s0ds=\E[10m,
- s1ds=\E[11m,
- s2ds=\E[12m,
- sc=\E7,
- setab=\E[4%p1%dm,
- setaf=\E[3%p1%dm,
- sgr0=\E[m\017,
- sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
- smacs=^N,
- smam=\E[?7h,
- smcup=\E[?47h,
- smir=\E[4h,
- smpch=\E[11m,
- smso=\E[7m,
- smul=\E[4m,
- tbc=\E[3g,
- tsl=\E]0;,
- u6=\E[%i%d;%dR,
- u7=\E[6n,
- u8=\E[?6c,
- u9=\E[c,
- vpa=\E[%i%p1%dd,
- xenl,
- xon,
diff --git a/terminfo/rxvt-256color.ti b/terminfo/rxvt-256color.ti
deleted file mode 100644
index 22c35ec2..00000000
--- a/terminfo/rxvt-256color.ti
+++ /dev/null
@@ -1,8 +0,0 @@
-rxvt-256color| rxvt with 256 colors,
- use=rxvt,
- ccc,
- colors#256,
- initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
- pairs#32767,
- setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
- setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
diff --git a/terminfo/rxvt-unicode-256color.ti b/terminfo/rxvt-unicode-256color.ti
deleted file mode 100644
index 1a34a46f..00000000
--- a/terminfo/rxvt-unicode-256color.ti
+++ /dev/null
@@ -1,4 +0,0 @@
-rxvt-unicode-256color| rxvt-unicode with 256 colors,
- use=rxvt-unicode,
- colors#256,
- pairs#32767,
diff --git a/terminfo/rxvt-unicode.ti b/terminfo/rxvt-unicode.ti
deleted file mode 100644
index 05bef84a..00000000
--- a/terminfo/rxvt-unicode.ti
+++ /dev/null
@@ -1,160 +0,0 @@
-rxvt-unicode| rxvt-unicode,
- acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
- am,
- bce,
- bel=^G,
- blink=\E[5m,
- bold=\E[1m,
- btns#5,
- bw,
- ccc,
- civis=\E[?25l,
- clear=\E[H\E[2J,
- cnorm=\E[?25h,
- colors#88,
- cols#80,
- cr=^M,
- csr=\E[%i%p1%d;%p2%dr,
- cub1=^H,
- cub=\E[%p1%dD,
- cud1=^J,
- cud=\E[%p1%dB,
- cuf1=\E[C,
- cuf=\E[%p1%dC,
- cup=\E[%i%p1%d;%p2%dH,
- cuu1=\E[A,
- cuu=\E[%p1%dA,
- cvvis=\E[?25h,
- dch1=\E[P,
- dch=\E[%p1%dP,
- dl1=\E[M,
- dl=\E[%p1%dM,
- dsl=\E]2;\007,
- ech=\E[%p1%dX,
- ed=\E[J,
- el1=\E[1K,
- el=\E[K,
- enacs=,
- eo,
- flash=\E[?5h$<20/>\E[?5l,
- fsl=^G,
- home=\E[H,
- hpa=\E[%i%p1%dG,
- hs,
- ht=^I,
- hts=\EH,
- ich1=\E[@,
- ich=\E[%p1%d@,
- il1=\E[L,
- il=\E[%p1%dL,
- ind=^J,
- indn=\E[%p1%dS,
- initc=\E]4;%p1%d;rgb\:%p2%{65535}%*%{1000}%/%4.4X/%p3%{65535}%*%{1000}%/%4.4X/%p4%{65535}%*%{1000}%/%4.4X\E\\,
- is1=\E[!p,
- is2=\E[r\E[m\E[2J\E[?7;25h\E[?1;3;4;5;6;9;66;1000;1001;1049l\E[4l,
- it#8,
- kDC=\E[3$,
- kEND=\E[8$,
- kHOM=\E[7$,
- kIC=\E[2$,
- kLFT=\E[d,
- kNXT=\E[6$,
- kPRV=\E[5$,
- kRIT=\E[c,
- ka1=\EOw,
- ka3=\EOy,
- kb2=\EOu,
- kbs=\177,
- kc1=\EOq,
- kc3=\EOs,
- kcbt=\E[Z,
- kcub1=\E[D,
- kcud1=\E[B,
- kcuf1=\E[C,
- kcuu1=\E[A,
- kdch1=\E[3~,
- kel=\E[8\^,
- kend=\E[8~,
- kent=\EOM,
- kf10=\E[21~,
- kf11=\E[23~,
- kf12=\E[24~,
- kf13=\E[25~,
- kf14=\E[26~,
- kf15=\E[28~,
- kf16=\E[29~,
- kf17=\E[31~,
- kf18=\E[32~,
- kf19=\E[33~,
- kf1=\E[11~,
- kf20=\E[34~,
- kf2=\E[12~,
- kf3=\E[13~,
- kf4=\E[14~,
- kf5=\E[15~,
- kf6=\E[17~,
- kf7=\E[18~,
- kf8=\E[19~,
- kf9=\E[20~,
- kfnd=\E[1~,
- khome=\E[7~,
- kich1=\E[2~,
- km,
- kmous=\E[M,
- knp=\E[6~,
- kpp=\E[5~,
- kslt=\E[4~,
- lines#24,
- lm#0,
- mc0=\E[i,
- mc4=\E[4i,
- mc5=\E[5i,
- mc5i,
- mir,
- msgr,
- ncv#0,
- npc,
- op=\E[39;49m,
- pairs#7744,
- rc=\E8,
- rev=\E[7m,
- ri=\EM,
- rin=\E[%p1%dT,
- ritm=\E[23m,
- rmacs=\E(B,
- rmam=\E[?7l,
- rmcup=\E[r\E[?1049l,
- rmir=\E[4l,
- rmkx=\E>,
- rmso=\E[27m,
- rmul=\E[24m,
- rs1=\Ec,
- rs2=\E[r\E[m\E[?7;25h\E[?1;3;4;5;6;9;66;1000;1001;1049l\E[4l,
- s0ds=\E(B,
- s1ds=\E(0,
- s2ds=\E*B,
- s3ds=\E+B,
- sc=\E7,
- setab=\E[48;5;%p1%dm,
- setaf=\E[38;5;%p1%dm,
- setb=%?%p1%{7}%>%t\E[48;5;%p1%dm%e\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m%;,
- setf=%?%p1%{7}%>%t\E[38;5;%p1%dm%e\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m%;,
- sgr0=\E[m\E(B,
- sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\E(0%e\E(B%;,
- sitm=\E[3m,
- smacs=\E(0,
- smam=\E[?7h,
- smcup=\E[?1049h,
- smir=\E[4h,
- smkx=\E=,
- smso=\E[7m,
- smul=\E[4m,
- tbc=\E[3g,
- tsl=\E]2;,
- u6=\E[%i%d;%dR,
- u7=\E[6n,
- u8=\E[?1;2c,
- u9=\E[c,
- vpa=\E[%i%p1%dd,
- xenl,
- xon,
diff --git a/terminfo/rxvt.ti b/terminfo/rxvt.ti
deleted file mode 100644
index 62808d3c..00000000
--- a/terminfo/rxvt.ti
+++ /dev/null
@@ -1,151 +0,0 @@
-rxvt| rxvt,
- acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
- am,
- bce,
- bel=^G,
- blink=\E[5m,
- bold=\E[1m,
- civis=\E[?25l,
- clear=\E[H\E[2J,
- cnorm=\E[?25h,
- colors#8,
- cols#80,
- cr=^M,
- csr=\E[%i%p1%d;%p2%dr,
- cub1=^H,
- cub=\E[%p1%dD,
- cud1=^J,
- cud=\E[%p1%dB,
- cuf1=\E[C,
- cuf=\E[%p1%dC,
- cup=\E[%i%p1%d;%p2%dH,
- cuu1=\E[A,
- cuu=\E[%p1%dA,
- dl1=\E[M,
- dl=\E[%p1%dM,
- ed=\E[J,
- el1=\E[1K,
- el=\E[K,
- enacs=\E(B\E)0,
- eo,
- flash=\E[?5h\E[?5l,
- home=\E[H,
- hpa=\E[%i%p1%dG,
- ht=^I,
- hts=\EH,
- ich1=\E[@,
- ich=\E[%p1%d@,
- il1=\E[L,
- il=\E[%p1%dL,
- ind=^J,
- is1=\E[?47l\E=\E[?1l,
- is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l,
- it#8,
- kDC=\E[3$,
- kEND=\E[8$,
- kHOM=\E[7$,
- kLFT=\E[d,
- kNXT=\E[6$,
- kPRV=\E[5$,
- kRIT=\E[c,
- ka1=\EOw,
- ka3=\EOy,
- kb2=\EOu,
- kbs=\177,
- kc1=\EOq,
- kc3=\EOs,
- kcbt=\E[Z,
- kcub1=\E[D,
- kcud1=\E[B,
- kcuf1=\E[C,
- kcuu1=\E[A,
- kdch1=\E[3~,
- kel=\E[8\^,
- kend=\E[8~,
- kent=\EOM,
- kf10=\E[21~,
- kf11=\E[23~,
- kf12=\E[24~,
- kf13=\E[25~,
- kf14=\E[26~,
- kf15=\E[28~,
- kf16=\E[29~,
- kf17=\E[31~,
- kf18=\E[32~,
- kf19=\E[33~,
- kf1=\E[11~,
- kf20=\E[34~,
- kf21=\E[23$,
- kf22=\E[24$,
- kf23=\E[11\^,
- kf24=\E[12\^,
- kf25=\E[13\^,
- kf26=\E[14\^,
- kf27=\E[15\^,
- kf28=\E[17\^,
- kf29=\E[18\^,
- kf2=\E[12~,
- kf30=\E[19\^,
- kf31=\E[20\^,
- kf32=\E[21\^,
- kf33=\E[23\^,
- kf34=\E[24\^,
- kf35=\E[25\^,
- kf36=\E[26\^,
- kf37=\E[28\^,
- kf38=\E[29\^,
- kf39=\E[31\^,
- kf3=\E[13~,
- kf40=\E[32\^,
- kf41=\E[33\^,
- kf42=\E[34\^,
- kf43=\E[23@,
- kf44=\E[24@,
- kf4=\E[14~,
- kf5=\E[15~,
- kf6=\E[17~,
- kf7=\E[18~,
- kf8=\E[19~,
- kf9=\E[20~,
- kfnd=\E[1~,
- khome=\E[7~,
- kich1=\E[2~,
- km,
- kmous=\E[M,
- knp=\E[6~,
- kpp=\E[5~,
- kslt=\E[4~,
- lines#24,
- mir,
- msgr,
- ncv@,
- op=\E[39;49m,
- pairs#64,
- rc=\E8,
- rev=\E[7m,
- ri=\EM,
- rmacs=^O,
- rmcup=\E[2J\E[?47l\E8,
- rmir=\E[4l,
- rmkx=\E>,
- rmso=\E[27m,
- rmul=\E[24m,
- rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H,
- rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E=\E[?1000l\E[?25h,
- s0ds=\E(B,
- s1ds=\E(0,
- sc=\E7,
- setab=\E[4%p1%dm,
- setaf=\E[3%p1%dm,
- sgr0=\E[m\017,
- sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
- smacs=^N,
- smcup=\E7\E[?47h,
- smir=\E[4h,
- smkx=\E=,
- smso=\E[7m,
- smul=\E[4m,
- tbc=\E[3g,
- vpa=\E[%i%p1%dd,
- xenl,
- xon,
diff --git a/terminfo/screen-256color.ti b/terminfo/screen-256color.ti
deleted file mode 100644
index cc7faffe..00000000
--- a/terminfo/screen-256color.ti
+++ /dev/null
@@ -1,7 +0,0 @@
-screen-256color| GNU Screen or tmux with 256 colors,
- use=screen,
- colors#256,
- initc@,
- pairs#32767,
- setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
- setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
diff --git a/terminfo/screen.ti b/terminfo/screen.ti
deleted file mode 100644
index 4658f424..00000000
--- a/terminfo/screen.ti
+++ /dev/null
@@ -1,100 +0,0 @@
-screen| GNU Screen or tmux,
- acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
- am,
- bel=^G,
- blink=\E[5m,
- bold=\E[1m,
- cbt=\E[Z,
- civis=\E[?25l,
- clear=\E[H\E[J,
- cnorm=\E[34h\E[?25h,
- colors#8,
- cols#80,
- cr=^M,
- csr=\E[%i%p1%d;%p2%dr,
- cub1=^H,
- cub=\E[%p1%dD,
- cud1=^J,
- cud=\E[%p1%dB,
- cuf1=\E[C,
- cuf=\E[%p1%dC,
- cup=\E[%i%p1%d;%p2%dH,
- cuu1=\EM,
- cuu=\E[%p1%dA,
- cvvis=\E[34l,
- dch1=\E[P,
- dch=\E[%p1%dP,
- dl1=\E[M,
- dl=\E[%p1%dM,
- ed=\E[J,
- el1=\E[1K,
- el=\E[K,
- enacs=\E(B\E)0,
- flash=\Eg,
- home=\E[H,
- ht=^I,
- hts=\EH,
- ich=\E[%p1%d@,
- il1=\E[L,
- il=\E[%p1%dL,
- ind=^J,
- is2=\E)0,
- it#8,
- kbs=\177,
- kcbt=\E[Z,
- kcub1=\EOD,
- kcud1=\EOB,
- kcuf1=\EOC,
- kcuu1=\EOA,
- kdch1=\E[3~,
- kend=\E[4~,
- kf10=\E[21~,
- kf11=\E[23~,
- kf12=\E[24~,
- kf1=\EOP,
- kf2=\EOQ,
- kf3=\EOR,
- kf4=\EOS,
- kf5=\E[15~,
- kf6=\E[17~,
- kf7=\E[18~,
- kf8=\E[19~,
- kf9=\E[20~,
- khome=\E[1~,
- kich1=\E[2~,
- km,
- kmous=\E[M,
- knp=\E[6~,
- kpp=\E[5~,
- lines#24,
- mir,
- msgr,
- ncv@,
- nel=\EE,
- op=\E[39;49m,
- pairs#64,
- rc=\E8,
- rev=\E[7m,
- ri=\EM,
- ritm=\E[23m,
- rmacs=^O,
- rmcup=\E[?1049l,
- rmir=\E[4l,
- rmkx=\E[?1l\E>,
- rmso=\E[27m,
- rmul=\E[24m,
- rs2=\Ec\E[?1000l\E[?25h,
- sc=\E7,
- setab=\E[4%p1%dm,
- setaf=\E[3%p1%dm,
- sgr0=\E[m\017,
- sgr=\E[0%?%p6%t;1%;%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
- sitm=\E[3m,
- smacs=^N,
- smcup=\E[?1049h,
- smir=\E[4h,
- smkx=\E[?1h\E=,
- smso=\E[7m,
- smul=\E[4m,
- tbc=\E[3g,
- xenl,
diff --git a/tmux/bin/tmux.sh b/tmux/bin/tmux.sh
new file mode 100644
index 00000000..bbe11636
--- /dev/null
+++ b/tmux/bin/tmux.sh
@@ -0,0 +1,11 @@
+#
+# Simple wrapper to force acting only as client; can't do anything if the
+# server isn't actually running. The correct way to do this is of course
+# socket activation, but Debian's version doesn't have --enable-systemd yet.
+# This will do fine in the meantime.
+#
+if ! systemctl --user is-active --quiet tmux.service ; then
+ printf >&2 'tmux: server not running\n'
+ exit
+fi
+exec /usr/bin/tmux "$@"
diff --git a/tmux/profile.d/tmux.sh b/tmux/profile.d/tmux.sh
new file mode 100644
index 00000000..15ba00ff
--- /dev/null
+++ b/tmux/profile.d/tmux.sh
@@ -0,0 +1,4 @@
+# Encourage tmux to put its sockets into XDG_RUNTIME_DIR rather than /tmp
+[ -n "$XDG_RUNTIME_DIR" ] || return
+TMUX_TMPDIR=$XDG_RUNTIME_DIR
+export TMUX_TMPDIR
diff --git a/tmux/systemd/user/tmux.service b/tmux/systemd/user/tmux.service
new file mode 100644
index 00000000..404f1888
--- /dev/null
+++ b/tmux/systemd/user/tmux.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=tmux server
+Documentation=man:tmux(1)
+
+[Service]
+ExecStart=/bin/sh -lc 'exec /usr/bin/tmux start-server \\; set-option -s exit-empty off'
+KillMode=mixed
+Type=forking
+
+[Install]
+WantedBy=default.target
diff --git a/tmux/tmux.conf b/tmux/tmux.conf
index 05e21f81..ad420528 100644
--- a/tmux/tmux.conf
+++ b/tmux/tmux.conf
@@ -1,20 +1,8 @@
-# Strip out a lot of machine and X11 dependent crap from the initial
-# environment
-set-environment -gru DISPLAY
-set-environment -gru SSH_CLIENT
-set-environment -gru SSH_CONNECTION
-set-environment -gru SSH_TTY
-set-environment -gru WINDOWID
-
-# Otherwise, use the environment we had when we started; don't touch it during
-# a session unless I specifically ask
-set-option -g update-environment 'COLORFGBG COLORTERM'
+# Don't update the environment from anywhere; too confusing
+set-option -g update-environment ''
# Setting this makes each new pane a non-login shell, which suits me better
-set-option -g default-command "$SHELL"
-
-# Expect a 256-color terminal
-set-option -g default-terminal 'screen-256color'
+set-option -g default-command "exec $SHELL"
# Change the prefix to ^A rather than the default of ^B, because I'm a godless
# GNU Screen refugee, and also I like using ^B in my shell and in Vim more
@@ -81,9 +69,6 @@ set-option -g base-index 1
# meta and prefer things to be snappier
set-option -g escape-time 0
-# Keep plenty of history
-set-option -g history-limit 100000
-
# Don't interfere with my system clipboard
set-option -g set-clipboard off
diff --git a/urxvt/ext/select.pl b/urxvt/ext/select.pl
deleted file mode 100644
index 90b13960..00000000
--- a/urxvt/ext/select.pl
+++ /dev/null
@@ -1,93 +0,0 @@
-# Tom Ryder's choice of selection behaviours for urxvt, butchered from included
-# URxvt extension scripts.
-
-# Force me to write this properly
-use strict;
-use warnings;
-use utf8;
-
-# Require at least this version of Perl
-use 5.006;
-
-# Use plain-English variable names
-use English qw(-no_match_vars);
-
-# Set version of this extension
-our $VERSION = 1.0;
-
-# On creation, read all of cutchars into a list of regex-quoted patterns
-sub on_init {
- my ($self) = @_;
- if ( defined( my $res = $self->resource('cutchars') ) ) {
- $res = $self->locale_decode($res);
- push @{ $self->{patterns} },
- qr{\G [\Q$res\E[:space:]]* ([^\Q$res\E[:space:]]+) }msx;
- }
- return ();
-}
-
-# Handle multiple-clicking selection extension
-sub on_sel_extend {
- my ($self) = @_;
-
- # Get attributes of the current selection
- my ( $row, $col ) = $self->selection_mark;
- my $line = $self->line($row);
- my $text = $line->t;
- my $markofs = $line->offset_of( $row, $col );
- my $curlen =
- $line->offset_of( $self->selection_end ) -
- $line->offset_of( $self->selection_beg );
-
- # Find all the possible matches
- my @matches;
- if ( $markofs < $line->l ) {
-
- # `perldoc -f study` says this does nothing useful anymore since
- # version 5.16
- study $text;
-
- for my $regex ( @{ $self->{patterns} } ) {
- while ( $text =~ m{$regex}gmsx ) {
- if ( $LAST_MATCH_START[1] <= $markofs
- and $markofs <= $LAST_MATCH_END[1] )
- {
- my $ofs = $LAST_MATCH_START[1];
- my $match = $1;
-
- push @matches, [ $ofs, length $match ];
- }
- }
- }
- }
-
- # If no more clever patterns matched, just snarf the whole line
- push @matches, [ 0, ( $line->end - $line->beg + 1 ) * $self->ncol ];
-
- # Iterate over the matches to choose the shortest one
- MATCH:
- for (
- sort { ## no critic (ProhibitReverseSortBlock)
- $a->[1] <=> $b->[1]
- or $b->[0] <=> $a->[0]
- } @matches
- )
- {
- my ( $ofs, $len ) = @{$_};
- next MATCH if $len <= $curlen;
- $self->selection_beg( $line->coord_of($ofs) );
- $self->selection_end( $line->coord_of( $ofs + $len ) );
- return 1;
- }
-
- # Done
- return ();
-}
-
-# Copy selections to CLIPBOARD as well as PRIMARY.
-sub on_sel_grab {
- my ( $self, $time ) = @_;
- $self->selection( $self->selection, 1 );
- $self->selection_grab( $time, 1 );
- return ();
-}
diff --git a/vim/after/ftplugin/python.vim b/vim/after/ftplugin/python.vim
new file mode 100644
index 00000000..2ca1ae89
--- /dev/null
+++ b/vim/after/ftplugin/python.vim
@@ -0,0 +1,35 @@
+" The Python runtime files didn't define b:undo_ftplugin until Vim v8.1.1048;
+" if it's not set yet, set it here (to something innoccuous) so that the
+" appending :let commands in the rest of this file don't break.
+"
+if !exists('b:undo_ftplugin')
+ let b:undo_ftplugin = 'setlocal tabstop<'
+endif
+
+" Use pyflakes for syntax checking and autopep8 for tidying
+compiler pyflakes
+if executable('autopep8')
+ setlocal equalprg=autopep8\ -aaa\ --\ -
+ let b:undo_ftplugin .= '|setlocal equalprg<'
+endif
+
+" Stop here if the user doesn't want ftplugin mappings
+if exists('no_plugin_maps') || exists('no_python_maps')
+ finish
+endif
+
+" Mappings to choose compiler
+nnoremap <buffer> <LocalLeader>c
+ \ :<C-U>compiler pyflakes<CR>
+nnoremap <buffer> <LocalLeader>l
+ \ :<C-U>compiler pylint<CR>
+let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>c'
+ \ . '|nunmap <buffer> <LocalLeader>l'
+
+" Mappings to choose 'equalprg'
+nnoremap <buffer> <LocalLeader>t
+ \ :<C-U>setlocal equalprg=autopep8\ -aaa\ --\ -<CR>
+nnoremap <buffer> <LocalLeader>i
+ \ :<C-U>setlocal equalprg<<CR>
+let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>t'
+ \ . '|nunmap <buffer> <LocalLeader>i'
diff --git a/vim/after/indent/vim.vim b/vim/after/indent/vim.vim
index da34eb75..4300e125 100644
--- a/vim/after/indent/vim.vim
+++ b/vim/after/indent/vim.vim
@@ -1,9 +1,9 @@
-" Use two (not four!) spaces for indentation, per convention
-call indent#Spaces(2)
-
" Remove inapplicable defaults from 'indentkeys'; we should only need to undo
" this if the stock plugin didn't already arrange that (before v7.3.539)
setlocal indentkeys-=0#,0{,0},0),:
if !exists('b:undo_indent')
let b:undo_indent = 'setlocal indentkeys<'
endif
+
+" Use two (not four!) spaces for indentation, per convention
+call indent#Spaces(2)
diff --git a/vim/after/indent/yaml.vim b/vim/after/indent/yaml.vim
new file mode 100644
index 00000000..d0478631
--- /dev/null
+++ b/vim/after/indent/yaml.vim
@@ -0,0 +1,2 @@
+" Use two (not four!) spaces for indentation, per convention
+call indent#Spaces(2)
diff --git a/vim/after/plugin/dist.vim b/vim/after/plugin/dist.vim
index 98574de8..c53ebd2c 100644
--- a/vim/after/plugin/dist.vim
+++ b/vim/after/plugin/dist.vim
@@ -7,3 +7,4 @@ unlet loaded_rrhelper
unlet loaded_spellfile_plugin
unlet loaded_tarPlugin
unlet loaded_zipPlugin
+unlet loaded_manpager_plugin
diff --git a/vim/autoload/getenv.vim b/vim/autoload/getenv.vim
deleted file mode 100644
index 3b5f4c1b..00000000
--- a/vim/autoload/getenv.vim
+++ /dev/null
@@ -1,17 +0,0 @@
-" Backport getenv() from v8.1.1305, except return an empty string rather than
-" v:null
-"
-" <https://github.com/vim/vim/releases/tag/v8.1.1305>
-"
-function! getenv#(name) abort
-
- if a:name !~# '^[A-Z][A-Z0-9_]*$'
- throw 'Illegal env var name'
- endif
- let value = ''
- if exists('$'.a:name)
- execute 'let value = $'.a:name
- endif
- return value
-
-endfunction
diff --git a/vim/autoload/has.vim b/vim/autoload/has.vim
deleted file mode 100644
index 162e4929..00000000
--- a/vim/autoload/has.vim
+++ /dev/null
@@ -1,34 +0,0 @@
-" Wrapper to backport the nicer has() syntax for simultaneous version and
-" patch level checking that was introduced in v7.4.236 and fixed in v7.4.237.
-"
-" * <https://github.com/vim/vim/releases/tag/v7.4.236>
-" * <https://github.com/vim/vim/releases/tag/v7.4.237>
-"
-function! has#(feature) abort
-
- " If we're new enough, we can just run the native has()
- if has('patch-7.4.237')
- return has(a:feature)
- endif
-
- " Otherwise, we have to break down the pattern and do manual version and
- " patch level checks; if it doesn't match the patch syntax, just return what
- " the native has() does
- "
- let feature = a:feature
- let pattern = '^patch-\(\d\+\)\.\(\d\+\)\.\(\d\+\)$'
- let matchlist = matchlist(feature, pattern)
- if empty(matchlist)
- return has(a:feature)
- endif
- let [major, minor, patch] = matchlist[1:3]
-
- " The v:version variable looks like e.g. 801 for v8.1
- let l:version = major * 100 + minor
-
- " Compare the version numbers, and then the patch level if they're the same
- return v:version != l:version
- \ ? v:version > l:version
- \ : has('patch-'.patch)
-
-endfunction
diff --git a/vim/autoload/html/timestamp.vim b/vim/autoload/html/timestamp.vim
index 6d525afb..8f250710 100644
--- a/vim/autoload/html/timestamp.vim
+++ b/vim/autoload/html/timestamp.vim
@@ -34,7 +34,7 @@ function! s:Timestamp(time) abort
endfunction
" Define timestamp prefix string
-let s:prefix = '<strong>Last updated:</strong> '
+let s:prefix = 'Last updated: '
" Define pattern to match date timestamps; no ZALGO, please
let s:pattern = '\m\C'
diff --git a/vim/autoload/indent.vim b/vim/autoload/indent.vim
index d597653f..19a9f03d 100644
--- a/vim/autoload/indent.vim
+++ b/vim/autoload/indent.vim
@@ -10,7 +10,7 @@ function! indent#Spaces(...) abort
" If we have the patch that supports it, set 'softtabstop' to dynamically
" mirror the value of 'shiftwidth'; failing that, just copy it
- let &l:softtabstop = has#('patch-7.3.693')
+ let &l:softtabstop = patch#('7.3.693')
\ ? -1
\ : &l:shiftwidth
@@ -19,27 +19,17 @@ endfunction
" Set the current buffer to tab indent
function! indent#Tabs() abort
- setlocal noexpandtab
- setlocal shiftwidth< softtabstop<
+ setlocal noexpandtab shiftwidth< softtabstop<
call indent#Undo()
endfunction
" Add commands to b:undo_indent to clean up buffer-local indentation changes
" on a change of filetype
function! indent#Undo() abort
-
- " Check and set a flag so that we only do this once per buffer
- if exists('b:undo_indent_type_set')
- return
- endif
- let b:undo_indent_type_set = 1
-
- " Either set or append relevant commands to b:undo_indent
- let l:undo = 'setlocal expandtab< shiftwidth< softtabstop< tabstop<'
+ let undo = 'setlocal expandtab< shiftwidth< softtabstop<'
if exists('b:undo_indent')
- let b:undo_indent .= '|'.l:undo
+ let b:undo_indent .= '|'.undo
else
- let b:undo_indent = l:undo
+ let b:undo_indent = undo
endif
-
endfunction
diff --git a/vim/autoload/patch.vim b/vim/autoload/patch.vim
new file mode 100644
index 00000000..3a17ccda
--- /dev/null
+++ b/vim/autoload/patch.vim
@@ -0,0 +1,35 @@
+" Wrapper to emulate the nicer has() syntax for simultaneous version and patch
+" level checking that was introduced in v7.4.236 and fixed in v7.4.237.
+"
+" * <https://github.com/vim/vim/releases/tag/v7.4.236>
+" * <https://github.com/vim/vim/releases/tag/v7.4.237>
+"
+function! patch#(version) abort
+
+ " If the Vim running is new enough for its has() function to support
+ " checking patch levels with version prefixes, we can just add a "patch-"
+ " prefix to the query, and pass it on to has().
+ "
+ if has('patch-7.4.237')
+ return has('patch-'.a:version)
+ endif
+
+ " Failing that, we need to do our own version number and patch number
+ " comparisons; split the queried version on dots.
+ "
+ let [major, minor, patch] = split(a:version, '\.')
+
+ " The internal variable v:version describing the running Vim looks like
+ " e.g. 801 for v8.1; reproduce that logic for the queried version.
+ "
+ let l:version = major * 100 + minor
+
+ " If the running version number is the same as the required one, return
+ " whether we have the specific patch requested; otherwise, return whether
+ " the running version number is greater than the required one.
+ "
+ return v:version == l:version
+ \ ? has('patch-'.patch)
+ \ : v:version > l:version
+
+endfunction
diff --git a/vim/autoload/xdg.vim b/vim/autoload/xdg.vim
index c5737506..cb7adcf5 100644
--- a/vim/autoload/xdg.vim
+++ b/vim/autoload/xdg.vim
@@ -5,6 +5,7 @@ let s:defaults = {
\ 'XDG_CONFIG_DIRS': '/etc/xdg',
\ 'XDG_DATA_HOME': $HOME.'/.local/share',
\ 'XDG_DATA_DIRS': '/usr/local/share:/usr/share',
+ \ 'XDG_STATE_HOME': $HOME.'/.local/state',
\}
function! s:Get(name) abort
@@ -12,10 +13,11 @@ function! s:Get(name) abort
if !has_key(s:defaults, name)
throw 'Illegal XDG basedirs env var name'
endif
- let value = getenv#(name)
- return value !=# ''
- \ ? value
- \ : s:defaults[name]
+ let value = s:defaults[name]
+ if exists('$'.a:name)
+ execute 'let value = $'.a:name
+ endif
+ return value
endfunction
function! s:Absolute(path) abort
@@ -41,21 +43,25 @@ function! s:Dirs(name) abort
endfunction
function! xdg#CacheHome() abort
- return s:Home('XDG_CACHE_HOME')
+ return has('unix') ? s:Home('XDG_CACHE_HOME') : ''
endfunction
function! xdg#ConfigHome() abort
- return s:Home('XDG_CONFIG_HOME')
+ return has('unix') ? s:Home('XDG_CONFIG_HOME') : ''
endfunction
function! xdg#DataHome() abort
- return s:Home('XDG_DATA_HOME')
+ return has('unix') ? s:Home('XDG_DATA_HOME') : ''
+endfunction
+
+function! xdg#StateHome() abort
+ return has('unix') ? s:Home('XDG_STATE_HOME') : ''
endfunction
function! xdg#ConfigDirs() abort
- return s:Dirs('XDG_CONFIG_DIRS')
+ return has('unix') ? s:Dirs('XDG_CONFIG_DIRS') : []
endfunction
function! xdg#DataDirs() abort
- return s:Dirs('XDG_DATA_DIRS')
+ return has('unix') ? s:Dirs('XDG_DATA_DIRS') : []
endfunction
diff --git a/vim/bundle/copy_linebreak b/vim/bundle/copy_linebreak
-Subproject 6692eef760ccfc2e1b888d1d604e3e1a156fcbc
+Subproject a0004c18da5f524f62e2da6e19be1a51ce282f3
diff --git a/vim/bundle/detect_indent b/vim/bundle/detect_indent
-Subproject b41d085cdcaf1f957b2c219630f332023baba72
+Subproject 96f46cae148517e4b8e8a5bbe13b623ddde6b70
diff --git a/vim/bundle/html_spelllang b/vim/bundle/html_spelllang
new file mode 160000
+Subproject 161e47f00cd5a1bdcef61097b7ba100ffd69a48
diff --git a/vim/bundle/put_date b/vim/bundle/put_date
-Subproject 598090797c2cb3a4fe945d2eacd3eca42a0cfe5
+Subproject fa0b0289b80fadbe9af87ca2faa3b5da4512d3f
diff --git a/vim/bundle/redact_pass b/vim/bundle/redact_pass
-Subproject 337e7498e2b483e79c9abb33a2feb670655b23d
+Subproject 403a44dc32533e631384dfcca40d520b9088b0d
diff --git a/vim/bundle/spellfile_local b/vim/bundle/spellfile_local
-Subproject 8772445433cffa3722c441569ae82f5ade4938c
+Subproject 6199ee785c6fb964292ec6e82c5b8a0f79e2606
diff --git a/vim/bundle/strip_trailing_whitespace b/vim/bundle/strip_trailing_whitespace
-Subproject 90e60095bcfcfeb60bea60ba7f51bbfac3bf469
+Subproject 03782cdaf9db6329665316e1dc2d1b8270714a3
diff --git a/vim/compiler/pyflakes.vim b/vim/compiler/pyflakes.vim
new file mode 100644
index 00000000..727fbd76
--- /dev/null
+++ b/vim/compiler/pyflakes.vim
@@ -0,0 +1,9 @@
+" :compiler support for Python syntax checking with pyflakes
+" <https://pypi.org/project/pyflakes/>
+if exists('current_compiler') || &compatible || !has('patch-7.4.191')
+ finish
+endif
+let current_compiler = 'pyflakes'
+
+CompilerSet makeprg=pyflakes\ %:S
+CompilerSet errorformat=%f:%l:%c:\ %m
diff --git a/vim/compiler/pylint.vim b/vim/compiler/pylint.vim
new file mode 100644
index 00000000..589f78e3
--- /dev/null
+++ b/vim/compiler/pylint.vim
@@ -0,0 +1,9 @@
+" :compiler support for Python linting with pylint
+" <https://pypi.org/project/pyflakes/>
+if exists('current_compiler') || &compatible || !has('patch-7.4.191')
+ finish
+endif
+let current_compiler = 'pylint'
+
+CompilerSet makeprg=pylint\ --output-format=parseable\ --score=n\ %:S
+CompilerSet errorformat=%f:%l:\ %m
diff --git a/vim/filetype.vim b/vim/filetype.vim
index 4ecc7aab..eea7f1f5 100644
--- a/vim/filetype.vim
+++ b/vim/filetype.vim
@@ -24,6 +24,7 @@ augroup filetypedetect
" Apache config
autocmd BufNewFile,BufRead
\ .htaccess
+ \,htaccess
\,*/apache*/?*.conf
\ setfiletype apache
" Assembly language files
@@ -67,6 +68,16 @@ augroup filetypedetect
autocmd BufNewFile,BufRead
\ ?*.csv
\ setfiletype csv
+ " Debian package sources
+ autocmd BufNewFile,BufRead
+ \ sources.list
+ \,*/etc/apt/sources.list.d/*.list
+ \ setfiletype debsources
+ " Desktop files
+ autocmd BufNewFile,BufRead
+ \ ?*.desktop
+ \,?*.directory
+ \ setfiletype desktop
" Diff and patch files
autocmd BufNewFile,BufRead
\ ?*.diff
@@ -76,6 +87,7 @@ augroup filetypedetect
" INI format files
autocmd BufNewFile,BufRead
\ ?*.ini
+ \,.editorconfig
\,perlcriticrc
\,.perlcriticrc
\ setfiletype dosini
@@ -83,6 +95,10 @@ augroup filetypedetect
autocmd BufNewFile,BufRead
\ ?*.dot
\ setfiletype dot
+ " NFS exports
+ autocmd BufNewFile,BufRead
+ \ exports
+ \ setfiletype exports
" Forth
autocmd BufNewFile,BufRead
\ ?*.fs,?*.ft
@@ -95,11 +111,18 @@ augroup filetypedetect
autocmd BufNewFile,BufRead
\ .gdbinit
\ setfiletype gdb
+ " Gemini markup
+ autocmd BufNewFile,BufRead
+ \ *.gmi
+ \,*.gemini
+ \ setfiletype gemtext
" Git commit messages
autocmd BufNewFile,BufRead
\ COMMIT_EDITMSG
+ \,EDIT_DESCRIPTION
\,MERGE_MSG
\,TAG_EDITMSG
+ \,NOTES_EDITMSG
\ setfiletype gitcommit
" Git config files
autocmd BufNewFile,BufRead
@@ -107,7 +130,7 @@ augroup filetypedetect
\,.gitconfig
\,.gitmodules
\,gitconfig
- \,~/.config/git/config
+ \,*/.config/git/config
\ setfiletype gitconfig
" Git rebase manifests
autocmd BufNewFile,BufRead
@@ -118,26 +141,29 @@ augroup filetypedetect
\ *gnupg/options
\,*gnupg/gpg.conf
\ setfiletype gpg
+ " Golang
+ autocmd BufNewFile,BufRead
+ \ ?*.go
+ \ setfiletype go
" UNIX group file
autocmd BufNewFile,BufRead
- \ /etc/group
- \,/etc/group-
- \,/etc/group.edit
- \,/etc/gshadow
- \,/etc/gshadow-
- \,/etc/gshadow.edit
+ \ */etc/group
+ \,*/etc/group-
+ \,*/etc/group.edit
+ \,*/etc/gshadow
+ \,*/etc/gshadow-
+ \,*/etc/gshadow.edit
\ setfiletype group
" GTK settings files
autocmd BufNewFile,BufRead
- \ .gktrc*,
- \,gktrc*
+ \ .gtkrc*
+ \,gtkrc*
\ setfiletype gtkrc
" Vim help files
autocmd BufNewFile,BufRead
- \ ~/.vim/doc/?*.txt
+ \ */*.vim/doc/?*.txt
\,*/vim-*/doc/?*.txt
\,*/vim/*/doc/?*.txt
- \,*/*.vim/doc/?*.txt
\,$VIMRUNTIME/doc/?*.txt
\ setfiletype help
" HTML files
@@ -147,7 +173,7 @@ augroup filetypedetect
\ setfiletype html
" hosts(5) file
autocmd BufNewFile,BufRead
- \ /etc/hosts
+ \ */etc/hosts
\ setfiletype hostconf
" inittab(5) files
autocmd BufNewFile,BufRead
@@ -158,6 +184,10 @@ augroup filetypedetect
\ ?*.java
\,?*.jav
\ setfiletype java
+ " Jinja2 templates
+ autocmd BufNewFile,BufRead
+ \ ?*.j2
+ \ setfiletype jinja2
" JSON files
autocmd BufNewFile,BufRead
\ ?*.js
@@ -183,10 +213,19 @@ augroup filetypedetect
\,.emacs
\,emacs
\ setfiletype lisp
+ " Login configuration
+ autocmd BufNewFile,BufRead
+ \ */etc/login.defs
+ \ setf logindefs
" Lua files
autocmd BufNewFile,BufRead
\ ?*.lua
\ setfiletype lua
+ " Lynx configuration
+ au BufNewFile,BufRead
+ \ lynx.cfg
+ \,.lynxrc
+ \ setfiletype lynx
" m4 files
autocmd BufNewFile,BufRead
\ ?*.m4
@@ -216,6 +255,16 @@ augroup filetypedetect
\ ?*.markdown
\,?*.md
\ setfiletype markdown
+ " Meson configuration
+ autocmd BufNewFile,BufRead
+ \ meson.build
+ \,meson_options.txt
+ \ setfiletype meson
+ " SNMP MIB files
+ autocmd BufNewFile,BufRead
+ \ *.mib
+ \,*.my
+ \ setfiletype mib
" Mutt configuration files
autocmd BufNewFile,BufRead
\ Muttrc
@@ -223,7 +272,7 @@ augroup filetypedetect
\,*/muttrc.d/?*.rc
\,.muttrc
\,muttrc
- \,/etc/Muttrc.d/*
+ \,*/etc/Muttrc.d/*
\ setfiletype muttrc
" BIND configuration file
autocmd BufNewFile,BufRead
@@ -249,18 +298,18 @@ augroup filetypedetect
\ setfiletype nroff
" UNIX password and shadow files
autocmd BufNewFile,BufRead
- \ /etc/passwd
- \,/etc/passwd-
- \,/etc/passwd.edit
- \,/etc/shadow
- \,/etc/shadow-
- \,/etc/shadow.edit
+ \ */etc/passwd
+ \,*/etc/passwd-
+ \,*/etc/passwd.edit
+ \,*/etc/shadow
+ \,*/etc/shadow-
+ \,*/etc/shadow.edit
\ setfiletype passwd
" Packet capture files
autocmd BufNewFile,BufRead
\ ?*.pcap
\ setfiletype pcap
- " Perl 5 files
+ " Perl files
autocmd BufNewFile,BufRead
\ ?*.pl
\,?*.pm
@@ -268,12 +317,6 @@ augroup filetypedetect
\,*/xt/?*.t
\,Makefile.PL
\ setfiletype perl
- " Perl 6 files
- autocmd BufNewFile,BufRead
- \ ?*.p6
- \,?*.pl6
- \,?*.pm6
- \ setfiletype perl6
" PHP files
autocmd BufNewFile,BufRead
\ ?*.php
@@ -298,6 +341,9 @@ augroup filetypedetect
" Python files
autocmd BufNewFile,BufRead
\ ?*.py
+ \,?*.pyw
+ \,?*.pythonstartup
+ \,?*.pythonrc
\ setfiletype python
" Readline configuration file
autocmd BufNewFile,BufRead
@@ -322,17 +368,27 @@ augroup filetypedetect
autocmd BufNewFile,BufRead
\ ?*.rb
\ setfiletype ruby
+ " Rust
+ autocmd BufNewFile,BufRead
+ \ ?*.rs
+ \ setfiletype rust
" Samba config
autocmd BufNewFile,BufRead
\ smb.conf
\ setfiletype samba
+ " Scheme
+ au BufNewFile,BufRead
+ \ ?*.scm
+ \,*.ss
+ \,*.sld
+ \ setfiletype scheme
" sed files
autocmd BufNewFile,BufRead
\ ?*.sed
\ setfiletype sed
" Services files
autocmd BufNewFile,BufRead
- \ /etc/services
+ \ */etc/services
\ setfiletype services
" Bash shell
autocmd BufNewFile,BufRead
@@ -365,12 +421,21 @@ augroup filetypedetect
\,.shinit
\,.shrc
\,.xinitrc
- \,/etc/default/*
+ \,.xprofile
+ \,.xsession
+ \,.xsessionrc
+ \,*/etc/default/*
\,configure
\,profile
\,shinit
\,shrc
\,xinitrc
+ \,xprofile
+ \,xsession
+ \,xsessionrc
+ \,*/etc/X11/xinit
+ \,*/etc/X11/Xreset
+ \,*/etc/X11/Xsession
\ let b:is_posix = 1
\|setfiletype sh
" SQL
@@ -378,17 +443,22 @@ augroup filetypedetect
\ ?*.sql
\ setfiletype sql
" OpenSSH configuration
+ "" client
autocmd BufNewFile,BufRead
- \ ssh_config,*/.ssh/config
+ \ ssh_config
+ \,*/ssh_config.d/*.conf
+ \,*/.ssh/config,
+ \,*/.ssh/config.d/*.conf
\ setfiletype sshconfig
+ "" server
+ autocmd BufNewFile,BufRead
+ \ sshd_config
+ \,*/sshd_config.d/*.conf
+ \ setfiletype sshdconfig
" sudoers(5)
autocmd BufNewFile,BufRead
\ sudoers
\,sudoers.tmp
- \ setfiletype sshdconfig
- " OpenSSH server configuration
- autocmd BufNewFile,BufRead
- \ sshd_config
\ setfiletype sudoers
" Subversion commit
autocmd BufNewFile,BufRead
@@ -396,8 +466,8 @@ augroup filetypedetect
\ setfiletype svn
" sysctl configuration files
autocmd BufNewFile,BufRead
- \ /etc/sysctl.conf
- \,/etc/sysctl.d/*.conf
+ \ */etc/sysctl.conf
+ \,*/etc/sysctl.d/*.conf
\ setfiletype sysctl
" Systemd unit files
autocmd BufNewFile,BufRead
@@ -411,10 +481,6 @@ augroup filetypedetect
autocmd BufNewFile,BufRead
\ ?*.ti
\ setfiletype terminfo
- " TextEditorAnywhere text field
- autocmd BufNewFile,BufRead
- \ TextEditorAnywhere_??_??_??.txt
- \ setfiletype textarea
" Tidy config
autocmd BufNewFile,BufRead
\ .tidyrc
@@ -425,6 +491,10 @@ augroup filetypedetect
\ .tmux.conf
\,tmux.conf
\ setfiletype tmux
+ " TOML configuration files
+ autocmd BufNewFile,BufRead
+ \ ?*.toml
+ \ setfiletype toml
" Tab-separated (TSV) files
autocmd BufNewFile,BufRead
\ ?*.tsv
@@ -453,9 +523,7 @@ augroup filetypedetect
" Add automatic commands to find .Xresources subfiles
autocmd BufNewFile,BufRead
\ .Xresources
- \,*/.Xresources.d/*
\,Xresources
- \,*/Xresources.d/*
\ setfiletype xdefaults
" XHTML files
autocmd BufNewFile,BufRead
@@ -505,8 +573,8 @@ augroup filetypedetect
" Clumsy attempt at typing files in `sudo -e` if a filename hasn't already
" been found
autocmd BufNewFile,BufRead
- \ /var/tmp/?*????????.*
- \,/var/tmp/?*.????????
+ \ */var/tmp/?*????????.*
+ \,*/var/tmp/?*.????????
\ if !did_filetype()
\| call filetype#repeat#Sudo()
\|endif
@@ -517,14 +585,14 @@ augroup filetypedetect
\,?*.txt
\,INSTALL
\,README
- \,/etc/issue
- \,/etc/motd
+ \,*/etc/issue
+ \,*/etc/motd
\ setfiletype text
autocmd BufNewFile,BufRead
\ ?*.cfg
\,?*.conf
\,?*.config
- \,/etc/*
+ \,*/etc/*
\ setfiletype conf
autocmd BufNewFile,BufRead
\ */log/*
diff --git a/vim/ftplugin/textarea.vim b/vim/ftplugin/textarea.vim
deleted file mode 100644
index 4db97b58..00000000
--- a/vim/ftplugin/textarea.vim
+++ /dev/null
@@ -1,12 +0,0 @@
-" Set mail message as an alternative filetype
-if !exists('b:alternate_filetypes')
- let b:alternate_filetypes = [&filetype, 'mail']
-endif
-
-" Stop here if the user doesn't want ftplugin mappings
-if exists('no_plugin_maps') || exists('no_textarea_maps')
- finish
-endif
-
-" #s expands to the #signature tag used in Cerb
-inoreabbrev #s #signature
diff --git a/vim/plugin/dist.vim b/vim/plugin/dist.vim
index 3a84abaa..94974f5f 100644
--- a/vim/plugin/dist.vim
+++ b/vim/plugin/dist.vim
@@ -14,3 +14,5 @@ let loaded_netrwPlugin = 1
let loaded_rrhelper = 1
" I don't need extra spelling files
let loaded_spellfile_plugin = 1
+" No thanks, just plain `less` is fine for manual pages
+let loaded_manpager_plugin = 1
diff --git a/vim/plugin/matchit.vim b/vim/plugin/matchit.vim
index f842bd9c..392b2728 100644
--- a/vim/plugin/matchit.vim
+++ b/vim/plugin/matchit.vim
@@ -1,5 +1,5 @@
" Get matchit.vim, one way or another
-if has('packages') && !has('nvim')
+if has('packages')
packadd matchit
else
runtime macros/matchit.vim
diff --git a/vim/scripts.vim b/vim/scripts.vim
index 3c3c53cd..e025a77a 100644
--- a/vim/scripts.vim
+++ b/vim/scripts.vim
@@ -13,14 +13,14 @@ if s:line !~# '^#!'
elseif s:line =~# '\<[gm]\=awk\d*\>'
setfiletype awk
-" Perl 5
+" Lua
+elseif s:line =~# '\<lua\d*\>'
+ setfiletype lua
+
+" Perl
elseif s:line =~# '\<perl5\=\>'
setfiletype perl
-" Perl 6
-elseif s:line =~# '\<perl6\>'
- setfiletype perl6
-
" PHP
elseif s:line =~# '\<php\d*\>'
setfiletype php
diff --git a/vim/syntax/jinja2.vim b/vim/syntax/jinja2.vim
new file mode 100644
index 00000000..2b4aef1a
--- /dev/null
+++ b/vim/syntax/jinja2.vim
@@ -0,0 +1,2 @@
+" Django is similar enough to Jinja2 to be useful for highlighting
+runtime! syntax/django.vim
diff --git a/vim/vimrc b/vim/vimrc
index fd7fa56b..66c1c68f 100644
--- a/vim/vimrc
+++ b/vim/vimrc
@@ -1,31 +1,31 @@
-" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-" Tom Ryder (tejr)’s Literate Vimrc
-" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+" -----------------------------------
+" Tom Ryder (tejr)'s Literate Vimrc
+" -----------------------------------
"
-" Last updated: Sat, 19 Sep 2020 08:36:41 UTC
+" Last updated: Sun, 14 Jan 2024 03:06:40 +0000
"
-" │ And I was lifted up in heart, and thought
-" │ Of all my late-shown prowess in the lists,
-" │ How my strong lance had beaten down the knights,
-" │ So many and famous names; and never yet
-" │ Had heaven appeared so blue, nor earth so green,
-" │ For all my blood danced in me, and I knew
-" │ That I should light upon the Holy Grail.
+" > And I was lifted up in heart, and thought
+" > Of all my late-shown prowess in the lists,
+" > How my strong lance had beaten down the knights,
+" > So many and famous names; and never yet
+" > Had heaven appeared so blue, nor earth so green,
+" > For all my blood danced in me, and I knew
+" > That I should light upon the Holy Grail.
"
-" —Tennyson
+" ---Tennyson
"
-" │ your vimrc is better than the bible
+" > your vimrc is better than the bible
"
-" —@polanco@mastodon.sdf.org
+" ---@polanco@mastodon.sdf.org
" <https://mastodon.sdf.org/@polanco/104069285780040986>
"
-" This file is an attempt at something like a “literate vimrc”, in the
-" tradition of Donald Knuth’s “literate programming”:
+" This file is an attempt at something like a "literate vimrc", in the
+" tradition of Donald Knuth's "literate programming":
" <http://www.literateprogramming.com/>
"
" The dotfiles project as part of which it is maintained is here:
-" <https://sanctum.geek.nz/cgit/dotfiles.git>
+" <https://dev.sanctum.geek.nz/cgit/dotfiles.git>
"
" This is a long file, and comments abound. Should this be bothersome, one
" could execute this command in Vim itself, to strip out comment blocks and
@@ -33,9 +33,9 @@
"
" :g/\m^$\|^\s*"/d
"
-" This file should be saved as ‘vimrc’—note no leading period—in the user
+" This file should be saved as `vimrc`---note no leading period---in the user
" runtime directory. On GNU/Linux, Mac OS X, and BSD, that directory is
-" ‘~/.vim’. On Windows, it’s ‘~/vimfiles’. It requires Vim v7.0.0 or newer,
+" `~/.vim`. On Windows, it's `~/vimfiles`. It requires Vim v7.0.0 or newer,
" including the +eval feature, and with the 'compatible' option turned off.
" That's to allow line continuations. The vimrc stub at ~/.vimrc (Unix) or
" ~/_vimrc (Windows) checks that these conditions are met before loading this
@@ -45,25 +45,25 @@
" problems with this file. <https://github.com/Kuniwak/vint>
"
-" We’ll begin by making sure that this file and Vim are speaking the same
-" language. Since it’s been the future for a few years now, this file
+" We'll begin by making sure that this file and Vim are speaking the same
+" language. Since it's been the future for a few years now, this file
" indulges in characters outside the ASCII character set. The presence of
" such characters prompts Vint to suggest declaring the file encoding with
" a :scriptencoding command:
"
-" │ vim/vimrc:1:1: Use scriptencoding when multibyte char exists (see :help
-" │ :scriptencoding)
+" > vim/vimrc:1:1: Use scriptencoding when multibyte char exists (see :help
+" > :scriptencoding)
"
" Furthermore, the :help for :scriptencoding specifies that :scriptencoding
" should be set *after* 'encoding'.
"
" Which encoding to use? The answer is the UTF-8 encoding for Unicode,
" wherever possible. On POSIX-fearing operating systems, I define the primary
-" locale environment variable $LANG to ‘en_NZ.UTF-8’. This informs Vim’s
+" locale environment variable $LANG to `en_NZ.UTF-8`. This informs Vim's
" choice of internal character encoding. In the absence of such a setting,
-" 'encoding' defaults to ‘latin1’ (ISO-8859-1) in most circumstances. Since
+" 'encoding' defaults to `latin1` (ISO-8859-1) in most circumstances. Since
" this is almost never what I want, even if I haven't said so explicitly by
-" exporting $LANG, we’ll fall back to UTF-8 instead.
+" exporting $LANG, we'll fall back to UTF-8 instead.
"
" However, we need to test that the +multi_byte feature is available before
" doing any of this, because it was a compile-time feature that wasn't even
@@ -72,49 +72,49 @@
"
" <https://github.com/vim/vim/releases/tag/v8.1.0733>
"
-if has#('multi_byte')
+if has('multi_byte')
if &encoding ==# 'latin1' && !exists('$LANG')
set encoding=utf-8
endif
scriptencoding utf-8
endif
-" With encoding handled, we’ll turn our attention to the value of the
+" With encoding handled, we'll turn our attention to the value of the
" 'runtimepath' option, since any scripts loaded from the paths specified
" therein control so much of the behavior of Vim. We build this path up as
-" accurately as possible, accounting for Vim’s unusual escaping behavior for
+" accurately as possible, accounting for Vim's unusual escaping behavior for
" these list options.
"
-" One of the first things we’ll need to be able to do is split the value of
+" One of the first things we'll need to be able to do is split the value of
" 'runtimepath' into its constituent paths. Correctly splitting the values of
" comma-separated Vim options is surprisingly complicated. It's not as simple
" as just splitting on commas, or even unescaped commas; a more accurate
" definition of the delimiter is:
"
-" │ Any comma not preceded by a backslash, followed by any number of spaces
-" │ and commas.
+" > Any comma not preceded by a backslash, followed by any number of spaces
+" > and commas.
"
" The pattern we use for the call to split() therefore breaks down like this:
"
-" \\ ← A literal backslash
-" \@<! ← A negative lookbehind assertion; this means that whatever
-" occurred before this pattern—in this case, a backslash—cannot
-" precede what follows, but anything that *does* precede it is
-" considered part of the datum, and not the delimiter.
-" , ← A literal comma
-" [, ]* ← Any number of commas and spaces
+" \\ <- A literal backslash
+" \@<! <- A negative lookbehind assertion; this means that whatever
+" occurred before this pattern---in this case, a backslash---
+" cannot precede what follows, but anything that *does* precede it
+" is considered part of the datum, and not the delimiter.
+" , <- A literal comma
+" [, ]* <- Any number of commas and spaces
"
-" We don’t, however, have to deal with backslashes before other backslashes,
+" We don't, however, have to deal with backslashes before other backslashes,
" nor before any other character. If this seems wrong to you, I encourage you
" to read the source code for the ad-hoc tokenizer in copy_option_part() in
-" src/misc2.c in Vim’s source code.
+" src/misc2.c in Vim's source code.
"
" Vim, I do love you, but sometimes you're really weird.
"
" We fold all that mess away into an autoloaded function option#Split(); see
" vim/autoload/option.vim. Provided a 'runtimepath' is actually set, using
" the list returned from that function, we define an environment variable
-" MYVIM—to complement MYVIMRC—for ~/.vim or ~/vimfiles, by retrieving the
+" MYVIM---to complement MYVIMRC---for ~/.vim or ~/vimfiles, by retrieving the
" first value from the 'runtimepath'. We'll use this later on in the file to
" comprehensively match expected paths for vimrc files.
"
@@ -124,37 +124,42 @@ endif
let $MYVIM = option#Split(&runtimepath)[0]
" The next components of the runtime directory that we'll set up here will
-" make use of the user’s configured XDG base directories:
+" make use of the user's configured XDG base directories:
"
" <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables>
"
" Note that this isn't an attempt to shoehorn all of Vim into the XDG mold;
" all of this distribution's files are still expected to be installed into
-" $MYVIM, per the above. We're just leaning on XDG’s conventions to provide
+" $MYVIM, per the above. We're just leaning on XDG's conventions to provide
" separate locations for cache files and other configuration.
"
" We'll start by retrieving the list of valid paths for configuration from
" both the XDG_CONFIG_HOME and XDG_CONFIG_DIRS variables, or from their
" defaults, using autoloaded xdg# functions.
"
-let s:xdgcachehome = xdg#CacheHome()
-let s:xdgconfigdirs = xdg#ConfigDirs()
-let s:xdgconfighome = xdg#ConfigHome()
-let s:xdgdatadirs = xdg#DataDirs()
-let s:xdgdatahome = xdg#DataHome()
+let s:xdgconfigdirs
+ \ = xdg#ConfigDirs()
+let s:xdgconfighome
+ \ = xdg#ConfigHome()
+let s:xdgdatadirs
+ \ = xdg#DataDirs()
+let s:xdgdatahome
+ \ = xdg#DataHome()
+let s:xdgstatehome
+ \ = xdg#StateHome()
" We put XDG_CONFIG_HOME at the front of the 'runtimepath' list with insert(),
" provided it isn't empty, which is what the function returns when the
" configured path isn't absolute. This is per the standard's dictum:
"
-" │ All paths set in these environment variables must be absolute. If an
-" │ implementation encounters a relative path in any of these variables it
-" │ should consider the path invalid and ignore it.
+" > All paths set in these environment variables must be absolute. If an
+" > implementation encounters a relative path in any of these variables it
+" > should consider the path invalid and ignore it.
"
-" —XDG Base Directory Specification v0.7 (24th November 2010), "Basics",
+" ---XDG Base Directory Specification v0.7 (24th November 2010), "Basics",
" <https://specifications.freedesktop.org/basedir-spec/0.7/ar01s02.html>
"
-" Ours not to reason why…
+" Ours not to reason why...
"
if s:xdgconfighome !=# '' || !empty(s:xdgconfigdirs)
execute 'set runtimepath^='.option#Escape(join(map(
@@ -179,16 +184,16 @@ endif
" write its own history to the default viminfo path instead.
"
" This is the portable way to specify the path to the viminfo file, as an
-" addendum of the path to the 'viminfo' option with an ‘n’ prefix. Vim
+" addendum of the path to the 'viminfo' option with an `n` prefix. Vim
" v8.1.716 introduced a way to set this with an option named 'viminfofile',
" but I don't see a reason to use that.
"
-if s:xdgcachehome !=# ''
- if !isdirectory(s:xdgcachehome)
- call mkdir(s:xdgcachehome, 'p', 0700)
+if s:xdgstatehome !=# ''
+ if !isdirectory(s:xdgstatehome)
+ call mkdir(s:xdgstatehome, 'p', 0700)
endif
execute 'set viminfo+='.option#Escape(
- \ 'n'.s:xdgcachehome.'/viminfo'
+ \ 'n'.s:xdgstatehome.'/viminfo'
\)
endif
@@ -202,16 +207,16 @@ endif
"
set history=300
-" We’ll now enable automatic backups of most file buffers, since that’s off by
-" default. In practice, I don’t need these backups very much, at least if I’m
+" We'll now enable automatic backups of most file buffers, since that's off by
+" default. In practice, I don't need these backups very much, at least if I'm
" using version control sensibly, but they have still saved my bacon a few
" times.
"
-" We’ll try to keep the backup files in a dedicated cache directory, to stop
+" We'll try to keep the backup files in a dedicated cache directory, to stop
" them popping up next to the file to which they correspond, and getting
" accidentally committed to version control.
"
-" If Vim is new enough, we’ll add two trailing slashes to the path we’re
+" If Vim is new enough, we'll add two trailing slashes to the path we're
" inserting, which prompts Vim to incorporate the full escaped path of the
" relevant buffer in the backup filename, avoiding collisions.
"
@@ -219,26 +224,26 @@ set history=300
" this trailing slashes hint for a long time before 'backupdir' caught up to
" them. The 'directory' option for swap files has supported it at least as
" far back as v5.8.0 (2001), and 'undodir' appears to have supported it since
-" its creation in v7.2.438. Even though ‘:help 'backupdir'’ didn’t say so,
+" its creation in v7.2.438. Even though `:help 'backupdir'` didn't say so,
" people assumed it would work the same way, when in fact Vim simply ignored
" it until v8.1.0251.
"
-" I don’t want to add the slashes to the option value in older versions of Vim
-" where they don’t do anything, so we’ll check the version ourselves to see if
-" there’s any point in including them.
+" I don't want to add the slashes to the option value in older versions of Vim
+" where they don't do anything, so we'll check the version ourselves to see if
+" there's any point in including them.
"
" <https://github.com/vim/vim/releases/tag/v8.1.0251>
"
-" It’s all so awkward. Surely separate options named something like
+" It's all so awkward. Surely separate options named something like
" 'backupfullname', 'swapfilefullname' would have been clearer.
"
set backup
-if s:xdgcachehome !=# ''
- if !isdirectory(s:xdgcachehome.'/backup')
- call mkdir(s:xdgcachehome.'/backup', 'p', 0700)
+if s:xdgstatehome !=# ''
+ if !isdirectory(s:xdgstatehome.'/backup')
+ call mkdir(s:xdgstatehome.'/backup', 'p', 0700)
endif
execute 'set backupdir^='.option#Escape(option#item#Escape(
- \ s:xdgcachehome.'/backup'.(has#('patch-8.1.251') ? '//' : '')
+ \ s:xdgstatehome.'/backup'.(patch#('8.1.251') ? '//' : '')
\))
endif
@@ -248,24 +253,24 @@ endif
" default value of 'backupskip' here, in order to prevent the creation of such
" undesired backup files.
"
-if has#('unix')
+if has('unix')
- " Prior to v8.1.1519, Vim didn’t check patterns added to 'backupskip' for
- " uniqueness, so adding the same path repeatedly resulted in duplicate strings
- " in the value. This was due to the absence of the P_NODUP flag for the
- " option’s definition in src/option.c in the Vim source code. If we’re using
- " a version older than v8.1.1519, we’ll need to explicitly reset 'backupskip'
- " to its default value before adding patterns to it, so that reloading this
- " file doesn’t stack up multiple copies of any added paths.
+ " Prior to v8.1.1519, Vim didn't check patterns added to 'backupskip' for
+ " uniqueness, so adding the same path repeatedly resulted in duplicate
+ " strings in the value. This was due to the absence of the P_NODUP flag for
+ " the option's definition in src/option.c in the Vim source code. If we're
+ " using a version older than v8.1.1519, we'll need to explicitly reset
+ " 'backupskip' to its default value before adding patterns to it, so that
+ " reloading this file doesn't stack up multiple copies of any added paths.
"
" <https://github.com/vim/vim/releases/tag/v8.1.1519>
"
- if !has#('patch-8.1.1519')
+ if !patch#('8.1.1519')
set backupskip&
endif
" Typical temporary file locations
- "" RAM disk, default path for password-store’s temporary files
+ "" RAM disk, default path for password-store's temporary files
set backupskip+=/dev/shm/*
"" Hard-coded paths for sudoedit
set backupskip+=/usr/tmp/*,/var/tmp/*
@@ -288,19 +293,18 @@ if has#('unix')
endif
-
" Keep swap files for file buffers in a dedicated directory, rather than the
" default of writing them to the same directory as the buffer file. Add two
" trailing slashes to the path to prompt Vim to use the full escaped path in
" its name, in order to avoid filename collisions, since the 'directory'
" option has supported that hint for much longer than 'backupdir' has.
"
-if s:xdgcachehome !=# ''
- if !isdirectory(s:xdgcachehome.'/swap')
- call mkdir(s:xdgcachehome.'/swap', 'p', 0700)
+if s:xdgstatehome !=# ''
+ if !isdirectory(s:xdgstatehome.'/swap')
+ call mkdir(s:xdgstatehome.'/swap', 'p', 0700)
endif
execute 'set directory^='.option#Escape(option#item#Escape(
- \ s:xdgcachehome.'/swap//'
+ \ s:xdgstatehome.'/swap//'
\))
endif
@@ -311,18 +315,18 @@ endif
" The 'undodir' option has the same structure as 'backupdir' and 'directory';
" if we have a user cache directory, create a subdirectory within it dedicated
" to the undo files cache. Note also the trailing double-slash as a signal to
-" Vim to use the full path of the original file in its undo file cache’s name.
+" Vim to use the full path of the original file in its undo file cache's name.
"
" Support for these persistent undo file caches was not released until v7.3.0,
-" so we need to check for the feature’s presence before we enable it.
+" so we need to check for the feature's presence before we enable it.
"
-if s:xdgcachehome !=# '' && has#('persistent_undo')
+if s:xdgstatehome !=# '' && has('persistent_undo')
set undofile
- if !isdirectory(s:xdgcachehome.'/undo')
- call mkdir(s:xdgcachehome.'/undo', 'p', 0700)
+ if !isdirectory(s:xdgstatehome.'/undo')
+ call mkdir(s:xdgstatehome.'/undo', 'p', 0700)
endif
execute 'set undodir^='.option#Escape(option#item#Escape(
- \ s:xdgcachehome.'/undo//'
+ \ s:xdgstatehome.'/undo//'
\))
endif
@@ -331,12 +335,12 @@ endif
" directories of this type. This isn't a comma-separated list like the others
" ('backupdir', 'directory', 'spell', 'undodir')
"
-if s:xdgcachehome !=# '' && has#('mksession')
- if !isdirectory(s:xdgcachehome.'/view')
- call mkdir(s:xdgcachehome.'/view', 'p', 0700)
+if s:xdgstatehome !=# '' && has('mksession')
+ if !isdirectory(s:xdgstatehome.'/view')
+ call mkdir(s:xdgstatehome.'/view', 'p', 0700)
endif
execute 'set viewdir='.option#Escape(option#item#Escape(
- \ s:xdgcachehome.'/view'
+ \ s:xdgstatehome.'/view'
\))
endif
@@ -394,7 +398,7 @@ if exists('##SourceCmd')
\ ReloadVimrc
endif
-" For spelling, use New Zealand English by default, but later on we’ll
+" For spelling, use New Zealand English by default, but later on we'll
" configure a leader mapping to switch to United States English, since I so
" often have to write for Yankees.
"
@@ -403,11 +407,11 @@ set spelllang=en_nz
" Spell checking includes optional support for catching lower case letters at
" the start of sentences, and defines a pattern in 'spellcapcheck' for the end
" of a sentence. The default is pretty good, but with two-spacing with
-" 'cpoptions' including ‘J’ and 'formatoptions' including ‘p’ as set later in
+" 'cpoptions' including `J` and 'formatoptions' including `p` as set later in
" this file, we can be less ambiguous in this pattern. We require two
" consecutive spaces, a newline, a carriage return, or a tab to mark the end
-" of a sentence. This means that we could make abbreviations like “i.e.
-" something” without flagging “something” as a spelling error.
+" of a sentence. This means that we could make abbreviations like "i.e.
+" something" without flagging "something" as a spelling error.
"
set spellcapcheck=[.?!]\\%(\ \ \\\|[\\n\\r\\t]\\)
@@ -423,18 +427,18 @@ if exists('+spelloptions')
endif
" For word completion in insert mode with CTRL-X CTRL-K, or if 'complete'
-" includes the ‘k’ flag, the 'dictionary' option specifies the path to the
+" includes the `k` flag, the 'dictionary' option specifies the path to the
" system word list. This makes the dictionary completion work consistently,
-" even if 'spell' isn’t set at the time to coax it into using 'spellfile'.
+" even if 'spell' isn't set at the time to coax it into using 'spellfile'.
"
-" It’s not an error if the system directory file added first doesn’t exist;
-" it’s just a common location that often yields a workable word list, and does
+" It's not an error if the system directory file added first doesn't exist;
+" it's just a common location that often yields a workable word list, and does
" so on all of my main machines.
"
" At some point, I may end up having to set this option along with 'spellfile'
" a bit more intelligently to ensure that spell checking and dictionary
" function consistently, and with reference to the same resources. For the
-" moment, I’ve just added additional entries referring to the user runtime
+" moment, I've just added additional entries referring to the user's data
" directory.
"
set dictionary^=/usr/share/dict/words
@@ -449,11 +453,11 @@ if s:xdgdatahome !=# '' || !empty(s:xdgdatadirs)
endif
" In much the same way as 'dictionary', we add an expected path to
-" a thesaurus, for completion with CTRL-X CTRL-T in insert mode, or with ‘t’
-" added to 'completeopt'. The thesaurus data isn’t installed as part of the
-" default ‘install-vim’ target in tejr’s dotfiles, but a decent one can be
+" a thesaurus, for completion with CTRL-X CTRL-T in insert mode, or with `t`
+" added to 'completeopt'. The thesaurus data isn't installed as part of the
+" default `install-vim` target in tejr's dotfiles, but a decent one can be
" retrieved from my website at <https://sanctum.geek.nz/ref/thesaurus.txt>.
-" I got this from the link in the :help for 'thesaurus' in v8.1. It’s from
+" I got this from the link in the :help for 'thesaurus' in v8.1. It's from
" WordNet and MyThes-1. I had to remove the first two metadata lines from
" thesaurus.txt, as Vim appeared to interpret them as part of the body data.
"
@@ -467,11 +471,11 @@ if s:xdgdatahome !=# '' || !empty(s:xdgdatadirs)
\), ','))
endif
-" Next, we’ll modernize a little in adjusting some options with old
+" Next, we'll modernize a little in adjusting some options with old
" language-specific defaults.
"
" Traditional vi was often used for development in the C programming language.
-" The default values for a lot of Vim’s options still reflect this common use
+" The default values for a lot of Vim's options still reflect this common use
" pattern. In this case, the 'comments' and 'commentstring' options reflect
" the C syntax for comments:
"
@@ -486,20 +490,20 @@ endif
"
" #include "baz.h"
"
-" Times change, however, and I don’t get to work with C nearly as much as I’d
+" Times change, however, and I don't get to work with C nearly as much as I'd
" like. The defaults for these options no longer make sense, and so we blank
" them, compelling filetype plugins to set them as they need instead.
"
" The default value for the 'path' option is similar, in that it has an aged
" default; this option specifies directories in which project files and
-" includes can be unearthed by navigation commands like 'gf'. Specifically,
-" its default value comprises /usr/include, which is another C default. Let’s
+" includes can be unearthed by navigation commands like `gf`. Specifically,
+" its default value comprises /usr/include, which is another C default. Let's
" get rid of that, too.
"
set comments= commentstring= define= include=
set path-=/usr/include
-" Relax traditional vi’s harsh standards over what regions of the buffer can
+" Relax traditional vi's harsh standards over what regions of the buffer can
" be removed with backspace in insert mode. While this admittedly allows bad
" habits to continue, since insert mode by definition is not really intended
" for deleting text, I feel the convenience outweighs that in this case.
@@ -509,7 +513,7 @@ set backspace+=indent " Leading whitespace characters created by 'autoindent'
set backspace+=start " Text before the start of the current insertion
" When soft-wrapping text with the 'wrap' option on, which is off by default,
-" break the lines between words, rather than within them; it’s much easier to
+" break the lines between words, rather than within them; it's much easier to
" read.
"
set linebreak
@@ -522,11 +526,11 @@ set linebreak
" … U+2026 HORIZONTAL ELLIPSIS
"
" Note that we test for the presence of a multi-byte encoding with a special
-" feature from ‘:help feature-list’, as recommended by ‘:help encoding’.
-" Checking that ‘&encoding ==# 'utf-8'’ is not quite the same thing, though
-" it’s unlikely I’ll ever use a different Unicode encoding by choice.
+" feature from `:help feature-list`, as recommended by `:help encoding`.
+" Checking that `&encoding ==# 'utf-8'` is not quite the same thing, though
+" it's unlikely I'll ever use a different Unicode encoding by choice.
"
-if has#('multi_byte_encoding')
+if has('multi_byte_encoding')
set showbreak=…
else
set showbreak=...
@@ -534,16 +538,16 @@ endif
" The visual structure of code provided by indents breaks down if a lot of the
" lines wrap. Ideally, most if not all lines would be kept below 80
-" characters, but in cases where this isn’t possible, soft-wrapping longer
+" characters, but in cases where this isn't possible, soft-wrapping longer
" lines when 'wrap' is on so that the indent is preserved in the following
" line mitigates this breakdown somewhat.
"
-" With this 'breakindent' option set, it’s particularly important to have
+" With this 'breakindent' option set, it's particularly important to have
" 'showbreak' set to something besides an empty string, as done above,
-" otherwise without line numbers it’s hard to tell what’s a logical line and
-" what’s not.
+" otherwise without line numbers it's hard to tell what's a logical line and
+" what's not.
"
-" The 'breakindent' option wasn’t added until v7.4.338, so we need to check it
+" The 'breakindent' option wasn't added until v7.4.338, so we need to check it
" exists before we set it.
"
" <https://github.com/vim/vim/releases/tag/v7.4.338>
@@ -552,20 +556,28 @@ if exists('+breakindent')
set breakindent
endif
+" I use `cd` with no argument to go $HOME in the shell all the time.
+" Analogous behavior for Vim with :cd makes sense to me. I can use :pwd (or
+" my <Leader>g mapping) if I want to see where I am.
+"
+if exists('+cdhome')
+ set cdhome
+endif
+
" Rather than rejecting operations like :write or :saveas when 'readonly' is
" set or in other situations in which data might be lost, Vim should give me
-" a prompt to allow me to confirm that I know what I’m doing.
+" a prompt to allow me to confirm that I know what I'm doing.
"
set confirm
-" If Vim receives an Escape key code in insert mode, it shouldn’t wait to see
-" if it’s going to be followed by another key code, despite this being how the
+" If Vim receives an Escape key code in insert mode, it shouldn't wait to see
+" if it's going to be followed by another key code, despite this being how the
" function keys and Meta/Alt modifier are implemented for many terminal types.
-" Otherwise, if I press Escape, there’s an annoying delay before 'showmode'
-" stops showing '--INSERT--'.
+" Otherwise, if I press Escape, there's an annoying delay before 'showmode'
+" stops showing `--INSERT--`.
"
" This breaks the function keys and the Meta/Alt modifier in insert mode in
-" most or maybe all of the terminals I use, but I don’t want those keys in
+" most or maybe all of the terminals I use, but I don't want those keys in
" insert mode, anyway. All of this works fine in the GUI, of course.
"
set noesckeys
@@ -576,109 +588,109 @@ set noesckeys
set foldlevel=256
" Automatic text wrapping options using flags in the 'formatoptions' option
-" begin here. I rely on the filetype plugins to set the ‘t’ and ‘c’ flags for
+" begin here. I rely on the filetype plugins to set the `t` and `c` flags for
" this option to configure whether text or comments should be wrapped, as
-" appropriate for the document type or language, and so I don’t mess with
+" appropriate for the document type or language, and so I don't mess with
" either of those flags here.
" If a line is already longer than 'textwidth' would otherwise limit when
-" editing of that line begins in insert mode, don’t suddenly automatically
-" wrap it; I’ll break it apart myself with a command like ‘gq’. This doesn’t
-" seem to stop paragraph reformatting with ‘a’, if that’s set.
+" editing of that line begins in insert mode, don't suddenly automatically
+" wrap it; I'll break it apart myself with a command like `gq`. This doesn't
+" seem to stop paragraph reformatting with `a`, if that's set.
"
set formatoptions+=l
-" Don’t wrap a line in such a way that a single-letter word like “I” or “a” is
+" Don't wrap a line in such a way that a single-letter word like "I" or "a" is
" at the end of it. Typographically, as far as I can tell, this seems to be
-" a stylistic preference rather than a rule, rather like avoiding “widow” and
-" “orphan” lines in typesetting. I think it generally looks better to have
-" the short word start the line, so we’ll switch it on.
+" a stylistic preference rather than a rule, rather like avoiding "widow" and
+" "orphan" lines in typesetting. I think it generally looks better to have
+" the short word start the line, so we'll switch it on.
"
set formatoptions+=1
" If the filetype plugins have correctly described what the comment syntax for
-" the buffer’s language looks like, it makes sense to use that to figure out
+" the buffer's language looks like, it makes sense to use that to figure out
" how to join lines within comments without redundant comment syntax cropping
-" up. For example, with this set, joining lines in this very comment with ‘J’
-" would remove the leading ‘"’ characters.
+" up. For example, with this set, joining lines in this very comment with `J`
+" would remove the leading `"` characters.
"
-" This 'formatoptions' flag wasn’t added until v7.3.541. Because we can’t
+" This 'formatoptions' flag wasn't added until v7.3.541. Because we can't
" test for the availability of option flags directly, we resort to a version
-" number check before attempting to set it. I don’t like using :silent! to
+" number check before attempting to set it. I don't like using :silent! to
" suppress errors for this sort of thing when I can reasonably avoid it, even
" if the tests are somewhat more verbose.
"
" <https://github.com/vim/vim/releases/tag/v7.3.541>
"
-if has#('patch-7.3.541')
+if patch#('7.3.541')
set formatoptions+=j
endif
-" A momentary digression here into the doldrums of 'cpoptions'—after staunchly
-" opposing it for years, I have converted to two-spacing. You can blame Steve
-" Losh:
+" A momentary digression here into the doldrums of 'cpoptions'---after
+" staunchly opposing it for years, I have converted to two-spacing. You can
+" blame Steve Losh:
"
" <http://stevelosh.com/blog/2012/10/why-i-two-space/>
"
-" Consequently, we specify that sentence objects for the purposes of the ‘s’
-" text object, the ‘(’ and ‘)’ sentence motions, and formatting with the 'gq'
+" Consequently, we specify that sentence objects for the purposes of the `s`
+" text object, the `(` and `)` sentence motions, and formatting with the 'gq'
" command must be separated by *two* spaces. One space does not suffice.
"
" My defection to the two-spacers is also the reason I now leave 'joinspaces'
" set, per its default, so that two spaces are inserted when consecutive
-" sentences separated by a line break are joined onto one line by the ‘J’
+" sentences separated by a line break are joined onto one line by the `J`
" command.
"
set cpoptions+=J
" Separating sentences with two spaces has an advantage in making a clear
" distinction between two different types of periods: periods that abbreviate
-" longer words, as in “Mr. Moolenaar”, and periods that terminate sentences,
+" longer words, as in "Mr. Moolenaar", and periods that terminate sentences,
" like this one.
"
-" If we’re using two-period spacing for sentences, Vim can interpret the
+" If we're using two-period spacing for sentences, Vim can interpret the
" different spacing to distinguish between the two types, and can thereby
" avoid breaking a line just after an abbreviating period. For example, the
-" two words in “Mr. Moolenaar” should never be split apart, lest the
-" abbreviation “Mr.” look too much like the end of a sentence. This also
+" two words in "Mr. Moolenaar" should never be split apart, lest the
+" abbreviation "Mr." look too much like the end of a sentence. This also
" preserves the semantics of that same period for subsequent reformatting; its
-" single-space won’t get lost.
+" single-space won't get lost.
"
-" So, getting back to our 'formatoptions' settings, that is what the ‘p’ flag
+" So, getting back to our 'formatoptions' settings, that is what the `p` flag
" does. I wrote the patch that added it, after becoming envious of an
" analogous feature during an ill-fated foray into GNU Emacs usage.
"
" <https://github.com/vim/vim/releases/tag/v8.1.1523>
"
-if has#('patch-8.1.728')
+if patch#('8.1.728')
set formatoptions+=p
endif
" In an effort to avoid loading unnecessary files, we add a flag to the
" 'guioptions' option to prevent the menu.vim runtime file from being loaded.
-" It doesn’t do any harm, but I never use it, and it’s easy to turn it off.
+" It doesn't do any harm, but I never use it, and it's easy to turn it off.
"
-" The documentation for this flag in ‘:help 'go-M'’ includes a note saying the
+" The documentation for this flag in `:help 'go-M'` includes a note saying the
" flag should be set here, rather that in the GUI-specific gvimrc file, as one
" might otherwise think.
"
-if has#('gui_running')
+if has('gui_running')
set guioptions+=M
endif
-" By default, Vim doesn’t allow a file buffer to have unwritten changes if
-" it’s not displayed in a window. Setting this option removes that
+" By default, Vim doesn't allow a file buffer to have unwritten changes if
+" it's not displayed in a window. Setting this option removes that
" restriction so that buffers can remain in a modified state while not
" actually displayed anywhere.
"
-" This option is set in almost every vimrc I read; it’s so pervasive that
-" I sometimes see comments expressing astonishment or annoyance that it isn’t
-" set by default. However, I didn’t actually need this option for several
+" This option is set in almost every vimrc I read; it's so pervasive that
+" I sometimes see comments expressing astonishment or annoyance that it isn't
+" set by default. However, I didn't actually need this option for several
" years of Vim usage, because I instinctively close windows onto buffers only
" after the buffers within them have been written anyway.
"
" However, the option really is required for batch operations performed with
-" commands like :argdo or :bufdo, because Vim won’t otherwise tolerate
+" commands like :argdo or :bufdo, because Vim won't otherwise tolerate
" unwritten changes to a litany of buffers that are not displayed in any
" window. After I started using such command maps a bit more often,
" I realized I finally had a reason to turn this on permanently.
@@ -693,16 +705,16 @@ set hidden
set hlsearch
nohlsearch
-" Highlight search matches in my text while I’m still typing my pattern,
+" Highlight search matches in my text while I'm still typing my pattern,
" including scrolling the screen to show the first such match if necessary.
" This can be somewhat jarring, particularly when the cursor ends up scrolling
" a long way from home in a large file, but I think the benefits of being able
-" to see instances of what I’m trying to match as I type the pattern do
+" to see instances of what I'm trying to match as I type the pattern do
" outweigh that discomfort.
"
set incsearch
-" Don’t waste cycles and bandwidth redrawing the screen during execution of
+" Don't waste cycles and bandwidth redrawing the screen during execution of
" macro recordings and scripts.
"
set lazyredraw
@@ -719,39 +731,39 @@ set listchars+=trail:- " Trailing spaces
set listchars+=nbsp:+ " Non-breaking spaces
" The next pair of 'list' characters are arguably somewhat misplaced, in that
-" they don’t really represent invisible characters in the same way as the
+" they don't really represent invisible characters in the same way as the
" others, but are hints for the presence of other characters on unwrapped
-" lines that are wider than the screen. They’re very useful, though.
+" lines that are wider than the screen. They're very useful, though.
"
" If the current encoding supports it, use these non-ASCII characters for the
-" markers, as they’re visually distinctive:
+" markers, as they're visually distinctive:
"
" extends: Signals presence of unwrapped text to screen right
" » U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
" precedes: Signals presence of unwrapped text to screen left
" « U+00BB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
"
-" Failing that, ‘<’ and ‘>’ will do the trick.
+" Failing that, `<` and `>` will do the trick.
"
-if has#('multi_byte_encoding')
+if has('multi_byte_encoding')
set listchars+=extends:»,precedes:«
else
set listchars+=extends:>,precedes:<
endif
-" Don’t let your editor’s options be configured by content in arbitrary files!
-" Down with modelines! Purge them from your files! Écrasez l’infâme!
+" Don't let your editor's options be configured by content in arbitrary files!
+" Down with modelines! Purge them from your files! Écrasez l'infâme!
"
-" I think that modelines are Vim’s worst misfeature, and that 'nomodeline'
-" should be the default. It’s enabled pretty bad security vulnerabilities
-" over the years, and it’s a lot more effective to use filetype detection,
+" I think that modelines are Vim's worst misfeature, and that 'nomodeline'
+" should be the default. It's enabled pretty bad security vulnerabilities
+" over the years, and it's a lot more effective to use filetype detection,
" other automatic command hooks, or methods like .editorconfig to set
" variables specifically for a buffer or project.
"
set nomodeline
" The only octal numbers I can think of that I ever even encounter are Unix
-" permissions masks, and I’d never use CTRL-A or CTRL-X to increment them.
+" permissions masks, and I'd never use CTRL-A or CTRL-X to increment them.
" Numbers with leading zeroes are far more likely to be decimals.
"
set nrformats-=octal
@@ -767,7 +779,7 @@ set nrformats-=octal
set noruler
" Sessions preserve window, tab, and buffer layout, and are thereby great for
-" more complex and longer-term projects like books, but they don’t play
+" more complex and longer-term projects like books, but they don't play
" together well with plugins and filetype plugins. Restoring the same
" settings from both reloaded plugins and from the session causes screeds of
" errors. Adjusting session behavior to stop it trying to restore the sorts
@@ -776,65 +788,69 @@ set noruler
set sessionoptions-=localoptions " No buffer options or mappings
set sessionoptions-=options " No global options or mappings
-" Turn 'showcmd' off if a system vimrc has been rude enough to set it; I don’t
+" Turn 'showcmd' off if a system vimrc has been rude enough to set it; I don't
" like how it can interfere with the display of longer lines.
"
set noshowcmd
-" The ‘I’ flag for the 'shortmess' option prevents the display of the Vim
+" The `I` flag for the 'shortmess' option prevents the display of the Vim
" startup screen with version information, :help hints, and donation
-" suggestion. After I registered Vim and donated to Uganda per the screen’s
-" plea, I didn’t feel bad about turning this off anymore. Even with this
-" setting in place, I wouldn’t normally see it too often anyway, as I seldom
+" suggestion. After I registered Vim and donated to Uganda per the screen's
+" plea, I didn't feel bad about turning this off anymore. Even with this
+" setting in place, I wouldn't normally see it too often anyway, as I seldom
" start Vim with no file arguments.
"
-" I haven’t felt the need to mess with the other flags in this option.
-" I don’t have any problems with spurious Enter prompts, which seems to be the
+" I haven't felt the need to mess with the other flags in this option.
+" I don't have any problems with spurious Enter prompts, which seems to be the
" main reason people pile it full of letters.
"
set shortmess+=I
+" Scrolling by screen line rather than file line makes sense to me. Turn the
+" option to do so on, if it's there. This only works with mouse scrolling,
+" which I don't use, and with CTRL-E, CTRL-Y, which I should be using more
+" anyway.
+"
+if exists('+smoothscroll')
+ set smoothscroll
+endif
+
" I find the defaults of new windows opening above or to the left of the
-" previous window too jarring, because I’m used to both the i3 window manager
+" previous window too jarring, because I'm used to both the i3 window manager
" and the tmux terminal multiplexer doing it the other way around, in reading
" order. I prefer the visual effect of the previous text staying where it is,
" and the new window occupying previously blank space.
"
set splitbelow splitright
-" Vim has an internal list of terminal types that support using smoother
-" terminal redrawing, and for which 'ttyfast' is normally set, described in
-" ‘:help 'ttyfast'’. That list includes most of the terminals I use, but
-" there are a couple more for which the 'ttyfast' option should apply: the
-" windows terminal emulator PuTTY, and the terminal multiplexer tmux, both of
-" which I use heavily.
+" I don't like the titles of my terminal windows being changed, especially
+" when changing them back doesn't actually work. Just leave them alone, Vim,
+" even if you think you can handle it.
"
-if &term =~# '^putty\|^tmux'
- set ttyfast
-endif
+set notitle
-" We really don’t want a mouse; while I use it a lot for cut and paste in X,
+" We really don't want a mouse; while I use it a lot for cut and paste in X,
" it just gets in the way if the tool running in the terminal tries to use it
" too. Mouse events should be exclusively handled by the terminal emulator
-" application, so Vim shouldn’t try to give me terminal mouse support, even if
+" application, so Vim shouldn't try to give me terminal mouse support, even if
" it would work.
"
" The manual suggests that disabling this should be done by clearing 't_RV',
-" but that didn’t actually seem to work when I tried it.
+" but that didn't actually seem to work when I tried it.
"
set ttymouse=
" While using virtual block mode, allow me to navigate to any column of the
-" buffer window; don’t confine the boundaries of the block to the coordinates
+" buffer window; don't confine the boundaries of the block to the coordinates
" of characters that actually exist in the buffer text. While working with
-" formatted columnar data with this off is generally OK, it’s a hassle for
+" formatted columnar data with this off is generally OK, it's a hassle for
" more subtle applications of visual block mode.
"
set virtualedit+=block
-" I can’t recall a time that Vim’s error beeping or flashing was actually
+" I can't recall a time that Vim's error beeping or flashing was actually
" useful to me, and so we turn it off in the manner that the manual instructs
-" in ‘:help 'visualbell'’. This enables visual rather than audio error bells,
+" in `:help 'visualbell'`. This enables visual rather than audio error bells,
" but in the same breath, blanks the terminal attribute that would be used to
" trigger such screen blinking, indirectly disabling the bell altogether.
"
@@ -853,7 +869,7 @@ set visualbell t_vb=
"
" The default value of 'full' for the 'wildmode' option puts the full
" completion onto the line immediately, which I tolerate for insert mode
-" completion but don’t really like on the Ex command line. Instead, I arrange
+" completion but don't really like on the Ex command line. Instead, I arrange
" for that to happen only with a second key press.
"
set wildmenu
@@ -861,7 +877,7 @@ set wildmode=list:longest,full
" Define a list of patterns to ignore for file and directory command line
" completion. Files and directories with names matching any of these patterns
-" won’t be presented as candidates for tab completion on the command line.
+" won't be presented as candidates for tab completion on the command line.
"
" To make this list, I went right through my home directory with
" a `find`-toothed comb; counted the occurrences of every extension, forced
@@ -870,7 +886,7 @@ set wildmode=list:longest,full
"
" The following incantation does the trick with POSIX-compatible shell tools,
" giving patterns for the top 100 alphanumeric extensions for files from the
-" running user’s home directory:
+" running user's home directory:
"
" $ (LC_ALL=C ; find "$HOME" ! -type d -name '*.?*' -exec \
" sh -c 'for fn ; do
@@ -885,9 +901,9 @@ set wildmode=list:longest,full
"
" I turned out to have rather a lot of .html and .vim files.
"
-" If you’re scoffing at that and thinking “I could write a much simpler one,”
+" If you're scoffing at that and thinking "I could write a much simpler one,"
" please do so, and send it to me at <tom@sanctum.geek.nz> to have yours put
-" in here instead, with appropriate credit. Don’t forget to handle more than
+" in here instead, with appropriate credit. Don't forget to handle more than
" ARG_MAX files, include filenames with newlines, and that the -z or -0 null
" separator extensions are not standardized in POSIX.
"
@@ -903,12 +919,12 @@ set wildignore=*~,#*#,*.7z,.DS_Store,.git,.hg,.svn,*.a,*.adf,*.asc,*.au,*.aup
" Allow me to type a path to complete on the Ex command line in all-lowercase,
" and transform the consequent completion to match the appropriate case, like
-" the Readline setting ‘completion-ignore-case’ can be used for GNU Bash.
+" the Readline setting `completion-ignore-case` can be used for GNU Bash.
"
" When completing filenames on the command line, choose completions without
" regard to case, allowing me the ease of typing a partial path in
" all-lowercase. This is very similar to the Readline setting
-" ‘completion-ignore-case’ used for Bash.
+" `completion-ignore-case` used for Bash.
"
" The 'wildignorecase' option is not related to the similarly-named
" 'wildignore' option, nor to the +wildmenu feature.
@@ -922,7 +938,7 @@ if exists('+wildignorecase')
set wildignorecase
endif
-" Enable syntax highlighting, but only if it’s not already on, to save
+" Enable syntax highlighting, but only if it's not already on, to save
" reloading the syntax files unnecessarily.
"
" <https://sanctum.geek.nz/blinkenlights/syntax-on.jpg>
@@ -930,41 +946,41 @@ endif
" For several months in 2018, as an experiment, I tried using terminals with
" no color at all, imitating a phenomenally productive BSD purist co-worker
" who abhorred color in any form on his terminals. He only drank black
-" coffee, too. If you’re reading this: Hello, bdh!
+" coffee, too. If you're reading this: Hello, bdh!
"
" That experiment was instructive and interesting, and I found I had been
" leaning on color information in some surprising ways. However, some months
" later, I found I still missed my colors, and so I went back to my
-" Kodachrome roots, and didn’t pine at all for that monochrome world.
+" Kodachrome roots, and didn't pine at all for that monochrome world.
"
" The thing I most like about syntax highlighting is detecting runaway
" strings, which generally works in even the most threadbare language syntax
-" highlighting definitions. I kept missing such errors when I didn’t have the
-" colors. I don’t have high standards for it otherwise, except maybe for
+" highlighting definitions. I kept missing such errors when I didn't have the
+" colors. I don't have high standards for it otherwise, except maybe for
" shell script.
"
if !exists('syntax_on')
syntax enable
endif
-" Before we attempt to pick a syntax highlighting color scheme, we’ll set up
+" Before we attempt to pick a syntax highlighting color scheme, we'll set up
" a couple of hooks for color scheme loading. In this case, we turn
-" 'cursorline' on if my 'sahara' color scheme is loaded, since I’ve configured
-" it to be a very dark gray that doesn’t stand out too much against a black
+" 'cursorline' on if my 'sahara' color scheme is loaded, since I've configured
+" it to be a very dark gray that doesn't stand out too much against a black
" background. For any other color scheme, turn the option off, because it
" almost always stands out too much for my liking.
"
-" You’d think the pattern here could be used to match the color scheme name,
-" and it can be—after patch v7.4.108, when Christian Brabandt fixed it. Until
-" that version, it matched against the current buffer name, so we’re forced to
-" have an explicit test in the command instead.
+" You'd think the pattern here could be used to match the color scheme name,
+" and it can be---after patch v7.4.108, when Christian Brabandt fixed it.
+" Until that version, it matched against the current buffer name, so we're
+" forced to have an explicit test in the command instead.
"
" <https://github.com/vim/vim/releases/tag/v7.4.108>
"
autocmd vimrc ColorScheme *
\ call colorscheme#UpdateCursorline(g:colors_name, ['sahara'])
-" Use 'dark' as my default value for 'background', in the absence of an
+" Use `dark` as my default value for 'background', in the absence of an
" environment variable COLORFGBG or a response in v:termrbgresp that would set
" it specifically.
"
@@ -977,7 +993,7 @@ endif
" it.
"
if &background ==# 'dark'
- \ && (has#('gui_running') || &t_Co >= 256)
+ \ && (has('gui_running') || str2nr(&t_Co) >= 256)
\ && globpath(&runtimepath, 'colors/sahara.vim') !=# ''
colorscheme sahara
endif
@@ -998,33 +1014,33 @@ endif
" use selection mode directly.
"
" * Avoid mapping in insert mode; let characters be literal to the greatest
-" extent possible, and avoid “doing more” in insert mode besides merely
-" inserting text as it’s typed.
+" extent possible, and avoid "doing more" in insert mode besides merely
+" inserting text as it's typed.
"
" * Avoid key chords with CTRL in favor of leader keys.
"
" * Never use Alt/Meta key chords; the terminal support for them is just too
" confusing and flaky.
"
-" * Don’t suppress display of mapped commands for no reason; it’s OK to show
-" the user the command that’s being run under the hood. Do avoid HIT-ENTER
+" * Don't suppress display of mapped commands for no reason; it's OK to show
+" the user the command that's being run under the hood. Do avoid HIT-ENTER
" prompts, though.
"
-" * Avoid shadowing any of Vim’s existing functionality. If possible, extend
+" * Avoid shadowing any of Vim's existing functionality. If possible, extend
" or supplement what Vim does, rather than replacing it.
"
-" We’ll start with the non-leader mappings. Ideally, there shouldn’t be too
+" We'll start with the non-leader mappings. Ideally, there shouldn't be too
" many of these.
"
-" Use backspace as an even quicker way to switch to the current buffer’s
-" alternate buffer. User nickspoons of #vim was incredulous that I had never
-" used CTRL-^ and indeed did not know about it. I have since repented.
+" I use Mosh (the mobile shell) a lot, which uses CTRL-^ as its escape key.
+" That shadows Vim's shortcut to switch to the alternate buffer. Map
+" <Backspace> to do that instead.
"
nnoremap <Backspace>
\ <C-^>
-" I find the space bar’s default behavior in normal mode of moving right one
+" I find the space bar's default behavior in normal mode of moving right one
" character to be useless. Instead, I remap it to be a lazy way of paging
" through the argument list buffers, scrolling a page until the last line of
" the buffer is visible, and then moving to the :next buffer.
@@ -1036,10 +1052,10 @@ nnoremap <expr> <Space>
\ ? "\<PageDown>"
\ : ":\<C-U>next\<CR>"
-" I often can’t remember (or guess) digraph codes, and want to look up how to
+" I often can't remember (or guess) digraph codes, and want to look up how to
" compose a specific character that I can name, at least in part. The table
-" in ‘:help digraph-table’ is what to use for that situation, and it solves
-" the problem, but I didn’t like the overhead of repeated lookups therein.
+" in `:help digraph-table` is what to use for that situation, and it solves
+" the problem, but I didn't like the overhead of repeated lookups therein.
"
" Steve Losh has a solution I liked where a double-tap of CTRL-K in insert
" mode brought up the applicable :help window:
@@ -1058,13 +1074,13 @@ nnoremap <expr> <Space>
" > Í I' LATIN CAPITAL LETTER I WITH ACUTE
" > ...etc...
"
-" <https://sanctum.geek.nz/cgit/vim-digraph-search.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-digraph-search.git/about/>
"
" This leaves you in insert mode, ready to hit CTRL-K one more time and then
-" type the digraph that you’ve hopefully found.
+" type the digraph that you've hopefully found.
"
-" Since a double-tap of CTRL-K does nothing in default Vim, we don’t bother
-" checking that the plugin’s available before we map to it; it’ll just quietly
+" Since a double-tap of CTRL-K does nothing in default Vim, we don't bother
+" checking that the plugin's available before we map to it; it'll just quietly
" do nothing.
"
imap <C-K><C-K>
@@ -1074,56 +1090,56 @@ imap <C-K><C-K>
" and tools like Mutt and Vim pretty often. It feels natural to me to stack
" issuing a :nohlsearch command to stop highlighting searches on top of this.
"
-" This gets by far the most use in normal mode, but I’d like it to work in
-" insert and visual modes, too, where it’s occasionally useful, especially on
+" This gets by far the most use in normal mode, but I'd like it to work in
+" insert and visual modes, too, where it's occasionally useful, especially on
" things like mobile phone terminal emulators that can be choppy and require
" a lot of redrawing.
"
" For each of these, we end the mapping with a CTRL-L in normal mode, thereby
-" extending rather than replacing Vim’s normal behavior.
+" extending rather than replacing Vim's normal behavior.
"
nnoremap <C-L>
\ :<C-U>nohlsearch<CR><C-L>
" The insert mode wrapper for normal CTRL-L uses i_CTRL-O to issue a single
-" normal mode command. We intentionally use ‘:normal’ rather than ‘:normal!’
+" normal mode command. We intentionally use `:normal` rather than `:normal!`
" so that the mapping works recursively. I tried using <C-O><C-L> with :imap
-" for this, but it didn’t work. Maybe i_CTRL-O doesn’t respect mappings.
-" I couldn’t find any documentation about it.
+" for this, but it didn't work. Maybe i_CTRL-O doesn't respect mappings.
+" I couldn't find any documentation about it.
"
inoremap <C-L>
\ <C-O>:execute "normal \<C-L>"<CR>
" We use :vmap here rather than :xmap to have the mapping applied for select
-" mode as well as visual mode. This is because CTRL-L doesn’t reflect
+" mode as well as visual mode. This is because CTRL-L doesn't reflect
" a printable character, and so we don't shadow anything by making it work,
-" even though I don’t actually use select mode directly very much.
+" even though I don't actually use select mode directly very much.
"
vmap <C-L>
\ <Esc><C-L>gv
-" By default, the very-useful normal mode command ‘&’ that repeats the
-" previous :substitute command doesn’t preserve the flags from that
-" substitution. I’d prefer it to do so, like the :&& command does, and it’s
-" easily remapped for both normal and visual mode, so let’s just do it.
+" By default, the very-useful normal mode command `&` that repeats the
+" previous :substitute command doesn't preserve the flags from that
+" substitution. I'd prefer it to do so, like the :&& command does, and it's
+" easily remapped for both normal and visual mode, so let's just do it.
"
noremap &
\ :&&<CR>
ounmap &
sunmap &
-" I really like using the ‘!’ command in normal mode as an operator to filter
+" I really like using the `!` command in normal mode as an operator to filter
" text through a shell command. It always bugged me a little that there
-" didn’t seem to be an analogue for a motion to filter text through an
+" didn't seem to be an analogue for a motion to filter text through an
" internal command like :sort, so I wrote one.
"
-" <https://sanctum.geek.nz/cgit/vim-colon-operator.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-colon-operator.git/about/>
"
nmap g:
\ <Plug>(ColonOperator)
-" I used Tim Pope’s unimpaired.vim plugin for ages, and I liked some of these
-" bracket pair mappings, so I’ve carried a few of the simpler ones over. All
+" I used Tim Pope's unimpaired.vim plugin for ages, and I liked some of these
+" bracket pair mappings, so I've carried a few of the simpler ones over. All
" of these can be prefixed with a count if needed, too. I use all of them
" pretty regularly, even though cycling through lists to look for something
" can be a bit wasteful.
@@ -1149,26 +1165,26 @@ nnoremap [l
nnoremap ]l
\ :lnext<CR>
-" Here’s another mapping I particularly liked from unimpaired.vim; insert
+" Here's another mapping I particularly liked from unimpaired.vim; insert
" blank lines from normal mode, using a custom plugin of mine called
-" put_blank_lines.vim. These use operator functions so that they’re
+" put_blank_lines.vim. These use operator functions so that they're
" repeatable without repeat.vim. They accept count prefixes, too.
"
-" <https://sanctum.geek.nz/cgit/vim-put-blank-lines.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-put-blank-lines.git/about/>
"
nmap [<Space>
\ <Plug>(PutBlankLinesAbove)
nmap ]<Space>
\ <Plug>(PutBlankLinesBelow)
-" We’re on to the leader maps, now. It’s difficult to know in what order to
+" We're on to the leader maps, now. It's difficult to know in what order to
" describe and specify these. I used to have them in alphabetical order, but
" it seems much more useful to group them by the type of action they take.
"
-" First of all, let’s set the leader keys; backslash happens to be the
-" default, but I like to make my choice explicit here. As of 2019, I’m still
+" First of all, let's set the leader keys; backslash happens to be the
+" default, but I like to make my choice explicit here. As of 2019, I'm still
" not certain that comma is the best choice for my local leader. I use it all
-" the time for this purpose, and it works well, but I don’t much like that it
+" the time for this purpose, and it works well, but I don't much like that it
" shadows a useful function in the fFtT;, group, and I sometimes wonder if
" I would use the key for its original function more, had I not shadowed it.
"
@@ -1185,20 +1201,20 @@ if maplocalleader ==# ','
sunmap ,,
endif
-" Let’s start with some simple ones; these ones all just toggle a boolean
-" option, and print its new value. They’re dirt simple to specify, and don’t
+" Let's start with some simple ones; these ones all just toggle a boolean
+" option, and print its new value. They're dirt simple to specify, and don't
" require any plugins.
"
-" These are sometimes applicable in visual mode, and sometimes not. We’ll
+" These are sometimes applicable in visual mode, and sometimes not. We'll
" start with the ones that only make sense as normal mode maps. Annoyingly,
-" a visual mode mapping for 'cursorline' toggling doesn’t work at all;
+" a visual mode mapping for 'cursorline' toggling doesn't work at all;
" 'cursorline' is always off when in any visual mode, including block mode,
" where it actually might have been really handy.
"" Leader,TAB toggles automatic indentation based on the previous line
nnoremap <Leader><Tab>
\ :<C-U>set autoindent! autoindent?<CR>
-"" Leader,c toggles highlighted cursor row; doesn’t work in visual mode
+"" Leader,c toggles highlighted cursor row; doesn't work in visual mode
nnoremap <Leader>c
\ :<C-U>set cursorline! cursorline?<CR>
"" Leader,h toggles highlighting search results
@@ -1241,17 +1257,10 @@ noremap <Leader>w
ounmap <Leader>w
sunmap <Leader>w
-" This next one just shows option state of the 'formatoptions' affecting how
-" text is automatically formatted; it doesn’t change its value.
-
-"" Leader,f shows the current 'formatoptions' at a glance
-nnoremap <Leader>f
- \ :<C-U>set formatoptions?<CR>
-
" I often have to switch between US English and NZ English. The latter is
" almost exactly the same as UK English in most locales, although we use
" dollars rather than pounds. This is mostly so I remember things like
-" excluding or including the ‘u’ in words like ‘favourite’, depending on the
+" excluding or including the `u` in words like `favourite`, depending on the
" target audience. I generally use US English for international audiences.
"
nnoremap <Leader>z
@@ -1259,20 +1268,31 @@ nnoremap <Leader>z
nnoremap <Leader>u
\ :<C-U>set spelllang=en_us<CR>
-" The next mapping is also for toggling an option, but it’s more complicated;
+" I've also been trying to learn French lately (2023-04-03), and having
+" a spelling check there is handy for doing my homework.
+"
+" This mapping used to show the state of 'formatoptions', but I haven't been
+" using that nearly as often lately.
+"
+" <https://sanctum.geek.nz/images/ze-cultured-frenchman.png>
+"
+nnoremap <Leader>f
+ \ :<C-U>set spelllang=fr<CR>
+
+" The next mapping is also for toggling an option, but it's more complicated;
" it uses a simple plugin of mine called copy_linebreak.vim to manage several
" options at once, related to the 'wrap' option that soft-wraps text.
"
-" It’s designed for usage in terminal emulators and multiplexers to
+" It's designed for usage in terminal emulators and multiplexers to
" temporarily make the buffer text suitable for copying in such a way that the
-" wrapping and any associated soft formatting won’t pervert the text,
+" wrapping and any associated soft formatting won't pervert the text,
" including 'breakindent', 'linebreak', and 'showbreak' artifacts.
"
" This is really handy for quick selections of small regions of text. For
" larger blocks of text or for manipulating the text as it leaves the buffer,
" it makes more sense to use :! commands.
"
-" <https://sanctum.geek.nz/cgit/vim-copy-linebreak.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-copy-linebreak.git/about/>
"
"" Leader,b toggles settings friendly to copying and pasting
@@ -1280,13 +1300,13 @@ nmap <Leader>b
\ <Plug>(CopyLinebreakToggle)
" The above mappings show that mappings for toggling boolean options are
-" simple, but there isn’t a way to toggle single flags within option strings
+" simple, but there isn't a way to toggle single flags within option strings
" with just the :set command, so I wrote a plugin called toggle_flags.vim to
" provide :ToggleFlag and :ToggleFlagLocal commands. The first argument is
" the name of an option, and the second is the flag within it that should be
" toggled on or off.
-"" Leader,a toggles 'formatoptions' ‘a’ auto-flowing flag
+"" Leader,a toggles 'formatoptions' `a` auto-flowing flag
nnoremap <Leader>a
\ :<C-U>ToggleFlagLocal formatoptions a<CR>
"" Leader,L toggles 'colorcolumn' showing the first column beyond 'textwidth'
@@ -1296,9 +1316,9 @@ ounmap <Leader>L
sunmap <Leader>L
" This mapping uses my paste_insert.vim plugin to queue up automatic commands
-" for the next insert operation. It’s still pretty new. It replaces my old
+" for the next insert operation. It's still pretty new. It replaces my old
" paste_open.vim plugin which did this only for opening new lines, and which
-" kept confusing me. I’m hoping this will be better.
+" kept confusing me. I'm hoping this will be better.
"" Leader,p prepares the next insert for paste mode
nmap <Leader>p
@@ -1331,17 +1351,17 @@ nnoremap <Leader>D
" This group contains mappings that are to do with file and path management
" relative to the current buffer.
-"" Leader,g shows the current file’s fully expanded path
+"" Leader,g shows the current file's fully expanded path
nnoremap <Leader>g
\ :<C-U>echo expand('%:p')<CR>
-"" Leader,G changes directory to the current file’s location
+"" Leader,G changes directory to the current file's location
nnoremap <Leader>G
\ :<C-U>cd %:h <Bar> pwd<CR>
-"" Leader,P creates the path to the current file if it doesn’t exist
+"" Leader,P creates the path to the current file if it doesn't exist
nnoremap <Leader>P
\ :<C-U>call mkdir(expand('%:h'), 'p')<CR>
-" This group contains mappings that show information about Vim’s internals:
+" This group contains mappings that show information about Vim's internals:
" marks, registers, variables, and the like.
"" Leader,H shows command history
@@ -1376,8 +1396,8 @@ nnoremap <Leader>y
\ :<C-U>registers<CR>
" This group contains mappings concerned with buffer navigation and
-" management. I use the “jetpack” buffer jumper one a lot. I got it from one
-" of bairui’s “Vim and Vigor” comics:
+" management. I use the "jetpack" buffer jumper one a lot. I got it from one
+" of bairui's "Vim and Vigor" comics:
"
" <http://of-vim-and-vigor.blogspot.com/p/vim-vigor-comic.html>
@@ -1393,12 +1413,12 @@ nnoremap <Leader>e
"" Leader,E locks a buffer, reversible with <Leader>e
nnoremap <Leader>E
\ :<C-U>set nomodifiable readonly<CR>
-"" Leader,j jumps to buffers—the “jetpack”
+"" Leader,j jumps to buffers---the "jetpack"
nnoremap <Leader>j
\ :<C-U>buffers<CR>:buffer<Space>
" Leader,o hacks up the list of old files from viminfo just long enough to
-" ensure that :browse :oldfiles fits in a screen, avoiding an Enter or ‘q’
+" ensure that :browse :oldfiles fits in a screen, avoiding an Enter or `q`
" keystroke before entering the number. This one is handy followed by
" <Leader>,\ to jump back to the last remembered position in that file, since
" by definition viminfo remembers that mark, too.
@@ -1410,11 +1430,11 @@ nmap <Leader>o
" buffer text. All of these mappings use commands from my custom plugins:
"
" :KeepPosition
-" <https://sanctum.geek.nz/cgit/vim-keep-position.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-keep-position.git/about/>
" :SqueezeRepeatBlanks
-" <https://sanctum.geek.nz/cgit/vim-squeeze-repeat-blanks.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-squeeze-repeat-blanks.git/about/>
" :StripTrailingWhitespace
-" <https://sanctum.geek.nz/cgit/vim-strip-trailing-whitespace.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-strip-trailing-whitespace.git/about/>
"
"" Leader,x strips trailing whitespace
@@ -1436,7 +1456,7 @@ nnoremap <Leader>+
\ :<C-U>KeepPosition execute 'normal! 1GgqG'<CR>
" This group defines a few :onoremap commands to make my own text objects.
-" I should probably make some more of these, as they’ve proven to be
+" I should probably make some more of these, as they've proven to be
" terrifically handy.
"" Leader,_ uses last changed or yanked text as an object
@@ -1451,7 +1471,7 @@ omap <Leader>5
" This group defines some useful motions, including navigating by indent
" block using a custom plugin:
"
-" <https://sanctum.geek.nz/cgit/vim-vertical-region.git/about/>
+" <https://dev.sanctum.geek.nz/cgit/vim-vertical-region.git/about/>
"
"" Leader,{ and Leader,} move to top and bottom of indent region
@@ -1461,7 +1481,7 @@ sunmap <Leader>{
map <Leader>}
\ <Plug>(VerticalRegionDown)
sunmap <Leader>}
-"" Leader,\ jumps to the last edit position mark; think “Now, where was I?”
+"" Leader,\ jumps to the last edit position mark; think "Now, where was I?"
noremap <Leader>\
\ `"
sunmap <Leader>\
@@ -1483,14 +1503,14 @@ nnoremap <Leader>/
nnoremap <Leader>?
\ :<C-U>lhelpgrep \c<S-Left>
-" This group contains miscellaneous mappings for which I couldn’t find any
+" This group contains miscellaneous mappings for which I couldn't find any
" other place. The plugin mappings probably require their own documentation
" comment block, but my hands are getting tired from all this typing.
"
-" * <https://sanctum.geek.nz/cgit/vim-alternate-filetype.git/about/>
-" * <https://sanctum.geek.nz/cgit/vim-regex-escape.git/about/>
-" * <https://sanctum.geek.nz/cgit/vim-replace-operator.git/about/>
-" * <https://sanctum.geek.nz/cgit/vim-scratch-buffer.git/about/>
+" * <https://dev.sanctum.geek.nz/cgit/vim-alternate-filetype.git/about/>
+" * <https://dev.sanctum.geek.nz/cgit/vim-regex-escape.git/about/>
+" * <https://dev.sanctum.geek.nz/cgit/vim-replace-operator.git/about/>
+" * <https://dev.sanctum.geek.nz/cgit/vim-scratch-buffer.git/about/>
"
"" Leader,. runs the configured make program into the location list
@@ -1543,17 +1563,17 @@ nnoremap <Leader>~
"
digraphs zs 8203
-" And last, but definitely not least, I’m required by Vim fanatic law to
+" And last, but definitely not least, I'm required by Vim fanatic law to
" include a mapping that reloads my whole configuration. This uses the
" command wrapper defined much earlier in the file, so that filetypes also get
-" reloaded afterwards, meaning I don’t need to follow <Leader>R with
+" reloaded afterwards, meaning I don't need to follow <Leader>R with
" a <Leader>F to fix up broken global settings.
"
nnoremap <Leader>R
\ :<C-U>ReloadVimrc<CR>
-" I’ll close this file with a few abbreviations. Perhaps of everything in
-" here, I’m least confident that these should be in here, but they’ve proven
+" I'll close this file with a few abbreviations. Perhaps of everything in
+" here, I'm least confident that these should be in here, but they've proven
" pretty useful. First, some 'deliberate' abbreviations for stuff I type
" a lot:
"
@@ -1582,10 +1602,10 @@ inoreabbrev THere
" Here endeth the literate vimrc. Let us praise God.
"
-" │ Consequently, it is soon recognized that they write for the sake of
-" │ filling up the paper, and this is the case sometimes with the best
-" │ authors…as soon as this is perceived the book should be thrown away,
-" │ for time is precious.
-" │
-" │ —Schopenhauer
+" > Consequently, it is soon recognized that they write for the sake of
+" > filling up the paper, and this is the case sometimes with the best
+" > authors...as soon as this is perceived the book should be thrown away,
+" > for time is precious.
+" >
+" > ---Schopenhauer
"
diff --git a/vim/vimrc.stub b/vim/vimrc.stub
index f9ad4d4f..2acd2d10 100644
--- a/vim/vimrc.stub
+++ b/vim/vimrc.stub
@@ -1,26 +1,25 @@
" We have a big, important decision to make here.
"
-" Check that we’re not running in 'compatible' mode, nor that the environment
-" calls for the same, that we’re running Vim v7.0.0 or newer, and that we
-" haven't been invoked as just plain `vi`. If it’s all clear, we can load the
-" main vimrc file from ~/.vim/vimrc to use Vim in all of its incompatible
-" glory, and then stop sourcing the rest of this file.
+" Check that we're not running in 'compatible' mode, nor that the environment
+" calls for the same, and that we're running Vim v7.0.0 or newer. If it's all
+" clear, we can load the main vimrc file from ~/.vim/vimrc to use Vim in all
+" of its incompatible glory, and then stop sourcing the rest of this file.
"
if !&compatible && !exists('$POSIXLY_CORRECT')
- if v:version >=700 && v:progname !=# 'vi'
+ if v:version >= 700
runtime vimrc
finish
endif
endif
-" If we got this far, it means we’re running a tiny, 'compatible', and/or
-" ancient version of Vim.
-"
-" So, strip out the user runtime directories from 'runtimepath', force
-" 'compatible' on, source your trusty ‘~/.exrc’, put on your dubbed cassette
-" copy of Kraftwerk’s ‘Computerwelt’, and start using vi v3.7 on your
-" engineering department’s Sun OS 4.x server via your VT220 terminal. It’s
-" July 1985, you write K&R C, and it’s good for you, like raisin bran.
+" If we got this far, it means we're running a tiny, 'compatible', and/or
+" ancient version of Vim. So: strip out the user runtime dirs from
+" 'runtimepath', force 'compatible' on, :source your trusty ~/.exrc, put on
+" your dubbed cassette copy of Kraftwerk's 'Computerwelt', and start using vi
+" v3.7 on your engineering department's SunOS 2.0 server via your shiny new
+" VT220 terminal. It's December 1985, and you're going home soon for the
+" holidays. You're writing K&R C tonight. It's good for you, like raisin
+" bran.
"
set runtimepath-=~/.vim
set runtimepath-=~/.vim/after
diff --git a/x/Xresources b/x/Xresources
new file mode 100644
index 00000000..829b208e
--- /dev/null
+++ b/x/Xresources
@@ -0,0 +1,106 @@
+/* Declare our xterms have 256 colors */
+XTerm.termName: xterm-256color
+
+/**
+ * Just use "xterm" as the title, no need to complicate it with the name of the
+ * actual binary called.
+ */
+XTerm.title: xterm
+
+/**
+ * Don't pass mouse events to applications, even if they ask for it; mouse
+ * interaction with command-line tools isn't normally very well-written anyway.
+ * Better just to treat it as text.
+ */
+XTerm.vt100.allowMouseOps: false
+
+/**
+ * Don't let applications set the window title; it's usually more confusing
+ * than helpful, with things like command wrappers getting in the way.
+ */
+XTerm.vt100.allowTitleOps: false
+
+/* Don't munge characters' 8th bit with Alt, send Escape prefix instead */
+XTerm.vt100.altIsNotMeta: true
+XTerm.vt100.altSendsEscape: true
+
+/* Flash my window manager if a BEL is sounded in an xterm */
+XTerm.vt100.bellIsUrgent: true
+
+/**
+ * Stick all of the non-control ASCII characters into the same xterm selection
+ * group as the alphanumeric ones added by default, except for space and the
+ * left and right angle brackets (less-than and greater-than), because being
+ * able to click URLs quickly outweighs anything else.
+ */
+XTerm.vt100.charClass: \
+ 33-59:48, \
+ 60:60, \
+ 61:48, \
+ 62:60, \
+ 63-126:48
+
+/**
+ * Set some less harsh colors than the xterm defaults; I think I got these from
+ * somewhere else and tweaked them, but I can't remember where it was now.
+ */
+XTerm.vt100.background: rgb:03/03/03
+XTerm.vt100.foreground: rgb:e0/e0/e0
+XTerm.vt100.color0: rgb:03/03/03
+XTerm.vt100.color1: rgb:cc/00/00
+XTerm.vt100.color2: rgb:3e/aa/06
+XTerm.vt100.color3: rgb:c4/a0/00
+XTerm.vt100.color4: rgb:34/65/a4
+XTerm.vt100.color5: rgb:75/50/7b
+XTerm.vt100.color6: rgb:06/98/9a
+XTerm.vt100.color7: rgb:d3/d7/cf
+XTerm.vt100.color8: rgb:30/30/30
+XTerm.vt100.color9: rgb:ef/29/29
+XTerm.vt100.color10: rgb:7a/f2/34
+XTerm.vt100.color11: rgb:fc/e9/4f
+XTerm.vt100.color12: rgb:72/9f/cf
+XTerm.vt100.color13: rgb:ad/7f/a8
+XTerm.vt100.color14: rgb:34/e2/e2
+XTerm.vt100.color15: rgb:ee/ee/ec
+
+/**
+ * Use Ubuntu Mono as a TrueType font if I decide to switch to it, but default
+ * to using the default bitmap font.
+ */
+XTerm.vt100.faceName: xft:Ubuntu Mono
+XTerm.vt100.faceSize: 9
+XTerm.vt100.renderFont: defaultOff
+
+/**
+ * Draw our own box characters, even if the font seems to support them. Using
+ * Ubuntu Mono at least, this removes gaps between vertical lines.
+ */
+XTerm.vt100.forceBoxChars: true
+
+/**
+ * Put the terminal text contents flush against the edges of the window,
+ * otherwise things like tmux look awkward.
+ */
+XTerm.vt100.internalBorder: 0
+
+/**
+ * Jump to the end of the buffer if I write to it, but don't if there's just
+ * something new to read. Funny how the defaults are the other way around...
+ */
+XTerm.vt100.scrollKey: true
+XTerm.vt100.scrollTtyOutput: false
+
+/**
+ * Bind extra keys to copy/paste to/from CLIPBOARD rather than PRIMARY, as
+ * a simple selection does.
+ */
+XTerm.vt100.translations: #override \n\
+ Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
+ Ctrl Shift <Key>V: insert-selection(CLIPBOARD)
+
+/**
+ * Trim trailing spaces from selections; if I'm copying text from a terminal
+ * emulator window, I probably don't want it byte-perfect for hashing purposes
+ * or anything like that.
+ */
+XTerm.vt100.trimSelection: true
diff --git a/x/logrotate/config.d/xsession b/x/logrotate/config.d/xsession
new file mode 100644
index 00000000..1541375d
--- /dev/null
+++ b/x/logrotate/config.d/xsession
@@ -0,0 +1,7 @@
+~/.xsession-errors {
+ copytruncate
+ daily
+ missingok
+ olddir .local/state/xsession/log
+ rotate 30
+}
diff --git a/sh/shrc.d/x.sh b/x/shrc.d/x.sh
index ed921c68..ed921c68 100644
--- a/sh/shrc.d/x.sh
+++ b/x/shrc.d/x.sh
diff --git a/x/xsession.sh b/x/xsession.sh
new file mode 100644
index 00000000..9cf4a99a
--- /dev/null
+++ b/x/xsession.sh
@@ -0,0 +1,64 @@
+#
+# Custom i3wm X session to fit into Debian's way of doing things, for use with
+# startx(1) or xinit(1). From Debian's `man 1 startx` (xinit dpkg 1.4.0-1):
+#
+# > Note that in the Debian system, what many people traditionally put in the
+# > .xinitrc file should go in .xsession instead; this permits the same X
+# > environment to be presented whether startx, xdm, or xinit is used to start
+# > the X session. All discussion of the .xinitrc file in the xinit(1) manual
+# > page applies equally well to .xsession.
+#
+# This turns out to be important for having the X session wrappers in /etc/X11
+# on Debian-derived systems do things like dbus daemon and accessibility setup.
+#
+# At the time of writing, none of my machines running X are using anything
+# other than the Debian-derived X startup script layout, so we'll just conform
+# to that unless and until I actually need to abstract this.
+#
+
+# Monitor and wallpaper setup is very machine-specific, and isn't versioned in
+# here. Neither xrandr(1) nor xwallpaper(1) have config files, so we fake it
+# with xargs and looking for a file with argument tokens to read in
+# XDG_CONFIG_HOME, which will almost always be:
+#
+# - ~/.config/xrandr/config
+# - ~/.config/xwallpaper/config
+#
+xargs xrandr \
+ < "${XDG_CONFIG_HOME:-"$HOME"/.config}"/xrandr/config
+xargs xwallpaper \
+ < "${XDG_CONFIG_HOME:-"$HOME"/.config}"/xwallpaper/config
+
+# Set a few X user preferences:
+#
+# - No bell
+# - Power management on, but start with no timeouts
+# - Quick curved mouse acceleration
+# - No screen saver
+#
+xset \
+ b off \
+ dpms 0 0 0 \
+ mouse 5/2 0 \
+ s off
+
+# Start a few daemons if we can; it's OK if any of these don't exist, but we'll
+# log the failed attempt to start them to the errors file, as a hint that
+# I might want to install them.
+#
+## Message display (libnotify)
+dunst &
+## PulseAudio system tray tool
+pasystray &
+## Hide mouse after inactivity
+unclutter &
+
+# Load all supplementary scripts in ~/.xsession.d
+for sh in "$HOME"/.xsession.d/*.sh ; do
+ [ -e "$sh" ] || continue
+ . "$sh"
+done
+unset -v sh
+
+# Become an i3 window manager process, having set everything else up
+exec i3
diff --git a/x/xsessionrc b/x/xsessionrc
new file mode 100644
index 00000000..8d46ed0b
--- /dev/null
+++ b/x/xsessionrc
@@ -0,0 +1,17 @@
+# X startup commands go in here if they should run on every X session, whether
+# classic `startx` or a modern DE like LightDM. xsessionrc is a dpkg-specific
+# file.
+#
+
+# If $ENV isn't set, then this X startup process wasn't started from somewhere
+# beneath a login shell that sources ~/.profile to set up environment variables
+# yet, most likely because it's being opened by a display manager, so we'll do
+# it here.
+#
+if [ -z "$ENV" ] ; then
+ . "$HOME"/.profile
+fi
+
+# Update BROWSER, since .profile has already set this to a curses browser
+# shellcheck disable=SC2034
+BROWSER=x-www-browser
diff --git a/zsh/zshrc b/zsh/zshrc
index 6d3239eb..30e7173b 100644
--- a/zsh/zshrc
+++ b/zsh/zshrc
@@ -15,7 +15,7 @@ bindkey -e
# History settings
setopt histignorealldups sharehistory
HISTFILE=$HOME/.zsh_history
-SAVEHIST=$((1 << 12))
+SAVEHIST=4096
# Load Zsh-specific startup files
for zsh in "$HOME"/.zshrc.d/*.zsh(N) ; do
diff --git a/zsh/zshrc.d/keep.zsh b/zsh/zshrc.d/keep.zsh
index 8a2b9449..36d2f57d 100644
--- a/zsh/zshrc.d/keep.zsh
+++ b/zsh/zshrc.d/keep.zsh
@@ -89,8 +89,8 @@ EOF
case $name in
# NAME must start with letters or an underscore, and contain no
- # characters besides letters, numbers, or underscores
- *[!a-zA-Z0-9_]*|[!a-zA-Z_]*)
+ # characters besides letters, numbers, underscores, or dashes
+ [!a-zA-Z_]*|*[!a-zA-Z0-9_-]*)
printf 'zsh: %s: %s not a valid NAME\n' \
"${FUNCNAME[0]}" "$name" >&2
((errors++))
diff --git a/zsh/zshrc.d/prompt.zsh b/zsh/zshrc.d/prompt.zsh
index 980d8669..245f2973 100644
--- a/zsh/zshrc.d/prompt.zsh
+++ b/zsh/zshrc.d/prompt.zsh
@@ -8,22 +8,23 @@ prompt() {
on)
setopt promptsubst promptpercent
- # Basic prompt shape depends on whether we're in SSH or not
+ # Prompt has hostname via SSH outside of screen/tmux
PS1=
- if [[ -n $SSH_CLIENT || -n $SSH_CONNECTION ]] ; then
+ if [[ -n $SSH_CLIENT && -z $STY && -z $TMUX ]] ; then
PS1=$PS1'%m:'
fi
PS1=$PS1'%~'
- # Add sub-commands; VCS, job, and return status checks
- PS1=$PS1'$(ret=$?;prompt vcs;prompt job;prompt ret)'
-
# Add a helpful prefix if this shell appears to be exotic
case ${SHELL##*/} in
(zsh) ;;
(*) PS1=zsh:$PS1 ;;
esac
+ # Add sub-commands:
+ ## VCS, job, and return status checks as suffixes
+ PS1=$PS1'$(ret=$?;prompt vcs;prompt job;prompt ret)'
+
# Add prefix and suffix
PS1='${PROMPT_PREFIX}'$PS1'${PROMPT_SUFFIX}'
@@ -53,7 +54,6 @@ prompt() {
fi
;;
- # Git prompt function
git)
# Wrap as compound command; we don't want to see output from any of