aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore9
-rw-r--r--.gitmodules3
-rw-r--r--ISSUES.md6
-rw-r--r--Makefile247
-rw-r--r--README.md37
-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/sxhkdrc56
-rw-r--r--X/xinitrc18
-rw-r--r--X/xinitrc.d/background.sh7
-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--bash/bash_completion.d/_ssh_config_hosts.bash29
-rw-r--r--bash/bash_completion.d/mosh.bash5
-rw-r--r--bash/bashrc4
-rw-r--r--bash/bashrc.d/prompt.bash34
-rw-r--r--bin/dmp.sh31
-rw-r--r--bin/gscr.sh9
-rw-r--r--[-rwxr-xr-x]bin/msc.sh0
-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/xgo.sh15
-rw-r--r--bin/xsnap.sh24
-rw-r--r--cabal/profile.d/cabal.sh3
-rw-r--r--cargo/profile.d/cabal.sh3
-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.mi510
-rw-r--r--gtk/gtk-3.0/settings.ini2
-rw-r--r--gtk/gtkrc-2.01
-rw-r--r--i3/config40
-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/prompt.ksh12
-rw-r--r--lint/bin.sh4
-rw-r--r--lint/games.sh2
-rw-r--r--lint/git-template-hooks.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/man7/dotfiles.7df735
-rw-r--r--mpv/mpv.conf32
-rw-r--r--mutt/muttrc3
-rw-r--r--[-rwxr-xr-x]mutt/muttrc.d/src.sh (renamed from mutt/muttrc.d/src)2
-rw-r--r--ncmpcpp/config1
-rw-r--r--newsboat/systemd/user/newsboat.service1
-rw-r--r--parcellite/parcelliterc41
-rw-r--r--parcellite/xsession.d/parcellite.sh2
-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/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/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.conf23
-rw-r--r--urxvt/ext/select.pl93
-rw-r--r--vim/after/ftplugin/python.vim35
-rw-r--r--vim/after/indent/yaml.vim2
-rw-r--r--vim/autoload/xdg.vim15
m---------vim/bundle/copy_linebreak0
m---------vim/bundle/html_spelllang0
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.vim148
-rw-r--r--vim/ftplugin/textarea.vim12
-rw-r--r--vim/plugin/matchit.vim2
-rw-r--r--vim/syntax/jinja2.vim2
-rw-r--r--vim/vimrc626
-rw-r--r--vim/vimrc.stub21
-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--youtube-dl/config5
-rw-r--r--zsh/zshrc.d/prompt.zsh12
153 files changed, 1802 insertions, 2256 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 4a63f718..e0ef1bf5 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -26,6 +26,9 @@
[submodule "vim/bundle/foldlevelstart_stdin"]
path = vim/bundle/foldlevelstart_stdin
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://dev.sanctum.geek.nz/code/vim-insert-cancel.git
diff --git a/ISSUES.md b/ISSUES.md
index c9d395ab..0a4abd4d 100644
--- a/ISSUES.md
+++ b/ISSUES.md
@@ -19,8 +19,6 @@ Known issues
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 Keychain etc, and
- if so how.
- 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
@@ -34,3 +32,7 @@ Known issues
highlighting, but not with `sh` highlighting
- 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 ca3fe473..9f98ce20 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,6 @@
install-cpanm \
install-curl \
install-dillo \
- install-dunst \
install-emacs \
install-ex \
install-finger \
@@ -22,8 +21,8 @@
install-games-man \
install-git \
install-gnupg \
- install-gtk \
install-i3 \
+ install-init \
install-ksh \
install-less \
install-login-shell \
@@ -32,7 +31,9 @@
install-mpv \
install-mutt \
install-mysql \
+ install-ncmpcpp \
install-newsboat \
+ install-parcellite \
install-perlcritic \
install-perltidy \
install-plenv \
@@ -40,19 +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-youtube-dl \
+ install-xsession \
install-zsh \
check \
check-bash \
@@ -63,8 +66,8 @@
check-login-shell \
check-man \
check-sh \
- check-urxvt \
- check-xinit \
+ check-x \
+ check-xsession \
check-zsh \
lint \
lint-bash \
@@ -73,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
@@ -111,7 +114,6 @@ BINS = bin/ap \
bin/ddup \
bin/defang \
bin/dfv \
- bin/dmp \
bin/dub \
bin/edda \
bin/eds \
@@ -222,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 \
@@ -273,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 -- \
@@ -291,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 < $< > $@
@@ -342,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
@@ -360,6 +366,7 @@ install: install-bin \
install-ex \
install-git \
install-gnupg \
+ install-init \
install-less \
install-login-shell \
install-man \
@@ -373,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
@@ -396,25 +403,21 @@ install-bin-man:
cp -p -- man/man8/*.8df $(XDG_DATA_HOME)/man/man8
install-cabal:
- cp -p -- cabal/profile.d/*.sh $(HOME)/.profile.d
+ cp -p -- cabal/profile.d/cabal.sh $(HOME)/.profile.d
install-cargo:
- cp -p -- cargo/profile.d/*.sh $(HOME)/.profile.d
+ 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
@@ -440,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
@@ -477,10 +484,12 @@ install-man:
cp -p -- man/man7/dotfiles.7df $(XDG_DATA_HOME)/man/man7
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 \
@@ -496,96 +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-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 enable newsboat.service \
- && systemctl --user start newsboat.service
+ 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
@@ -614,35 +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/* $(HOME)/.Xresources.d
-
-install-youtube-dl:
- mkdir -p -- $(XDG_CONFIG_HOME)/youtube-dl
- cp -p -- youtube-dl/config $(XDG_CONFIG_HOME)/youtube-dl
+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
@@ -653,7 +677,7 @@ check: check-bin \
check-man \
check-sh
-check-bash:
+check-bash: bin/han
sh check/bash.sh
check-bin: $(BINS)
@@ -677,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
@@ -692,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
@@ -714,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 0380d79c..0c4ee069 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ Installation
------------
$ mkdir -p ~/.local/src
- $ git clone https://sanctum.geek.nz/code/dotfiles.git ~/.local/src/dotfiles
+ $ git clone https://dev.sanctum.geek.nz/code/dotfiles.git ~/.local/src/dotfiles
$ cd ~/.local/src/dotfiles
$ git submodule init
$ git submodule update
@@ -82,30 +82,27 @@ Configuration is included for:
- [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
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 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
+- [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
library for user input used by Bash, MySQL, and others
-- [rxvt-unicode](http://software.schmorp.de/pkg/rxvt-unicode.html)---Fork of
- the rxvt terminal emulator with Unicode support
- [Subversion](https://subversion.apache.org/)---Apache Subversion, a version
control system
- [tidy](http://www.html-tidy.org/)---HTML/XHTML linter and tidier
@@ -113,7 +110,6 @@ Configuration is included for:
- [Vim](https://www.vim.org/)---Vi IMproved, a text editor
- [X11](https://www.x.org/wiki/)---Windowing system with network transparency
for Unix
-- [youtube-dl](https://youtube-dl.org/)---Download manager for video hosting websites
There is also some slightly customized support for multi-version environment
management for three major scripting languages:
@@ -124,8 +120,7 @@ management for three major scripting languages:
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
@@ -239,7 +234,6 @@ in `sh/shrc.d` to be loaded by any POSIX interactive shell. Those include:
- `grep()` tries to apply color and other options good for interactive use if
available.
- `hgrep()` allows searching `$HISTFILE`.
-- `keychain()` keeps `$GPG_TTY` up to date if a GnuPG agent is available.
- `ls()` tries to apply color and other options good for interactive use if
available.
- `la()` runs `ls -A` if it can, or `ls -a` otherwise.
@@ -248,6 +242,8 @@ in `sh/shrc.d` to be loaded by any POSIX interactive shell. Those include:
- `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.
+- `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`.
@@ -316,22 +312,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
@@ -414,7 +400,7 @@ 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
+ - `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
prints output.
@@ -524,7 +510,6 @@ These scripts are installed by the `install-bin` target:
- `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
any options, mostly useful for scripts.
@@ -653,9 +638,7 @@ available to run them:
- `lint-games`
- `lint-ksh`
- `lint-sh`
- - `lint-xinit`
-- Perl::Critic:
- - `lint-urxvt`
+ - `lint-x`
- [Vint](https://github.com/Kuniwak/vint):
- `lint-vim`
diff --git a/TABS.md b/TABS.md
deleted file mode 100644
index dd2be868..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 1e72aa29..f677da70 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-tejr dotfiles v11.10.0
-Fri, 24 Dec 2021 07:44:16 +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 c277855b..00000000
--- a/X/sxhkdrc
+++ /dev/null
@@ -1,56 +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 + shift + s
- sleep 0.25 && scrot --freeze --select \
- --exec 'xclip -selection clipboard -target image/png $f && \
- dir=$$HOME/screenshots/%Y-%m-%d && \
- mkdir --parents -- "$$dir" && \
- convert -- $f -define webp:lossless=true \
- "$$dir"/%Y-%m-%d_%H%M%S_$wx$h.webp && \
- rm -- $f'
-
-super + slash
- i3lock --color=#000000 --image "$HOME"/.local/share/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 b5041f8c..00000000
--- a/X/xinitrc
+++ /dev/null
@@ -1,18 +0,0 @@
-# If a file ~/.xrandrrc exists for monitor setup, source that first
-# shellcheck disable=SC1091
-[ -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/background.sh b/X/xinitrc.d/background.sh
deleted file mode 100644
index 85a40889..00000000
--- a/X/xinitrc.d/background.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-# If there's a ~/.fehbg, just run that; otherwise, try to apply a random
-# background image, if the relevant dir exists
-if [ -e "$HOME"/.fehbg ] ; then
- sh -- "$HOME"/.fehbg
-elif [ -d "${XBACKGROUNDS:-"$HOME"/.xbackgrounds}" ] ; then
- xrbg
-fi
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/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/bashrc b/bash/bashrc
index a60a047e..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=32768
+# Keep around 128K lines of history in file
+HISTFILESIZE=131072
# Ignore duplicate commands
HISTCONTROL=ignoredups
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/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/msc.sh b/bin/msc.sh
index 051f104a..051f104a 100755..100644
--- a/bin/msc.sh
+++ b/bin/msc.sh
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/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/profile.d/cabal.sh b/cabal/profile.d/cabal.sh
index b5730916..638f8d04 100644
--- a/cabal/profile.d/cabal.sh
+++ b/cabal/profile.d/cabal.sh
@@ -1,3 +1,2 @@
-# Include user-built Haskell programs if the dir exists
-[ -d "$HOME"/.cabal/bin ] || return
+# Include user-built Haskell programs
PATH=$HOME/.cabal/bin:$PATH
diff --git a/cargo/profile.d/cabal.sh b/cargo/profile.d/cabal.sh
deleted file mode 100644
index b5730916..00000000
--- a/cargo/profile.d/cabal.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# Include user-built Haskell programs if the dir exists
-[ -d "$HOME"/.cabal/bin ] || return
-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 3aa2c35e..f9569c8f 100644
--- a/finger/pgpkey
+++ b/finger/pgpkey
@@ -1,4 +1,4 @@
-pub rsa4096 2013-03-12 [SC] [expires: 2022-06-30]
+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: 2022-06-30]
-sub rsa4096 2013-03-12 [S] [expires: 2022-06-30]
-sub rsa4096 2019-08-06 [A] [expires: 2022-06-30]
+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 8456cc74..efdbc277 100644
--- a/git/config.mi5
+++ b/git/config.mi5
@@ -4,16 +4,15 @@
[diff]
algorithm = patience
-[fetch]
- output = compact
+[format]
+ pretty = fuller
[init]
defaultBranch = master
- templateDir = <% XDG_CONFIG_HOME %>/git/template
+ templateDir = <% XDG_DATA_HOME %>/git/template
[log]
date = local
- decorate = short
[merge]
ff = false
@@ -31,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 f43679e8..1e641b9f 100644
--- a/i3/config
+++ b/i3/config
@@ -4,11 +4,8 @@ set $mod Mod4
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
-# If the window is the only one on the workspace, forego the borders
-hide_edge_borders smart
-
-# Use a Unicode-capable font that should be available
-font pango:Liberation Mono 8
+# Use a nice Unicode-aware condensed font
+font pango:Noto Sans 10
# Mod+Shift+r restarts i3wm
bindsym $mod+Shift+r restart
@@ -53,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
@@ -87,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/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/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/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/man7/dotfiles.7df b/man/man7/dotfiles.7df
index 9b2cf0da..83616552 100644
--- a/man/man7/dotfiles.7df
+++ b/man/man7/dotfiles.7df
@@ -1,11 +1,25 @@
-.\" Automatically generated by Pandoc 2.9.2.1
+.\" Automatically generated by Pandoc 2.17.1.1
.\"
+.\" 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[R], including most of the settings that migrate well
+\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
@@ -16,7 +30,7 @@ added over time, making it into a personal suite of custom Unix tools.
.nf
\f[C]
$ mkdir -p \[ti]/.local/src
-$ git clone https://sanctum.geek.nz/code/dotfiles.git \[ti]/.local/src/dotfiles
+$ 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
@@ -26,12 +40,12 @@ $ make install
\f[R]
.fi
.PP
-For the default \f[C]all\f[R] target, you\[cq]ll need a POSIX-fearing
-userland, including \f[C]make(1)\f[R] and \f[C]m4(1)\f[R].
+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[R] overwrites things standing in the
+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[C]make -n install\f[R] before running \f[C]make install\f[R]
+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,
@@ -45,44 +59,44 @@ $ env -i HOME=\[dq]$tmpdir\[dq] TERM=\[dq]$TERM\[dq] \[dq]$SHELL\[dq] -l
\f[R]
.fi
.PP
-The default \f[C]install\f[R] 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[R]
+\f[V]install-bin\f[R]
.IP \[bu] 2
-\f[C]install-curl\f[R]
+\f[V]install-curl\f[R]
.IP \[bu] 2
-\f[C]install-ex\f[R]
+\f[V]install-ex\f[R]
.IP \[bu] 2
-\f[C]install-git\f[R]
+\f[V]install-git\f[R]
.IP \[bu] 2
-\f[C]install-gnupg\f[R]
+\f[V]install-gnupg\f[R]
.IP \[bu] 2
-\f[C]install-less\f[R]
+\f[V]install-less\f[R]
.IP \[bu] 2
-\f[C]install-login-shell\f[R]
+\f[V]install-login-shell\f[R]
.IP \[bu] 2
-\f[C]install-man\f[R]
+\f[V]install-man\f[R]
.IP \[bu] 2
-\f[C]install-readline\f[R]
+\f[V]install-readline\f[R]
.IP \[bu] 2
-\f[C]install-vim\f[R]
+\f[V]install-vim\f[R]
.PP
-The \f[C]install-login-shell\f[R] target looks at your \f[C]SHELL\f[R]
+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[C]install-sh\f[R].
+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[R]
+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[R] in the project\[cq]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[R] targets useful for a specific user or
+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[C]\[ti]/.config/dotfiles/config\f[R], and install using that with the
-special \f[C]install-conf\f[R] target.
-This can include macro settings for the \f[C]Makefile\f[R], too:
+\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]
@@ -98,14 +112,14 @@ $ make -C .local/src/dotfiles install-conf
.PP
Configuration is included for:
.IP \[bu] 2
-Bourne-style POSIX shells, sharing a \f[C].profile\f[R], an
-\f[C]ENV\f[R] 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[R],
-\f[C]pdksh\f[R], \f[C]mksh\f[R])
+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
@@ -117,10 +131,7 @@ 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[R]
-.IP \[bu] 2
-\f[C]finger(1)\f[R]\[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
@@ -130,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
@@ -141,14 +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[R] (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 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[R] (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
@@ -158,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
@@ -173,9 +184,6 @@ Vim (https://www.vim.org/)\[em]Vi IMproved, a text editor
.IP \[bu] 2
X11 (https://www.x.org/wiki/)\[em]Windowing system with network
transparency for Unix
-.IP \[bu] 2
-youtube-dl (https://youtube-dl.org/)\[em]Download manager for video
-hosting websites
.PP
There is also some slightly customized support for multi-version
environment management for three major scripting languages:
@@ -190,27 +198,26 @@ 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\[cq]s.
-There are a fair few resources defined for rxvt-unicode.
.SS Shell
.PP
On GNU/Linux, I use Bash; on *BSD, I use some variant of Korn Shell,
-preferably \f[C]ksh93\f[R] if it\[cq]s available.
+preferably \f[V]ksh93\f[R] if it\[cq]s available.
.SS POSIX core
.PP
-My \f[C]\[ti]/.profile\f[R] and other files in \f[C]sh\f[R] are written
+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[C]sh(1)\f[R] implementations.
+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]\[ti]/.profile.d\f[R] by \f[C]\[ti]/.profile\f[R].
+\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[R] shells is kept in \f[C]\[ti]/.shrc\f[R], with
-subscripts read from \f[C]\[ti]/.shrc.d\f[R].
-There\[cq]s a \f[C]\[ti]/.shinit\f[R] shim to act as \f[C]ENV\f[R].
+\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
@@ -234,9 +241,9 @@ array+=(\[dq]$item\[dq])
.fi
.PP
I do use some features that are only available in versions after v3.0,
-such as newer \f[C]shopt\f[R] options like \f[C]dirspell\f[R], or
-variables like \f[C]PROMPT_DIRTRIM\f[R].
-These are set only after testing \f[C]BASH_VERSINFO\f[R] 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:
@@ -258,7 +265,7 @@ remote:\[ti]/.local/src/dotfiles(master+!){1}$
.fi
.PP
The hostname is elided if not connected via SSH.
-The working directory with tilde abbreviation for \f[C]$HOME\f[R] 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:
@@ -268,165 +275,165 @@ 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[R]
-or \f[C]svn:\f[R] 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.
.IP \[bu] 2
The exit status of the last command, if non-zero.
.PP
-You can set \f[C]PROMPT_COLOR\f[R], \f[C]PROMPT_PREFIX\f[R], and
-\f[C]PROMPT_SUFFIX\f[R] too, which all do about what you\[cq]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\[cq]t
match your login shell, the prompt should display an appropriate prefix.
.PP
-This is all managed within the \f[C]prompt\f[R] function.
-There\[cq]s some mildly hacky logic on \f[C]tput\f[R] codes included
+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[C]termcap(5)\f[R] and \f[C]terminfo(5)\f[R], including *BSD systems.
+\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[R] without too much
-hackery, I put it in \f[C]sh/shrc.d\f[R] 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[R]/\f[C]popd\f[R]
+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[R] 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[R] goes to the marked directory.
+\f[V]gd()\f[R] goes to the marked directory.
.IP \[bu] 2
-\f[C]pmd()\f[R] prints the marked directory.
+\f[V]pmd()\f[R] prints the marked directory.
.IP \[bu] 2
-\f[C]xd()\f[R] 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[R] 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[R] changes into a directory or into a file\[cq]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[R] runs \f[C]gt()\f[R] on the first result from a
-\f[C]loc(1df)\f[R] 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[R] 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[R] changes to the argument\[cq]s parent directory.
+\f[V]pd()\f[R] changes to the argument\[cq]s parent directory.
.IP \[bu] 2
-\f[C]rd()\f[R] replaces the first instance of its first argument with
-its second argument in \f[C]$PWD\f[R], emulating a feature of the Zsh
-\f[C]cd\f[R] 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[R] 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[R] 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[R] 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[R] 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[R] invokes \f[C]$EDITOR\f[R], or \f[C]ed(1)\f[R] 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[R] invokes \f[C]$VISUAL\f[R], or \f[C]vi(1)\f[R] 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[R] silences startup messages from GNU \f[C]bc(1)\f[R].
+\f[V]bc()\f[R] silences startup messages from GNU \f[V]bc(1)\f[R].
.IP \[bu] 2
-\f[C]ed()\f[R] tries to get verbose error messages, a prompt, and a
-Readline environment for \f[C]ed(1)\f[R].
+\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[R] silences startup messages from \f[C]gdb(1)\f[R].
+\f[V]gdb()\f[R] silences startup messages from \f[V]gdb(1)\f[R].
.IP \[bu] 2
-\f[C]grep()\f[R] 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[R] allows searching \f[C]$HISTFILE\f[R].
+\f[V]hgrep()\f[R] allows searching \f[V]$HISTFILE\f[R].
.IP \[bu] 2
-\f[C]keychain()\f[R] keeps \f[C]$GPG_TTY\f[R] up to date if a GnuPG
-agent is available.
-.IP \[bu] 2
-\f[C]ls()\f[R] 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[R] runs \f[C]ls -A\f[R] if it can, or \f[C]ls -a\f[R]
+\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[R] runs \f[C]ls -Al\f[R] if it can, or \f[C]ls -al\f[R]
+\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[R] manages the contents of \f[C]PATH\f[R] conveniently.
+\f[V]path()\f[R] manages the contents of \f[V]PATH\f[R] conveniently.
.IP \[bu] 2
-\f[C]scp()\f[R] tries to detect forgotten hostnames in \f[C]scp(1)\f[R]
+\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[R] forces \f[C]-H\f[R] for \f[C]sudo(8)\f[R] calls so that
-\f[C]$HOME\f[R] is never preserved; I hate having \f[C]root\f[R]-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[R] colorizes GNU \f[C]tree(1)\f[R] output if possible
-(without having \f[C]LS_COLORS\f[R] 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[R] is a one-key shortcut for \f[C]exec startx\f[R].
+\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:
.IP \[bu] 2
-\f[C]keep()\f[R] 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[R] 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[R] adds a default destination of \f[C]$HOME\f[R] to the
-\f[C]pushd\f[R] 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[R] 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[R] prints the current shell\[cq]s version information
+\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[R] 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]\[ti]/.config/bash_completion\f[R].
+\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]\[ti]/.bash_completion.d\f[R] for things I really do get tired of
+\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[R]\[cq]s more portable options
+\f[V]find(1)\f[R]\[cq]s more portable options
.IP \[bu] 2
-\f[C]gpg(1)\f[R] long options
+\f[V]gpg(1)\f[R] long options
.IP \[bu] 2
-\f[C]make(1)\f[R] targets read from a \f[C]Makefile\f[R]
+\f[V]make(1)\f[R] targets read from a \f[V]Makefile\f[R]
.IP \[bu] 2
-\f[C]man(1)\f[R] page titles
+\f[V]man(1)\f[R] page titles
.IP \[bu] 2
-\f[C]pass(1)\f[R] entries
+\f[V]pass(1)\f[R] entries
.IP \[bu] 2
-\f[C]ssh(1)\f[R] hostnames from \f[C]\[ti]/.ssh/config\f[R]
+\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
@@ -441,18 +448,18 @@ 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[R], AT&T \f[C]ksh93\f[R], and OpenBSD \f[C]pdksh\f[R].
+\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[R]).
-\f[C]zsh\f[R] 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]\[ti]/mail\f[R], with the system mail spool in
-e.g.\ \f[C]/var/mail/tejr\f[R] being where most unfiltered new mail is
+\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
@@ -465,23 +472,12 @@ 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\[cq]ll need Abook installed if you want to use the
-\f[C]query_command\f[R] I have defined, and msmtp for the
-\f[C]sendmail\f[R] command.
-.SS rxvt-unicode
-.PP
-I\[cq]ve butchered the URxvt Perl extensions
-\f[C]selection-to-clipboard\f[R] and \f[C]selection\f[R] into a single
-\f[C]select\f[R] extension in \f[C]\[ti]/.urxvt/ext\f[R], which is the
-only extension I define in \f[C]\[ti]/.Xresources\f[R].
-.PP
-The included \f[C].Xresources\f[R] file assumes that \f[C]urxvt\f[R] can
-use 256 colors and Perl extensions.
-If you\[cq]re missing functionality, try changing
-\f[C]perl-ext-common\f[R] to \f[C]default\f[R].
+\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\[cq]t much
@@ -490,10 +486,10 @@ 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[R] include \f[C]tm(1df)\f[R], a shortcut
-to make \f[C]attach\f[R] 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]\[ti]/.inputrc\f[R] file binds Alt+M to run that, and Tmux in
+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
@@ -506,51 +502,51 @@ The XDG Base Directory
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[R].
+\f[V]\[aq]runtimepath\[aq]\f[R].
I use these separate directories for machine-local configuration,
-usually in \f[C]\[ti]/.config/vim\f[R], while all the files that this
-suite installs land in \f[C]\[ti]/.vim\f[R].
+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[R] file all live under \f[C]XDG_CACHE_HOME\f[R], normally
-\f[C]\[ti]/.cache/vim\f[R].
+\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[R] and \f[C]scripts.vim\f[R], so
+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[R] 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[R],
-I like to implement it as a plugin in \f[C]\[ti]/.vim/plugin\f[R] and/or
-\f[C]\[ti]/.vim/autoload\f[R], with documentation for each in
-\f[C]\[ti]/.vim/doc\f[R].
+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[R] if I don\[cq]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]\[ti]/.vim\f[R] and
-\f[C]\[ti]/.vim/after\f[R], in the \f[C]ftplugin\f[R], \f[C]indent\f[R],
-and \f[C]syntax\f[R] 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[R] scripts for
-\f[C]\[ti]/.vim/compiler\f[R] 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[R] filetypes, \f[C]<LocalLeader>c\f[R] switches
-\f[C]makeprg\f[R] to \f[C]perl -c\f[R] for checking, and
-\f[C]<LocalLeader>l\f[R] to \f[C]perlcritic\f[R] 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\[cq]t explicitly support Neovim, although most
@@ -559,111 +555,111 @@ 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[R], \f[C]awk(1)\f[R], or \f[C]sed(1)\f[R] scripts in
-\f[C]\[ti]/.local/bin\f[R].
+\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\[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[R] target:
+These scripts are installed by the \f[V]install-bin\f[R] target:
.IP \[bu] 2
Three SSH-related scripts:
.RS 2
.IP \[bu] 2
-\f[C]sls(1df)\f[R] prints hostnames read from a \f[C]ssh_config(5)\f[R]
-file.
-It uses \f[C]slsf(1df)\f[R] 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[R] runs a command on multiple hosts read from
-\f[C]sls(1df)\f[R] 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[R] runs a command on multiple hosts read from
-\f[C]sls(1df)\f[R] 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:
.RS 2
.IP \[bu] 2
-\f[C]hurl(1df)\f[R] extracts values of \f[C]href\f[R] attributes of
-\f[C]<a>\f[R] tags, sorts them uniquely, and writes them to
-\f[C]stdout\f[R]; 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[R] converts Markdown documents to HTML with
-\f[C]pandoc(1)\f[R] and runs the output through \f[C]hurl(1df)\f[R].
+\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[R] accepts a list of URLs on \f[C]stdin\f[R] and writes
-error messages to \f[C]stderr\f[R] 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[R].
+\f[V]curl(1)\f[R].
.IP \[bu] 2
-\f[C]urlh(1df)\f[R] prints the values for a given HTTP header from a
+\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[R] prints the MIME type from the
-\f[C]Content-Type\f[R] header as retrieved by \f[C]urlh(1df)\f[R].
+\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:
.RS 2
.IP \[bu] 2
-\f[C]rfcf(1df)\f[R] 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[R] formats ASCII RFCs.
+\f[V]rfct(1df)\f[R] formats ASCII RFCs.
.IP \[bu] 2
-\f[C]rfcr(1df)\f[R] does both, displaying in a pager if appropriate,
-like a \f[C]man(1)\f[R] 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):
.RS 2
.IP \[bu] 2
-\f[C]rndi(1df)\f[R] 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[R] attempts to get an optional random seed for
-\f[C]rndi(1df)\f[R].
+\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[R] uses \f[C]rndi(1df)\f[R] to choose a random
+\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[R] uses \f[C]rnda(1df)\f[R] to choose a random file
+\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[R] uses \f[C]rndi(1df)\f[R] to choose a random line
+\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[R] 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[R] 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[R] 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[R] 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[R] 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[R] 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[R] converts uppercase to lowercase.
+\f[V]slow(1df)\f[R] converts uppercase to lowercase.
.IP \[bu] 2
-\f[C]supp(1df)\f[R] converts lowercase to uppercase.
+\f[V]supp(1df)\f[R] converts lowercase to uppercase.
.IP \[bu] 2
-\f[C]tl(1df)\f[R] tags input lines with a prefix or suffix, basically a
-\f[C]sed(1)\f[R] 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[R] executes a command and uses \f[C]tl(1df)\f[R] 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[R] 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
@@ -671,388 +667,379 @@ formats.
Six simple aggregate scripts for numbers:
.RS 2
.IP \[bu] 2
-\f[C]max(1df)\f[R] prints the maximum.
+\f[V]max(1df)\f[R] prints the maximum.
.IP \[bu] 2
-\f[C]mean(1df)\f[R] prints the mean.
+\f[V]mean(1df)\f[R] prints the mean.
.IP \[bu] 2
-\f[C]med(1df)\f[R] prints the median.
+\f[V]med(1df)\f[R] prints the median.
.IP \[bu] 2
-\f[C]min(1df)\f[R] prints the minimum.
+\f[V]min(1df)\f[R] prints the minimum.
.IP \[bu] 2
-\f[C]mode(1df)\f[R] prints the first encountered mode.
+\f[V]mode(1df)\f[R] prints the first encountered mode.
.IP \[bu] 2
-\f[C]tot(1df)\f[R] totals the set.
+\f[V]tot(1df)\f[R] totals the set.
.RE
.IP \[bu] 2
Three quick-and-dirty HTML tools:
.RS 2
.IP \[bu] 2
-\f[C]htenc(1df)\f[R] encodes.
+\f[V]htenc(1df)\f[R] encodes.
.IP \[bu] 2
-\f[C]htdec(1df)\f[R] decodes.
+\f[V]htdec(1df)\f[R] decodes.
.IP \[bu] 2
-\f[C]htrec(1df)\f[R] wraps \f[C]a\f[R] 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[R] 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[R] 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:
.RS 2
.IP \[bu] 2
-\f[C]fgscr(1df)\f[R] finds Git repositories in a directory root and
-scrubs them with \f[C]gscr(1df)\f[R].
+\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[R] 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[R] scrubs Git repositories.
+\f[V]gscr(1df)\f[R] scrubs Git repositories.
.IP \[bu] 2
-\f[C]isgr(1df)\f[R] 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[R] 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[R] watches a directory for changes and runs
-\f[C]jfc(1df)\f[R] 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[R] converts seconds to \f[C]hh:mm:ss\f[R] or
-\f[C]mm:ss\f[R] 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[R] converts \f[C]hh:mm:ss\f[R] or \f[C]mm:ss\f[R]
+\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[R] 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[R] runs \f[C]pst(1df)\f[R] with \f[C]$EDITOR\f[R] or
-\f[C]ed(1)\f[R].
+\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[R] runs \f[C]pvi(1df)\f[R] with \f[C]$VISUAL\f[R] or
-\f[C]vi(1)\f[R].
+\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[R] creates paths to all its arguments before invoking
-\f[C]$EDITOR\f[R].
+\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[R] creates paths to all its arguments before invoking
-\f[C]$VISUAL\f[R].
+\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[R] 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[R] 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[R] 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[R] runs \f[C]bc(1)\f[R], 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[R] prints a terminal bell character.
+\f[V]bel(1df)\f[R] prints a terminal bell character.
.IP \[bu] 2
-\f[C]bl(1df)\f[R] 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[R] runs \f[C]br(1df)\f[R] 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[R] launches \f[C]$BROWSER\f[R].
+\f[V]br(1df)\f[R] launches \f[V]$BROWSER\f[R].
.IP \[bu] 2
-\f[C]ca(1df)\f[R] 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[R] 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[R] does the same as \f[C]cf(1df)\f[R], 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[R] 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[R] 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[R] 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[R] 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[R] 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[R] 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[R] 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[R] 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[R] 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[R] copies a pass(1) entry selected by \f[C]dmenu(1)\f[R]
-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[R] lists the biggest entries in a directory.
-.IP \[bu] 2
-\f[C]edda(1df)\f[R] provides a means to run \f[C]ed(1)\f[R] over a set
+\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]eds(1df)\f[R] edits executable script files in \f[C]EDSPATH\f[R],
-defaulting to \f[C]\[ti]/.local/bin\f[R], for personal scripting
+\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]exm(1df)\f[R] works around a screen-clearing quirk of Vim\[cq]s
-\f[C]ex\f[R] mode.
+\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]finc(1df)\f[R] counts the number of results returned from a set of
-given \f[C]find(1)\f[R] conditions.
+\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]fnl(1df)\f[R] 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[R] prints the given files to standard output, each with
+\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[R] runs a set of \f[C]getmailrc\f[R] files; does much
-the same thing as the script \f[C]getmails\f[R] in the \f[C]getmail\f[R]
+\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[R].
+retries using \f[V]try(1df)\f[R].
.IP \[bu] 2
-\f[C]grec(1df)\f[R] is a more logically-named \f[C]grep -c\f[R].
+\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[R] is a more logically-named \f[C]grep -v\f[R].
+\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[R] searches for alphanumeric words in a similar way to
-\f[C]grep(1)\f[R].
+\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[R] provides a \f[C]keywordprg\f[R] for Vim\[cq]s Bash
-script file type that will look for \f[C]help\f[R] 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[R] wraps around a command to allow you to ignore error
+\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[R] posts its input to the \f[C]ix.io\f[R] 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[R] 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[R] is a quick-search wrapped around \f[C]find(1)\f[R].
+\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[R] is like \f[C]true(1)\f[R] or \f[C]false(1)\f[R];
+\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[R] makes given filenames in \f[C]$PATH\f[R] 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[R] is a crude preprocessor for \f[C]m4\f[R].
+\f[V]mi5(1df)\f[R] is a crude preprocessor for \f[V]m4\f[R].
.IP \[bu] 2
-\f[C]mim(1df)\f[R] 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[R] 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[R] 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[R] 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[R] shows the system MOTD.
+\f[V]motd(1df)\f[R] shows the system MOTD.
.IP \[bu] 2
-\f[C]msc(1df)\f[R] 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[R] 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[R] 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[R] 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[R] implements a \f[C]netcat(1)\f[R]-like wrapper for
-\f[C]openssl(1)\f[R]\[cq]s \f[C]s_client\f[R] 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[R] prints concatenated standard input; \f[C]cat(1)\f[R] 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[R] 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[R] wraps around
+\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[C]equalprg\f[R] in Vim.
+source code filter suitable for use as an \f[V]equalprg\f[R] in Vim.
.IP \[bu] 2
-\f[C]pp(1df)\f[R] prints the full path of each argument using
-\f[C]$PWD\f[R].
+\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[R] runs \f[C]pp(1df)\f[R] and includes a leading
-\f[C]$HOSTNAME:\f[R].
+\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[R] 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[R] 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[R] generates just one decent password with
-\f[C]pwgen(1)\f[R].
+\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[R] disables \f[C]stty echo\f[R] 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[R] 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[R] is a very crude interactive \f[C]grep(1)\f[R] 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[R] 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[R] 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[R] 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[R] strips extensions from filenames.
+\f[V]stex(1df)\f[R] strips extensions from filenames.
.IP \[bu] 2
-\f[C]sue(8df)\f[R] execs \f[C]sudoedit(8)\f[R] 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[R] \f[C]sudo(8)\f[R] privileges.
+have \f[V]root\f[R] \f[V]sudo(8)\f[R] privileges.
.IP \[bu] 2
-\f[C]swr(1df)\f[R] allows you to run commands locally specifying remote
-files in \f[C]scp(1)\f[R]\[cq]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[R] manages a to-do file for you with \f[C]$EDITOR\f[R]
-and \f[C]git(1)\f[R]; I used to use Taskwarrior, but found it too
+\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[R] runs \f[C]tmux(1)\f[R] with
-\f[C]attach-session -d\f[R] if a session exists, and
-\f[C]new-session\f[R] if it doesn\[cq]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[R] 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[R] 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[R]
+Good for tolerating blips or temporary failures in \f[V]cron(8)\f[R]
scripts.
.IP \[bu] 2
-\f[C]umake(1df)\f[R] iterates upwards through the directory tree from
-\f[C]$PWD\f[R] until it finds a Makefile for which to run
-\f[C]make(1)\f[R] 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[R] gets the current UNIX timestamp in an unorthodox way
+\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[R] runs \f[C]test(1)\f[R] but fails with explicit
-output via \f[C]vex(1df)\f[R].
+\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[R] runs a command and prints \f[C]true\f[R] or
-\f[C]false\f[R] explicitly to \f[C]stdout\f[R] 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[R] tries to run a POSIX-compliant \f[C]vi(1)\f[R].
+\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[R] 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[R] gets the values of specific resources out of
-\f[C]xrdb -query\f[R] output.
+\f[V]xrq(1df)\f[R] gets the values of specific resources out of
+\f[V]xrdb -query\f[R] output.
.PP
-There\[cq]s some silly stuff in \f[C]install-games\f[R]:
+There\[cq]s some silly stuff in \f[V]install-games\f[R]:
.IP \[bu] 2
-\f[C]aaf(6df)\f[R] 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[R] 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[R] converts English letters to their full width CJK
+\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[R] 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[R] 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[R] shows a picture to accompany \f[C]pks(6df)\f[R]
+\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[R] 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[R] 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[R] outputs
+\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[R] 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[R] 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[R] 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[R] 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[R] and \f[C]install-games\f[R] 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]\[ti]/.local/share/man\f[R] to your \f[C]\[ti]/.manpath\f[R] or
-\f[C]/etc/manpath\f[R] 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[R] or \f[C]make check-sh\f[R], or
-\f[C]make check\f[R] for everything including the scripts in
-\f[C]bin\f[R] and \f[C]games\f[R].
+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[R] 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[R]
-.IP \[bu] 2
-\f[C]lint-bin\f[R]
+\f[V]lint-bash\f[R]
.IP \[bu] 2
-\f[C]lint-games\f[R]
+\f[V]lint-bin\f[R]
.IP \[bu] 2
-\f[C]lint-ksh\f[R]
+\f[V]lint-games\f[R]
.IP \[bu] 2
-\f[C]lint-sh\f[R]
+\f[V]lint-ksh\f[R]
.IP \[bu] 2
-\f[C]lint-xinit\f[R]
-.RE
-.IP \[bu] 2
-Perl::Critic:
-.RS 2
+\f[V]lint-sh\f[R]
.IP \[bu] 2
-\f[C]lint-urxvt\f[R]
+\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[R]
+\f[V]lint-vim\f[R]
.RE
.SS Future development
.PP
@@ -1062,7 +1049,7 @@ See IDEAS.md.
See ISSUES.md.
.SS License
.PP
-Public domain; see the included \f[C]UNLICENSE\f[R] file.
+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
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 2a3dca8b..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
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
new file mode 100644
index 00000000..48f5137a
--- /dev/null
+++ b/ncmpcpp/config
@@ -0,0 +1 @@
+enable_window_title = no
diff --git a/newsboat/systemd/user/newsboat.service b/newsboat/systemd/user/newsboat.service
index 645843e6..020ba328 100644
--- a/newsboat/systemd/user/newsboat.service
+++ b/newsboat/systemd/user/newsboat.service
@@ -1,6 +1,5 @@
[Unit]
Description=Newsboat news reader
-OnFailure=notify-email@%n
[Service]
Environment=TERM=screen-256color
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/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 88601391..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=4096
+# 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/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/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 4410fe0e..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
@@ -28,7 +16,7 @@ bind-key C-a last-window
# Quick ways to kill single windows and the whole server
bind-key '/' confirm-before 'kill-window'
-bind-key "\\" confirm-before 'kill-server'
+bind-key '\' confirm-before 'kill-server'
# Slightly more intuitive way to split windows
bind-key '_' split-window -v
@@ -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 589c7464..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/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/autoload/xdg.vim b/vim/autoload/xdg.vim
index 67a9c5b2..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
@@ -42,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/html_spelllang b/vim/bundle/html_spelllang
new file mode 160000
+Subproject 161e47f00cd5a1bdcef61097b7ba100ffd69a48
diff --git a/vim/bundle/redact_pass b/vim/bundle/redact_pass
-Subproject 0fa145b0014c57e21eadd251eb69c61c0598a03
+Subproject 403a44dc32533e631384dfcca40d520b9088b0d
diff --git a/vim/bundle/spellfile_local b/vim/bundle/spellfile_local
-Subproject 0d70cfc626e1b77c7e31b8cdc35f8d3edc507ba
+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 91cc1ec5..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
@@ -124,24 +147,23 @@ augroup filetypedetect
\ 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
@@ -151,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
@@ -162,6 +184,10 @@ augroup filetypedetect
\ ?*.java
\,?*.jav
\ setfiletype java
+ " Jinja2 templates
+ autocmd BufNewFile,BufRead
+ \ ?*.j2
+ \ setfiletype jinja2
" JSON files
autocmd BufNewFile,BufRead
\ ?*.js
@@ -187,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
@@ -220,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
@@ -227,7 +272,7 @@ augroup filetypedetect
\,*/muttrc.d/?*.rc
\,.muttrc
\,muttrc
- \,/etc/Muttrc.d/*
+ \,*/etc/Muttrc.d/*
\ setfiletype muttrc
" BIND configuration file
autocmd BufNewFile,BufRead
@@ -253,12 +298,12 @@ 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
@@ -296,6 +341,9 @@ augroup filetypedetect
" Python files
autocmd BufNewFile,BufRead
\ ?*.py
+ \,?*.pyw
+ \,?*.pythonstartup
+ \,?*.pythonrc
\ setfiletype python
" Readline configuration file
autocmd BufNewFile,BufRead
@@ -320,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
@@ -363,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
@@ -376,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
@@ -394,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
@@ -409,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
@@ -423,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
@@ -451,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
@@ -503,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
@@ -515,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/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/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 9b916564..d32b437b 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: Mon 15 Nov 2021 21:57:49 UTC
+" Last updated: Fri, 06 May 2022 12:23:48 +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,11 +33,11 @@
"
" :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
+" That's to allow line continuations. The vimrc stub at ~/.vimrc (Unix) or
" ~/_vimrc (Windows) checks that these conditions are met before loading this
" file.
"
@@ -45,29 +45,29 @@
" 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
-" 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.
+" 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.
"
" 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
-" enabled by default in Vim v7.0. Its status as an optional feature wasn’t
+" doing any of this, because it was a compile-time feature that wasn't even
+" enabled by default in Vim v7.0. Its status as an optional feature wasn't
" removed until v8.1.0733.
"
" <https://github.com/vim/vim/releases/tag/v8.1.0733>
@@ -79,43 +79,43 @@ if has('multi_byte')
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
+" 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.
+" 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
-" first value from the 'runtimepath'. We’ll use this later on in the file to
+" 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.
"
if &runtimepath ==# ''
@@ -123,48 +123,45 @@ if &runtimepath ==# ''
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:
+" The next components of the runtime directory that we'll set up here will
+" 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
+" 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
" separate locations for cache files and other configuration.
"
-" We’ll start by retrieving the list of valid paths for configuration from
+" 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.
"
-if has('unix')
- 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()
-endif
+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:
+" 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 exists('s:xdgconfighome') && s:xdgconfighome !=# ''
- \ || exists('s:xdgconfigdirs') && !empty(s:xdgconfigdirs)
+if s:xdgconfighome !=# '' || !empty(s:xdgconfigdirs)
execute 'set runtimepath^='.option#Escape(join(map(
\ extend(
\ s:xdgconfighome !=# '' ? [s:xdgconfighome] : [],
@@ -189,14 +186,14 @@ endif
" 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
" v8.1.716 introduced a way to set this with an option named 'viminfofile',
-" but I don’t see a reason to use that.
+" but I don't see a reason to use that.
"
-if exists('s:xdgcachehome') && 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
@@ -204,22 +201,22 @@ endif
" 50 entries for command and search history is pretty stingy. The documented
" maximum value for this option is 10000. I used that for a while, but
" eventually found that on lower-powered machines, keeping this much command
-" history slowed Vim startup down a bit much for my liking, so I’ve scaled
+" history slowed Vim startup down a bit much for my liking, so I've scaled
" this back to a more conservative 300. If I end up missing useful commands,
" I might try switching this on available memory instead.
"
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.
"
@@ -227,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 exists('s:xdgcachehome') && 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'.(patch#('8.1.251') ? '//' : '')
+ \ s:xdgstatehome.'/backup'.(patch#('8.1.251') ? '//' : '')
\))
endif
@@ -258,13 +255,13 @@ endif
"
if has('unix')
- " Prior to v8.1.1519, Vim didn’t check patterns added to 'backupskip' for
+ " 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
+ " 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.
+ " reloading this file doesn't stack up multiple copies of any added paths.
"
" <https://github.com/vim/vim/releases/tag/v8.1.1519>
"
@@ -273,7 +270,7 @@ if has('unix')
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/*
@@ -302,12 +299,12 @@ endif
" its name, in order to avoid filename collisions, since the 'directory'
" option has supported that hint for much longer than 'backupdir' has.
"
-if exists('s:xdgcachehome') && 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
@@ -318,32 +315,32 @@ 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 exists('s:xdgcachehome') && 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
" Set up a directory for files generated by :mkview. To date, I think I have
" used this twice in my life, but may as well be consistent with the other
-" directories of this type. This isn’t a comma-separated list like the others
+" directories of this type. This isn't a comma-separated list like the others
" ('backupdir', 'directory', 'spell', 'undodir')
"
-if exists('s:xdgcachehome') && 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
@@ -352,28 +349,28 @@ endif
"
filetype plugin indent on
-" There are a couple of contexts in which it’s useful to reload filetypes for
-" the current buffer, quietly doing nothing if filetypes aren’t enabled.
-" We’ll set up a user command named :ReloadFileType to do this, with
+" There are a couple of contexts in which it's useful to reload filetypes for
+" the current buffer, quietly doing nothing if filetypes aren't enabled.
+" We'll set up a user command named :ReloadFileType to do this, with
" an autoloaded function backing it.
"
command! -bar ReloadFileType
\ call reload#FileType()
-" We’ll also define a :ReloadVimrc command. This may seem like overkill, at
+" We'll also define a :ReloadVimrc command. This may seem like overkill, at
" first. Surely just `:source $MYVIMRC` would be good enough?
"
" The problem is there are potential side effects to the current buffer when
" the vimrc is reloaded. The global :set commands for some options may
" trample over different buffer-local settings that were specified by filetype
-" and indent plugins. To ensure these local values are reinstated, we’ll
+" and indent plugins. To ensure these local values are reinstated, we'll
" define the new command wrapper around an autoloaded function that itself
" issues a :ReloadFileType command after the vimrc file is sourced.
"
command! -bar ReloadVimrc
\ call reload#Vimrc()
-" We’ll now create or reset a group of automatic command hooks specific to
+" We'll now create or reset a group of automatic command hooks specific to
" matters related to reloading the vimrc itself, or maintaining and managing
" options set within it.
"
@@ -390,7 +387,7 @@ autocmd vimrc BufWritePost $MYVIMRC,$MYVIM/vimrc
\ ReloadVimrc
" If Vim is new enough (v7.0.187) to support the ##SourceCmd event for
-" automatic command hooks, we’ll also apply a hook for that event to catch
+" automatic command hooks, we'll also apply a hook for that event to catch
" invocations of :source of either vimrc file, and translate that into
" reloading the stub vimrc.
"
@@ -401,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.
"
@@ -413,8 +410,8 @@ set spelllang=en_nz
" '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]\\)
@@ -432,21 +429,20 @@ 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
" 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
-if exists('s:xdgdatahome') && s:xdgdatahome !=# ''
- \ || exists('s:xdgdatadirs') && !empty(s:xdgdatadirs)
+if s:xdgdatahome !=# '' || !empty(s:xdgdatadirs)
execute 'set dictionary^='.option#Escape(join(map(
\ extend(
\ s:xdgdatahome !=# '' ? [s:xdgdatahome] : [],
@@ -458,15 +454,14 @@ 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
+" 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.
"
-if exists('s:xdgdatahome') && s:xdgdatahome !=# ''
- \ || exists('s:xdgdatadirs') && !empty(s:xdgdatadirs)
+if s:xdgdatahome !=# '' || !empty(s:xdgdatadirs)
execute 'set thesaurus^='.option#Escape(join(map(
\ extend(
\ s:xdgdatahome !=# '' ? [s:xdgdatahome] : [],
@@ -476,11 +471,11 @@ if exists('s:xdgdatahome') && s:xdgdatahome !=# ''
\), ','))
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:
"
@@ -495,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
+" 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.
@@ -518,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
@@ -533,7 +528,7 @@ set linebreak
" 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.
+" it's unlikely I'll ever use a different Unicode encoding by choice.
"
if has('multi_byte_encoding')
set showbreak=…
@@ -543,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>
@@ -563,18 +558,18 @@ 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'
+" 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
@@ -587,33 +582,33 @@ 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
" 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.
"
-" 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.
"
@@ -623,9 +618,9 @@ 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/>
"
@@ -642,16 +637,16 @@ 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
" does. I wrote the patch that added it, after becoming envious of an
@@ -665,7 +660,7 @@ 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
" flag should be set here, rather that in the GUI-specific gvimrc file, as one
@@ -675,19 +670,19 @@ 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.
@@ -702,16 +697,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
@@ -728,12 +723,12 @@ 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
@@ -748,19 +743,19 @@ 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
@@ -776,7 +771,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
@@ -785,63 +780,58 @@ 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
" 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
" 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,
" but in the same breath, blanks the terminal attribute that would be used to
@@ -862,7 +852,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
@@ -870,7 +860,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
@@ -879,7 +869,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
@@ -894,9 +884,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.
"
@@ -923,7 +913,7 @@ set wildignore=*~,#*#,*.7z,.DS_Store,.git,.hg,.svn,*.a,*.adf,*.asc,*.au,*.aup
" 'wildignore' option, nor to the +wildmenu feature.
"
" We need to check that the 'wildignorecase' option exists before we set it,
-" because it wasn’t added to Vim until v7.3.72:
+" because it wasn't added to Vim until v7.3.72:
"
" <https://github.com/vim/vim/releases/tag/v7.3.072>
"
@@ -931,7 +921,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>
@@ -939,34 +929,34 @@ 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>
"
@@ -986,7 +976,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
@@ -1007,33 +997,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
+" 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.
"
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.
@@ -1045,10 +1035,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.
+" 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:
@@ -1067,13 +1057,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>
@@ -1083,13 +1073,13 @@ 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>
@@ -1097,24 +1087,24 @@ nnoremap <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!`
" 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
-" 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.
+" 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.
"
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.
+" 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>
@@ -1123,16 +1113,16 @@ sunmap &
" 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.
@@ -1158,26 +1148,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.
"
@@ -1194,20 +1184,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
@@ -1250,13 +1240,6 @@ 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
@@ -1268,20 +1251,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
@@ -1289,7 +1283,7 @@ 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
@@ -1305,9 +1299,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
@@ -1340,17 +1334,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
@@ -1385,8 +1379,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>
@@ -1402,7 +1396,7 @@ 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>
@@ -1419,11 +1413,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
@@ -1445,7 +1439,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
@@ -1460,7 +1454,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
@@ -1470,7 +1464,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>\
@@ -1492,14 +1486,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
@@ -1534,7 +1528,7 @@ ounmap <Leader>7
sunmap <Leader>7
"" Leader,*/8 is "sticky star":
"" - Set search string to word under cursor
-"" - Show search highlighting if it’s enabled
+"" - Show search highlighting if it's enabled
"" - Don't move the cursor
nnoremap <Leader>*
\ :<C-U>let @/ = expand('<cword>') <Bar> let &hlsearch = &hlsearch<CR>
@@ -1547,22 +1541,22 @@ nnoremap <Leader>`
nnoremap <Leader>~
\ :<C-U>vertical ScratchBuffer<CR>
-" There’s no digraph for ZERO WIDTH SPACE (U+200B), which I often need to work
+" There's no digraph for ZERO WIDTH SPACE (U+200B), which I often need to work
" around word boundary problems in tagging people on the Fediverse.
"
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:
"
@@ -1591,10 +1585,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..92c53dfb 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
+" 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.
+" '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.
"
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/youtube-dl/config b/youtube-dl/config
deleted file mode 100644
index ae2162f5..00000000
--- a/youtube-dl/config
+++ /dev/null
@@ -1,5 +0,0 @@
-# Get WebM if we can, but keep going if not
---format 'bestvideo[ext=webm]+bestaudio[ext=webm]/best'
-
-# Save into the ~/download directory
---output ~/download/%(title)s-%(id)s.%(ext)s
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