aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rw-r--r--Makefile210
-rw-r--r--README.md27
-rw-r--r--VERSION4
-rw-r--r--bash/bash_completion.d/_ssh_config_hosts.bash29
-rw-r--r--bash/bash_completion.d/mosh.bash5
-rw-r--r--bash/bashrc.d/prompt.bash4
-rwxr-xr-xbin/dmenu_pass.sh17
-rw-r--r--[-rwxr-xr-x]bin/gscr.sh0
-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/tm.sh9
-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--compton/xsession.d/compton.sh2
-rw-r--r--dunst/xsession.d/dunst.sh2
-rw-r--r--finger/pgpkey8
-rw-r--r--finger/plan2
-rw-r--r--git/config.mi52
-rw-r--r--gtk/gtk-3.0/settings.ini2
-rw-r--r--gtk/gtkrc-2.01
-rw-r--r--i3/config20
-rw-r--r--i3/status6
-rw-r--r--ksh/kshrc.d/prompt.ksh4
-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/xsession.sh2
-rw-r--r--man/man1/dmenu_pass.1df17
-rw-r--r--man/man1/sls.1df8
-rw-r--r--man/man1/slsf.1df8
-rw-r--r--man/man1/xrq.1df4
-rw-r--r--man/man7/dotfiles.7df718
-rw-r--r--mpv/mpv.conf10
-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--parcellite/xsession.d/parcellite.sh2
-rw-r--r--parcellite/xsession.d/redshift.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/xsession.d/redshift.sh2
-rw-r--r--rofi/bin/rofi_pass.sh92
-rw-r--r--sh/profile41
-rw-r--r--sh/profile.d/browser.sh10
-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/shrc.d/gdb.sh2
-rw-r--r--sh/shrc.d/ls.sh10
-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/which.sh2
-rw-r--r--sxhkd/sxhkdrc13
-rw-r--r--sxhkd/xsession.d/sxhkd.sh5
-rw-r--r--systemd/profile.d/systemd.sh3
-rw-r--r--systemd/user/notify-email@.service2
-rw-r--r--systemd/user/run-.service.d/50-notify-email.conf5
-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--thunar/xsession.d/thunar.sh2
-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/Xresources.d/URxvt32
-rw-r--r--urxvt/ext/select.pl85
-rw-r--r--urxvt/xsession.d/urxvt.sh2
-rw-r--r--vim/after/ftplugin/python.vim10
-rw-r--r--vim/autoload/xdg.vim12
m---------vim/bundle/copy_linebreak0
m---------vim/bundle/spellfile_local0
m---------vim/bundle/strip_trailing_whitespace0
-rw-r--r--vim/filetype.vim143
-rw-r--r--vim/ftplugin/textarea.vim12
-rw-r--r--vim/plugin/matchit.vim2
-rw-r--r--vim/vimrc98
-rw-r--r--vim/vimrc.stub9
-rw-r--r--x/Xresources108
-rw-r--r--x/Xresources.d/XTerm24
-rw-r--r--x/shrc.d/x.sh (renamed from sh/shrc.d/x.sh)0
-rw-r--r--x/xsession.sh60
-rw-r--r--x/xsessionrc17
-rw-r--r--yt-dlp/config5
-rw-r--r--zsh/zshrc.d/prompt.zsh4
109 files changed, 1068 insertions, 1740 deletions
diff --git a/.gitignore b/.gitignore
index d5431855..417741c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,7 +25,6 @@
/bin/dfv
/bin/dfv.m4
/bin/dfv.sh
-/bin/dmenu_pass
/bin/dub
/bin/edda
/bin/edda.m4
@@ -178,13 +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/Makefile b/Makefile
index c3c3c2ca..9f98ce20 100644
--- a/Makefile
+++ b/Makefile
@@ -11,11 +11,9 @@
install-bin-man \
install-cabal \
install-cargo \
- install-compton \
install-cpanm \
install-curl \
install-dillo \
- install-dunst \
install-emacs \
install-ex \
install-finger \
@@ -23,8 +21,8 @@
install-games-man \
install-git \
install-gnupg \
- install-gtk \
install-i3 \
+ install-init \
install-ksh \
install-less \
install-login-shell \
@@ -44,22 +42,20 @@
install-rbenv \
install-readline \
install-redshift \
+ install-rofi \
install-scrot \
install-sh \
install-subversion \
install-sxhkd \
install-systemd \
- install-terminfo \
- install-thunar \
install-tidy \
install-tmux \
- install-urxvt \
install-vim \
install-vim-gui \
install-vint \
install-wget \
install-x \
- install-yt-dlp \
+ install-xsession \
install-zsh \
check \
check-bash \
@@ -70,7 +66,7 @@
check-login-shell \
check-man \
check-sh \
- check-urxvt \
+ check-x \
check-xsession \
check-zsh \
lint \
@@ -80,8 +76,8 @@
lint-git-template-hooks \
lint-ksh \
lint-sh \
- lint-urxvt \
lint-vim \
+ lint-x \
lint-xsession
.SUFFIXES:
@@ -118,7 +114,6 @@ BINS = bin/ap \
bin/ddup \
bin/defang \
bin/dfv \
- bin/dmenu_pass \
bin/dub \
bin/edda \
bin/eds \
@@ -282,6 +277,7 @@ all: $(BINS) \
git/config \
gnupg/profile.d/gnupg.sh \
less/less \
+ tmux/bin/tmux \
x/xsession
clean distclean:
@@ -300,7 +296,8 @@ clean distclean:
include/mktd.m4 \
less/less \
mutt/filters/markdown-to-html \
- urxvt/ext/select \
+ mutt/muttrc.d/src \
+ tmux/bin/tmux \
x/xsession
.awk:
@@ -351,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
@@ -369,6 +366,7 @@ install: install-bin \
install-ex \
install-git \
install-gnupg \
+ install-init \
install-less \
install-login-shell \
install-man \
@@ -405,27 +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
-
-install-compton: install-x
- cp -p -- compton/xsession.d/* $(HOME)/.xsession.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
- cp -p -- dunst/xsession.d/* $(HOME)/.xsession.d
-
install-emacs: emacs/bin/emacsm install-sh
mkdir -p -- $(HOME)/.local/bin
cp -p -- emacs/emacs $(HOME)/.emacs
@@ -451,39 +443,38 @@ 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-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-logrotate: install-systemd
mkdir -p -- $(XDG_CONFIG_HOME)/logrotate \
$(XDG_CONFIG_HOME)/logrotate/config.d
- cp -- logrotate/config $(XDG_CONFIG_HOME)/logrotate
- mkdir -p -- $(XDG_CONFIG_HOME)/systemd/user
- cp -p -- logrotate/systemd/user/* $(XDG_CONFIG_HOME)/systemd/user
- -systemctl --user enable logrotate.timer
- -systemctl --user start logrotate.timer
+ 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
@@ -496,9 +487,9 @@ install-mpv:
mkdir -p -- \
$(XDG_CONFIG_HOME)/mpv \
$(XDG_DATA_HOME)/mpv/screenshots
- cp -p -- mpv/* $(XDG_CONFIG_HOME)/mpv
+ 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 \
@@ -519,19 +510,19 @@ install-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
- 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
@@ -540,49 +531,54 @@ install-login-shell: check-login-shell
install-parcellite: install-x
cp -p -- parcellite/parcelliterc $(XDG_CONFIG_HOME)
- cp -p -- redshift/xsession.d/* $(HOME)/.xsession.d
+ 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/* $(HOME)/.xsession.d
+ 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:
@@ -592,45 +588,34 @@ install-subversion:
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/* $(HOME)/.xsession.d
-
-install-systemd:
- mkdir -p -- $(XDG_CONFIG_HOME)/systemd/user \
- $(XDG_CONFIG_HOME)/systemd/user/service.d \
- $(XDG_CONFIG_HOME)/systemd/user/notify-email@.service.d
- cp -p -- systemd/user/*.service $(XDG_CONFIG_HOME)/systemd/user
- cp -p -- systemd/user/service.d/*.conf $(XDG_CONFIG_HOME)/systemd/user/service.d
- cp -p -- systemd/user/notify-email@.service.d/*.conf $(XDG_CONFIG_HOME)/systemd/user/notify-email@.service.d
- -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-thunar: install-x
- cp -p -- thunar/xsession.d/* $(HOME)/.xsession.d
+ 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 install-x
- mkdir -p -- $(HOME)/.urxvt/ext
- cp -p -- urxvt/ext/select $(HOME)/.urxvt/ext
- cp -p -- urxvt/Xresources.d/* $(HOME)/.Xresources.d
- cp -p -- urxvt/xsession.d/* $(HOME)/.xsession.d
+ cp -p -- tmux/systemd/user/tmux.service \
+ $(XDG_DATA_HOME)/systemd/user
VIM = vim
VIMDIR = $(HOME)/.vim
@@ -659,33 +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: x/xsession check-xsession install-logrotate
- mkdir -p -- \
- $(HOME)/.xsession.d \
- $(HOME)/.Xresources.d \
- $(XDG_CONFIG_HOME)/log/xsession
- cp -p -- x/xsession $(HOME)/.xsession
+install-x: check-x install-logrotate install-sh
cp -p -- x/Xresources $(HOME)/.Xresources
- cp -p -- x/Xresources.d/* $(HOME)/.Xresources.d
- cp -p -- x/logrotate/config.d/* $(XDG_CONFIG_HOME)/logrotate/config.d
+ cp -p -- x/shrc.d/x.sh $(HOME)/.shrc.d
+ mkdir -p -- $(HOME)/.xsession.d
-install-yt-dlp install-youtube-dl:
- mkdir -p -- $(XDG_CONFIG_HOME)/yt-dlp
- cp -p -- yt-dlp/config $(XDG_CONFIG_HOME)/yt-dlp
+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
@@ -720,8 +701,8 @@ 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-xsession: x/xsession
sh check/xsession.sh
@@ -735,9 +716,8 @@ lint: lint-bash \
lint-git-template-hooks \
lint-ksh \
lint-sh \
- lint-urxvt \
lint-vim \
- lint-xsession
+ lint-x
lint-bash: check-bash
sh lint/bash.sh
@@ -757,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-xsession: check-xsession
+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 3b89b34b..0c4ee069 100644
--- a/README.md
+++ b/README.md
@@ -87,8 +87,6 @@ Configuration is included for:
- [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
@@ -105,8 +103,6 @@ Configuration is included for:
- [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
@@ -114,8 +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
-- [yt-dlp](https://github.com/yt-dlp/yt-dlp)---Download manager for video
- hosting websites
There is also some slightly customized support for multi-version environment
management for three major scripting languages:
@@ -126,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
@@ -325,16 +318,6 @@ 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
@@ -417,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.
@@ -527,8 +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.
-- `dmenu_pass(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.
@@ -657,9 +638,7 @@ available to run them:
- `lint-games`
- `lint-ksh`
- `lint-sh`
- - `lint-xsession`
-- Perl::Critic:
- - `lint-urxvt`
+ - `lint-x`
- [Vint](https://github.com/Kuniwak/vint):
- `lint-vim`
diff --git a/VERSION b/VERSION
index 8abe7a65..f677da70 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-tejr dotfiles v12.7.0
-Fri, 27 May 2022 04:07:18 +0000
+tejr dotfiles v12.41.0
+Wed, 02 Aug 2023 21:39:23 +0000
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.d/prompt.bash b/bash/bashrc.d/prompt.bash
index bdea7ace..e0a03438 100644
--- a/bash/bashrc.d/prompt.bash
+++ b/bash/bashrc.d/prompt.bash
@@ -14,9 +14,9 @@ prompt() {
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'
diff --git a/bin/dmenu_pass.sh b/bin/dmenu_pass.sh
deleted file mode 100755
index 44296439..00000000
--- a/bin/dmenu_pass.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-# Pick and type out a pass(1) password with dmenu(1) and xdotool(1)
-self=dmenu_pass
-cd -- "${PASSWORD_STORE_DIR:-"$HOME"/.password-store}" || exit
-# shellcheck disable=SC2016
-name=$(
- find . -name \*.gpg ! -type d |
- sed -e 's_^\./__' -e 's_\.gpg$__' |
- LC_ALL=C sort -f |
- dmenu
-)
-password=$(pass show -- "$name" | head -n 1) || exit
-[ -n "$password" ] || exit
-printf %s "$password" | xdotool type --clearmodifiers --file - \
- || exit
-notify-send --app-name="$self" -- \
- "Password typed" \
- "$name"
diff --git a/bin/gscr.sh b/bin/gscr.sh
index 26eafb12..26eafb12 100755..100644
--- a/bin/gscr.sh
+++ b/bin/gscr.sh
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/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/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/compton/xsession.d/compton.sh b/compton/xsession.d/compton.sh
deleted file mode 100644
index f579eac1..00000000
--- a/compton/xsession.d/compton.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-# Start compton(1)
-compton -b
diff --git a/dunst/xsession.d/dunst.sh b/dunst/xsession.d/dunst.sh
deleted file mode 100644
index 6aad0c86..00000000
--- a/dunst/xsession.d/dunst.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-# Start dunst(1) to display libnotify messages
-dunst &
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 6ae7f8ef..efdbc277 100644
--- a/git/config.mi5
+++ b/git/config.mi5
@@ -9,7 +9,7 @@
[init]
defaultBranch = master
- templateDir = <% XDG_CONFIG_HOME %>/git/template
+ templateDir = <% XDG_DATA_HOME %>/git/template
[log]
date = local
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 1fe8e336..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
@@ -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/ksh/kshrc.d/prompt.ksh b/ksh/kshrc.d/prompt.ksh
index b0023670..99d999de 100644
--- a/ksh/kshrc.d/prompt.ksh
+++ b/ksh/kshrc.d/prompt.ksh
@@ -12,9 +12,9 @@ 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
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/xsession.sh b/lint/xsession.sh
index dc291fd3..5544e1be 100644
--- a/lint/xsession.sh
+++ b/lint/xsession.sh
@@ -1 +1 @@
-shellcheck -e SC1090 -s sh -- x/xsession
+shellcheck -e SC1090 -e SC1091 -s sh -- x/xsession
diff --git a/man/man1/dmenu_pass.1df b/man/man1/dmenu_pass.1df
deleted file mode 100644
index c83cd837..00000000
--- a/man/man1/dmenu_pass.1df
+++ /dev/null
@@ -1,17 +0,0 @@
-.TH DMENU_PASS 1df "May 2022" "Manual page for dmenu_pass"
-.SH NAME
-.B dmenu_pass
-\- pick and type a password-store password
-.SH SYNOPSIS
-.B dmenu_pass
-.SH DESCRIPTION
-.B dmenu_pass
-applies dmenu(1) to pick a password entry from a pass(1) store and types it out
-with xdotool(1).
-.P
-A notification with the default priority is sent when the password is
-successfully typed.
-.SH SEE ALSO
-dmenu(1), notify-send(1), pass(1), xdotool(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/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/man7/dotfiles.7df b/man/man7/dotfiles.7df
index 8c19fbfe..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
@@ -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,7 +131,7 @@ with URL syntax
.IP \[bu] 2
Dillo (https://www.dillo.org/)\[em]A lightweight web browser
.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
@@ -127,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
@@ -138,7 +149,7 @@ 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
@@ -146,7 +157,7 @@ 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
@@ -161,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
@@ -176,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
-yt-dlp (https://github.com/yt-dlp/yt-dlp)\[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:
@@ -193,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
@@ -237,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:
@@ -261,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:
@@ -271,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]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]tor()\f[R] is just a terse shortcut for using Torsocks to anonymize
+\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[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]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
@@ -444,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
@@ -472,19 +476,8 @@ 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
@@ -493,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
@@ -509,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
@@ -562,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
@@ -674,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]dmenu_pass(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-xsession\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
@@ -1065,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 d1624a79..553d73b7 100644
--- a/mpv/mpv.conf
+++ b/mpv/mpv.conf
@@ -22,3 +22,13 @@ screenshot-format="png"
# ~/.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/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/parcellite/xsession.d/redshift.sh b/parcellite/xsession.d/redshift.sh
deleted file mode 100644
index 25241ab3..00000000
--- a/parcellite/xsession.d/redshift.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-# Start parcellite(1)
-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 cddcdd9e..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/$(python3 -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/xsession.d/redshift.sh b/redshift/xsession.d/redshift.sh
index 929f564e..503877dc 100644
--- a/redshift/xsession.d/redshift.sh
+++ b/redshift/xsession.d/redshift.sh
@@ -1,2 +1,2 @@
-# Start redshift(1)
+# 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 ce18e127..00000000
--- a/sh/profile.d/browser.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-# Set command-line browser to Debian's alternatives name www-browser, or
-# failing that, just to `lynx`; ~/.xsession will change this to something
-# graphical instead if invoked.
-#
-if command -v www-browser >/dev/null 2>&1 ; then
- BROWSER=www-browser
-else
- BROWSER=lynx
-fi
-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.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/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/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
index d655dc30..b4f823b6 100644
--- a/sxhkd/sxhkdrc
+++ b/sxhkd/sxhkdrc
@@ -8,7 +8,7 @@ super + b
exec x-www-browser
super + d
- exec dmenu_run
+ exec rofi -modi drun -show drun
super + g
exec xgoc
@@ -17,16 +17,19 @@ super + i
exec gimp
super + m
- exec x-terminal-emulator -e tm
+ exec x-terminal-emulator -title tm -e tm
super + p
- exec dmenu_pass
+ exec rofi_pass
+
+super + shift + p
+ exec rofi_pass --login
super + t
exec thunar
super + v
- exec x-terminal-emulator -e "$VISUAL"
+ exec x-terminal-emulator -title "$VISUAL" -e "$VISUAL"
Print
exec xsnap
@@ -47,4 +50,4 @@ XF86Audio{Lower,Raise}Volume
exec pactl set-sink-volume @DEFAULT_SINK@ {-5%,+5%}
XF86Calculator
- exec x-terminal-emulator -e bcq
+ exec x-terminal-emulator -title bcq -e bcq
diff --git a/sxhkd/xsession.d/sxhkd.sh b/sxhkd/xsession.d/sxhkd.sh
index d52396c9..ca0e27e3 100644
--- a/sxhkd/xsession.d/sxhkd.sh
+++ b/sxhkd/xsession.d/sxhkd.sh
@@ -1,3 +1,2 @@
-# Start sxhkd(1)
-SXHKD_SHELL=$(command -pv sh) \
- sxhkd &
+# 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/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/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/thunar/xsession.d/thunar.sh b/thunar/xsession.d/thunar.sh
deleted file mode 100644
index 9d35a3ce..00000000
--- a/thunar/xsession.d/thunar.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-# Start Thunar's daemon mode
-thunar --daemon &
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/Xresources.d/URxvt b/urxvt/Xresources.d/URxvt
deleted file mode 100644
index f4c30d54..00000000
--- a/urxvt/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/urxvt/ext/select.pl b/urxvt/ext/select.pl
deleted file mode 100644
index 7701e963..00000000
--- a/urxvt/ext/select.pl
+++ /dev/null
@@ -1,85 +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 ();
-}
diff --git a/urxvt/xsession.d/urxvt.sh b/urxvt/xsession.d/urxvt.sh
deleted file mode 100644
index 03b0efd5..00000000
--- a/urxvt/xsession.d/urxvt.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-# Run urxvtd(1) in the background
-urxvtd --fork --opendisplay
diff --git a/vim/after/ftplugin/python.vim b/vim/after/ftplugin/python.vim
index b5071e3b..2ca1ae89 100644
--- a/vim/after/ftplugin/python.vim
+++ b/vim/after/ftplugin/python.vim
@@ -1,3 +1,11 @@
+" 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')
@@ -20,7 +28,7 @@ let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>c'
" Mappings to choose 'equalprg'
nnoremap <buffer> <LocalLeader>t
- \ :<C-U>setlocal equalprg=equalprg=autopep8\ -aaa\ --\ -<CR>
+ \ :<C-U>setlocal equalprg=autopep8\ -aaa\ --\ -<CR>
nnoremap <buffer> <LocalLeader>i
\ :<C-U>setlocal equalprg<<CR>
let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>t'
diff --git a/vim/autoload/xdg.vim b/vim/autoload/xdg.vim
index 90ea9c2f..cb7adcf5 100644
--- a/vim/autoload/xdg.vim
+++ b/vim/autoload/xdg.vim
@@ -43,25 +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 s:Home('XDG_STATE_HOME')
+ 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/spellfile_local b/vim/bundle/spellfile_local
-Subproject 0958f0f8d9754b2e7571b6a50f4db434b719564
+Subproject 6199ee785c6fb964292ec6e82c5b8a0f79e2606
diff --git a/vim/bundle/strip_trailing_whitespace b/vim/bundle/strip_trailing_whitespace
-Subproject 90e60095bcfcfeb60bea60ba7f51bbfac3bf469
+Subproject 03782cdaf9db6329665316e1dc2d1b8270714a3
diff --git a/vim/filetype.vim b/vim/filetype.vim
index 60221c83..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
@@ -191,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
@@ -224,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
@@ -231,7 +272,7 @@ augroup filetypedetect
\,*/muttrc.d/?*.rc
\,.muttrc
\,muttrc
- \,/etc/Muttrc.d/*
+ \,*/etc/Muttrc.d/*
\ setfiletype muttrc
" BIND configuration file
autocmd BufNewFile,BufRead
@@ -257,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
@@ -300,6 +341,9 @@ augroup filetypedetect
" Python files
autocmd BufNewFile,BufRead
\ ?*.py
+ \,?*.pyw
+ \,?*.pythonstartup
+ \,?*.pythonrc
\ setfiletype python
" Readline configuration file
autocmd BufNewFile,BufRead
@@ -324,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
@@ -367,19 +421,21 @@ augroup filetypedetect
\,.shinit
\,.shrc
\,.xinitrc
+ \,.xprofile
\,.xsession
\,.xsessionrc
- \,/etc/default/*
+ \,*/etc/default/*
\,configure
\,profile
\,shinit
\,shrc
\,xinitrc
+ \,xprofile
\,xsession
\,xsessionrc
- \,/etc/X11/xinit
- \,/etc/X11/Xreset
- \,/etc/X11/Xsession
+ \,*/etc/X11/xinit
+ \,*/etc/X11/Xreset
+ \,*/etc/X11/Xsession
\ let b:is_posix = 1
\|setfiletype sh
" SQL
@@ -387,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
@@ -405,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
@@ -420,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
@@ -434,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
@@ -462,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
@@ -514,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
@@ -526,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/vimrc b/vim/vimrc
index fb26b75e..d32b437b 100644
--- a/vim/vimrc
+++ b/vim/vimrc
@@ -25,7 +25,7 @@
" <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
@@ -137,18 +137,16 @@ let $MYVIM = option#Split(&runtimepath)[0]
" both the XDG_CONFIG_HOME and XDG_CONFIG_DIRS variables, or from their
" defaults, using autoloaded xdg# functions.
"
-if has('unix')
- 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()
-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
@@ -163,8 +161,7 @@ endif
"
" 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] : [],
@@ -191,7 +188,7 @@ endif
" v8.1.716 introduced a way to set this with an option named 'viminfofile',
" but I don't see a reason to use that.
"
-if exists('s:xdgstatehome') && s:xdgstatehome !=# ''
+if s:xdgstatehome !=# ''
if !isdirectory(s:xdgstatehome)
call mkdir(s:xdgstatehome, 'p', 0700)
endif
@@ -241,7 +238,7 @@ set history=300
" 'backupfullname', 'swapfilefullname' would have been clearer.
"
set backup
-if exists('s:xdgstatehome') && s:xdgstatehome !=# ''
+if s:xdgstatehome !=# ''
if !isdirectory(s:xdgstatehome.'/backup')
call mkdir(s:xdgstatehome.'/backup', 'p', 0700)
endif
@@ -302,7 +299,7 @@ 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:xdgstatehome') && s:xdgstatehome !=# ''
+if s:xdgstatehome !=# ''
if !isdirectory(s:xdgstatehome.'/swap')
call mkdir(s:xdgstatehome.'/swap', 'p', 0700)
endif
@@ -323,7 +320,7 @@ endif
" 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.
"
-if exists('s:xdgstatehome') && s:xdgstatehome !=# '' && has('persistent_undo')
+if s:xdgstatehome !=# '' && has('persistent_undo')
set undofile
if !isdirectory(s:xdgstatehome.'/undo')
call mkdir(s:xdgstatehome.'/undo', 'p', 0700)
@@ -338,7 +335,7 @@ endif
" directories of this type. This isn't a comma-separated list like the others
" ('backupdir', 'directory', 'spell', 'undodir')
"
-if exists('s:xdgstatehome') && s:xdgstatehome !=# '' && has('mksession')
+if s:xdgstatehome !=# '' && has('mksession')
if !isdirectory(s:xdgstatehome.'/view')
call mkdir(s:xdgstatehome.'/view', 'p', 0700)
endif
@@ -445,8 +442,7 @@ endif
" 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] : [],
@@ -465,8 +461,7 @@ endif
" 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] : [],
@@ -817,17 +812,6 @@ set splitbelow splitright
"
set notitle
-" 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.
-"
-if &term =~# '^putty\|^tmux'
- set ttyfast
-endif
-
" 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
@@ -992,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
@@ -1073,7 +1057,7 @@ 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.
@@ -1132,7 +1116,7 @@ sunmap &
" 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)
@@ -1169,7 +1153,7 @@ nnoremap ]l
" 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)
@@ -1256,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
@@ -1274,6 +1251,17 @@ nnoremap <Leader>z
nnoremap <Leader>u
\ :<C-U>set spelllang=en_us<CR>
+" 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.
@@ -1287,7 +1275,7 @@ nnoremap <Leader>u
" 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
@@ -1425,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
@@ -1466,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
@@ -1502,10 +1490,10 @@ nnoremap <Leader>?
" 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
diff --git a/vim/vimrc.stub b/vim/vimrc.stub
index 484e881e..92c53dfb 100644
--- a/vim/vimrc.stub
+++ b/vim/vimrc.stub
@@ -1,13 +1,12 @@
" 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.
+" 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
diff --git a/x/Xresources b/x/Xresources
index 3f586a87..829b208e 100644
--- a/x/Xresources
+++ b/x/Xresources
@@ -1,2 +1,106 @@
-#include ".Xresources.d/URxvt"
-#include ".Xresources.d/XTerm"
+/* 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/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/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
index 3475c0bd..9cf4a99a 100644
--- a/x/xsession.sh
+++ b/x/xsession.sh
@@ -1,4 +1,20 @@
-# Custom X session to fit into Debian's way of doing things
+#
+# 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
@@ -8,43 +24,34 @@
# - ~/.config/xrandr/config
# - ~/.config/xwallpaper/config
#
-# We wait for the monitor setup to finish before proceeding, but we can do
-# other things while we wait for the wallpaper to be drawn thereon.
-#
xargs xrandr \
< "${XDG_CONFIG_HOME:-"$HOME"/.config}"/xrandr/config
xargs xwallpaper \
- < "${XDG_CONFIG_HOME:-"$HOME"/.config}"/xwallpaper/config &
-
-# Set a few keyboard map options:
-#
-# - Remap Caps Lock as another Control key.
-# - Remap right Alt as a Compose key.
-# - Kill X server with Ctrl+Alt+Backspace.
-#
-setxkbmap \
- -option caps:ctrl_modifier \
- -option compose:ralt \
- -option terminate:ctrl_alt_bksp \
- &
+ < "${XDG_CONFIG_HOME:-"$HOME"/.config}"/xwallpaper/config
# Set a few X user preferences:
#
# - No bell
-# - No power management
+# - Power management on, but start with no timeouts
# - Quick curved mouse acceleration
# - No screen saver
#
xset \
b off \
- -dpms \
+ dpms 0 0 0 \
mouse 5/2 0 \
- s off \
- &
+ s off
-# Update browser, since .profile set this to a curses browser on login
-# shellcheck disable=SC2034
-BROWSER=x-www-browser
+# 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
@@ -53,6 +60,5 @@ for sh in "$HOME"/.xsession.d/*.sh ; do
done
unset -v sh
-# Start Debian's configured window manager now that everything's ready; at the
-# time of writing, this is normally i3wm
-exec x-window-manager
+# 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/yt-dlp/config b/yt-dlp/config
deleted file mode 100644
index ae2162f5..00000000
--- a/yt-dlp/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 eb43484f..245f2973 100644
--- a/zsh/zshrc.d/prompt.zsh
+++ b/zsh/zshrc.d/prompt.zsh
@@ -8,9 +8,9 @@ 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'%~'