diff options
184 files changed, 2302 insertions, 2798 deletions
@@ -25,7 +25,6 @@ /bin/dfv /bin/dfv.m4 /bin/dfv.sh -/bin/dmp /bin/dub /bin/edda /bin/edda.m4 @@ -156,6 +155,7 @@ /bin/xgoc /bin/xrbg /bin/xrq +/bin/xsnap /dillo/dillorc /dillo/dillorc.m4 /emacs/bin/emacsm @@ -177,12 +177,15 @@ /games/zs /git/config /git/config.m4 +/git/template/hooks/post-update /git/template/hooks/pre-commit /git/template/hooks/prepare-commit-msg -/git/template/hooks/post-update /gnupg/profile.d/gnupg.sh /gnupg/profile.d/gnupg.sh.m4 /include/mktd.m4 /less/less /mutt/filters/markdown-to-html -/urxvt/ext/select +/mutt/muttrc.d/src +/rofi/bin/rofi_pass +/tmux/bin/tmux +/x/xsession diff --git a/.gitmodules b/.gitmodules index e892cefb..e0ef1bf5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,116 +1,119 @@ # Vim plugins [submodule "vim/bundle/alternate_filetypes"] path = vim/bundle/alternate_filetypes - url = https://sanctum.geek.nz/code/vim-alternate-filetypes.git + url = https://dev.sanctum.geek.nz/code/vim-alternate-filetypes.git [submodule "vim/bundle/big_file_options"] path = vim/bundle/big_file_options - url = https://sanctum.geek.nz/code/vim-big-file-options.git + url = https://dev.sanctum.geek.nz/code/vim-big-file-options.git [submodule "vim/bundle/colon_operator"] path = vim/bundle/colon_operator - url = https://sanctum.geek.nz/code/vim-colon-operator.git + url = https://dev.sanctum.geek.nz/code/vim-colon-operator.git [submodule "vim/bundle/copy_linebreak"] path = vim/bundle/copy_linebreak - url = https://sanctum.geek.nz/code/vim-copy-linebreak.git + url = https://dev.sanctum.geek.nz/code/vim-copy-linebreak.git [submodule "vim/bundle/cursorline_current"] path = vim/bundle/cursorline_current - url = https://sanctum.geek.nz/code/vim-cursorline-current.git + url = https://dev.sanctum.geek.nz/code/vim-cursorline-current.git [submodule "vim/bundle/detect_indent"] path = vim/bundle/detect_indent - url = https://sanctum.geek.nz/code/vim-detect-indent.git + url = https://dev.sanctum.geek.nz/code/vim-detect-indent.git [submodule "vim/bundle/digraph_search"] path = vim/bundle/digraph_search - url = https://sanctum.geek.nz/code/vim-digraph-search.git + url = https://dev.sanctum.geek.nz/code/vim-digraph-search.git [submodule "vim/bundle/equalalways_resized"] path = vim/bundle/equalalways_resized - url = https://sanctum.geek.nz/code/vim-equalalways-resized.git + url = https://dev.sanctum.geek.nz/code/vim-equalalways-resized.git [submodule "vim/bundle/foldlevelstart_stdin"] path = vim/bundle/foldlevelstart_stdin - url = https://sanctum.geek.nz/code/vim-foldlevelstart-stdin.git + url = https://dev.sanctum.geek.nz/code/vim-foldlevelstart-stdin.git +[submodule "vim/bundle/html_spelllang"] + path = vim/bundle/html_spelllang + url = https://dev.sanctum.geek.nz/code/vim-html-spelllang.git [submodule "vim/bundle/insert_cancel"] path = vim/bundle/insert_cancel - url = https://sanctum.geek.nz/code/vim-insert-cancel.git + url = https://dev.sanctum.geek.nz/code/vim-insert-cancel.git [submodule "vim/bundle/insert_suspend_hlsearch"] path = vim/bundle/insert_suspend_hlsearch - url = https://sanctum.geek.nz/code/vim-insert-suspend-hlsearch.git + url = https://dev.sanctum.geek.nz/code/vim-insert-suspend-hlsearch.git [submodule "vim/bundle/insert_timeout"] path = vim/bundle/insert_timeout - url = https://sanctum.geek.nz/code/vim-insert-timeout.git + url = https://dev.sanctum.geek.nz/code/vim-insert-timeout.git [submodule "vim/bundle/keep_position"] path = vim/bundle/keep_position - url = https://sanctum.geek.nz/code/vim-keep-position.git + url = https://dev.sanctum.geek.nz/code/vim-keep-position.git [submodule "vim/bundle/paste_insert"] path = vim/bundle/paste_insert - url = https://sanctum.geek.nz/code/vim-paste-insert.git + url = https://dev.sanctum.geek.nz/code/vim-paste-insert.git [submodule "vim/bundle/put_blank_lines"] path = vim/bundle/put_blank_lines - url = https://sanctum.geek.nz/code/vim-put-blank-lines.git + url = https://dev.sanctum.geek.nz/code/vim-put-blank-lines.git [submodule "vim/bundle/put_date"] path = vim/bundle/put_date - url = https://sanctum.geek.nz/code/vim-put-date.git + url = https://dev.sanctum.geek.nz/code/vim-put-date.git [submodule "vim/bundle/quickfix_auto_open"] path = vim/bundle/quickfix_auto_open - url = https://sanctum.geek.nz/code/vim-quickfix-auto-open.git + url = https://dev.sanctum.geek.nz/code/vim-quickfix-auto-open.git [submodule "vim/bundle/redact_pass"] path = vim/bundle/redact_pass - url = https://sanctum.geek.nz/code/vim-redact-pass.git + url = https://dev.sanctum.geek.nz/code/vim-redact-pass.git [submodule "vim/bundle/regex_escape"] path = vim/bundle/regex_escape - url = https://sanctum.geek.nz/code/vim-regex-escape.git + url = https://dev.sanctum.geek.nz/code/vim-regex-escape.git [submodule "vim/bundle/replace_operator"] path = vim/bundle/replace_operator - url = https://sanctum.geek.nz/code/vim-replace-operator.git + url = https://dev.sanctum.geek.nz/code/vim-replace-operator.git [submodule "vim/bundle/scratch_buffer"] path = vim/bundle/scratch_buffer - url = https://sanctum.geek.nz/code/vim-scratch-buffer.git + url = https://dev.sanctum.geek.nz/code/vim-scratch-buffer.git [submodule "vim/bundle/select_old_files"] path = vim/bundle/select_old_files - url = https://sanctum.geek.nz/code/vim-select-old-files.git + url = https://dev.sanctum.geek.nz/code/vim-select-old-files.git [submodule "vim/bundle/shebang_change_filetype"] path = vim/bundle/shebang_change_filetype - url = https://sanctum.geek.nz/code/vim-shebang-change-filetype.git + url = https://dev.sanctum.geek.nz/code/vim-shebang-change-filetype.git [submodule "vim/bundle/shebang_create_exec"] path = vim/bundle/shebang_create_exec - url = https://sanctum.geek.nz/code/vim-shebang-create-exec.git + url = https://dev.sanctum.geek.nz/code/vim-shebang-create-exec.git [submodule "vim/bundle/spellfile_local"] path = vim/bundle/spellfile_local - url = https://sanctum.geek.nz/code/vim-spellfile-local.git + url = https://dev.sanctum.geek.nz/code/vim-spellfile-local.git [submodule "vim/bundle/squeeze_repeat_blanks"] path = vim/bundle/squeeze_repeat_blanks - url = https://sanctum.geek.nz/code/vim-squeeze-repeat-blanks.git + url = https://dev.sanctum.geek.nz/code/vim-squeeze-repeat-blanks.git [submodule "vim/bundle/strip_trailing_whitespace"] path = vim/bundle/strip_trailing_whitespace - url = https://sanctum.geek.nz/code/vim-strip-trailing-whitespace.git + url = https://dev.sanctum.geek.nz/code/vim-strip-trailing-whitespace.git [submodule "vim/bundle/toggle_flags"] path = vim/bundle/toggle_flags - url = https://sanctum.geek.nz/code/vim-toggle-flags.git + url = https://dev.sanctum.geek.nz/code/vim-toggle-flags.git [submodule "vim/bundle/undofileskip"] path = vim/bundle/undofileskip - url = https://sanctum.geek.nz/code/vim-undofileskip.git + url = https://dev.sanctum.geek.nz/code/vim-undofileskip.git [submodule "vim/bundle/vertical_region"] path = vim/bundle/vertical_region - url = https://sanctum.geek.nz/code/vim-vertical-region.git + url = https://dev.sanctum.geek.nz/code/vim-vertical-region.git [submodule "vim/bundle/vimrc_reload_filetype"] path = vim/bundle/vimrc_reload_filetype - url = https://sanctum.geek.nz/code/vim-vimrc-reload-filetype.git + url = https://dev.sanctum.geek.nz/code/vim-vimrc-reload-filetype.git [submodule "vim/bundle/write_mkpath"] path = vim/bundle/write_mkpath - url = https://sanctum.geek.nz/code/vim-write-mkpath.git + url = https://dev.sanctum.geek.nz/code/vim-write-mkpath.git # Vim filetype plugins [submodule "vim/bundle/diff_prune"] path = vim/bundle/diff_prune - url = https://sanctum.geek.nz/code/vim-diff-prune.git + url = https://dev.sanctum.geek.nz/code/vim-diff-prune.git [submodule "vim/bundle/make_target"] path = vim/bundle/make_target - url = https://sanctum.geek.nz/code/vim-make-target.git + url = https://dev.sanctum.geek.nz/code/vim-make-target.git [submodule "vim/bundle/perl_version_bump"] path = vim/bundle/perl_version_bump - url = https://sanctum.geek.nz/code/vim-perl-version-bump.git + url = https://dev.sanctum.geek.nz/code/vim-perl-version-bump.git # Vim colorschemes [submodule "vim/bundle/juvenile"] path = vim/bundle/juvenile - url = https://sanctum.geek.nz/code/vim-juvenile.git + url = https://dev.sanctum.geek.nz/code/vim-juvenile.git [submodule "vim/bundle/sahara"] path = vim/bundle/sahara - url = https://sanctum.geek.nz/code/vim-sahara.git + url = https://dev.sanctum.geek.nz/code/vim-sahara.git @@ -1,31 +1,31 @@ Ideas ===== -* A wrapper `ksw(1df)` (kill-switch) that traps `SIGINT` to kill a called +- A wrapper `ksw(1df)` (kill-switch) that traps `SIGINT` to kill a called program or loop immediately, rather than aborting a loop (is this possible?) -* I can probably share my `psql()` completions/shortcuts after sanitizing them +- I can probably share my `psql()` completions/shortcuts after sanitizing them a bit -* Wouldn't be too hard to add some HTTP BASIC authentication to `ix(1df)` to +- Wouldn't be too hard to add some HTTP BASIC authentication to `ix(1df)` to make pastes manageable -* Have `eds(1df)` accept standard input with the "starting content" for the +- Have `eds(1df)` accept standard input with the "starting content" for the script -* Convert all the manual pages to Mandoc format maybe? +- Convert all the manual pages to Mandoc format maybe? <https://en.wikipedia.org/wiki/Mandoc> -* `qmp(1df)`--quick man page -* The solution to `chn(1df)` not running in parallel is probably backgrounded +- `qmp(1df)`--quick man page +- The solution to `chn(1df)` not running in parallel is probably backgrounded processes and `mkfifo(1)`. -* Write something like `hcat(1df)` or `tcat(1df)` that includes filename +- Write something like `hcat(1df)` or `tcat(1df)` that includes filename headings for each concatenated file. -* I can probably get rid of all that nasty templated shell by writing something +- I can probably get rid of all that nasty templated shell by writing something that wraps around `mktd(1df)` and generates shell script to run, and calls that via `eval`. -* Ideally, the AWK and/or sed scripts in the bin and games directories should +- Ideally, the AWK and/or sed scripts in the bin and games directories should be syntax-checked or linted. I could at least add some patient application of appropriate `gawk --lint` calls for each of the .awk scripts. -* Write a ftplugin for Perl to switch between punctuation variable names and +- Write a ftplugin for Perl to switch between punctuation variable names and English variable names., i.e. \e on `$?` would change to `$CHILD_ERROR`, and vice-versa. -* Almost definitely going to want to try a runparts layout for Git hooks at +- Almost definitely going to want to try a runparts layout for Git hooks at some point -* I'd like a Git hook that pre-fills out "Version X.Y.Z" if making an annotated +- I'd like a Git hook that pre-fills out "Version X.Y.Z" if making an annotated tag named `vX.Y.Z`. @@ -1,36 +1,38 @@ Known issues ============ -* `man(1)` completion doesn't work on OpenBSD as `manpath(1)` isn't a thing on +- `man(1)` completion doesn't work on OpenBSD as `manpath(1)` isn't a thing on that system; need to find some way of finding which manual directories should be searched at runtime, if there is one. -* The checks `gscr(1df)` makes to determine where it is are a bit naïve (don't +- The checks `gscr(1df)` makes to determine where it is are a bit naïve (don't work with bare repos) and could probably be improved with some appropriate `git-reflog(1)` calls -* `dr(6df)` is probably more practical in awk -* Running the block of git(1) commands in the prompt leaves five "stale" +- `dr(6df)` is probably more practical in awk +- Running the block of git(1) commands in the prompt leaves five "stale" jobspecs around that flee after a jobs builtin run; only saw this manifest after `90dcadf`; either I understand job specs really poorly or this may be a bug in bash -* I can't find a clean way of detecting a restricted shell for ksh instances to +- I can't find a clean way of detecting a restricted shell for ksh instances to prevent trying to load anything fancy (works for Bash) - * Zsh, either! $options[restricted] is "off" within the startup file -* Would be good to complete the Makefile variables for NAME, EMAIL etc with + - Zsh, either! $options[restricted] is "off" within the startup file +- Would be good to complete the Makefile variables for NAME, EMAIL etc with educated guesses (`id -u`@`cat /etc/mailname`) etc rather than hardcoding my own stuff in there -* Need to decide whether I care about XDG, and implement it if I do -* Need to decide whether I'm testing the shell snippets for MPD, Keychain etc, - and if so how. -* The custom shell functions really should be documented, but it's not clear to +- Need to decide whether I care about XDG, and implement it if I do +- The custom shell functions really should be documented, but it's not clear to me exactly where this should happen, because the commands' availability depends on which shell you're using; the `sd` function isn't available when you're not using Bash. Maybe I should try to extend `help` without breaking it? -* The `b:undo\_indent` definition for the `perl` filetype can probably be +- The `b:undo\_indent` definition for the `perl` filetype can probably be pushed upstream. -* The `_text_filenames` completion handler for Bash won't work on files with +- The `_text_filenames` completion handler for Bash won't work on files with newlines in their names. Can it be made to? -* Highlighting the variable name in e.g. `unset -v VARNAME` works with `bash` +- Highlighting the variable name in e.g. `unset -v VARNAME` works with `bash` highlighting, but not with `sh` highlighting -* The Markdown underline functions should count screen columns, not characters +- The Markdown underline functions should count screen columns, not characters or bytes +- > $ lesskey --output less/less less/lesskey + > NOTE: lesskey is deprecated. + > It is no longer necessary to run lesskey, when using less version 582 and + > later. @@ -9,10 +9,11 @@ install-bash-completion \ install-bin \ install-bin-man \ + install-cabal \ + install-cargo \ install-cpanm \ install-curl \ install-dillo \ - install-dunst \ install-emacs \ install-ex \ install-finger \ @@ -20,19 +21,19 @@ install-games-man \ install-git \ install-gnupg \ - install-gtk \ install-i3 \ + install-init \ install-ksh \ install-less \ install-login-shell \ install-mail \ install-man \ - install-mpd \ install-mpv \ install-mutt \ install-mysql \ - install-ncmcpp \ + install-ncmpcpp \ install-newsboat \ + install-parcellite \ install-perlcritic \ install-perltidy \ install-plenv \ @@ -40,18 +41,21 @@ install-pyenv \ install-rbenv \ install-readline \ + install-redshift \ + install-rofi \ + install-scrot \ install-sh \ install-subversion \ + install-sxhkd \ install-systemd \ - install-terminfo \ install-tidy \ install-tmux \ - install-urxvt \ install-vim \ install-vim-gui \ install-vint \ install-wget \ install-x \ + install-xsession \ install-zsh \ check \ check-bash \ @@ -62,8 +66,8 @@ check-login-shell \ check-man \ check-sh \ - check-urxvt \ - check-xinit \ + check-x \ + check-xsession \ check-zsh \ lint \ lint-bash \ @@ -72,9 +76,9 @@ lint-git-template-hooks \ lint-ksh \ lint-sh \ - lint-urxvt \ lint-vim \ - lint-xinit + lint-x \ + lint-xsession .SUFFIXES: .SUFFIXES: .awk .bash .m4 .mi5 .pl .sed .sh @@ -110,7 +114,6 @@ BINS = bin/ap \ bin/ddup \ bin/defang \ bin/dfv \ - bin/dmp \ bin/dub \ bin/edda \ bin/eds \ @@ -221,7 +224,8 @@ BINS = bin/ap \ bin/xgo \ bin/xgoc \ bin/xrbg \ - bin/xrq + bin/xrq \ + bin/xsnap BINS_M4 = bin/chn.m4 \ bin/dfv.m4 \ @@ -272,7 +276,9 @@ all: $(BINS) \ $(GIT_TEMPLATE_HOOKS) \ git/config \ gnupg/profile.d/gnupg.sh \ - less/less + less/less \ + tmux/bin/tmux \ + x/xsession clean distclean: rm -f -- \ @@ -290,8 +296,9 @@ clean distclean: include/mktd.m4 \ less/less \ mutt/filters/markdown-to-html \ - urxvt/ext/select \ - vim/dist/* + mutt/muttrc.d/src \ + tmux/bin/tmux \ + x/xsession .awk: sh bin/shb.sh awk -f < $< > $@ @@ -341,7 +348,7 @@ git/config: git/config.m4 -D NAME=$(NAME) \ -D EMAIL=$(EMAIL) \ -D GPG_KEYID=$(GPG_KEYID) \ - -D XDG_CONFIG_HOME=$(XDG_CONFIG_HOME) \ + -D XDG_DATA_HOME=$(XDG_DATA_HOME) \ git/config.m4 > $@ less/less: less/lesskey @@ -359,6 +366,7 @@ install: install-bin \ install-ex \ install-git \ install-gnupg \ + install-init \ install-less \ install-login-shell \ install-man \ @@ -372,7 +380,7 @@ install-abook: mkdir -p -- $(HOME)/.abook cp -p -- abook/abookrc $(HOME)/.abook -install-bash: check-bash install-sh bin/han +install-bash: check-bash install-sh bin/han mkdir -p -- $(HOME)/.bashrc.d $(HOME)/.local/bin cp -p -- bash/bashrc $(HOME)/.bashrc cp -p -- bash/bashrc.d/*.bash $(HOME)/.bashrc.d @@ -394,20 +402,22 @@ install-bin-man: cp -p -- man/man1/*.1df $(XDG_DATA_HOME)/man/man1 cp -p -- man/man8/*.8df $(XDG_DATA_HOME)/man/man8 +install-cabal: + cp -p -- cabal/profile.d/cabal.sh $(HOME)/.profile.d + +install-cargo: + cp -p -- cargo/profile.d/cargo.sh $(HOME)/.profile.d + install-cpanm: - cp -p -- cpanm/profile.d/*.sh $(HOME)/.profile.d + cp -p -- cpanm/profile.d/cpanm.sh $(HOME)/.profile.d install-curl: cp -p -- curl/curlrc $(HOME)/.curlrc -install-dillo: dillo/dillorc install-x +install-dillo: dillo/dillorc mkdir -p -- $(HOME)/.dillo cp -p -- dillo/dillorc $(HOME)/.dillo/dillorc -install-dunst: install-x - mkdir -p -- $(XDG_CONFIG_HOME)/dunst - cp -p -- dunst/dunstrc $(XDG_CONFIG_HOME)/dunst - install-emacs: emacs/bin/emacsm install-sh mkdir -p -- $(HOME)/.local/bin cp -p -- emacs/emacs $(HOME)/.emacs @@ -433,35 +443,39 @@ install-games-man: install-git: git/config $(GIT_TEMPLATE_HOOKS) mkdir -p -- $(XDG_CONFIG_HOME)/git cp -p -- git/config $(XDG_CONFIG_HOME)/git/config - mkdir -p -- $(XDG_CONFIG_HOME)/git/template + mkdir -p -- $(XDG_DATA_HOME)/git/template cp -pR -- git/template/description \ - $(XDG_CONFIG_HOME)/git/template/description - mkdir -p -- $(XDG_CONFIG_HOME)/git/template/hooks + $(XDG_DATA_HOME)/git/template/description + mkdir -p -- $(XDG_DATA_HOME)/git/template/hooks cp -pR -- $(GIT_TEMPLATE_HOOKS) \ - $(XDG_CONFIG_HOME)/git/template/hooks + $(XDG_DATA_HOME)/git/template/hooks install-gnupg: gnupg/profile.d/gnupg.sh install-sh - cp -p -- gnupg/profile.d/*.sh $(HOME)/.profile.d - -install-gtk: - mkdir -p -- $(XDG_CONFIG_HOME)/gtk-3.0 - cp -p -- gtk/gtkrc-2.0 $(HOME)/.gtkrc-2.0 - cp -p -- gtk/gtk-3.0/settings.ini $(XDG_CONFIG_HOME)/gtk-3.0 + cp -p -- gnupg/profile.d/gnupg.sh $(HOME)/.profile.d install-i3: install-x mkdir -p -- $(XDG_CONFIG_HOME)/i3 - cp -p -- i3/* $(XDG_CONFIG_HOME)/i3 + cp -p -- i3/config $(XDG_CONFIG_HOME)/i3 + mkdir -p -- $(XDG_CONFIG_HOME)/i3status + cp -p -- i3/status $(XDG_CONFIG_HOME)/i3status/config -install-keychain: install-sh - cp -p -- keychain/profile.d/*.sh $(HOME)/.profile.d - cp -p -- keychain/shrc.d/*.sh $(HOME)/.shrc.d +install-init: + if test -d /run/systemd/system ; then make install-systemd ; fi install-less: less/less mkdir -p -- $(HOME)/.profile.d - cp -- less/profile.d/*.sh $(HOME)/.profile.d + cp -p -- less/profile.d/less.sh $(HOME)/.profile.d mkdir -p -- $(XDG_CONFIG_HOME)/less cp -p -- less/less $(XDG_CONFIG_HOME)/less/key +install-logrotate: install-systemd + mkdir -p -- $(XDG_CONFIG_HOME)/logrotate \ + $(XDG_CONFIG_HOME)/logrotate/config.d + cp -p -- logrotate/config $(XDG_CONFIG_HOME)/logrotate + cp -p -- logrotate/systemd/user/logrotate.service \ + logrotate/systemd/user/logrotate.timer \ + $(XDG_DATA_HOME)/systemd/user + install-mail: cp -p -- mail/signature $(HOME)/.signature @@ -469,16 +483,13 @@ install-man: mkdir -p -- $(XDG_DATA_HOME)/man/man7 cp -p -- man/man7/dotfiles.7df $(XDG_DATA_HOME)/man/man7 -install-mpd: install-sh - mkdir -p -- $(HOME)/.mpd/playlists - cp -p -- mpd/profile.d/*.sh $(HOME)/.profile.d - cp -p -- mpd/mpdconf $(HOME)/.mpdconf - install-mpv: - mkdir -p -- $(XDG_CONFIG_HOME)/mpv - cp -p -- mpv/* $(XDG_CONFIG_HOME)/mpv + mkdir -p -- \ + $(XDG_CONFIG_HOME)/mpv \ + $(XDG_DATA_HOME)/mpv/screenshots + cp -p -- mpv/mpv.conf $(XDG_CONFIG_HOME)/mpv -install-mutt: install-gnupg install-mail mutt/filters/markdown-to-html +install-mutt: install-gnupg install-mail mutt/filters/markdown-to-html mutt/muttrc.d/src mkdir -p -- \ $(XDG_CONFIG_HOME)/mutt \ $(XDG_CONFIG_HOME)/mutt/muttrc.d \ @@ -494,101 +505,117 @@ install-mutt: install-gnupg install-mail mutt/filters/markdown-to-html cp -p -- mutt/filters/markdown-to-html \ $(HOME)/.local/libexec/mutt/filters -install-ncmcpp: install-mpd - mkdir -p -- $(HOME)/.ncmpcpp - cp -p -- ncmpcpp/config $(HOME)/.ncmpcpp +install-ncmpcpp: + mkdir -p -- $(XDG_CONFIG_HOME)/ncmpcpp + cp -p -- ncmpcpp/config $(XDG_CONFIG_HOME)/ncmpcpp install-newsboat: install-systemd - mkdir -p -- $(XDG_CONFIG_HOME)/newsboat $(XDG_DATA_HOME)/newsboat - cp -p -- newsboat/config $(XDG_CONFIG_HOME)/newsboat - -command -v systemctl >/dev/null 2>&1 \ - && mkdir -p -- $(XDG_CONFIG_HOME)/systemd/user \ - && cp -p -- newsboat/systemd/user/* $(XDG_CONFIG_HOME)/systemd/user \ - && systemctl --user daemon-reload \ - && systemctl --user start reload-newsboat.timer \ - && systemctl --user enable reload-newsboat.timer + mkdir -p -- $(XDG_CONFIG_HOME)/newsboat \ + $(XDG_DATA_HOME)/newsboat + cp -p -- newsboat/config \ + $(XDG_CONFIG_HOME)/newsboat + cp -p -- newsboat/systemd/user/newsboat.service \ + $(XDG_DATA_HOME)/systemd/user install-mysql: cp -p -- mysql/my.cnf $(HOME)/.my.cnf install-ksh: check-ksh install-sh mkdir -p -- $(HOME)/.kshrc.d - cp -p -- ksh/shrc.d/*.sh $(HOME)/.shrc.d + cp -p -- ksh/shrc.d/ksh.sh $(HOME)/.shrc.d cp -p -- ksh/kshrc $(HOME)/.kshrc cp -p -- ksh/kshrc.d/*.ksh $(HOME)/.kshrc.d install-login-shell: check-login-shell sh install/login-shell.sh +install-parcellite: install-x + cp -p -- parcellite/parcelliterc $(XDG_CONFIG_HOME) + cp -p -- parcellite/xsession.d/parcellite.sh $(HOME)/.xsession.d + install-perlcritic: install-sh - cp -p -- perlcritic/profile.d/*.sh $(HOME)/.profile.d + cp -p -- perlcritic/profile.d/perlcritic.sh $(HOME)/.profile.d mkdir -p -- $(XDG_CONFIG_HOME)/perlcritic cp -p -- perlcritic/perlcriticrc $(XDG_CONFIG_HOME)/perlcritic/perlcriticrc install-perltidy: install-sh - cp -p -- perltidy/profile.d/*.sh $(HOME)/.profile.d + cp -p -- perltidy/profile.d/perltidy.sh $(HOME)/.profile.d mkdir -p -- $(XDG_CONFIG_HOME)/perltidy cp -p -- perltidy/perltidyrc $(XDG_CONFIG_HOME)/perltidy/perltidyrc install-plenv: install-sh install-cpanm - cp -p -- plenv/profile.d/*.sh $(HOME)/.profile.d - cp -p -- plenv/shrc.d/*.sh $(HOME)/.shrc.d + cp -p -- plenv/profile.d/plenv.sh $(HOME)/.profile.d + cp -p -- plenv/shrc.d/plenv.sh $(HOME)/.shrc.d install-psql: cp -p -- psql/psqlrc $(HOME)/.psqlrc install-pyenv: install-sh - cp -p -- pyenv/profile.d/*.sh $(HOME)/.profile.d - cp -p -- pyenv/shrc.d/*.sh $(HOME)/.shrc.d + cp -p -- pyenv/profile.d/pyenv.sh $(HOME)/.profile.d + cp -p -- pyenv/shrc.d/pyenv.sh $(HOME)/.shrc.d install-rbenv: install-sh - cp -p -- rbenv/profile.d/*.sh $(HOME)/.profile.d - cp -p -- rbenv/shrc.d/*.sh $(HOME)/.shrc.d + cp -p -- rbenv/profile.d/rbenv.sh $(HOME)/.profile.d + cp -p -- rbenv/shrc.d/rbenv.sh $(HOME)/.shrc.d install-readline: cp -p -- readline/inputrc $(HOME)/.inputrc +install-redshift: install-x + cp -p -- redshift/redshift.conf $(XDG_CONFIG_HOME) + cp -p -- redshift/xsession.d/redshift.sh $(HOME)/.xsession.d + +install-rofi: rofi/bin/rofi_pass + mkdir -p -- $(HOME)/.local/bin + cp -p -- rofi/bin/rofi_pass $(HOME)/.local/bin + +install-scrot: + mkdir -p -- $(XDG_DATA_HOME)/scrot/screenshots + install-sh: check-sh - mkdir -p -- $(HOME)/.profile.d $(HOME)/.shrc.d cp -p -- sh/profile $(HOME)/.profile + mkdir -p -- $(HOME)/.profile.d cp -p -- sh/profile.d/*.sh $(HOME)/.profile.d cp -p -- sh/shinit $(HOME)/.shinit cp -p -- sh/shrc $(HOME)/.shrc + mkdir -p -- $(HOME)/.shrc.d cp -p -- sh/shrc.d/*.sh $(HOME)/.shrc.d install-subversion: mkdir -p -- $(HOME)/.subversion cp -p -- subversion/config $(HOME)/.subversion -install-systemd: - -command -v systemctl >/dev/null 2>&1 \ - && mkdir -p -- $(XDG_CONFIG_HOME)/systemd/user \ - && cp -p -- systemd/user/* $(XDG_CONFIG_HOME)/systemd/user \ - && systemctl --user daemon-reload \ - -# Need to install these in appropriate order to meet dependencies; could trust -# the system glob, but a fixed list is just more straightforward -install-terminfo: - tic terminfo/putty.ti - tic terminfo/putty-256color.ti - tic terminfo/rxvt.ti - tic terminfo/rxvt-256color.ti - tic terminfo/rxvt-unicode.ti - tic terminfo/rxvt-unicode-256color.ti - tic terminfo/screen.ti - tic terminfo/screen-256color.ti +install-sxhkd: install-scrot install-x + mkdir -p -- $(XDG_CONFIG_HOME)/sxhkd + cp -p -- sxhkd/sxhkdrc $(XDG_CONFIG_HOME)/sxhkd + cp -p -- sxhkd/xsession.d/sxhkd.sh $(HOME)/.xsession.d + +install-systemd: install-sh + cp -p -- systemd/profile.d/systemd.sh $(HOME)/.profile.d + mkdir -p -- $(XDG_DATA_HOME)/systemd/user + cp -p -- systemd/user/notify-email@.service \ + $(XDG_DATA_HOME)/systemd/user + mkdir -p -- $(XDG_DATA_HOME)/systemd/user/service.d + cp -p -- systemd/user/service.d/50-notify-email.conf \ + $(XDG_DATA_HOME)/systemd/user/service.d + mkdir -p -- $(XDG_DATA_HOME)/systemd/user/notify-email@.service.d + cp -p -- systemd/user/notify-email@.service.d/50-notify-email.conf \ + $(XDG_DATA_HOME)/systemd/user/notify-email@.service.d + mkdir -p -- $(XDG_DATA_HOME)/systemd/user/run-.service.d + cp -p -- systemd/user/run-.service.d/50-notify-email.conf \ + $(XDG_DATA_HOME)/systemd/user/run-.service.d install-tidy: install-sh - cp -p -- tidy/profile.d/*.sh $(HOME)/.profile.d + cp -p -- tidy/profile.d/tidy.sh $(HOME)/.profile.d mkdir -p -- $(XDG_CONFIG_HOME)/tidy cp -p -- tidy/tidyrc $(XDG_CONFIG_HOME)/tidy/tidyrc -install-tmux: tmux/tmux.conf install-terminfo +install-tmux: tmux/bin/tmux tmux/tmux.conf install-systemd + cp -p -- tmux/bin/tmux $(HOME)/.local/bin + cp -p -- tmux/profile.d/tmux.sh $(HOME)/.profile.d cp -p -- tmux/tmux.conf $(HOME)/.tmux.conf - -install-urxvt: urxvt/ext/select - mkdir -p -- $(HOME)/.urxvt/ext - cp -- urxvt/ext/select $(HOME)/.urxvt/ext + cp -p -- tmux/systemd/user/tmux.service \ + $(XDG_DATA_HOME)/systemd/user VIM = vim VIMDIR = $(HOME)/.vim @@ -617,31 +644,29 @@ install-vim: GVIMRC = $(HOME)/.gvimrc install-vim-gui: install-vim - cp -- vim/gvimrc $(GVIMRC) + cp -p -- vim/gvimrc $(GVIMRC) install-vint: cp -p -- vint/vintrc.yaml $(HOME)/.vintrc.yaml install-wget: install-sh - cp -p -- wget/profile.d/*.sh $(HOME)/.profile.d + cp -p -- wget/profile.d/wget.sh $(HOME)/.profile.d mkdir -p -- $(XDG_CACHE_HOME)/wget $(XDG_CONFIG_HOME)/wget cp -p -- wget/wgetrc $(XDG_CONFIG_HOME)/wget/wgetrc -install-x: check-xinit - mkdir -p -- \ - $(XDG_CONFIG_HOME)/sxhkd \ - $(HOME)/.xinitrc.d \ - $(HOME)/.Xresources.d - cp -p -- X/redshift.conf $(XDG_CONFIG_HOME) - cp -p -- X/sxhkdrc $(XDG_CONFIG_HOME)/sxhkd - cp -p -- X/xinitrc $(HOME)/.xinitrc - cp -p -- X/xinitrc.d/*.sh $(HOME)/.xinitrc.d - cp -p -- X/Xresources $(HOME)/.Xresources - cp -p -- X/Xresources.d/*.sh $(HOME)/.Xresources.d +install-x: check-x install-logrotate install-sh + cp -p -- x/Xresources $(HOME)/.Xresources + cp -p -- x/shrc.d/x.sh $(HOME)/.shrc.d + mkdir -p -- $(HOME)/.xsession.d + +install-xsession: x/xsession check-xsession install-x + cp -p -- x/xsession $(HOME)/.xsession + mkdir -p -- $(XDG_CONFIG_HOME)/log/xsession + cp -p -- x/logrotate/config.d/xsession $(XDG_CONFIG_HOME)/logrotate/config.d install-zsh: check-zsh install-sh mkdir -p -- $(HOME)/.zshrc.d - cp -p -- zsh/profile.d/*.sh $(HOME)/.profile.d + cp -p -- zsh/profile.d/zsh.sh $(HOME)/.profile.d cp -p -- zsh/zprofile $(HOME)/.zprofile cp -p -- zsh/zshrc $(HOME)/.zshrc cp -p -- zsh/zshrc.d/*.zsh $(HOME)/.zshrc.d @@ -652,7 +677,7 @@ check: check-bin \ check-man \ check-sh -check-bash: +check-bash: bin/han sh check/bash.sh check-bin: $(BINS) @@ -676,11 +701,11 @@ check-login-shell: check-sh: sh check/sh.sh -check-urxvt: urxvt/ext/select - sh check/urxvt.sh +check-x: + sh check/x.sh -check-xinit: - sh check/xinit.sh +check-xsession: x/xsession + sh check/xsession.sh check-zsh: sh check/zsh.sh @@ -691,9 +716,8 @@ lint: lint-bash \ lint-git-template-hooks \ lint-ksh \ lint-sh \ - lint-urxvt \ lint-vim \ - lint-xinit + lint-x lint-bash: check-bash sh lint/bash.sh @@ -713,11 +737,11 @@ lint-ksh: check-ksh lint-sh: check-sh sh lint/sh.sh -lint-urxvt: check-urxvt - sh lint/urxvt.sh - lint-vim: sh lint/vim.sh -lint-xinit: check-xinit - sh lint/xinit.sh +lint-x: check-x + sh lint/x.sh + +lint-xsession: x/xsession check-xsession + sh lint/xsession.sh @@ -11,9 +11,9 @@ into a personal suite of custom Unix tools. Installation ------------ - $ mkdir -p ~/.local/share - $ git clone https://sanctum.geek.nz/code/dotfiles.git ~/.local/share/dotfiles - $ cd ~/.local/share/dotfiles + $ mkdir -p ~/.local/src + $ git clone https://dev.sanctum.geek.nz/code/dotfiles.git ~/.local/src/dotfiles + $ cd ~/.local/src/dotfiles $ git submodule init $ git submodule update $ make @@ -36,16 +36,16 @@ a temporary directory first, so you can explore: The default `install` target will install these targets and all their dependencies: -* `install-bin` -* `install-curl` -* `install-ex` -* `install-git` -* `install-gnupg` -* `install-less` -* `install-login-shell` -* `install-man` -* `install-readline` -* `install-vim` +- `install-bin` +- `install-curl` +- `install-ex` +- `install-git` +- `install-gnupg` +- `install-less` +- `install-login-shell` +- `install-man` +- `install-readline` +- `install-vim` The `install-login-shell` target looks at your `SHELL` environment variable, and tries to figure out which shell's configuration files to install, falling @@ -66,66 +66,61 @@ settings for the `Makefile`, too: install-bash install-bin EMAIL=you@example.com - $ make -C .local/share/dotfiles install-conf + $ make -C .local/src/dotfiles install-conf Tools ----- Configuration is included for: -* Bourne-style POSIX shells, sharing a `.profile`, an `ENV` file, and some +- Bourne-style POSIX shells, sharing a `.profile`, an `ENV` file, and some helper functions: - * [GNU Bash](https://www.gnu.org/software/bash/) (v3.0 or newer) - * [Korn shell](http://www.kornshell.com/) (`ksh93`, `pdksh`, `mksh`) - * [Z shell](https://www.zsh.org/) -* [Abook](http://abook.sourceforge.net/)---curses address book program -* [cURL](https://curl.haxx.se/)---Command-line tool for transferring data with + - [GNU Bash](https://www.gnu.org/software/bash/) (v3.0 or newer) + - [Korn shell](http://www.kornshell.com/) (`ksh93`, `pdksh`, `mksh`) + - [Z shell](https://www.zsh.org/) +- [Abook](http://abook.sourceforge.net/)---curses address book program +- [cURL](https://curl.haxx.se/)---Command-line tool for transferring data with URL syntax -* [Dillo](https://www.dillo.org/)---A lightweight web browser -* [Dunst](https://dunst-project.org/)---A lightweight X11 notification daemon - that works with `libnotify` -* `finger(1)`---User information lookup program -* [Git](https://git-scm.com/)---Distributed version control system -* [GNU Emacs](https://www.gnu.org/software/emacs/)---Extensible text editor -* [GnuPG](https://www.gnupg.org/)---GNU Privacy Guard, for private +- [Dillo](https://www.dillo.org/)---A lightweight web browser +- `finger(1)`---User information lookup program +- [Git](https://git-scm.com/)---Distributed version control system +- [GNU Emacs](https://www.gnu.org/software/emacs/)---Extensible text editor +- [GnuPG](https://www.gnupg.org/)---GNU Privacy Guard, for private communication and file encryption -* [GTK+](https://www.gtk.org/)---GIMP Toolkit, for graphical user interface - elements -* [i3](https://i3wm.org/)---Tiling window manager -* [less](https://www.gnu.org/software/less/)---Terminal pager -* [mpv](https://mpv.io/)---Media player -* [Mutt](http://www.mutt.org/)---Terminal mail user agent -* [`mysql(1)`](https://linux.die.net/man/1/mysql)---Command-line MySQL client -* [Ncmpcpp](https://rybczak.net/ncmpcpp/)---ncurses music player client -* [Newsboat](https://newsboat.org/)---Terminal RSS/Atom feed reader -* [`psql(1)`](https://linux.die.net/man/1/psql)---Command-line PostgreSQL +- [i3](https://i3wm.org/)---Tiling window manager +- [less](https://www.gnu.org/software/less/)---Terminal pager +- [mpv](https://mpv.io/)---Media player +- [Mutt](http://www.mutt.org/)---Terminal mail user agent +- [`mysql(1)`](https://linux.die.net/man/1/mysql)---Command-line MySQL client +- [ncmpcpp](https://rybczak.net/ncmpcpp/)---ncurses based MPD client inspired + by ncmpc +- [Newsboat](https://newsboat.org/)---Terminal RSS/Atom feed reader +- [`psql(1)`](https://linux.die.net/man/1/psql)---Command-line PostgreSQL client -* [Perl::Critic](http://perlcritic.com/)---static source code analysis engine +- [Parcellite](http://parcellite.sourceforge.net/)---clipboard manager for X +- [Perl::Critic](http://perlcritic.com/)---static source code analysis engine for Perl -* [Perl::Tidy](http://perltidy.sourceforge.net/)---reformats Perl source code -* [Readline](https://tiswww.case.edu/php/chet/readline/rltop.html)---GNU +- [Perl::Tidy](http://perltidy.sourceforge.net/)---reformats Perl source code +- [Readline](https://tiswww.case.edu/php/chet/readline/rltop.html)---GNU library for user input used by Bash, MySQL, and others -* [rxvt-unicode](http://software.schmorp.de/pkg/rxvt-unicode.html)---Fork of - the rxvt terminal emulator with Unicode support -* [Subversion](https://subversion.apache.org/)---Apache Subversion, a version +- [Subversion](https://subversion.apache.org/)---Apache Subversion, a version control system -* [tidy](http://www.html-tidy.org/)---HTML/XHTML linter and tidier -* [tmux](https://tmux.github.io/)---Terminal multiplexer similar to GNU Screen -* [Vim](https://www.vim.org/)---Vi IMproved, a text editor -* [X11](https://www.x.org/wiki/)---Windowing system with network transparency +- [tidy](http://www.html-tidy.org/)---HTML/XHTML linter and tidier +- [tmux](https://tmux.github.io/)---Terminal multiplexer similar to GNU Screen +- [Vim](https://www.vim.org/)---Vi IMproved, a text editor +- [X11](https://www.x.org/wiki/)---Windowing system with network transparency for Unix There is also some slightly customized support for multi-version environment management for three major scripting languages: -* [plenv](https://github.com/tokuhirom/plenv)---Perl -* [pyenv](https://github.com/pyenv/pyenv)---Python -* [rbenv](https://github.com/rbenv/rbenv)---Ruby +- [plenv](https://github.com/tokuhirom/plenv)---Perl +- [pyenv](https://github.com/pyenv/pyenv)---Python +- [rbenv](https://github.com/rbenv/rbenv)---Ruby The configurations for shells, Mutt, tmux, and Vim are the most likely to be of interest. The i3 configuration is limited mainly to changing window switching -key bindings to match Vim's. There are a fair few resources defined for -rxvt-unicode. +key bindings to match Vim's. ### Shell @@ -168,29 +163,29 @@ These are set only after testing `BASH_VERSINFO` appropriately. A terminal session with my prompt looks something like this: ~$ ssh remote - remote:~$ cd .local/share/dotfiles - remote:~/.local/share/dotfiles(master+!)$ git status + remote:~$ cd .local/src/dotfiles + remote:~/.local/src/dotfiles(master+!)$ git status M README.md M bash/bashrc.d/prompt.bash A init - remote:~/.local/share/dotfiles(master+!)$ foobar + remote:~/.local/src/dotfiles(master+!)$ foobar foobar: command not found - remote:~/.local/share/dotfiles(master+!)<127>$ sleep 5 & + remote:~/.local/src/dotfiles(master+!)<127>$ sleep 5 & [1] 28937 - remote:~/.local/share/dotfiles(master+!){1}$ + remote:~/.local/src/dotfiles(master+!){1}$ The hostname is elided if not connected via SSH. The working directory with tilde abbreviation for `$HOME` is always shown. The rest of the prompt expands based on context to include these elements, in this order: -* Whether in a Git repository if applicable, +- Whether in a Git repository if applicable, -* The current version control branch, tag, or commit/revision if applicable, +- The current version control branch, tag, or commit/revision if applicable, and punctuation to show repository status including reference to upstreams at a glance. Subversion support can also be enabled, in which case a `git:` or `svn:` prefix is added appropriately for disambiguation. -* The number of running background jobs, if non-zero. -* The exit status of the last command, if non-zero. +- The number of running background jobs, if non-zero. +- The exit status of the last command, if non-zero. You can set `PROMPT_COLOR`, `PROMPT_PREFIX`, and `PROMPT_SUFFIX` too, which all do about what you'd expect. @@ -209,60 +204,61 @@ terminals. If a function can be written in POSIX `sh` without too much hackery, I put it in `sh/shrc.d` to be loaded by any POSIX interactive shell. Those include: -* Four functions for using a "marked" directory, which I find a more manageable +- Four functions for using a "marked" directory, which I find a more manageable concept than the `pushd`/`popd` directory stack: - * `md()` marks a given (or the current) directory. - * `gd()` goes to the marked directory. - * `pmd()` prints the marked directory. - * `xd()` swaps the current and marked directories. -* Ten other directory management and navigation functions: - * `bd()` changes into a named ancestor of the current directory. - * `gt()` changes into a directory or into a file's directory. - * `lgt()` runs `gt()` on the first result from a `loc(1df)` search. - * `mkcd()` creates a directory and changes into it. - * `pd()` changes to the argument's parent directory. - * `rd()` replaces the first instance of its first argument with its second + - `md()` marks a given (or the current) directory. + - `gd()` goes to the marked directory. + - `pmd()` prints the marked directory. + - `xd()` swaps the current and marked directories. +- Ten other directory management and navigation functions: + - `bd()` changes into a named ancestor of the current directory. + - `gt()` changes into a directory or into a file's directory. + - `lgt()` runs `gt()` on the first result from a `loc(1df)` search. + - `mkcd()` creates a directory and changes into it. + - `pd()` changes to the argument's parent directory. + - `rd()` replaces the first instance of its first argument with its second argument in `$PWD`, emulating a feature of the Zsh `cd` builtin that I like. - * `scr()` creates a temporary directory and changes into it. - * `sd()` changes into a sibling of the current directory. - * `ud()` changes into an indexed ancestor of a directory. - * `vr()` tries to change to the root directory of a source control + - `scr()` creates a temporary directory and changes into it. + - `sd()` changes into a sibling of the current directory. + - `ud()` changes into an indexed ancestor of a directory. + - `vr()` tries to change to the root directory of a source control repository. -* Two editor wrapper functions: - * `e()` invokes `$EDITOR`, or `ed(1)` if not set. - * `v()` invokes `$VISUAL`, or `vi(1)` if not set. -* `bc()` silences startup messages from GNU `bc(1)`. -* `ed()` tries to get verbose error messages, a prompt, and a Readline +- Two editor wrapper functions: + - `e()` invokes `$EDITOR`, or `ed(1)` if not set. + - `v()` invokes `$VISUAL`, or `vi(1)` if not set. +- `bc()` silences startup messages from GNU `bc(1)`. +- `ed()` tries to get verbose error messages, a prompt, and a Readline environment for `ed(1)`. -* `gdb()` silences startup messages from `gdb(1)`. -* `grep()` tries to apply color and other options good for interactive use if +- `gdb()` silences startup messages from `gdb(1)`. +- `grep()` tries to apply color and other options good for interactive use if available. -* `hgrep()` allows searching `$HISTFILE`. -* `keychain()` keeps `$GPG_TTY` up to date if a GnuPG agent is available. -* `ls()` tries to apply color and other options good for interactive use if +- `hgrep()` allows searching `$HISTFILE`. +- `ls()` tries to apply color and other options good for interactive use if available. - * `la()` runs `ls -A` if it can, or `ls -a` otherwise. - * `ll()` runs `ls -Al` if it can, or `ls -al` otherwise. -* `path()` manages the contents of `PATH` conveniently. -* `scp()` tries to detect forgotten hostnames in `scp(1)` command calls. -* `sudo()` forces `-H` for `sudo(8)` calls so that `$HOME` is never preserved; + - `la()` runs `ls -A` if it can, or `ls -a` otherwise. + - `ll()` runs `ls -Al` if it can, or `ls -al` otherwise. +- `path()` manages the contents of `PATH` conveniently. +- `scp()` tries to detect forgotten hostnames in `scp(1)` command calls. +- `sudo()` forces `-H` for `sudo(8)` calls so that `$HOME` is never preserved; I hate having `root`-owned files in my home directory. -* `tree()` colorizes GNU `tree(1)` output if possible (without having +- `tor()` is just a terse shortcut for using Torsocks to anonymize TCP + connections from the current shell. +- `tree()` colorizes GNU `tree(1)` output if possible (without having `LS_COLORS` set). -* `x()` is a one-key shortcut for `exec startx`. +- `x()` is a one-key shortcut for `exec startx`. There are a few other little tricks defined for other shells providing non-POSIX features, as compatibility allows: -* `keep()` stores ad-hoc shell functions and variables (Bash, Korn Shell 93, Z +- `keep()` stores ad-hoc shell functions and variables (Bash, Korn Shell 93, Z shell). -* `prompt()` sets up my interactive prompt (Bash, Korn Shell, Z shell). -* `pushd()` adds a default destination of `$HOME` to the `pushd` builtin +- `prompt()` sets up my interactive prompt (Bash, Korn Shell, Z shell). +- `pushd()` adds a default destination of `$HOME` to the `pushd` builtin (Bash). -* `vared()` allows interactively editing a variable with Readline, emulating a +- `vared()` allows interactively editing a variable with Readline, emulating a Z shell function I like by the same name (Bash). -* `ver()` prints the current shell's version information (Bash, Korn Shell, Z +- `ver()` prints the current shell's version information (Bash, Korn Shell, Z shell). #### Completion @@ -275,13 +271,13 @@ startup without a lot of junk functions in my Bash namespace. I do make some exceptions with completions defined in files in `~/.bash_completion.d` for things I really do get tired of typing repeatedly: -* Bash builtins: commands, help topics, shell options, variables, etc. -* `find(1)`'s more portable options -* `gpg(1)` long options -* `make(1)` targets read from a `Makefile` -* `man(1)` page titles -* `pass(1)` entries -* `ssh(1)` hostnames from `~/.ssh/config` +- Bash builtins: commands, help topics, shell options, variables, etc. +- `find(1)`'s more portable options +- `gpg(1)` long options +- `make(1)` targets read from a `Makefile` +- `man(1)` page titles +- `pass(1)` entries +- `ssh(1)` hostnames from `~/.ssh/config` For commands that pretty much always want to operate on text, such as text file or stream editors, I exclude special file types and extensions I know are @@ -316,22 +312,12 @@ be using a PGP implementation, and I encrypt whenever I have a public key available for them. The GnuPG and S/MIME interfacing is done with [GPGme](https://www.gnupg.org/related_software/gpgme/), rather than defining commands for each crypto operation. I wrote [an article about this -setup](https://sanctum.geek.nz/arabesque/gnu-linux-crypto-email/) if it sounds +setup](https://blog.sanctum.geek.nz/gnu-linux-crypto-email/) if it sounds appealing. You'll need Abook installed if you want to use the `query_command` I have defined, and msmtp for the `sendmail` command. -### rxvt-unicode - -I've butchered the URxvt Perl extensions `selection-to-clipboard` and -`selection` into a single `select` extension in `~/.urxvt/ext`, which is the -only extension I define in `~/.Xresources`. - -The included `.Xresources` file assumes that `urxvt` can use 256 colors and -Perl extensions. If you're missing functionality, try changing -`perl-ext-common` to `default`. - ### tmux These are just generally vi-friendly settings, and there isn't much out of the @@ -413,220 +399,219 @@ interactive shells. These scripts are installed by the `install-bin` target: -* Three SSH-related scripts: - * `sls(1df)` prints hostnames read from a `ssh_config(5)` file. It uses +- Three SSH-related scripts: + - `sls(1df)` prints hostnames read from `ssh_config(5)` files. It uses `slsf(1df)` to read each one. - * `sra(1df)` runs a command on multiple hosts read from `sls(1df)` and + - `sra(1df)` runs a command on multiple hosts read from `sls(1df)` and prints output. - * `sta(1df)` runs a command on multiple hosts read from `sls(1df)` and + - `sta(1df)` runs a command on multiple hosts read from `sls(1df)` and prints the hostname if the command returns zero. -* Five URL-related shortcut scripts: - * `hurl(1df)` extracts values of `href` attributes of `<a>` tags, sorts +- Five URL-related shortcut scripts: + - `hurl(1df)` extracts values of `href` attributes of `<a>` tags, sorts them uniquely, and writes them to `stdout`; it requires [pup](https://github.com/ericchiang/pup). - * `murl(1df)` converts Markdown documents to HTML with `pandoc(1)` and runs + - `murl(1df)` converts Markdown documents to HTML with `pandoc(1)` and runs the output through `hurl(1df)`. - * `urlc(1df)` accepts a list of URLs on `stdin` and writes error messages + - `urlc(1df)` accepts a list of URLs on `stdin` and writes error messages to `stderr` if any of the URLs are broken, redirecting, or are insecure and have working secure versions; requires `curl(1)`. - * `urlh(1df)` prints the values for a given HTTP header from a HEAD + - `urlh(1df)` prints the values for a given HTTP header from a HEAD response. - * `urlmt(1df)` prints the MIME type from the `Content-Type` header as + - `urlmt(1df)` prints the MIME type from the `Content-Type` header as retrieved by `urlh(1df)`. -* Three RFC-related shortcut scripts: - * `rfcf(1df)` fetches ASCII RFCs from the IETF website. - * `rfct(1df)` formats ASCII RFCs. - * `rfcr(1df)` does both, displaying in a pager if appropriate, like a +- Three RFC-related shortcut scripts: + - `rfcf(1df)` fetches ASCII RFCs from the IETF website. + - `rfct(1df)` formats ASCII RFCs. + - `rfcr(1df)` does both, displaying in a pager if appropriate, like a `man(1)` reader for RFCs. -* Five toy random-number scripts (not for sensitive/dead-serious use): - * `rndi(1df)` gets a random integer within two bounds. - * `rnds(1df)` attempts to get an optional random seed for `rndi(1df)`. - * `rnda(1df)` uses `rndi(1df)` to choose a random argument. - * `rndf(1df)` uses `rnda(1df)` to choose a random file from a directory. - * `rndl(1df)` uses `rndi(1df)` to choose a random line from files. -* Four file formatting scripts: - * `d2u(1df)` converts DOS line endings in files to UNIX ones. - * `u2d(1df)` converts UNIX line endings in files to DOS ones. - * `stbl(1df)` strips a trailing blank line from the files in its arguments. - * `stws(1df)` strips trailing spaces from the ends of lines of the files in +- Five toy random-number scripts (not for sensitive/dead-serious use): + - `rndi(1df)` gets a random integer within two bounds. + - `rnds(1df)` attempts to get an optional random seed for `rndi(1df)`. + - `rnda(1df)` uses `rndi(1df)` to choose a random argument. + - `rndf(1df)` uses `rnda(1df)` to choose a random file from a directory. + - `rndl(1df)` uses `rndi(1df)` to choose a random line from files. +- Four file formatting scripts: + - `d2u(1df)` converts DOS line endings in files to UNIX ones. + - `u2d(1df)` converts UNIX line endings in files to DOS ones. + - `stbl(1df)` strips a trailing blank line from the files in its arguments. + - `stws(1df)` strips trailing spaces from the ends of lines of the files in its arguments. -* Seven stream formatting scripts: - * `sd2u(1df)` converts DOS line endings in streams to UNIX ones. - * `su2d(1df)` converts UNIX line endings in streams to DOS ones. - * `slow(1df)` converts uppercase to lowercase. - * `supp(1df)` converts lowercase to uppercase. - * `tl(1df)` tags input lines with a prefix or suffix, basically a `sed(1)` +- Seven stream formatting scripts: + - `sd2u(1df)` converts DOS line endings in streams to UNIX ones. + - `su2d(1df)` converts UNIX line endings in streams to DOS ones. + - `slow(1df)` converts uppercase to lowercase. + - `supp(1df)` converts lowercase to uppercase. + - `tl(1df)` tags input lines with a prefix or suffix, basically a `sed(1)` shortcut. - * `tlcs(1df)` executes a command and uses `tl(1df)` to tag standard output + - `tlcs(1df)` executes a command and uses `tl(1df)` to tag standard output and standard error lines, and color them if you want. - * `unf(1df)` joins lines with leading spaces to the previous line. + - `unf(1df)` joins lines with leading spaces to the previous line. Intended for unfolding HTTP headers, but it should work for most RFC 822 formats. -* Six simple aggregate scripts for numbers: - * `max(1df)` prints the maximum. - * `mean(1df)` prints the mean. - * `med(1df)` prints the median. - * `min(1df)` prints the minimum. - * `mode(1df)` prints the first encountered mode. - * `tot(1df)` totals the set. -* Three quick-and-dirty HTML tools: - * `htenc(1df)` encodes. - * `htdec(1df)` decodes. - * `htrec(1df)` wraps `a` tags around URLs. -* Two internet message quoting tools: - * `quo(1df)` indents with quoting right angle-brackets. - * `wro(1df)` adds a quote attribution header to its input. -* Six Git-related tools: - * `fgscr(1df)` finds Git repositories in a directory root and scrubs them +- Six simple aggregate scripts for numbers: + - `max(1df)` prints the maximum. + - `mean(1df)` prints the mean. + - `med(1df)` prints the median. + - `min(1df)` prints the minimum. + - `mode(1df)` prints the first encountered mode. + - `tot(1df)` totals the set. +- Three quick-and-dirty HTML tools: + - `htenc(1df)` encodes. + - `htdec(1df)` decodes. + - `htrec(1df)` wraps `a` tags around URLs. +- Two internet message quoting tools: + - `quo(1df)` indents with quoting right angle-brackets. + - `wro(1df)` adds a quote attribution header to its input. +- Six Git-related tools: + - `fgscr(1df)` finds Git repositories in a directory root and scrubs them with `gscr(1df)`. - * `grc(1df)` quietly tests whether the given directory appears to be a Git + - `grc(1df)` quietly tests whether the given directory appears to be a Git repository with pending changes. - * `gscr(1df)` scrubs Git repositories. - * `isgr(1df)` quietly tests whether the given directory appears to be a Git + - `gscr(1df)` scrubs Git repositories. + - `isgr(1df)` quietly tests whether the given directory appears to be a Git repository. - * `jfc(1df)` adds and commits lazily to a Git repository. - * `jfcd(1df)` watches a directory for changes and runs `jfc(1df)` if it + - `jfc(1df)` adds and commits lazily to a Git repository. + - `jfcd(1df)` watches a directory for changes and runs `jfc(1df)` if it sees any. -* Two time duration functions: - * `hms(1df)` converts seconds to `hh:mm:ss` or `mm:ss` timestamps. - * `sec(1df)` converts `hh:mm:ss` or `mm:ss` timestamps to seconds. -* Three pipe interaction tools: - * `pst(1df)` runs an interactive program on data before passing it along a +- Two time duration functions: + - `hms(1df)` converts seconds to `hh:mm:ss` or `mm:ss` timestamps. + - `sec(1df)` converts `hh:mm:ss` or `mm:ss` timestamps to seconds. +- Three pipe interaction tools: + - `pst(1df)` runs an interactive program on data before passing it along a pipeline. - * `ped(1df)` runs `pst(1df)` with `$EDITOR` or `ed(1)`. - * `pvi(1df)` runs `pvi(1df)` with `$VISUAL` or `vi(1)`. -* Two editor wrapper tools: - * `mked(1df)` creates paths to all its arguments before invoking `$EDITOR`. - * `mkvi(1df)` creates paths to all its arguments before invoking `$VISUAL`. -* `ap(1df)` reads arguments for a given command from the standard input, + - `ped(1df)` runs `pst(1df)` with `$EDITOR` or `ed(1)`. + - `pvi(1df)` runs `pvi(1df)` with `$VISUAL` or `vi(1)`. +- Two editor wrapper tools: + - `mked(1df)` creates paths to all its arguments before invoking `$EDITOR`. + - `mkvi(1df)` creates paths to all its arguments before invoking `$VISUAL`. +- `ap(1df)` reads arguments for a given command from the standard input, prompting if appropriate. -* `apf(1df)` inserts arguments to a command with ones read from a file, +- `apf(1df)` inserts arguments to a command with ones read from a file, intended as a framework for shell wrappers or functions. -* `ax(1df)` evaluates an AWK expression given on the command line; this is +- `ax(1df)` evaluates an AWK expression given on the command line; this is intended as a quick way to test how AWK would interpret a given expression. -* `bcq(1df)` runs `bc(1)`, quieting it down if need be. -* `bel(1df)` prints a terminal bell character. -* `bl(1df)` generates a given number of blank lines. -* `bp(1df)` runs `br(1df)` after prompting for an URL. -* `br(1df)` launches `$BROWSER`. -* `ca(1df)` prints a count of its given arguments. -* `cf(1df)` prints a count of entries in a given directory. -* `cfr(1df)` does the same as `cf(1df)`, but recurses into subdirectories as +- `bcq(1df)` runs `bc(1)`, quieting it down if need be. +- `bel(1df)` prints a terminal bell character. +- `bl(1df)` generates a given number of blank lines. +- `bp(1df)` runs `br(1df)` after prompting for an URL. +- `br(1df)` launches `$BROWSER`. +- `ca(1df)` prints a count of its given arguments. +- `cf(1df)` prints a count of entries in a given directory. +- `cfr(1df)` does the same as `cf(1df)`, but recurses into subdirectories as well. -* `chc(1df)` caches the output of a command. -* `chn(1df)` runs a filter over its input a given number of times. -* `clog(1df)` is a tiny timestamped log system. -* `clrd(1df)` sets up a per-line file read, clearing the screen first. -* `clwr(1df)` sets up a per-line file write, clearing the screen before each +- `chc(1df)` caches the output of a command. +- `chn(1df)` runs a filter over its input a given number of times. +- `clog(1df)` is a tiny timestamped log system. +- `clrd(1df)` sets up a per-line file read, clearing the screen first. +- `clwr(1df)` sets up a per-line file write, clearing the screen before each line. -* `csmw(1df)` prints an English list of monospace-quoted words read from the +- `csmw(1df)` prints an English list of monospace-quoted words read from the input. -* `dam(1df)` buffers all its input before emitting it as output. -* `ddup(1df)` removes duplicate lines from unsorted input. -* `defang(1df)` prevents dangerous URLs from being made into clickable links. -* `dmp(1df)` copies a pass(1) entry selected by `dmenu(1)` to the X CLIPBOARD. -* `dub(1df)` lists the biggest entries in a directory. -* `edda(1df)` provides a means to run `ed(1)` over a set of files preserving +- `dam(1df)` buffers all its input before emitting it as output. +- `ddup(1df)` removes duplicate lines from unsorted input. +- `defang(1df)` prevents dangerous URLs from being made into clickable links. +- `dub(1df)` lists the biggest entries in a directory. +- `edda(1df)` provides a means to run `ed(1)` over a set of files preserving any options, mostly useful for scripts. -* `eds(1df)` edits executable script files in `EDSPATH`, defaulting to +- `eds(1df)` edits executable script files in `EDSPATH`, defaulting to `~/.local/bin`, for personal scripting snippets. -* `exm(1df)` works around a screen-clearing quirk of Vim's `ex` mode. -* `finc(1df)` counts the number of results returned from a set of given +- `exm(1df)` works around a screen-clearing quirk of Vim's `ex` mode. +- `finc(1df)` counts the number of results returned from a set of given `find(1)` conditions. -* `fnl(1df)` runs a command and saves its output and error into temporary +- `fnl(1df)` runs a command and saves its output and error into temporary files, printing their paths and line counts. -* `fnp(1df)` prints the given files to standard output, each with a plain text +- `fnp(1df)` prints the given files to standard output, each with a plain text heading with the filename in it. -* `gms(1df)` runs a set of `getmailrc` files; does much the same thing as the +- `gms(1df)` runs a set of `getmailrc` files; does much the same thing as the script `getmails` in the `getmail` suite, but runs the requests in parallel and does up to three silent retries using `try(1df)`. -* `grec(1df)` is a more logically-named `grep -c`. -* `gred(1df)` is a more logically-named `grep -v`. -* `gwp(1df)` searches for alphanumeric words in a similar way to `grep(1)`. -* `han(1df)` provides a `keywordprg` for Vim's Bash script file type that will +- `grec(1df)` is a more logically-named `grep -c`. +- `gred(1df)` is a more logically-named `grep -v`. +- `gwp(1df)` searches for alphanumeric words in a similar way to `grep(1)`. +- `han(1df)` provides a `keywordprg` for Vim's Bash script file type that will look for `help` topics. You could use it from the shell too. -* `igex(1df)` wraps around a command to allow you to ignore error conditions +- `igex(1df)` wraps around a command to allow you to ignore error conditions that don't actually worry you, exiting with 0 anyway. -* `ix(1df)` posts its input to the `ix.io` pastebin. -* `jfp(1df)` prints its input, excluding any shebang on the first line only. -* `loc(1df)` is a quick-search wrapped around `find(1)`. -* `maybe(1df)` is like `true(1)` or `false(1)`; given a probability of success, +- `ix(1df)` posts its input to the `ix.io` pastebin. +- `jfp(1df)` prints its input, excluding any shebang on the first line only. +- `loc(1df)` is a quick-search wrapped around `find(1)`. +- `maybe(1df)` is like `true(1)` or `false(1)`; given a probability of success, it exits with success or failure. Good for quick tests. -* `mex(1df)` makes given filenames in `$PATH` executable. -* `mi5(1df)` is a crude preprocessor for `m4`. -* `mim(1df)` starts an interactive Mutt message with its input. -* `mftl(1df)` finds usable-looking targets in Makefiles. -* `mkcp(1df)` creates a directory and copies preceding arguments into it. -* `mkmv(1df)` creates a directory and moves preceding arguments into it. -* `motd(1df)` shows the system MOTD. -* `msc(1df)` crudely counts messages in an mbox. -* `mw(1df)` prints alphabetic space-delimited words from the input one per +- `mex(1df)` makes given filenames in `$PATH` executable. +- `mi5(1df)` is a crude preprocessor for `m4`. +- `mim(1df)` starts an interactive Mutt message with its input. +- `mftl(1df)` finds usable-looking targets in Makefiles. +- `mkcp(1df)` creates a directory and copies preceding arguments into it. +- `mkmv(1df)` creates a directory and moves preceding arguments into it. +- `motd(1df)` shows the system MOTD. +- `msc(1df)` crudely counts messages in an mbox. +- `mw(1df)` prints alphabetic space-delimited words from the input one per line. -* `oii(1df)` runs a command on input only if there is any. -* `onl(1df)` crunches input down to one printable line. -* `osc(1df)` implements a `netcat(1)`-like wrapper for `openssl(1)`'s +- `oii(1df)` runs a command on input only if there is any. +- `onl(1df)` crunches input down to one printable line. +- `osc(1df)` implements a `netcat(1)`-like wrapper for `openssl(1)`'s `s_client` sub-command. -* `p(1df)` prints concatenated standard input; `cat(1)` as it should always +- `p(1df)` prints concatenated standard input; `cat(1)` as it should always have been. -* `pa(1df)` prints its arguments, one per line. -* `phpcsff(1df)` wraps around +- `pa(1df)` prints its arguments, one per line. +- `phpcsff(1df)` wraps around [PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to make it a source code filter suitable for use as an `equalprg` in Vim. -* `pp(1df)` prints the full path of each argument using `$PWD`. -* `pph(1df)` runs `pp(1df)` and includes a leading `$HOSTNAME:`. -* `paz(1df)` print its arguments terminated by NULL chars. -* `pit(1df)` runs its input through a pager if its standard output looks like a +- `pp(1df)` prints the full path of each argument using `$PWD`. +- `pph(1df)` runs `pp(1df)` and includes a leading `$HOSTNAME:`. +- `paz(1df)` print its arguments terminated by NULL chars. +- `pit(1df)` runs its input through a pager if its standard output looks like a terminal. -* `pwg(1df)` generates just one decent password with `pwgen(1)`. -* `qat(1df)` disables `stty echo` for the duration of a paste. -* `rep(1df)` repeats a command a given number of times. -* `rgl(1df)` is a very crude interactive `grep(1)` loop. -* `shb(1df)` attempts to build shebang lines for scripts from the system paths. -* `sqs(1df)` chops off query strings from filenames, usually downloads. -* `sshi(1df)` prints human-readable SSH connection details. -* `stex(1df)` strips extensions from filenames. -* `sue(8df)` execs `sudoedit(8)` as the owner of all the file arguments given, +- `pwg(1df)` generates just one decent password with `pwgen(1)`. +- `qat(1df)` disables `stty echo` for the duration of a paste. +- `rep(1df)` repeats a command a given number of times. +- `rgl(1df)` is a very crude interactive `grep(1)` loop. +- `shb(1df)` attempts to build shebang lines for scripts from the system paths. +- `sqs(1df)` chops off query strings from filenames, usually downloads. +- `sshi(1df)` prints human-readable SSH connection details. +- `stex(1df)` strips extensions from filenames. +- `sue(8df)` execs `sudoedit(8)` as the owner of all the file arguments given, perhaps in cases where you may not necessarily have `root` `sudo(8)` privileges. -* `swr(1df)` allows you to run commands locally specifying remote files in +- `swr(1df)` allows you to run commands locally specifying remote files in `scp(1)`'s HOST:PATH format. -* `td(1df)` manages a to-do file for you with `$EDITOR` and `git(1)`; I used to +- `td(1df)` manages a to-do file for you with `$EDITOR` and `git(1)`; I used to use Taskwarrior, but found it too complex and buggy. -* `tm(1df)` runs `tmux(1)` with `attach-session -d` if a session exists, and +- `tm(1df)` runs `tmux(1)` with `attach-session -d` if a session exists, and `new-session` if it doesn't. -* `trs(1df)` replaces strings (not regular expression) in its input. -* `try(1df)` repeats a command up to a given number of times until it succeeds, +- `trs(1df)` replaces strings (not regular expression) in its input. +- `try(1df)` repeats a command up to a given number of times until it succeeds, only printing error output if all three attempts failed. Good for tolerating blips or temporary failures in `cron(8)` scripts. -* `umake(1df)` iterates upwards through the directory tree from `$PWD` until it +- `umake(1df)` iterates upwards through the directory tree from `$PWD` until it finds a Makefile for which to run `make(1)` with the given arguments. -* `uts(1df)` gets the current UNIX timestamp in an unorthodox way that should +- `uts(1df)` gets the current UNIX timestamp in an unorthodox way that should work on all POSIX-compliant operating systems. -* `vest(1df)` runs `test(1)` but fails with explicit output via `vex(1df)`. -* `vex(1df)` runs a command and prints `true` or `false` explicitly to `stdout` +- `vest(1df)` runs `test(1)` but fails with explicit output via `vex(1df)`. +- `vex(1df)` runs a command and prints `true` or `false` explicitly to `stdout` based on the exit value. -* `vic(1df)` tries to run a POSIX-compliant `vi(1)`. -* `xrbg(1df)` applies the same randomly-selected background to each X screen. -* `xrq(1df)` gets the values of specific resources out of `xrdb -query` output. +- `vic(1df)` tries to run a POSIX-compliant `vi(1)`. +- `xrbg(1df)` applies the same randomly-selected background to each X screen. +- `xrq(1df)` gets the values of specific resources out of `xrdb -query` output. There's some silly stuff in `install-games`: -* `aaf(6df)` gets a random [ASCII Art Farts](http://www.asciiartfarts.com/) +- `aaf(6df)` gets a random [ASCII Art Farts](http://www.asciiartfarts.com/) comic. -* `acq(6df)` allows you to interrogate AC, the interplanetary computer. -* `aesth(6df)` converts English letters to their full width CJK analogues, +- `acq(6df)` allows you to interrogate AC, the interplanetary computer. +- `aesth(6df)` converts English letters to their full width CJK analogues, for aesthetic purposes. -* `squ(6df)` makes a reduced Latin square out of each line of input. -* `kvlt(6df)` translates input to emulate a style of typing unique to black +- `squ(6df)` makes a reduced Latin square out of each line of input. +- `kvlt(6df)` translates input to emulate a style of typing unique to black metal communities on the internet. -* `philsay(6df)` shows a picture to accompany `pks(6df)` output. -* `pks(6df)` laughs at a randomly selected word. -* `rndn(6df)` implements an esoteric random number generation algorithm. -* `strik(6df)` outputs s̶t̶r̶i̶k̶e̶d̶ ̶o̶u̶t̶ struck out text. -* `rot13(6df)` rotates the Latin letters in its input. -* `uuu(6df)` uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu. -* `xyzzy(6df)` teleports to a marked location on the filesystem. -* `zs(6df)` prefixes "z" case-appropriately to every occurrence of "s" in the +- `philsay(6df)` shows a picture to accompany `pks(6df)` output. +- `pks(6df)` laughs at a randomly selected word. +- `rndn(6df)` implements an esoteric random number generation algorithm. +- `strik(6df)` outputs s̶t̶r̶i̶k̶e̶d̶ ̶o̶u̶t̶ struck out text. +- `rot13(6df)` rotates the Latin letters in its input. +- `uuu(6df)` uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu. +- `xyzzy(6df)` teleports to a marked location on the filesystem. +- `zs(6df)` prefixes "z" case-appropriately to every occurrence of "s" in the text on its standard input. Manuals @@ -647,17 +632,15 @@ functionality (yet). There are also optional `lint` targets, if you have the appropriate tools available to run them: -* [ShellCheck](https://www.shellcheck.net/): - * `lint-bash` - * `lint-bin` - * `lint-games` - * `lint-ksh` - * `lint-sh` - * `lint-xinit` -* Perl::Critic: - * `lint-urxvt` -* [Vint](https://github.com/Kuniwak/vint): - * `lint-vim` +- [ShellCheck](https://www.shellcheck.net/): + - `lint-bash` + - `lint-bin` + - `lint-games` + - `lint-ksh` + - `lint-sh` + - `lint-x` +- [Vint](https://github.com/Kuniwak/vint): + - `lint-vim` Future development ------------------ @@ -677,7 +660,7 @@ simple scripts, so do whatever you like with it if any of it's useful to you. If you're feeling generous, please join and/or donate to a free software advocacy group, and let me know you did it because of this project: -* [Free Software Foundation](https://www.fsf.org/) -* [Software in the Public Interest](https://www.spi-inc.org/) -* [FreeBSD Foundation](https://www.freebsdfoundation.org/) -* [OpenBSD Foundation](https://www.openbsdfoundation.org/) +- [Free Software Foundation](https://www.fsf.org/) +- [Software in the Public Interest](https://www.spi-inc.org/) +- [FreeBSD Foundation](https://www.freebsdfoundation.org/) +- [OpenBSD Foundation](https://www.openbsdfoundation.org/) diff --git a/TABS.md b/TABS.md deleted file mode 100644 index 80c81294..00000000 --- a/TABS.md +++ /dev/null @@ -1,26 +0,0 @@ -Spaces to tabs -============== - -If you prefer tabs to spaces, the following recipe seems to convert everything -pretty nicely: - - $ find . -name .git -prune -o -name vim -prune -o -type f \ - -exec sh -c \ - 'for f;do unexpand -t4 "$f">"$f".tmp;mv "$f".tmp "$f";done' \ - _ {} + - - $ find vim -name bundle -prune -o -type f \ - -exec sh -c \ - 'for f;do unexpand -t2 "$f">"$f".tmp;mv "$f".tmp "$f";done' \ - _ {} + - -If you have GNU `unexpand(1)` and can add `--first-only` to each of those -calls, the results seem perfect. - -You can configure Vim to accommodate this by removing the settings in -vim/vimrc.vim for: - -* `'expandtab'` -* `'shiftwidth'` -* `'smarttab'` -* `'softtabstop'` @@ -1,2 +1,2 @@ -tejr dotfiles v10.13.0 -Sun, 11 Oct 2020 00:22:33 +0000 +tejr dotfiles v12.41.0 +Wed, 02 Aug 2023 21:39:23 +0000 diff --git a/X/Xresources b/X/Xresources deleted file mode 100644 index 3f586a87..00000000 --- a/X/Xresources +++ /dev/null @@ -1,2 +0,0 @@ -#include ".Xresources.d/URxvt" -#include ".Xresources.d/XTerm" diff --git a/X/Xresources.d/URxvt b/X/Xresources.d/URxvt deleted file mode 100644 index f4c30d54..00000000 --- a/X/Xresources.d/URxvt +++ /dev/null @@ -1,32 +0,0 @@ -! URxvt -URxvt.cursorBlink: on -URxvt.cutchars: <>│ -URxvt.internalBorder: 0 -URxvt.iso14755: false -URxvt.iso14755_52: false -URxvt.perl-ext-common: select -URxvt.pointerBlank: true -URxvt.saveLines: 10000 -URxvt.scrollBar: false -URxvt.scrollTTyKeypress: true -URxvt.scrollTTyOutput: false -URxvt.secondaryScroll: true -URxvt.urgentOnBell: true -URxvt.background: #030303 -URxvt.foreground: #E0E0E0 -URxvt.color0: #030303 -URxvt.color1: #CC0000 -URxvt.color2: #3EAA06 -URxvt.color3: #C4A000 -URxvt.color4: #3465A4 -URxvt.color5: #75507B -URxvt.color6: #06989A -URxvt.color7: #D3D7CF -URxvt.color8: #303030 -URxvt.color9: #EF2929 -URxvt.color10: #7AF234 -URxvt.color11: #FCE94F -URxvt.color12: #729FCF -URxvt.color13: #AD7FA8 -URxvt.color14: #34E2E2 -URxvt.color15: #EEEEEC diff --git a/X/Xresources.d/XTerm b/X/Xresources.d/XTerm deleted file mode 100644 index f991ec91..00000000 --- a/X/Xresources.d/XTerm +++ /dev/null @@ -1,24 +0,0 @@ -! XTerm -XTerm.termName: xterm-256color -XTerm.vt100.bellIsUrgent: true -XTerm.vt100.internalBorder: 0 -XTerm.vt100.eightBitInput: false -XTerm.vt100.metaSendsEscape: true -XTerm.vt100.background: #030303 -XTerm.vt100.foreground: #E0E0E0 -XTerm.vt100.color0: #030303 -XTerm.vt100.color1: #CC0000 -XTerm.vt100.color2: #3EAA06 -XTerm.vt100.color3: #C4A000 -XTerm.vt100.color4: #3465A4 -XTerm.vt100.color5: #75507B -XTerm.vt100.color6: #06989A -XTerm.vt100.color7: #D3D7CF -XTerm.vt100.color8: #303030 -XTerm.vt100.color9: #EF2929 -XTerm.vt100.color10: #7AF234 -XTerm.vt100.color11: #FCE94F -XTerm.vt100.color12: #729FCF -XTerm.vt100.color13: #AD7FA8 -XTerm.vt100.color14: #34E2E2 -XTerm.vt101.color15: #EEEEEC diff --git a/X/redshift.conf b/X/redshift.conf deleted file mode 100644 index 1e1de4ee..00000000 --- a/X/redshift.conf +++ /dev/null @@ -1,10 +0,0 @@ -[redshift] -adjustment-method=randr -location-provider=manual -temp-day=5700 -temp-night=3500 -transition=1 - -[manual] -lat=-40.352306 -lon=175.608215 diff --git a/X/sxhkdrc b/X/sxhkdrc deleted file mode 100644 index 9d9884c9..00000000 --- a/X/sxhkdrc +++ /dev/null @@ -1,47 +0,0 @@ -super + Return - urxvtcd - -super + control + Return - urxvtcd -e sh - -super + shift + Return - urxvtcd -e ksh - -super + alt + Return - urxvtcd -e zsh - -super + b - br - -super + d - dmenu_run - -super + g - xgoc - -super + i - gimp - -super + m - urxvtcd -e tm - -super + p - dmp - -super + v - urxvtcd -e "$VISUAL" - -super + slash - i3lock --color=#000000 --image ~/.i3/lock.png --nofork - -XF86AudioMute - amixer -q sset Master toggle - -XF86AudioRaiseVolume - amixer -q sset Master 5%+ unmute - -XF86AudioLowerVolume - amixer -q sset Master 5%- unmute - -XF86Calculator - urxvtcd -e bcq diff --git a/X/xinitrc b/X/xinitrc deleted file mode 100644 index e86cac4d..00000000 --- a/X/xinitrc +++ /dev/null @@ -1,17 +0,0 @@ -# If a file ~/.xrandrrc exists for monitor setup, source that first -[ -e "$HOME"/.xrandrrc ] && . "$HOME"/.xrandrrc - -# Read X resources -xrdb "$HOME"/.Xresources - -# Faster mouse acceleration with a natural threshold -xset mouse 5/2 0 - -# Load all supplementary scripts in ~/.xinitrc.d -for sh in "$HOME"/.xinitrc.d/*.sh ; do - [ -e "$sh" ] && . "$sh" -done -unset -v sh - -# Start window manager -exec i3 diff --git a/X/xinitrc.d/browser.sh b/X/xinitrc.d/browser.sh deleted file mode 100644 index 0153fba9..00000000 --- a/X/xinitrc.d/browser.sh +++ /dev/null @@ -1,24 +0,0 @@ -# Choose a GUI browser with some rough heuristics - -# If Firefox is available, start by assuming that -if command -v firefox >/dev/null 2>&1 ; then - BROWSER=firefox -fi - -# Consider a switch to Dillo... -if ( - # No output, please - exec >/dev/null 2>&1 - # Don't switch if it's not there - command -v dillo || exit - # Switch if Firefox isn't there - command -v firefox || exit 0 - # Switch if procfs says we have less than 2GB of RAM - awk '$1=="MemTotal:"&&$2<2^20{m++}END{exit!m}' < /proc/meminfo -) ; then - BROWSER=dillo -fi - -# Export our choice of browser, if it isn't empty -[ -n "$BROWSER" ] || return -export BROWSER diff --git a/X/xinitrc.d/dunst.sh b/X/xinitrc.d/dunst.sh deleted file mode 100644 index bddaa1fe..00000000 --- a/X/xinitrc.d/dunst.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Start dunst(1) to display libnotify messages -command -v dunst >/dev/null 2>&1 || return -dunst & diff --git a/X/xinitrc.d/redshift.sh b/X/xinitrc.d/redshift.sh deleted file mode 100644 index d5d58d8a..00000000 --- a/X/xinitrc.d/redshift.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Start redshift(1) -command -v redshift >/dev/null 2>&1 || return -redshift & diff --git a/X/xinitrc.d/ssh.sh b/X/xinitrc.d/ssh.sh deleted file mode 100644 index 005743fe..00000000 --- a/X/xinitrc.d/ssh.sh +++ /dev/null @@ -1,4 +0,0 @@ -# Set SSH_ASKPASS if we can find one -command -v ssh-askpass >/dev/null 2>&1 || return -SSH_ASKPASS=$(command -v ssh-askpass) -export SSH_ASKPASS diff --git a/X/xinitrc.d/sxhkd.sh b/X/xinitrc.d/sxhkd.sh deleted file mode 100644 index 132d8f8a..00000000 --- a/X/xinitrc.d/sxhkd.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Start sxhkd(1) -command -v sxhkd >/dev/null 2>&1 || return -sxhkd & diff --git a/X/xinitrc.d/urxvt.sh b/X/xinitrc.d/urxvt.sh deleted file mode 100644 index a5eb0940..00000000 --- a/X/xinitrc.d/urxvt.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Start urxvtd(1) -command -v urxvtd >/dev/null 2>&1 || return -urxvtd -o -q & diff --git a/X/xinitrc.d/xkb.sh b/X/xinitrc.d/xkb.sh deleted file mode 100644 index a5142398..00000000 --- a/X/xinitrc.d/xkb.sh +++ /dev/null @@ -1,5 +0,0 @@ -# Map Caps Lock as a Ctrl key, use right alt as Compose, kill X server with -# Ctrl+Alt+Backspace -# <https://en.wikipedia.org/wiki/Compose_key#Common_compose_combinations> -command -v setxkbmap >/dev/null 2>&1 || return -setxkbmap -option compose:ralt,ctrl:nocaps,terminate:ctrl_alt_bksp diff --git a/X/xinitrc.d/xrbg.sh b/X/xinitrc.d/xrbg.sh deleted file mode 100644 index 0e4ec278..00000000 --- a/X/xinitrc.d/xrbg.sh +++ /dev/null @@ -1,2 +0,0 @@ -# Apply a random background image -xrbg diff --git a/bash/bash_completion.d/_ssh_config_hosts.bash b/bash/bash_completion.d/_ssh_config_hosts.bash index 0959f52b..16265e8a 100644 --- a/bash/bash_completion.d/_ssh_config_hosts.bash +++ b/bash/bash_completion.d/_ssh_config_hosts.bash @@ -3,23 +3,28 @@ _ssh_config_hosts() { # Iterate through SSH client config paths local config - for config in "$HOME"/.ssh/config /etc/ssh/ssh_config ; do + for config in /etc/ssh/ssh_config.d/*.conf /etc/ssh/ssh_config \ + "$HOME"/.ssh/config.d/*.conf "$HOME"/.ssh/config ; do [[ -e $config ]] || continue - # Read 'Host' options and their first value from file - local option value ci - while read -r option value _ ; do + # Read 'Host' options and their patterns from file + local option value patterns pattern ci + while read -r option value ; do [[ $option == Host ]] || continue + read -a patterns -r \ + < <(printf '%s\n' "$value") # Check host value - case $value in - # No empties - '') ;; - # No wildcards - *'*'*) ;; - # Found a match; print it - "$2"*) COMPREPLY[ci++]=$value ;; - esac + for pattern in "${patterns[@]}" ; do + case $pattern in + # No empties + '') ;; + # No wildcards + *'*'*) ;; + # Found a match; print it + "$2"*) COMPREPLY[ci++]=$pattern ;; + esac + done done < "$config" done diff --git a/bash/bash_completion.d/mosh.bash b/bash/bash_completion.d/mosh.bash new file mode 100644 index 00000000..17d72ca1 --- /dev/null +++ b/bash/bash_completion.d/mosh.bash @@ -0,0 +1,5 @@ +# Completion for mosh(1) with ssh_config(5) hostnames +if ! declare -F _ssh_config_hosts >/dev/null ; then + source "$HOME"/.bash_completion.d/_ssh_config_hosts.bash +fi +complete -F _ssh_config_hosts -o bashdefault -o default mosh diff --git a/bash/bash_completion.d/path.bash b/bash/bash_completion.d/path.bash index 9224506a..9234f132 100644 --- a/bash/bash_completion.d/path.bash +++ b/bash/bash_completion.d/path.bash @@ -62,6 +62,7 @@ _path() { fi # Break PATH into parts + declare -a paths IFS=: read -a paths -d '' -r \ < <(printf '%s\0' "$PATH") diff --git a/bash/bashrc b/bash/bashrc index 6e4c31a9..5d3a7bbc 100644 --- a/bash/bashrc +++ b/bash/bashrc @@ -28,8 +28,8 @@ fi # Clear away command_not_found_handle if a system bashrc file set it up unset -f command_not_found_handle -# Keep around 32K lines of history in file -HISTFILESIZE=$((1 << 15)) +# Keep around 128K lines of history in file +HISTFILESIZE=131072 # Ignore duplicate commands HISTCONTROL=ignoredups diff --git a/bash/bashrc.d/keep.bash b/bash/bashrc.d/keep.bash index 2e2424a3..26a84f5b 100644 --- a/bash/bashrc.d/keep.bash +++ b/bash/bashrc.d/keep.bash @@ -89,8 +89,8 @@ EOF case $name in # NAME must start with letters or an underscore, and contain no - # characters besides letters, numbers, or underscores - *[!a-zA-Z0-9_]*|[!a-zA-Z_]*) + # characters besides letters, numbers, underscores, or dashes + [!a-zA-Z_]*|*[!a-zA-Z0-9_-]*) printf 'bash: %s: %s not a valid NAME\n' \ "${FUNCNAME[0]}" "$name" >&2 ((errors++)) diff --git a/bash/bashrc.d/prompt.bash b/bash/bashrc.d/prompt.bash index f9678f20..e0a03438 100644 --- a/bash/bashrc.d/prompt.bash +++ b/bash/bashrc.d/prompt.bash @@ -7,29 +7,32 @@ prompt() { # Turn complex, colored PS1 and debugging PS4 prompts on on) # Set up pre-prompt command - PROMPT_COMMAND='history -a' + PROMPT_COMMAND='PROMPT_RETURN=$?;history -a' # If Bash 4.0 is available, trim very long paths in prompt if ((BASH_VERSINFO[0] >= 4)) ; then PROMPT_DIRTRIM=4 fi - # Basic prompt shape depends on whether we're in SSH or not + # Prompt has hostname via SSH outside of screen/tmux PS1= - if [[ -n $SSH_CLIENT || -n $SSH_CONNECTION ]] ; then + if [[ -n $SSH_CLIENT && -z $STY && -z $TMUX ]] ; then PS1=$PS1'\h:' fi PS1=$PS1'\w' - # Add sub-commands; VCS, job, and return status checks - PS1=$PS1'$(ret=$?;prompt vcs;prompt job;prompt ret)' - # Add a helpful prefix if this shell appears to be exotic case ${SHELL##*/} in (bash) ;; (*) PS1=bash:$PS1 ;; esac + # Add sub-commands: + ## Preload libraries as prefix + PS1='$(prompt preload)'$PS1 + ## VCS, job, and return status checks as suffixes + PS1=$PS1'$(prompt vcs;prompt job;prompt ret)' + # Add prefix and suffix PS1='${PROMPT_PREFIX}'$PS1'${PROMPT_SUFFIX}' @@ -92,6 +95,21 @@ prompt() { fi ;; + # Analyze LD_PRELOAD to see if we should report anything loaded + preload) + printf '%s:' "$LD_PRELOAD" | + while read -d : -r ; do + case $REPLY in + (*/libip2unix.so) + printf '[IP2Unix]' + ;; + (*/libtorsocks.so) + printf '[Tor]' + ;; + esac + done + ;; + # Git prompt function git) @@ -249,8 +267,8 @@ prompt() { # Show return status of previous command in angle brackets, if not zero ret) # shellcheck disable=SC2154 - ((ret)) || return - printf '<%u>' "${ret//\\/\\\\}" + ((PROMPT_RETURN)) || return + printf '<%u>' "${PROMPT_RETURN//\\/\\\\}" ;; # Show the count of background jobs in curly brackets, if not zero diff --git a/bin/clog.sh b/bin/clog.sh index 3269c508..a5c777e8 100644 --- a/bin/clog.sh +++ b/bin/clog.sh @@ -3,7 +3,8 @@ # Build the cat(1) command we'll run, wrapping it in rlwrap(1) if available and # applicable. if [ "$#" -eq 0 ] && [ -t 0 ] && command -v rlwrap >/dev/null 2>&1 ; then - set -- rlwrap --history-filename=/dev/null cat -- "${@:--}" + set -- rlwrap --history-filename=/dev/null --no-warnings \ + cat -- "${@:--}" else set -- cat -- "${@:--}" fi diff --git a/bin/dmp.sh b/bin/dmp.sh deleted file mode 100644 index ab09c20e..00000000 --- a/bin/dmp.sh +++ /dev/null @@ -1,31 +0,0 @@ -# Pick a pass(1) password with dmenu(1) - -# Get the password store directory, bail if we can't -pwsd=${PASSWORD_STORE_DIR:-"$HOME"/.password-store} -pwsd=${pwsd%/} -[ -n "$pwsd" ] || exit - -# Get the password; get all the names from find(1) -# shellcheck disable=SC2016 -pw=$( - cd -- "$pwsd" || exit - # Get all the names from find(1) - find ./ -name \*.gpg | - # Sort them - sort | - # Strip the leading directory and the trailing .gpg - sed 's_^\./__;s_\.gpg$__' | - # Use dmenu(1) to prompt the user to select one - dmenu -) || exit - -# Bail if we don't have a password -[ -n "$pw" ] || exit - -# Pump the first line of the password into the clipboard -pass show "$pw" | sed 1q | xsel -ib || exit - -# If we have notify-send(1), alert that the password has been copied -if command -v notify-send >/dev/null >&2 ; then - notify-send "$(printf '%s in clipboard' "$pw")" -fi diff --git a/bin/gscr.sh b/bin/gscr.sh index 2fbee05a..26eafb12 100644 --- a/bin/gscr.sh +++ b/bin/gscr.sh @@ -16,11 +16,16 @@ for arg in "${@:-.}" ; do ( ;; esac + # Remove any original refs from a prior rewrite + if [ -e refs/original ] ; then + rm -r -- refs/original || exit + fi + # Check for bad references or other integrity/sanity problems - git fsck || exit + git fsck --full --no-reflogs || exit # Expire dangling references - git reflog expire --expire=now || exit + git reflog expire --all --expire=now --expire-unreachable=now || exit # Remove dangling references git gc --prune=now --aggressive || exit diff --git a/bin/han.bash b/bin/han.bash index 6ab0b3e7..5e5d67c2 100644 --- a/bin/han.bash +++ b/bin/han.bash @@ -1,5 +1,4 @@ # Abstract calls to Bash help vs man(1) -self=han # Ensure we're using at least version 3.0 # shellcheck disable=SC2128 @@ -13,22 +12,6 @@ if ((BASH_VERSINFO[0] >= 4)) ; then helpopts=(-m) fi -# Create a temporary directory with name in $td, and a trap to remove it when -# the script exits -td= -cleanup() { - [[ -n $td ]] && rm -fr -- "$td" -} -trap cleanup EXIT -td=$(mktd "$self") || exit - -# If we have exactly one argument and a call to the help builtin with that -# argument succeeds, display its output with `pager -s` -if (($# == 1)) && - help "${helpopts[@]}" "$1" >"$td"/"$1".help 2>/dev/null ; then - (cd -- "$td" && "$PAGER" -s -- "$1".help) - -# Otherwise, just pass all the arguments to man(1) -else - man "$@" -fi +# Call `help`, with the `-m` flag if available; if it errors out (discard +# stderr), run `man` instead +help "${helpopts[@]}" -- "$@" 2>/dev/null || man -- "$@" diff --git a/bin/mked.sh b/bin/mked.sh index 93e21573..24a61de8 100644 --- a/bin/mked.sh +++ b/bin/mked.sh @@ -1,4 +1,3 @@ -#!/bin/sh # Create paths to all files before invoking editor for file do mkdir -p -- "${file%/*}" || exit diff --git a/bin/mktd.sh b/bin/mktd.sh index 72375873..c2ba2ee2 100644 --- a/bin/mktd.sh +++ b/bin/mktd.sh @@ -2,7 +2,7 @@ # Build the intended directory name, with the last element a random integer # from 1..2^31 -lim=$((2 << 31)) +lim=2147483648 dn=${TMPDIR:-/tmp}/${1:-mktd}.$$.$(rndi 1 "$lim") # Create the directory and print its name if successful diff --git a/bin/mkvi.sh b/bin/mkvi.sh index c5974383..ac5c6229 100644 --- a/bin/mkvi.sh +++ b/bin/mkvi.sh @@ -1,4 +1,3 @@ -#!/bin/sh # Create paths to all files before invoking editor for file do mkdir -p -- "${file%/*}" || exit diff --git a/bin/msc.sh b/bin/msc.sh index 051f104a..051f104a 100755..100644 --- a/bin/msc.sh +++ b/bin/msc.sh @@ -17,7 +17,7 @@ serv=${2:-https} set -- ## If we have rlwrap, use it, but don't complain if we don't if command -v rlwrap >/dev/null 2>&1 ; then - set -- "$@" rlwrap --history-filename=/dev/null + set -- "$@" rlwrap --history-filename=/dev/null --no-warnings fi ## The actual openssl(1ssl) and subcommand call set -- "$@" openssl s_client diff --git a/bin/plmu b/bin/plmu deleted file mode 100755 index bac2e434..00000000 --- a/bin/plmu +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -# Upgrade plenv modules with cpanm(1) - -# Set up exceptions file if it exists -def="$HOME"/.plenv/non-cpanm-modules -if [ -e "$def" ] ; then - ef=$def -else - ef=/dev/null -fi - -# Check that exceptions file is sorted -if ! LC_COLLATE=C sort -c -- "$ef" ; then - printf >&2 '%s not sorted\n' "$ef" - exit 1 -fi - -# Get the list of modules; sort them in case our current locale disagrees on -# the existing sorting -plenv list-modules | LC_COLLATE=C sort | - -# Exclude any modules in ~/.plenv/non-cpanm-modules if it exists -LC_COLLATE=C comm -23 -- - "$ef" | - -# Read that list of modules to upgrade and upgrade them one by one -while read -r module ; do - cpanm --notest --quiet -- "$module" -done @@ -1,4 +1,3 @@ -#!/bin/sh restore() { if [ -n "$stty" ] ; then stty "$stty" diff --git a/bin/rndi.awk b/bin/rndi.awk index 7d9c640b..44989d11 100644 --- a/bin/rndi.awk +++ b/bin/rndi.awk @@ -30,9 +30,6 @@ BEGIN { # Print a random integer bounded by the first and second arguments print int(lower + rand() * (upper - lower + 1)) - - # Bail before processing any lines - exit } # Bailout function @@ -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" + } +} @@ -1,7 +1,7 @@ # Manage to-do files with just $EDITOR and git(1) # Specify the path and file -dir=${TODO_DIR:-"$HOME"/Todo} +dir=${TODO_DIR:-"$HOME"/todo} # If the directory doesn't exist, create it [ -d "$dir" ] || mkdir -p -- "$dir" || exit @@ -1,5 +1,10 @@ # Attach to existing tmux session rather than create a new one if possible +# Source config if it exists (just the session name, really) +if [ -e "${XDG_CONFIG_HOME:-"$HOME"/.config}"/tm/config ] ; then + . "${XDG_CONFIG_HOME:-"$HOME"/.config}"/tm/config || exit +fi + # If given any arguments, just use them as they are if [ "$#" -gt 0 ] ; then : @@ -10,8 +15,8 @@ elif tmux has-session 2>/dev/null ; then # Create a new session with an appropriate name else - set -- new-session -s "${TMUX_SESSION:-default}" + set -- new-session -s "${default_session_name:-default}" fi # Execute with concluded arguments -tmux "$@" +exec tmux "$@" diff --git a/bin/uts.awk b/bin/uts.awk index 3aaec2ab..a7b3ef5d 100644 --- a/bin/uts.awk +++ b/bin/uts.awk @@ -2,5 +2,4 @@ BEGIN { srand() print srand() - exit } @@ -39,7 +39,7 @@ for url do ( # mpv(1) (*[/.]youtube.com/watch*[?\&]t=) ;; (*[/.]youtube.com/watch*) - exec mpv -- "$url" + exec mpv --force-window --no-terminal -- "$url" ;; esac @@ -59,14 +59,15 @@ for url do ( ) ;; - # Open audio and video in mpv(1); force a window even for audio so I - # can control it + # Open audio and video in mpv(1) (audio/*|video/*) - exec mpv --force-window -- "$url" + exec mpv --force-window --no-terminal -- "$url" ;; - # If the MIME type is an image that is not a GIF, load it in feh(1) - (image/gif) ;; + # Open GIFs with a looping mpv(1), and all other images with feh(1) + (image/gif) + exec mpv --force-window --loop=inf --no-terminal -- "$url" + ;; (image/*) exec curl -- "$url" | feh - ;; @@ -74,7 +75,7 @@ for url do ( # Open plain text in a terminal view(1) (text/plain) # shellcheck disable=SC2016 - exec urxvt -e sh -c 'curl -- "$1" | view -' _ "$url" + exec x-terminal-emulator -e sh -c 'curl -- "$1" | view -' _ "$url" ;; # Otherwise, just pass it to br(1df) diff --git a/bin/xsnap.sh b/bin/xsnap.sh new file mode 100644 index 00000000..7a9d0c38 --- /dev/null +++ b/bin/xsnap.sh @@ -0,0 +1,24 @@ +# Wrapper for scrot(1) for use in recording screenshots +date=$(date +%Y/%m/%d) || exit +dir=${XDG_DATA_HOME:-"$HOME"/.local/share}/scrot/screenshots/$date +mkdir -p -- "$dir" || exit +cd -- "$dir" || exit +for ent in * ; do + [ -e "$ent" ] || continue + case $ent in + *.png) ;; + *) continue ;; + esac + basename=${ent%.png} + case $basename in + *[!0-9]*) continue ;; + esac + last=$basename +done +number=$(printf '%s' "$last" | sed 's/^0*//') # Avoid octal +id=$((number + 1)) +name=$(printf '%05d' "$id").png +path=$dir/$name +scrot --file="$path" --overwrite "$@" || exit +xclip -selection clipboard -target image/png "$path" || exit +notify-send "Saved: $date/$name" diff --git a/cabal/cabal.sh b/cabal/cabal.sh new file mode 100644 index 00000000..b5730916 --- /dev/null +++ b/cabal/cabal.sh @@ -0,0 +1,3 @@ +# Include user-built Haskell programs if the dir exists +[ -d "$HOME"/.cabal/bin ] || return +PATH=$HOME/.cabal/bin:$PATH diff --git a/cabal/profile.d/cabal.sh b/cabal/profile.d/cabal.sh new file mode 100644 index 00000000..638f8d04 --- /dev/null +++ b/cabal/profile.d/cabal.sh @@ -0,0 +1,2 @@ +# Include user-built Haskell programs +PATH=$HOME/.cabal/bin:$PATH diff --git a/cargo/profile.d/cargo.sh b/cargo/profile.d/cargo.sh new file mode 100644 index 00000000..89bcd524 --- /dev/null +++ b/cargo/profile.d/cargo.sh @@ -0,0 +1,2 @@ +# Include user-built Rust programs +PATH=$HOME/.cargo/bin:$PATH diff --git a/check/urxvt.sh b/check/urxvt.sh deleted file mode 100644 index e64ba1e5..00000000 --- a/check/urxvt.sh +++ /dev/null @@ -1,3 +0,0 @@ -for perl in urxvt/ext/*.pl ; do - perl -c "${perl%.pl}" || exit -done diff --git a/check/x.sh b/check/x.sh new file mode 100644 index 00000000..f88f11a1 --- /dev/null +++ b/check/x.sh @@ -0,0 +1 @@ +sh -n -- x/xsessionrc x/shrc.d/*.sh diff --git a/check/xinit.sh b/check/xinit.sh deleted file mode 100644 index a354422a..00000000 --- a/check/xinit.sh +++ /dev/null @@ -1,6 +0,0 @@ -set \ - X/xinitrc \ - X/xinitrc.d/*.sh -for xinit do - sh -n -- "$xinit" || exit -done diff --git a/check/xsession.sh b/check/xsession.sh new file mode 100644 index 00000000..0b72d8a6 --- /dev/null +++ b/check/xsession.sh @@ -0,0 +1 @@ +sh -n -- x/xsession diff --git a/cpanm/profile.d/cpanm.sh b/cpanm/profile.d/cpanm.sh index 98b685e3..a860162e 100644 --- a/cpanm/profile.d/cpanm.sh +++ b/cpanm/profile.d/cpanm.sh @@ -1,2 +1,3 @@ -PERL_CPANM_HOME=${XDG_CACHE_HOME:-$HOME/.config}/cpanm +# Set home directory for cpanm files to be XDG-conformant +PERL_CPANM_HOME=${XDG_CACHE_HOME:-$HOME/.cache}/cpanm export PERL_CPANM_HOME diff --git a/dunst/dunstrc b/dunst/dunstrc deleted file mode 100644 index e3e3e43f..00000000 --- a/dunst/dunstrc +++ /dev/null @@ -1,46 +0,0 @@ -[global] -galignment = left -gallow_markup = no -gbounce_freq = 0 -gdmenu = dmenu -p dunst: -gfollow = mouse -gformat = "%s %b" -ggeometry = "350x5-0-17" -ghistory_length = 20 -ghorizontal_padding = 8 -gicon_position = off -gidle_threshold = 0 -gignore_newline = no -gindicate_hidden = no -gline_height = 0 -gmonitor = 0 -gpadding = 8 -gseparator_color = frame -gseparator_height = 0 -gshow_age_threshold = -1 -gshow_indicators = no -gshrink = no -gsort = yes -gstartup_notification = false -gsticky_history = yes -gtransparency = 0 -gword_wrap = yes - -[frame] -gwidth = 1 -gcolor = "#333333" - -[urgency_low] -gbackground = "#222222" -gforeground = "#bbbbbb" -gtimeout = 10 - -[urgency_normal] -gbackground = "#285577" -gforeground = "#ffffff" -gtimeout = 10 - -[urgency_critical] -gbackground = "#900000" -gforeground = "#ffffff" -gtimeout = 0 diff --git a/finger/pgpkey b/finger/pgpkey index dc7f2e25..f9569c8f 100644 --- a/finger/pgpkey +++ b/finger/pgpkey @@ -1,4 +1,4 @@ -pub rsa4096 2013-03-12 [SC] [expires: 2021-01-03] +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: 2021-01-03] -sub rsa4096 2013-03-12 [S] [expires: 2021-01-03] -sub rsa4096 2019-08-06 [A] [expires: 2021-01-03] +sub rsa4096 2013-03-12 [E] [expires: 2024-06-16] +sub rsa4096 2013-03-12 [S] [expires: 2024-06-16] +sub rsa4096 2019-08-06 [A] [expires: 2024-06-16] diff --git a/finger/plan b/finger/plan index b4562cd8..ec8a1d3d 100644 --- a/finger/plan +++ b/finger/plan @@ -1,3 +1,3 @@ > I am his Highness' dog at Kew. > Pray tell me, Sir: whose dog are you? - -- Pope + ---Pope diff --git a/git/config.mi5 b/git/config.mi5 index 304be811..efdbc277 100644 --- a/git/config.mi5 +++ b/git/config.mi5 @@ -4,15 +4,15 @@ [diff] algorithm = patience -[fetch] - output = compact +[format] + pretty = fuller [init] - templateDir = <% XDG_CONFIG_HOME %>/git/template + defaultBranch = master + templateDir = <% XDG_DATA_HOME %>/git/template [log] date = local - decorate = short [merge] ff = false @@ -30,6 +30,9 @@ [status] short = true +[tag] + sort = -taggerdate + [user] name = <% NAME %> email = <% EMAIL %> diff --git a/gtk/gtk-3.0/settings.ini b/gtk/gtk-3.0/settings.ini deleted file mode 100644 index 4f93dfe4..00000000 --- a/gtk/gtk-3.0/settings.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Settings] -gtk-theme-name = Clearlooks-Phenix diff --git a/gtk/gtkrc-2.0 b/gtk/gtkrc-2.0 deleted file mode 100644 index 99fb22e2..00000000 --- a/gtk/gtkrc-2.0 +++ /dev/null @@ -1 +0,0 @@ -gtk-theme-name = "Clearlooks-Phenix" @@ -4,8 +4,8 @@ set $mod Mod4 # Use Mouse+$mod to drag floating windows to their wanted position floating_modifier $mod -# No title bar -new_window 1pixel +# Use a nice Unicode-aware condensed font +font pango:Noto Sans 10 # Mod+Shift+r restarts i3wm bindsym $mod+Shift+r restart @@ -50,22 +50,22 @@ bindsym $mod+a focus parent bindsym $mod+z focus child # Mod+<n> switches to a workspace -bindsym $mod+1 workspace 1:main -bindsym $mod+2 workspace 2:home -bindsym $mod+3 workspace 3:work -bindsym $mod+4 workspace 4:soc -bindsym $mod+5 workspace 5:tor +bindsym $mod+1 workspace 1 +bindsym $mod+2 workspace 2 +bindsym $mod+3 workspace 3 +bindsym $mod+4 workspace 4 +bindsym $mod+5 workspace 5 bindsym $mod+6 workspace 6 bindsym $mod+7 workspace 7 bindsym $mod+8 workspace 8 bindsym $mod+9 workspace 9 # Mod+Shift+<n> moves a container to a workspace -bindsym $mod+Shift+1 move container to workspace 1:main -bindsym $mod+Shift+2 move container to workspace 2:home -bindsym $mod+Shift+3 move container to workspace 3:work -bindsym $mod+Shift+4 move container to workspace 4:soc -bindsym $mod+Shift+5 move container to workspace 5:tor +bindsym $mod+Shift+1 move container to workspace 1 +bindsym $mod+Shift+2 move container to workspace 2 +bindsym $mod+Shift+3 move container to workspace 3 +bindsym $mod+Shift+4 move container to workspace 4 +bindsym $mod+Shift+5 move container to workspace 5 bindsym $mod+Shift+6 move container to workspace 6 bindsym $mod+Shift+7 move container to workspace 7 bindsym $mod+Shift+8 move container to workspace 8 @@ -84,17 +84,10 @@ mode "resize" { # i3bar at bottom of screen bar { - position bottom - status_command i3status --config ~/.config/i3/status - workspace_buttons yes - + separator_symbol "—" + status_command i3status + tray_padding 0 colors { background #111111 - statusline #eeeeee - - focused_workspace #ffffff #285577 - active_workspace #ffffff #333333 - inactive_workspace #888888 #222222 - urgent_workspace #ffffff #900000 } } @@ -2,7 +2,6 @@ order += "load" order += "tztime local" -order += "battery 0" load { format = "%1min/%5min/%15min" @@ -10,8 +9,3 @@ load { tztime local { format = "%Y-%m-%d %H:%M:%S" } -battery 0 { - format = "%status %percentage %remaining %emptytime" - path = "/sys/class/power_supply/BAT%d/uevent" - low_threshold = 15 -} diff --git a/keychain/profile.d/keychain.sh b/keychain/profile.d/keychain.sh deleted file mode 100644 index 63eb613a..00000000 --- a/keychain/profile.d/keychain.sh +++ /dev/null @@ -1,5 +0,0 @@ -# keychain setup -command -v keychain >/dev/null 2>&1 || return -eval "$(TERM=${TERM:-ansi} keychain \ - --eval --ignore-missing --quick --quiet \ - id_dsa id_rsa id_ecdsa id_ed25519)" diff --git a/keychain/shrc.d/keychain.sh b/keychain/shrc.d/keychain.sh deleted file mode 100644 index 1c0e780e..00000000 --- a/keychain/shrc.d/keychain.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Update GPG_TTY for clean use of pinentry(1) etc -GPG_TTY=$(command -p tty) || return -export GPG_TTY diff --git a/ksh/kshrc.d/keep.ksh b/ksh/kshrc.d/keep.ksh index f61a7a4d..861e1b2b 100644 --- a/ksh/kshrc.d/keep.ksh +++ b/ksh/kshrc.d/keep.ksh @@ -100,8 +100,8 @@ EOF case $name in # NAME must start with letters or an underscore, and contain no - # characters besides letters, numbers, or underscores - *[!a-zA-Z0-9_]*|[!a-zA-Z_]*) + # characters besides letters, numbers, underscores, or dashes + [!a-zA-Z_]*|*[!a-zA-Z0-9_-]*) printf 'ksh: %s: %s not a valid NAME\n' \ "$self" "$name" >&2 ((errors++)) diff --git a/ksh/kshrc.d/prompt.ksh b/ksh/kshrc.d/prompt.ksh index 64e22e8e..99d999de 100644 --- a/ksh/kshrc.d/prompt.ksh +++ b/ksh/kshrc.d/prompt.ksh @@ -12,16 +12,12 @@ function prompt { # Turn complex, colored PS1 and debugging PS4 prompts on on) - # Basic prompt shape depends on whether we're in SSH or not + # Prompt has hostname via SSH outside of screen/tmux PS1= - if [[ -n $SSH_CLIENT || -n $SSH_CONNECTION ]] ; then + if [[ -n $SSH_CLIENT && -z $STY && -z $TMUX ]] ; then PS1=$PS1'${HOSTNAME%%.*}:' fi - # Add sub-commands; working directory with ~ abbreviation, VCS, job - # count, and previous command return value - PS1=$PS1'$(ret=$?;jobc=$(jobs -p|sed -n '\''$='\'');prompt pwd;prompt vcs;prompt job;prompt ret;:)' - # Add a helpful prefix if this shell appears to be exotic typeset ksh case $KSH_VERSION in @@ -34,6 +30,10 @@ function prompt { (*) PS1=$ksh:$PS1 ;; esac + # Add sub-commands: + ## VCS, job, and return status checks as suffixes + PS1=$PS1'$(ret=$?;jobc=$(jobs -p|sed -n '\''$='\'');prompt pwd;prompt vcs;prompt job;prompt ret;:)' + # Add prefix and suffix PS1='${PROMPT_PREFIX}'$PS1'${PROMPT_SUFFIX}' diff --git a/ksh/shrc.d/ksh.sh b/ksh/shrc.d/ksh.sh index 9e032756..f074c832 100644 --- a/ksh/shrc.d/ksh.sh +++ b/ksh/shrc.d/ksh.sh @@ -21,10 +21,11 @@ if [ -z "$KSH_VERSION" ] ; then # Test whether we have content in the .sh.version variable. Suppress # errors and run it in a subshell to work around parsing error precedence. - # shellcheck disable=SC2234 + # shellcheck disable=SC2234,SC2296 ( test -n "${.sh.version}" ) 2>/dev/null || return # If that peculiarly named variable was set, then that's our KSH_VERSION + # shellcheck disable=SC2296 KSH_VERSION=${.sh.version} fi diff --git a/lint/bash.sh b/lint/bash.sh index 13754a3f..2b6342ae 100644 --- a/lint/bash.sh +++ b/lint/bash.sh @@ -5,4 +5,4 @@ set \ bash/bash_profile \ bash/bashrc \ bash/bashrc.d/*.bash -shellcheck -e SC1090 -s bash -- "$@" || exit +shellcheck -e SC1090 -e SC1091 -s bash -- "$@" || exit diff --git a/lint/bin.sh b/lint/bin.sh index a98c6a73..f80f44d2 100644 --- a/lint/bin.sh +++ b/lint/bin.sh @@ -3,7 +3,7 @@ set -- for bin in bin/*.sh ; do set -- "$@" "${bin%.sh}" done -shellcheck -e SC1090 -- "$@" || exit +shellcheck -e SC1090 -e SC1091 -- "$@" || exit # GNU Bash if command -v bash >/dev/null 2>&1 ; then @@ -11,5 +11,5 @@ if command -v bash >/dev/null 2>&1 ; then for bin in bin/*.bash ; do set -- "$@" "${bin%.bash}" done - shellcheck -e SC1090 -- "$@" || exit + shellcheck -e SC1090 -e SC1091 -- "$@" || exit fi diff --git a/lint/games.sh b/lint/games.sh index e9690d8d..aa680035 100644 --- a/lint/games.sh +++ b/lint/games.sh @@ -3,4 +3,4 @@ set -- for game in games/*.sh ; do set -- "$@" "${game%.sh}" done -shellcheck -e SC1090 -- "$@" || exit +shellcheck -e SC1090 -e SC1091 -- "$@" || exit diff --git a/lint/git-template-hooks.sh b/lint/git-template-hooks.sh index 74f20fc6..a0f7ef1a 100644 --- a/lint/git-template-hooks.sh +++ b/lint/git-template-hooks.sh @@ -2,4 +2,4 @@ set -- for bin in git/template/hooks/*.sh ; do set -- "$@" "${bin%.sh}" done -shellcheck -e SC1090 -- "$@" || exit +shellcheck -e SC1090 -e SC1091 -- "$@" || exit diff --git a/lint/ksh.sh b/lint/ksh.sh index 117909b3..164c4672 100644 --- a/lint/ksh.sh +++ b/lint/ksh.sh @@ -1,5 +1,5 @@ set \ ksh/kshrc \ ksh/kshrc.d/*.ksh -shellcheck -e SC1090 -s ksh -- "$@" || exit -shellcheck -e SC1090 -s sh -- ksh/shrc.d/ksh.sh || exit +shellcheck -e SC1090 -e SC1091 -s ksh -- "$@" || exit +shellcheck -e SC1090 -e SC1091 -s sh -- ksh/shrc.d/ksh.sh || exit @@ -4,4 +4,4 @@ set \ sh/shrc \ */profile.d/*.sh \ */shrc.d/*.sh -shellcheck -e SC1090 -s sh -- "$@" || exit +shellcheck -e SC1090 -e SC1091 -s sh -- "$@" || exit diff --git a/lint/urxvt.sh b/lint/urxvt.sh deleted file mode 100644 index 6e5fb503..00000000 --- a/lint/urxvt.sh +++ /dev/null @@ -1,5 +0,0 @@ -set -- -for pl in urxvt/ext/*.pl ; do - set -- "$@" "${pl%.pl}" -done -perlcritic --brutal -- "${pl%.pl}" diff --git a/lint/x.sh b/lint/x.sh new file mode 100644 index 00000000..0625369b --- /dev/null +++ b/lint/x.sh @@ -0,0 +1 @@ +shellcheck -e SC1090 -e SC1091 -s sh -- x/xsessionrc x/shrc.d/*.sh diff --git a/lint/xinit.sh b/lint/xinit.sh deleted file mode 100644 index 0fab84d2..00000000 --- a/lint/xinit.sh +++ /dev/null @@ -1,4 +0,0 @@ -set \ - X/xinitrc \ - X/xinitrc.d/*.sh -shellcheck -e SC1090 -s sh -- "$@" diff --git a/lint/xsession.sh b/lint/xsession.sh new file mode 100644 index 00000000..5544e1be --- /dev/null +++ b/lint/xsession.sh @@ -0,0 +1 @@ +shellcheck -e SC1090 -e SC1091 -s sh -- x/xsession diff --git a/logrotate/config b/logrotate/config new file mode 100644 index 00000000..5a703a46 --- /dev/null +++ b/logrotate/config @@ -0,0 +1,5 @@ +compress +create 0600 +delaycompress + +include ~/.config/logrotate/config.d diff --git a/logrotate/systemd/user/logrotate.service b/logrotate/systemd/user/logrotate.service new file mode 100644 index 00000000..0193d5be --- /dev/null +++ b/logrotate/systemd/user/logrotate.service @@ -0,0 +1,10 @@ +[Unit] +Description=user log rotation + +[Service] +Type=oneshot +ConfigurationDirectory=%p %p/config.d +StateDirectory=%p +ExecStartPre=/bin/mkdir -pv -- %h/.local/state/%p +ExecStart=/usr/sbin/logrotate --state=%h/.local/state/%p/status -- %E/%p/config +TimeoutStartSec=20m diff --git a/logrotate/systemd/user/logrotate.timer b/logrotate/systemd/user/logrotate.timer new file mode 100644 index 00000000..077aeac9 --- /dev/null +++ b/logrotate/systemd/user/logrotate.timer @@ -0,0 +1,10 @@ +[Unit] +Description=user log rotation schedule + +[Timer] +OnBootSec=1h +OnUnitActiveSec=6h +RandomizedDelaySec=5m + +[Install] +WantedBy=timers.target diff --git a/man/man1/bp.1df b/man/man1/bp.1df index 93f08f74..835ffaf6 100644 --- a/man/man1/bp.1df +++ b/man/man1/bp.1df @@ -5,7 +5,7 @@ .SH SYNOPSIS .B bp .br -BROWSER=firefox +BROWSER=librewolf .B bp .SH DESCRIPTION .B bp diff --git a/man/man1/br.1df b/man/man1/br.1df index a84a55d3..1690af5c 100644 --- a/man/man1/br.1df +++ b/man/man1/br.1df @@ -8,7 +8,7 @@ .B br http://www.example.com/ .br -BROWSER=firefox +BROWSER=librewolf .B br .SH DESCRIPTION .B br diff --git a/man/man1/dmp.1df b/man/man1/dmp.1df deleted file mode 100644 index d663e3d0..00000000 --- a/man/man1/dmp.1df +++ /dev/null @@ -1,17 +0,0 @@ -.TH DMP 1df "August 2016" "Manual page for dmp" -.SH NAME -.B dmp -\- pick a pass(1) password with dmenu(1) -.SH SYNOPSIS -.B dmp -.SH DESCRIPTION -.B dmp -applies dmenu(1) to pick a password entry from a pass(1) store and put it into -the X CLIPBOARD for a period of time. -.P -If notify-send(1) is installed, a notification with the default priority will -be written when the password is successfully clipped. -.SH SEE ALSO -dmenu(1), notify-send(1), pass(1), xsel(1) -.SH AUTHOR -Tom Ryder <tom@sanctum.geek.nz> diff --git a/man/man1/sls.1df b/man/man1/sls.1df index 83c13201..dde8e622 100644 --- a/man/man1/sls.1df +++ b/man/man1/sls.1df @@ -1,4 +1,4 @@ -.TH SLS 1df "May 2014" "Manual page for sls" +.TH SLS 1df "August 2022" "Manual page for sls" .SH NAME .B sls \- list the first hostname on each line of an ssh_config(5) file @@ -10,9 +10,9 @@ ssh_config_alt1 ssh_config_alt2 .SH DESCRIPTION .B sls runs slsf(1df) on the given set of ssh_config(5) files to print the first -non-wildcard hostname on each "Host" line, defaulting to /etc/ssh/ssh_config -and ~/.ssh/config if they exist. Suitable for use in batch scripts like -sra(1df). +non-wildcard hostname on each "Host" line, defaulting to +/etc/ssh/ssh_config.d/*.conf, /etc/ssh/ssh_config, ~/.ssh/config.d/*.conf, and +~/.ssh/config if they exist. Suitable for use in batch scripts like sra(1df). .SH SEE ALSO slsf(1df), sra(1df), sta(1df), ssh(1), ssh_config(5) .SH AUTHOR diff --git a/man/man1/slsf.1df b/man/man1/slsf.1df index 31453dca..6d59ba3d 100644 --- a/man/man1/slsf.1df +++ b/man/man1/slsf.1df @@ -1,4 +1,4 @@ -.TH SLSF 1df "July 2016" "Manual page for slsf" +.TH SLSF 1df "August 2022" "Manual page for slsf" .SH NAME .B slsf \- list the first hostname on each line of ssh_config(5) files @@ -10,9 +10,9 @@ cat ~/.ssh_config | .br .SH DESCRIPTION .B slsf -iterates through the ssh_config(5) files given as its input and prints the -first name given on each "Host" line, as long as it contains no wildcards. -Most users will probably want the sls(1df) frontend. +iterates through the ssh_config(5) files given as its input and prints a unique +list of the patterns given on each "Host" line containing no wildcards. Most +users will probably want the sls(1df) frontend instead. .P Within the file, a comment "### nosls" on its own line will exclude all following output unless an "### sls" comment is read to resume it again: diff --git a/man/man1/xrbg.1df b/man/man1/xrbg.1df index 14bfbc7d..9c067ff9 100644 --- a/man/man1/xrbg.1df +++ b/man/man1/xrbg.1df @@ -11,8 +11,8 @@ XBACKGROUNDS=/path/to/images .B xrbg searches for images in the directory named in the XBACKGROUNDS environment variable (defaults to ~/.xbackgrounds), chooses a random one with rndf(1df), -and applies it with feh(1). It's designed for use in ~/.xinitrc, but it seems -to work when called manually from within an X session too. +and applies it with feh(1). It's designed for use in X startup files, but it +seems to work when called manually from within an X session too. .SH SEE ALSO feh(1), rndf(1df) .SH AUTHOR diff --git a/man/man1/xrq.1df b/man/man1/xrq.1df index 9dd7f0d1..184aa186 100644 --- a/man/man1/xrq.1df +++ b/man/man1/xrq.1df @@ -1,4 +1,4 @@ -.TH XRQ 1df "January 2017" "Manual page for xrq" +.TH XRQ 1df "February 2023" "Manual page for xrq" .SH NAME .B xrq \- query X resource values @@ -7,7 +7,7 @@ Xft.hintstyle .br .B xrq -URxvt.color0 URxvt.color9 +XTerm.vt100.color0 XTerm.vt100.color9 .SH DESCRIPTION .B xrq runs xrdb(1) with the -query option and filters for the values of the named diff --git a/man/man1/xsnap.1df b/man/man1/xsnap.1df new file mode 100644 index 00000000..276e27b3 --- /dev/null +++ b/man/man1/xsnap.1df @@ -0,0 +1,16 @@ +.TH XSNAP 1df "May 2022" "Manual page for xsnap" +.SH NAME +.B xsnap +\- wrapper around scrot(1) for serialized recorded screenshots +.SH SYNOPSIS +.B xsnap +.br +.B xsnap +\--select +.SH DESCRIPTION +.B xsnap +takes a PNG screenshot with scrot(1), passing any options thereto, saving the +image into a date-stamped path ~/.local/share/scrot/screenshots/YYYY-MM-DD, +with increasing integer filenames for that day. +.SH AUTHOR +Tom Ryder <tom@sanctum.geek.nz> diff --git a/man/man6/pks.6df b/man/man6/pks.6df index 8de04491..b0f15d24 100644 --- a/man/man6/pks.6df +++ b/man/man6/pks.6df @@ -1,4 +1,4 @@ -.TH PKS 6df "July 2017" "Manual page for pks" +.TH PKS 6df "March 2021" "Manual page for pks" .SH NAME .B pks \- select and laugh at a random word from a system dictionary or fileset @@ -24,6 +24,6 @@ A hyphen character "-" can be given as an argument to select standard input. .SH SEE ALSO philsay(6df) .br -<https://www.youtube.com/watch?v=F8ID1KJQxB8> +<https://www.youtube.com/watch?v=FKmHtw0vDrs> .SH AUTHOR Tom Ryder <tom@sanctum.geek.nz> diff --git a/man/man7/dotfiles.7df b/man/man7/dotfiles.7df index 899cacb1..83616552 100644 --- a/man/man7/dotfiles.7df +++ b/man/man7/dotfiles.7df @@ -1,12 +1,26 @@ -.\" Automatically generated by Pandoc 2.2.1 +.\" Automatically generated by Pandoc 2.17.1.1 .\" -.TH "DOTFILES" "7" "October 2017" "Tom Ryder's personal scripts and configuration" "" +.\" Define V font for inline verbatim, using C font in formats +.\" that render this, and otherwise B font. +.ie "\f[CB]x\f[]"x" \{\ +. ftr V B +. ftr VI BI +. ftr VB B +. ftr VBI BI +.\} +.el \{\ +. ftr V CR +. ftr VI CI +. ftr VB CB +. ftr VBI CBI +.\} +.TH "DOTFILES" "7" "October 2017" "Tom Ryder\[cq]s personal scripts and configuration" "" .hy .SH Dotfiles (Tom Ryder) .PP This is my personal repository of configuration files and scripts for -\f[C]$HOME\f[], including most of the settings that migrate well between -machines. +\f[V]$HOME\f[R], including most of the settings that migrate well +between machines. .PP This repository began as a simple way to share Vim and tmux configuration, but a lot of scripts and shell configuration have been @@ -15,111 +29,109 @@ added over time, making it into a personal suite of custom Unix tools. .IP .nf \f[C] -$\ mkdir\ \-p\ ~/.local/share -$\ git\ clone\ https://sanctum.geek.nz/code/dotfiles.git\ ~/.local/share/dotfiles -$\ cd\ ~/.local/share/dotfiles -$\ git\ submodule\ init -$\ git\ submodule\ update -$\ make -$\ make\ \-n\ install\ \ #\ Check\ output\ carefully -$\ make\ install -\f[] +$ mkdir -p \[ti]/.local/src +$ git clone https://dev.sanctum.geek.nz/code/dotfiles.git \[ti]/.local/src/dotfiles +$ cd \[ti]/.local/src/dotfiles +$ git submodule init +$ git submodule update +$ make +$ make -n install # Check output carefully +$ make install +\f[R] .fi .PP -For the default \f[C]all\f[] target, you'll need a POSIX\-fearing -userland, including \f[C]make(1)\f[] and \f[C]m4(1)\f[]. +For the default \f[V]all\f[R] target, you\[cq]ll need a POSIX-fearing +userland, including \f[V]make(1)\f[R] and \f[V]m4(1)\f[R]. .PP -The installation \f[C]Makefile\f[] overwrites things standing in the way -of its installed files without backing them up, so read the output of -\f[C]make\ \-n\ install\f[] before running \f[C]make\ install\f[] -carefully, to make sure you aren't going to lose anything unexpected. -If you're still not sure, install it in a temporary directory first, so -you can explore: +The installation \f[V]Makefile\f[R] overwrites things standing in the +way of its installed files without backing them up, so read the output +of \f[V]make -n install\f[R] before running \f[V]make install\f[R] +carefully, to make sure you aren\[cq]t going to lose anything +unexpected. +If you\[cq]re still not sure, install it in a temporary directory first, +so you can explore: .IP .nf \f[C] -$\ tmpdir=$(mktemp\ \-d) -$\ make\ install\ HOME="$tmpdir" -$\ env\ \-i\ HOME="$tmpdir"\ TERM="$TERM"\ "$SHELL"\ \-l -\f[] +$ tmpdir=$(mktemp -d) +$ make install HOME=\[dq]$tmpdir\[dq] +$ env -i HOME=\[dq]$tmpdir\[dq] TERM=\[dq]$TERM\[dq] \[dq]$SHELL\[dq] -l +\f[R] .fi .PP -The default \f[C]install\f[] target will install these targets and all +The default \f[V]install\f[R] target will install these targets and all their dependencies: .IP \[bu] 2 -\f[C]install\-bin\f[] +\f[V]install-bin\f[R] .IP \[bu] 2 -\f[C]install\-curl\f[] +\f[V]install-curl\f[R] .IP \[bu] 2 -\f[C]install\-ex\f[] +\f[V]install-ex\f[R] .IP \[bu] 2 -\f[C]install\-git\f[] +\f[V]install-git\f[R] .IP \[bu] 2 -\f[C]install\-gnupg\f[] +\f[V]install-gnupg\f[R] .IP \[bu] 2 -\f[C]install\-less\f[] +\f[V]install-less\f[R] .IP \[bu] 2 -\f[C]install\-login\-shell\f[] +\f[V]install-login-shell\f[R] .IP \[bu] 2 -\f[C]install\-man\f[] +\f[V]install-man\f[R] .IP \[bu] 2 -\f[C]install\-readline\f[] +\f[V]install-readline\f[R] .IP \[bu] 2 -\f[C]install\-vim\f[] +\f[V]install-vim\f[R] .PP -The \f[C]install\-login\-shell\f[] target looks at your \f[C]SHELL\f[] -environment variable, and tries to figure out which shell's -configuration files to install, falling back on \f[C]install\-sh\f[]. +The \f[V]install-login-shell\f[R] target looks at your \f[V]SHELL\f[R] +environment variable, and tries to figure out which shell\[cq]s +configuration files to install, falling back on \f[V]install-sh\f[R]. .PP -The remaining files can be installed with the other \f[C]install\-*\f[] +The remaining files can be installed with the other \f[V]install-*\f[R] targets. -Try \f[C]awk\ \-f\ bin/mftl.awk\ Makefile\f[] in the project's root +Try \f[V]awk -f bin/mftl.awk Makefile\f[R] in the project\[cq]s root directory to see a list. .SS Configuration .PP -To keep a set of \f[C]make\f[] targets useful for a specific user or -host, you can list them in a newline\-separated file -\f[C]~/.config/dotfiles/config\f[], and install using that with the -special \f[C]install\-conf\f[] target. -This can include macro settings for the \f[C]Makefile\f[], too: +To keep a set of \f[V]make\f[R] targets useful for a specific user or +host, you can list them in a newline-separated file +\f[V]\[ti]/.config/dotfiles/config\f[R], and install using that with the +special \f[V]install-conf\f[R] target. +This can include macro settings for the \f[V]Makefile\f[R], too: .IP .nf \f[C] -$\ cd -$\ cat\ .config/dotfiles/config -install\-bash -install\-bin -EMAIL=you\@example.com -$\ make\ \-C\ .local/share/dotfiles\ install\-conf -\f[] +$ cd +$ cat .config/dotfiles/config +install-bash +install-bin +EMAIL=you\[at]example.com +$ make -C .local/src/dotfiles install-conf +\f[R] .fi .SS Tools .PP Configuration is included for: .IP \[bu] 2 -Bourne\-style POSIX shells, sharing a \f[C]\&.profile\f[], an -\f[C]ENV\f[] file, and some helper functions: +Bourne-style POSIX shells, sharing a \f[V].profile\f[R], an +\f[V]ENV\f[R] file, and some helper functions: .RS 2 .IP \[bu] 2 GNU Bash (https://www.gnu.org/software/bash/) (v3.0 or newer) .IP \[bu] 2 -Korn shell (http://www.kornshell.com/) (\f[C]ksh93\f[], \f[C]pdksh\f[], -\f[C]mksh\f[]) +Korn shell (http://www.kornshell.com/) (\f[V]ksh93\f[R], +\f[V]pdksh\f[R], \f[V]mksh\f[R]) .IP \[bu] 2 Z shell (https://www.zsh.org/) .RE .IP \[bu] 2 Abook (http://abook.sourceforge.net/)\[em]curses address book program .IP \[bu] 2 -cURL (https://curl.haxx.se/)\[em]Command\-line tool for transferring -data with URL syntax +cURL (https://curl.haxx.se/)\[em]Command-line tool for transferring data +with URL syntax .IP \[bu] 2 Dillo (https://www.dillo.org/)\[em]A lightweight web browser .IP \[bu] 2 -Dunst (https://dunst-project.org/)\[em]A lightweight X11 notification -daemon that works with \f[C]libnotify\f[] -.IP \[bu] 2 -\f[C]finger(1)\f[]\[em]User information lookup program +\f[V]finger(1)\f[R]\[em]User information lookup program .IP \[bu] 2 Git (https://git-scm.com/)\[em]Distributed version control system .IP \[bu] 2 @@ -129,9 +141,6 @@ editor GnuPG (https://www.gnupg.org/)\[em]GNU Privacy Guard, for private communication and file encryption .IP \[bu] 2 -GTK+ (https://www.gtk.org/)\[em]GIMP Toolkit, for graphical user -interface elements -.IP \[bu] 2 i3 (https://i3wm.org/)\[em]Tiling window manager .IP \[bu] 2 less (https://www.gnu.org/software/less/)\[em]Terminal pager @@ -140,16 +149,20 @@ mpv (https://mpv.io/)\[em]Media player .IP \[bu] 2 Mutt (http://www.mutt.org/)\[em]Terminal mail user agent .IP \[bu] 2 -\f[C]mysql(1)\f[] (https://linux.die.net/man/1/mysql)\[em]Command\-line +\f[V]mysql(1)\f[R] (https://linux.die.net/man/1/mysql)\[em]Command-line MySQL client .IP \[bu] 2 -Ncmpcpp (https://rybczak.net/ncmpcpp/)\[em]ncurses music player client +ncmpcpp (https://rybczak.net/ncmpcpp/)\[em]ncurses based MPD client +inspired by ncmpc .IP \[bu] 2 Newsboat (https://newsboat.org/)\[em]Terminal RSS/Atom feed reader .IP \[bu] 2 -\f[C]psql(1)\f[] (https://linux.die.net/man/1/psql)\[em]Command\-line +\f[V]psql(1)\f[R] (https://linux.die.net/man/1/psql)\[em]Command-line PostgreSQL client .IP \[bu] 2 +Parcellite (http://parcellite.sourceforge.net/)\[em]clipboard manager +for X +.IP \[bu] 2 Perl::Critic (http://perlcritic.com/)\[em]static source code analysis engine for Perl .IP \[bu] 2 @@ -159,9 +172,6 @@ code Readline (https://tiswww.case.edu/php/chet/readline/rltop.html)\[em]GNU library for user input used by Bash, MySQL, and others .IP \[bu] 2 -rxvt\-unicode (http://software.schmorp.de/pkg/rxvt-unicode.html)\[em]Fork -of the rxvt terminal emulator with Unicode support -.IP \[bu] 2 Subversion (https://subversion.apache.org/)\[em]Apache Subversion, a version control system .IP \[bu] 2 @@ -175,7 +185,7 @@ Vim (https://www.vim.org/)\[em]Vi IMproved, a text editor X11 (https://www.x.org/wiki/)\[em]Windowing system with network transparency for Unix .PP -There is also some slightly customized support for multi\-version +There is also some slightly customized support for multi-version environment management for three major scripting languages: .IP \[bu] 2 plenv (https://github.com/tokuhirom/plenv)\[em]Perl @@ -187,28 +197,27 @@ rbenv (https://github.com/rbenv/rbenv)\[em]Ruby The configurations for shells, Mutt, tmux, and Vim are the most likely to be of interest. The i3 configuration is limited mainly to changing window switching key -bindings to match Vim's. -There are a fair few resources defined for rxvt\-unicode. +bindings to match Vim\[cq]s. .SS Shell .PP On GNU/Linux, I use Bash; on *BSD, I use some variant of Korn Shell, -preferably \f[C]ksh93\f[] if it's available. +preferably \f[V]ksh93\f[R] if it\[cq]s available. .SS POSIX core .PP -My \f[C]~/.profile\f[] and other files in \f[C]sh\f[] are written in -POSIX shell script, so they \f[I]should\f[] work in most -POSIX\-conforming \f[C]sh(1)\f[] implementations. -Please email me if you find a case where they don't! +My \f[V]\[ti]/.profile\f[R] and other files in \f[V]sh\f[R] are written +in POSIX shell script, so they \f[I]should\f[R] work in most +POSIX-conforming \f[V]sh(1)\f[R] implementations. +Please email me if you find a case where they don\[cq]t! .PP Further shell snippets to run on login are sourced from -\f[C]~/.profile.d\f[] by \f[C]~/.profile\f[]. +\f[V]\[ti]/.profile.d\f[R] by \f[V]\[ti]/.profile\f[R]. Most of these boil down to exporting variables appropriate to the system and the software it has available. .PP Configuration that should be sourced for all conforming -\f[I]interactive\f[] shells is kept in \f[C]~/.shrc\f[], with subscripts -read from \f[C]~/.shrc.d\f[]. -There's a \f[C]~/.shinit\f[] shim to act as \f[C]ENV\f[]. +\f[I]interactive\f[R] shells is kept in \f[V]\[ti]/.shrc\f[R], with +subscripts read from \f[V]\[ti]/.shrc.d\f[R]. +There\[cq]s a \f[V]\[ti]/.shinit\f[R] shim to act as \f[V]ENV\f[R]. .SS GNU Bash .PP My Bash scripts are written to work with GNU Bash v3.0 or @@ -218,45 +227,45 @@ items to arrays: .IP .nf \f[C] -array[${#array[\@]}]=$item -\f[] +array[${#array[\[at]]}]=$item +\f[R] .fi .PP -This doesn't work for arrays with sparse indices; compare this to the -much nicer syntax available since 3.1\-alpha1, which does: +This doesn\[cq]t work for arrays with sparse indices; compare this to +the much nicer syntax available since 3.1-alpha1, which does: .IP .nf \f[C] -array+=("$item") -\f[] +array+=(\[dq]$item\[dq]) +\f[R] .fi .PP I do use some features that are only available in versions after v3.0, -such as newer \f[C]shopt\f[] options like \f[C]dirspell\f[], or -variables like \f[C]PROMPT_DIRTRIM\f[]. -These are set only after testing \f[C]BASH_VERSINFO\f[] appropriately. +such as newer \f[V]shopt\f[R] options like \f[V]dirspell\f[R], or +variables like \f[V]PROMPT_DIRTRIM\f[R]. +These are set only after testing \f[V]BASH_VERSINFO\f[R] appropriately. .SS Prompt .PP A terminal session with my prompt looks something like this: .IP .nf \f[C] -~$\ ssh\ remote -remote:~$\ cd\ .local/share/dotfiles -remote:~/.local/share/dotfiles(master+!)$\ git\ status -\ M\ README.md -M\ \ bash/bashrc.d/prompt.bash -A\ \ init -remote:~/.local/share/dotfiles(master+!)$\ foobar -foobar:\ command\ not\ found -remote:~/.local/share/dotfiles(master+!)<127>$\ sleep\ 5\ & -[1]\ 28937 -remote:~/.local/share/dotfiles(master+!){1}$ -\f[] +\[ti]$ ssh remote +remote:\[ti]$ cd .local/src/dotfiles +remote:\[ti]/.local/src/dotfiles(master+!)$ git status + M README.md +M bash/bashrc.d/prompt.bash +A init +remote:\[ti]/.local/src/dotfiles(master+!)$ foobar +foobar: command not found +remote:\[ti]/.local/src/dotfiles(master+!)<127>$ sleep 5 & +[1] 28937 +remote:\[ti]/.local/src/dotfiles(master+!){1}$ +\f[R] .fi .PP The hostname is elided if not connected via SSH. -The working directory with tilde abbreviation for \f[C]$HOME\f[] is +The working directory with tilde abbreviation for \f[V]$HOME\f[R] is always shown. The rest of the prompt expands based on context to include these elements, in this order: @@ -266,191 +275,192 @@ Whether in a Git repository if applicable, The current version control branch, tag, or commit/revision if applicable, and punctuation to show repository status including reference to upstreams at a glance. -Subversion support can also be enabled, in which case a \f[C]git:\f[] or -\f[C]svn:\f[] prefix is added appropriately for disambiguation. +Subversion support can also be enabled, in which case a \f[V]git:\f[R] +or \f[V]svn:\f[R] prefix is added appropriately for disambiguation. .IP \[bu] 2 -The number of running background jobs, if non\-zero. +The number of running background jobs, if non-zero. .IP \[bu] 2 -The exit status of the last command, if non\-zero. +The exit status of the last command, if non-zero. .PP -You can set \f[C]PROMPT_COLOR\f[], \f[C]PROMPT_PREFIX\f[], and -\f[C]PROMPT_SUFFIX\f[] too, which all do about what you'd expect. +You can set \f[V]PROMPT_COLOR\f[R], \f[V]PROMPT_PREFIX\f[R], and +\f[V]PROMPT_SUFFIX\f[R] too, which all do about what you\[cq]d expect. .PP -If you start up GNU Bash, Korn shell, or Z shell, and that doesn't match -your login shell, the prompt should display an appropriate prefix. +If you start up GNU Bash, Korn shell, or Z shell, and that doesn\[cq]t +match your login shell, the prompt should display an appropriate prefix. .PP -This is all managed within the \f[C]prompt\f[] function. -There's some mildly hacky logic on \f[C]tput\f[] codes included such -that it should work correctly for most common terminals using both -\f[C]termcap(5)\f[] and \f[C]terminfo(5)\f[], including *BSD systems. -It's also designed to degrade gracefully for eight\-color and no\-color -terminals. +This is all managed within the \f[V]prompt\f[R] function. +There\[cq]s some mildly hacky logic on \f[V]tput\f[R] codes included +such that it should work correctly for most common terminals using both +\f[V]termcap(5)\f[R] and \f[V]terminfo(5)\f[R], including *BSD systems. +It\[cq]s also designed to degrade gracefully for eight-color and +no-color terminals. .SS Functions .PP -If a function can be written in POSIX \f[C]sh\f[] without too much -hackery, I put it in \f[C]sh/shrc.d\f[] to be loaded by any POSIX +If a function can be written in POSIX \f[V]sh\f[R] without too much +hackery, I put it in \f[V]sh/shrc.d\f[R] to be loaded by any POSIX interactive shell. Those include: .IP \[bu] 2 Four functions for using a \[lq]marked\[rq] directory, which I find a -more manageable concept than the \f[C]pushd\f[]/\f[C]popd\f[] directory -stack: +more manageable concept than the \f[V]pushd\f[R]/\f[V]popd\f[R] +directory stack: .RS 2 .IP \[bu] 2 -\f[C]md()\f[] marks a given (or the current) directory. +\f[V]md()\f[R] marks a given (or the current) directory. .IP \[bu] 2 -\f[C]gd()\f[] goes to the marked directory. +\f[V]gd()\f[R] goes to the marked directory. .IP \[bu] 2 -\f[C]pmd()\f[] prints the marked directory. +\f[V]pmd()\f[R] prints the marked directory. .IP \[bu] 2 -\f[C]xd()\f[] swaps the current and marked directories. +\f[V]xd()\f[R] swaps the current and marked directories. .RE .IP \[bu] 2 Ten other directory management and navigation functions: .RS 2 .IP \[bu] 2 -\f[C]bd()\f[] changes into a named ancestor of the current directory. +\f[V]bd()\f[R] changes into a named ancestor of the current directory. .IP \[bu] 2 -\f[C]gt()\f[] changes into a directory or into a file's directory. +\f[V]gt()\f[R] changes into a directory or into a file\[cq]s directory. .IP \[bu] 2 -\f[C]lgt()\f[] runs \f[C]gt()\f[] on the first result from a -\f[C]loc(1df)\f[] search. +\f[V]lgt()\f[R] runs \f[V]gt()\f[R] on the first result from a +\f[V]loc(1df)\f[R] search. .IP \[bu] 2 -\f[C]mkcd()\f[] creates a directory and changes into it. +\f[V]mkcd()\f[R] creates a directory and changes into it. .IP \[bu] 2 -\f[C]pd()\f[] changes to the argument's parent directory. +\f[V]pd()\f[R] changes to the argument\[cq]s parent directory. .IP \[bu] 2 -\f[C]rd()\f[] replaces the first instance of its first argument with its -second argument in \f[C]$PWD\f[], emulating a feature of the Zsh -\f[C]cd\f[] builtin that I like. +\f[V]rd()\f[R] replaces the first instance of its first argument with +its second argument in \f[V]$PWD\f[R], emulating a feature of the Zsh +\f[V]cd\f[R] builtin that I like. .IP \[bu] 2 -\f[C]scr()\f[] creates a temporary directory and changes into it. +\f[V]scr()\f[R] creates a temporary directory and changes into it. .IP \[bu] 2 -\f[C]sd()\f[] changes into a sibling of the current directory. +\f[V]sd()\f[R] changes into a sibling of the current directory. .IP \[bu] 2 -\f[C]ud()\f[] changes into an indexed ancestor of a directory. +\f[V]ud()\f[R] changes into an indexed ancestor of a directory. .IP \[bu] 2 -\f[C]vr()\f[] tries to change to the root directory of a source control +\f[V]vr()\f[R] tries to change to the root directory of a source control repository. .RE .IP \[bu] 2 Two editor wrapper functions: .RS 2 .IP \[bu] 2 -\f[C]e()\f[] invokes \f[C]$EDITOR\f[], or \f[C]ed(1)\f[] if not set. +\f[V]e()\f[R] invokes \f[V]$EDITOR\f[R], or \f[V]ed(1)\f[R] if not set. .IP \[bu] 2 -\f[C]v()\f[] invokes \f[C]$VISUAL\f[], or \f[C]vi(1)\f[] if not set. +\f[V]v()\f[R] invokes \f[V]$VISUAL\f[R], or \f[V]vi(1)\f[R] if not set. .RE .IP \[bu] 2 -\f[C]bc()\f[] silences startup messages from GNU \f[C]bc(1)\f[]. +\f[V]bc()\f[R] silences startup messages from GNU \f[V]bc(1)\f[R]. .IP \[bu] 2 -\f[C]ed()\f[] tries to get verbose error messages, a prompt, and a -Readline environment for \f[C]ed(1)\f[]. +\f[V]ed()\f[R] tries to get verbose error messages, a prompt, and a +Readline environment for \f[V]ed(1)\f[R]. .IP \[bu] 2 -\f[C]gdb()\f[] silences startup messages from \f[C]gdb(1)\f[]. +\f[V]gdb()\f[R] silences startup messages from \f[V]gdb(1)\f[R]. .IP \[bu] 2 -\f[C]grep()\f[] tries to apply color and other options good for +\f[V]grep()\f[R] tries to apply color and other options good for interactive use if available. .IP \[bu] 2 -\f[C]hgrep()\f[] allows searching \f[C]$HISTFILE\f[]. +\f[V]hgrep()\f[R] allows searching \f[V]$HISTFILE\f[R]. .IP \[bu] 2 -\f[C]keychain()\f[] keeps \f[C]$GPG_TTY\f[] up to date if a GnuPG agent -is available. -.IP \[bu] 2 -\f[C]ls()\f[] tries to apply color and other options good for +\f[V]ls()\f[R] tries to apply color and other options good for interactive use if available. .RS 2 .IP \[bu] 2 -\f[C]la()\f[] runs \f[C]ls\ \-A\f[] if it can, or \f[C]ls\ \-a\f[] +\f[V]la()\f[R] runs \f[V]ls -A\f[R] if it can, or \f[V]ls -a\f[R] otherwise. .IP \[bu] 2 -\f[C]ll()\f[] runs \f[C]ls\ \-Al\f[] if it can, or \f[C]ls\ \-al\f[] +\f[V]ll()\f[R] runs \f[V]ls -Al\f[R] if it can, or \f[V]ls -al\f[R] otherwise. .RE .IP \[bu] 2 -\f[C]path()\f[] manages the contents of \f[C]PATH\f[] conveniently. +\f[V]path()\f[R] manages the contents of \f[V]PATH\f[R] conveniently. .IP \[bu] 2 -\f[C]scp()\f[] tries to detect forgotten hostnames in \f[C]scp(1)\f[] +\f[V]scp()\f[R] tries to detect forgotten hostnames in \f[V]scp(1)\f[R] command calls. .IP \[bu] 2 -\f[C]sudo()\f[] forces \f[C]\-H\f[] for \f[C]sudo(8)\f[] calls so that -\f[C]$HOME\f[] is never preserved; I hate having \f[C]root\f[]\-owned +\f[V]sudo()\f[R] forces \f[V]-H\f[R] for \f[V]sudo(8)\f[R] calls so that +\f[V]$HOME\f[R] is never preserved; I hate having \f[V]root\f[R]-owned files in my home directory. .IP \[bu] 2 -\f[C]tree()\f[] colorizes GNU \f[C]tree(1)\f[] output if possible -(without having \f[C]LS_COLORS\f[] set). +\f[V]tor()\f[R] is just a terse shortcut for using Torsocks to anonymize +TCP connections from the current shell. +.IP \[bu] 2 +\f[V]tree()\f[R] colorizes GNU \f[V]tree(1)\f[R] output if possible +(without having \f[V]LS_COLORS\f[R] set). .IP \[bu] 2 -\f[C]x()\f[] is a one\-key shortcut for \f[C]exec\ startx\f[]. +\f[V]x()\f[R] is a one-key shortcut for \f[V]exec startx\f[R]. .PP There are a few other little tricks defined for other shells providing -non\-POSIX features, as compatibility allows: +non-POSIX features, as compatibility allows: .IP \[bu] 2 -\f[C]keep()\f[] stores ad\-hoc shell functions and variables (Bash, Korn +\f[V]keep()\f[R] stores ad-hoc shell functions and variables (Bash, Korn Shell 93, Z shell). .IP \[bu] 2 -\f[C]prompt()\f[] sets up my interactive prompt (Bash, Korn Shell, Z +\f[V]prompt()\f[R] sets up my interactive prompt (Bash, Korn Shell, Z shell). .IP \[bu] 2 -\f[C]pushd()\f[] adds a default destination of \f[C]$HOME\f[] to the -\f[C]pushd\f[] builtin (Bash). +\f[V]pushd()\f[R] adds a default destination of \f[V]$HOME\f[R] to the +\f[V]pushd\f[R] builtin (Bash). .IP \[bu] 2 -\f[C]vared()\f[] allows interactively editing a variable with Readline, +\f[V]vared()\f[R] allows interactively editing a variable with Readline, emulating a Z shell function I like by the same name (Bash). .IP \[bu] 2 -\f[C]ver()\f[] prints the current shell's version information (Bash, -Korn Shell, Z shell). +\f[V]ver()\f[R] prints the current shell\[cq]s version information +(Bash, Korn Shell, Z shell). .SS Completion .PP -I find the \f[C]bash\-completion\f[] package a bit too heavy for my +I find the \f[V]bash-completion\f[R] package a bit too heavy for my tastes, and turn it off using a stub file installed in -\f[C]~/.config/bash_completion\f[]. +\f[V]\[ti]/.config/bash_completion\f[R]. The majority of the time I just want to complete paths anyway, and this makes for a quicker startup without a lot of junk functions in my Bash namespace. .PP I do make some exceptions with completions defined in files in -\f[C]~/.bash_completion.d\f[] for things I really do get tired of typing -repeatedly: +\f[V]\[ti]/.bash_completion.d\f[R] for things I really do get tired of +typing repeatedly: .IP \[bu] 2 Bash builtins: commands, help topics, shell options, variables, etc. .IP \[bu] 2 -\f[C]find(1)\f[]'s more portable options +\f[V]find(1)\f[R]\[cq]s more portable options .IP \[bu] 2 -\f[C]gpg(1)\f[] long options +\f[V]gpg(1)\f[R] long options .IP \[bu] 2 -\f[C]make(1)\f[] targets read from a \f[C]Makefile\f[] +\f[V]make(1)\f[R] targets read from a \f[V]Makefile\f[R] .IP \[bu] 2 -\f[C]man(1)\f[] page titles +\f[V]man(1)\f[R] page titles .IP \[bu] 2 -\f[C]pass(1)\f[] entries +\f[V]pass(1)\f[R] entries .IP \[bu] 2 -\f[C]ssh(1)\f[] hostnames from \f[C]~/.ssh/config\f[] +\f[V]ssh(1)\f[R] hostnames from \f[V]\[ti]/.ssh/config\f[R] .PP For commands that pretty much always want to operate on text, such as text file or stream editors, I exclude special file types and extensions I know are binary. -I don't actually read the file, so this is more of a heuristic thing, -and sometimes it will get things wrong. +I don\[cq]t actually read the file, so this is more of a heuristic +thing, and sometimes it will get things wrong. .PP I also add completions for my own scripts and functions where useful. The completions are dynamically loaded if Bash is version 4.0 or greater. -Otherwise, they're all loaded on startup. +Otherwise, they\[cq]re all loaded on startup. .SS Korn shell .PP These are experimental; they are mostly used to tinker with MirBSD -\f[C]mksh\f[], AT&T \f[C]ksh93\f[], and OpenBSD \f[C]pdksh\f[]. +\f[V]mksh\f[R], AT&T \f[V]ksh93\f[R], and OpenBSD \f[V]pdksh\f[R]. All shells in this family default to a yellow prompt if detected. .SS Z shell .PP These are experimental; I do not like Z shell much at the moment. -The files started as a joke (\f[C]exec\ bash\f[]). -\f[C]zsh\f[] shells default to having a prompt colored cyan. +The files started as a joke (\f[V]exec bash\f[R]). +\f[V]zsh\f[R] shells default to having a prompt colored cyan. .SS Mutt .PP -My mail is kept in individual Maildir\-format directories under -\f[C]~/mail\f[], with the system mail spool in e.g. -\f[C]/var/mail/tejr\f[] being where most unfiltered new mail is spooled. +My mail is kept in individual Maildir-format directories under +\f[V]\[ti]/mail\f[R], with the system mail spool in +e.g.\ \f[V]/var/mail/tejr\f[R] being where most unfiltered new mail is +spooled. I use Getmail (http://pyropus.ca/software/getmail/), maildrop (https://www.courier-mta.org/maildrop/), and msmtp (https://marlam.de/msmtp/); the configurations for these are not @@ -462,203 +472,194 @@ The GnuPG and S/MIME interfacing is done with GPGme (https://www.gnupg.org/related_software/gpgme/), rather than defining commands for each crypto operation. I wrote an article about this -setup (https://sanctum.geek.nz/arabesque/gnu-linux-crypto-email/) if it +setup (https://blog.sanctum.geek.nz/gnu-linux-crypto-email/) if it sounds appealing. .PP -You'll need Abook installed if you want to use the -\f[C]query_command\f[] I have defined, and msmtp for the -\f[C]sendmail\f[] command. -.SS rxvt\-unicode -.PP -I've butchered the URxvt Perl extensions -\f[C]selection\-to\-clipboard\f[] and \f[C]selection\f[] into a single -\f[C]select\f[] extension in \f[C]~/.urxvt/ext\f[], which is the only -extension I define in \f[C]~/.Xresources\f[]. -.PP -The included \f[C]\&.Xresources\f[] file assumes that \f[C]urxvt\f[] can -use 256 colors and Perl extensions. -If you're missing functionality, try changing \f[C]perl\-ext\-common\f[] -to \f[C]default\f[]. +You\[cq]ll need Abook installed if you want to use the +\f[V]query_command\f[R] I have defined, and msmtp for the +\f[V]sendmail\f[R] command. .SS tmux .PP -These are just generally vi\-friendly settings, and there isn't much out -of the ordinary. -Note that the configuration presently uses a hard\-coded 256\-color -color scheme, and uses non\-login shells, with an attempt to control the +These are just generally vi-friendly settings, and there isn\[cq]t much +out of the ordinary. +Note that the configuration presently uses a hard-coded 256-color color +scheme, and uses non-login shells, with an attempt to control the environment to stop shells thinking they have access to an X display. .PP -The shell scripts in \f[C]bin\f[] include \f[C]tm(1df)\f[], a shortcut -to make \f[C]attach\f[] into the default command if no arguments are +The shell scripts in \f[V]bin\f[R] include \f[V]tm(1df)\f[R], a shortcut +to make \f[V]attach\f[R] into the default command if no arguments are given and sessions do already exist. -My \f[C]~/.inputrc\f[] file binds Alt+M to run that, and Tmux in turn -binds the same key combination to detach. +My \f[V]\[ti]/.inputrc\f[R] file binds Alt+M to run that, and Tmux in +turn binds the same key combination to detach. .SS Vim .PP The majority of the Vim configuration is just setting options, with a -fair few mappings and remappings, both global and buffer\-local. -It's extensively commented. +fair few mappings and remappings, both global and buffer-local. +It\[cq]s extensively commented. .SS XDG Basedirs .PP The XDG Base Directory -Specification (https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)'s +Specification (https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)\[cq]s environment variables are checked on startup, and appropriate directories are added to the start and end of -\f[C]\[aq]runtimepath\[aq]\f[]. -I use these separate directories for machine\-local configuration, -usually in \f[C]~/.config/vim\f[], while all the files that this suite -installs land in \f[C]~/.vim\f[]. +\f[V]\[aq]runtimepath\[aq]\f[R]. +I use these separate directories for machine-local configuration, +usually in \f[V]\[ti]/.config/vim\f[R], while all the files that this +suite installs land in \f[V]\[ti]/.vim\f[R]. Backups, swap files, persistent undo data, saved views, and the -\f[C]viminfo\f[] file all live under \f[C]XDG_CACHE_HOME\f[], normally -\f[C]~/.cache/vim\f[]. +\f[V]viminfo\f[R] file all live under \f[V]XDG_CACHE_HOME\f[R], normally +\f[V]\[ti]/.cache/vim\f[R]. .SS Filetypes .PP -I define my own \f[C]filetype.vim\f[] and \f[C]scripts.vim\f[], so that -filetype detection works in a way I like, and loads quickly. +I define my own \f[V]filetype.vim\f[R] and \f[V]scripts.vim\f[R], so +that filetype detection works in a way I like, and loads quickly. They are unlikely to suit you as they are, but if you want to use it, you can extend them with your favorite filetypes in custom -\f[C]ftdetect\f[] rules. +\f[V]ftdetect\f[R] rules. .SS Plugins .PP If the logic for doing something involves more than a few lines or any -structures like functions that can be decoupled from \f[C]$MYVIMRC\f[], -I like to implement it as a plugin in \f[C]~/.vim/plugin\f[] and/or -\f[C]~/.vim/autoload\f[], with documentation for each in -\f[C]~/.vim/doc\f[]. +structures like functions that can be decoupled from \f[V]$MYVIMRC\f[R], +I like to implement it as a plugin in \f[V]\[ti]/.vim/plugin\f[R] and/or +\f[V]\[ti]/.vim/autoload\f[R], with documentation for each in +\f[V]\[ti]/.vim/doc\f[R]. .PP They eventually get either discarded if I stop using them, or spun off into their own repositories and added to this repository as submodules -under \f[C]vim/bundle\f[] if I don't. +under \f[V]vim/bundle\f[R] if I don\[cq]t. Some of them I upload to vim.org (https://www.vim.org/account/profile.php?user_id=73687). .SS Filetype plugins .PP I apply some replacement or supplementary configuration specific to file -types I often edit in \f[C]~/.vim\f[] and \f[C]~/.vim/after\f[], in the -\f[C]ftplugin\f[], \f[C]indent\f[], and \f[C]syntax\f[] subdirectories. +types I often edit in \f[V]\[ti]/.vim\f[R] and +\f[V]\[ti]/.vim/after\f[R], in the \f[V]ftplugin\f[R], \f[V]indent\f[R], +and \f[V]syntax\f[R] subdirectories. Some of these filetype plugins or extensions may also eventually be removed to be separately distributed, and installed via submodules instead. .SS Compilers .PP -I define a few of my own \f[C]:compiler\f[] scripts for -\f[C]~/.vim/compiler\f[] to check and lint appropriate filetypes. +I define a few of my own \f[V]:compiler\f[R] scripts for +\f[V]\[ti]/.vim/compiler\f[R] to check and lint appropriate filetypes. I bind checking\[em]\[lq]does it run?\[rq]\[em]and linting\[em]\[lq]is it good?\[rq]\[em]with separate local leader maps; for example, for -\f[C]perl\f[] filetypes, \f[C]<LocalLeader>c\f[] switches -\f[C]makeprg\f[] to \f[C]perl\ \-c\f[] for checking, and -\f[C]<LocalLeader>l\f[] to \f[C]perlcritic\f[] for linting. +\f[V]perl\f[R] filetypes, \f[V]<LocalLeader>c\f[R] switches +\f[V]makeprg\f[R] to \f[V]perl -c\f[R] for checking, and +\f[V]<LocalLeader>l\f[R] to \f[V]perlcritic\f[R] for linting. .SS No Neovim support .PP -The configuration doesn't explicitly support Neovim, although most of it -will probably work; you would probably just comment out the settings for -a few of the removed options. +The configuration doesn\[cq]t explicitly support Neovim, although most +of it will probably work; you would probably just comment out the +settings for a few of the removed options. .SS Scripts .PP Where practical, I make short scripts into POSIX (but not Bourne) -\f[C]sh(1)\f[], \f[C]awk(1)\f[], or \f[C]sed(1)\f[] scripts in -\f[C]~/.local/bin\f[]. +\f[V]sh(1)\f[R], \f[V]awk(1)\f[R], or \f[V]sed(1)\f[R] scripts in +\f[V]\[ti]/.local/bin\f[R]. I try to use shell functions only when I actually need to, which tends -to be when I need to change the state of the user's current shell, or to -limit a change in behavior only to interactive shells. +to be when I need to change the state of the user\[cq]s current shell, +or to limit a change in behavior only to interactive shells. .PP -These scripts are installed by the \f[C]install\-bin\f[] target: +These scripts are installed by the \f[V]install-bin\f[R] target: .IP \[bu] 2 -Three SSH\-related scripts: +Three SSH-related scripts: .RS 2 .IP \[bu] 2 -\f[C]sls(1df)\f[] prints hostnames read from a \f[C]ssh_config(5)\f[] -file. -It uses \f[C]slsf(1df)\f[] to read each one. +\f[V]sls(1df)\f[R] prints hostnames read from \f[V]ssh_config(5)\f[R] +files. +It uses \f[V]slsf(1df)\f[R] to read each one. .IP \[bu] 2 -\f[C]sra(1df)\f[] runs a command on multiple hosts read from -\f[C]sls(1df)\f[] and prints output. +\f[V]sra(1df)\f[R] runs a command on multiple hosts read from +\f[V]sls(1df)\f[R] and prints output. .IP \[bu] 2 -\f[C]sta(1df)\f[] runs a command on multiple hosts read from -\f[C]sls(1df)\f[] and prints the hostname if the command returns zero. +\f[V]sta(1df)\f[R] runs a command on multiple hosts read from +\f[V]sls(1df)\f[R] and prints the hostname if the command returns zero. .RE .IP \[bu] 2 -Five URL\-related shortcut scripts: +Five URL-related shortcut scripts: .RS 2 .IP \[bu] 2 -\f[C]hurl(1df)\f[] extracts values of \f[C]href\f[] attributes of -\f[C]<a>\f[] tags, sorts them uniquely, and writes them to -\f[C]stdout\f[]; it requires pup (https://github.com/ericchiang/pup). +\f[V]hurl(1df)\f[R] extracts values of \f[V]href\f[R] attributes of +\f[V]<a>\f[R] tags, sorts them uniquely, and writes them to +\f[V]stdout\f[R]; it requires pup (https://github.com/ericchiang/pup). .IP \[bu] 2 -\f[C]murl(1df)\f[] converts Markdown documents to HTML with -\f[C]pandoc(1)\f[] and runs the output through \f[C]hurl(1df)\f[]. +\f[V]murl(1df)\f[R] converts Markdown documents to HTML with +\f[V]pandoc(1)\f[R] and runs the output through \f[V]hurl(1df)\f[R]. .IP \[bu] 2 -\f[C]urlc(1df)\f[] accepts a list of URLs on \f[C]stdin\f[] and writes -error messages to \f[C]stderr\f[] if any of the URLs are broken, +\f[V]urlc(1df)\f[R] accepts a list of URLs on \f[V]stdin\f[R] and writes +error messages to \f[V]stderr\f[R] if any of the URLs are broken, redirecting, or are insecure and have working secure versions; requires -\f[C]curl(1)\f[]. +\f[V]curl(1)\f[R]. .IP \[bu] 2 -\f[C]urlh(1df)\f[] prints the values for a given HTTP header from a HEAD -response. +\f[V]urlh(1df)\f[R] prints the values for a given HTTP header from a +HEAD response. .IP \[bu] 2 -\f[C]urlmt(1df)\f[] prints the MIME type from the \f[C]Content\-Type\f[] -header as retrieved by \f[C]urlh(1df)\f[]. +\f[V]urlmt(1df)\f[R] prints the MIME type from the +\f[V]Content-Type\f[R] header as retrieved by \f[V]urlh(1df)\f[R]. .RE .IP \[bu] 2 -Three RFC\-related shortcut scripts: +Three RFC-related shortcut scripts: .RS 2 .IP \[bu] 2 -\f[C]rfcf(1df)\f[] fetches ASCII RFCs from the IETF website. +\f[V]rfcf(1df)\f[R] fetches ASCII RFCs from the IETF website. .IP \[bu] 2 -\f[C]rfct(1df)\f[] formats ASCII RFCs. +\f[V]rfct(1df)\f[R] formats ASCII RFCs. .IP \[bu] 2 -\f[C]rfcr(1df)\f[] does both, displaying in a pager if appropriate, like -a \f[C]man(1)\f[] reader for RFCs. +\f[V]rfcr(1df)\f[R] does both, displaying in a pager if appropriate, +like a \f[V]man(1)\f[R] reader for RFCs. .RE .IP \[bu] 2 -Five toy random\-number scripts (not for sensitive/dead\-serious use): +Five toy random-number scripts (not for sensitive/dead-serious use): .RS 2 .IP \[bu] 2 -\f[C]rndi(1df)\f[] gets a random integer within two bounds. +\f[V]rndi(1df)\f[R] gets a random integer within two bounds. .IP \[bu] 2 -\f[C]rnds(1df)\f[] attempts to get an optional random seed for -\f[C]rndi(1df)\f[]. +\f[V]rnds(1df)\f[R] attempts to get an optional random seed for +\f[V]rndi(1df)\f[R]. .IP \[bu] 2 -\f[C]rnda(1df)\f[] uses \f[C]rndi(1df)\f[] to choose a random argument. +\f[V]rnda(1df)\f[R] uses \f[V]rndi(1df)\f[R] to choose a random +argument. .IP \[bu] 2 -\f[C]rndf(1df)\f[] uses \f[C]rnda(1df)\f[] to choose a random file from -a directory. +\f[V]rndf(1df)\f[R] uses \f[V]rnda(1df)\f[R] to choose a random file +from a directory. .IP \[bu] 2 -\f[C]rndl(1df)\f[] uses \f[C]rndi(1df)\f[] to choose a random line from -files. +\f[V]rndl(1df)\f[R] uses \f[V]rndi(1df)\f[R] to choose a random line +from files. .RE .IP \[bu] 2 Four file formatting scripts: .RS 2 .IP \[bu] 2 -\f[C]d2u(1df)\f[] converts DOS line endings in files to UNIX ones. +\f[V]d2u(1df)\f[R] converts DOS line endings in files to UNIX ones. .IP \[bu] 2 -\f[C]u2d(1df)\f[] converts UNIX line endings in files to DOS ones. +\f[V]u2d(1df)\f[R] converts UNIX line endings in files to DOS ones. .IP \[bu] 2 -\f[C]stbl(1df)\f[] strips a trailing blank line from the files in its +\f[V]stbl(1df)\f[R] strips a trailing blank line from the files in its arguments. .IP \[bu] 2 -\f[C]stws(1df)\f[] strips trailing spaces from the ends of lines of the +\f[V]stws(1df)\f[R] strips trailing spaces from the ends of lines of the files in its arguments. .RE .IP \[bu] 2 Seven stream formatting scripts: .RS 2 .IP \[bu] 2 -\f[C]sd2u(1df)\f[] converts DOS line endings in streams to UNIX ones. +\f[V]sd2u(1df)\f[R] converts DOS line endings in streams to UNIX ones. .IP \[bu] 2 -\f[C]su2d(1df)\f[] converts UNIX line endings in streams to DOS ones. +\f[V]su2d(1df)\f[R] converts UNIX line endings in streams to DOS ones. .IP \[bu] 2 -\f[C]slow(1df)\f[] converts uppercase to lowercase. +\f[V]slow(1df)\f[R] converts uppercase to lowercase. .IP \[bu] 2 -\f[C]supp(1df)\f[] converts lowercase to uppercase. +\f[V]supp(1df)\f[R] converts lowercase to uppercase. .IP \[bu] 2 -\f[C]tl(1df)\f[] tags input lines with a prefix or suffix, basically a -\f[C]sed(1)\f[] shortcut. +\f[V]tl(1df)\f[R] tags input lines with a prefix or suffix, basically a +\f[V]sed(1)\f[R] shortcut. .IP \[bu] 2 -\f[C]tlcs(1df)\f[] executes a command and uses \f[C]tl(1df)\f[] to tag +\f[V]tlcs(1df)\f[R] executes a command and uses \f[V]tl(1df)\f[R] to tag standard output and standard error lines, and color them if you want. .IP \[bu] 2 -\f[C]unf(1df)\f[] joins lines with leading spaces to the previous line. +\f[V]unf(1df)\f[R] joins lines with leading spaces to the previous line. Intended for unfolding HTTP headers, but it should work for most RFC 822 formats. .RE @@ -666,383 +667,379 @@ formats. Six simple aggregate scripts for numbers: .RS 2 .IP \[bu] 2 -\f[C]max(1df)\f[] prints the maximum. +\f[V]max(1df)\f[R] prints the maximum. .IP \[bu] 2 -\f[C]mean(1df)\f[] prints the mean. +\f[V]mean(1df)\f[R] prints the mean. .IP \[bu] 2 -\f[C]med(1df)\f[] prints the median. +\f[V]med(1df)\f[R] prints the median. .IP \[bu] 2 -\f[C]min(1df)\f[] prints the minimum. +\f[V]min(1df)\f[R] prints the minimum. .IP \[bu] 2 -\f[C]mode(1df)\f[] prints the first encountered mode. +\f[V]mode(1df)\f[R] prints the first encountered mode. .IP \[bu] 2 -\f[C]tot(1df)\f[] totals the set. +\f[V]tot(1df)\f[R] totals the set. .RE .IP \[bu] 2 -Three quick\-and\-dirty HTML tools: +Three quick-and-dirty HTML tools: .RS 2 .IP \[bu] 2 -\f[C]htenc(1df)\f[] encodes. +\f[V]htenc(1df)\f[R] encodes. .IP \[bu] 2 -\f[C]htdec(1df)\f[] decodes. +\f[V]htdec(1df)\f[R] decodes. .IP \[bu] 2 -\f[C]htrec(1df)\f[] wraps \f[C]a\f[] tags around URLs. +\f[V]htrec(1df)\f[R] wraps \f[V]a\f[R] tags around URLs. .RE .IP \[bu] 2 Two internet message quoting tools: .RS 2 .IP \[bu] 2 -\f[C]quo(1df)\f[] indents with quoting right angle\-brackets. +\f[V]quo(1df)\f[R] indents with quoting right angle-brackets. .IP \[bu] 2 -\f[C]wro(1df)\f[] adds a quote attribution header to its input. +\f[V]wro(1df)\f[R] adds a quote attribution header to its input. .RE .IP \[bu] 2 -Six Git\-related tools: +Six Git-related tools: .RS 2 .IP \[bu] 2 -\f[C]fgscr(1df)\f[] finds Git repositories in a directory root and -scrubs them with \f[C]gscr(1df)\f[]. +\f[V]fgscr(1df)\f[R] finds Git repositories in a directory root and +scrubs them with \f[V]gscr(1df)\f[R]. .IP \[bu] 2 -\f[C]grc(1df)\f[] quietly tests whether the given directory appears to +\f[V]grc(1df)\f[R] quietly tests whether the given directory appears to be a Git repository with pending changes. .IP \[bu] 2 -\f[C]gscr(1df)\f[] scrubs Git repositories. +\f[V]gscr(1df)\f[R] scrubs Git repositories. .IP \[bu] 2 -\f[C]isgr(1df)\f[] quietly tests whether the given directory appears to +\f[V]isgr(1df)\f[R] quietly tests whether the given directory appears to be a Git repository. .IP \[bu] 2 -\f[C]jfc(1df)\f[] adds and commits lazily to a Git repository. +\f[V]jfc(1df)\f[R] adds and commits lazily to a Git repository. .IP \[bu] 2 -\f[C]jfcd(1df)\f[] watches a directory for changes and runs -\f[C]jfc(1df)\f[] if it sees any. +\f[V]jfcd(1df)\f[R] watches a directory for changes and runs +\f[V]jfc(1df)\f[R] if it sees any. .RE .IP \[bu] 2 Two time duration functions: .RS 2 .IP \[bu] 2 -\f[C]hms(1df)\f[] converts seconds to \f[C]hh:mm:ss\f[] or -\f[C]mm:ss\f[] timestamps. +\f[V]hms(1df)\f[R] converts seconds to \f[V]hh:mm:ss\f[R] or +\f[V]mm:ss\f[R] timestamps. .IP \[bu] 2 -\f[C]sec(1df)\f[] converts \f[C]hh:mm:ss\f[] or \f[C]mm:ss\f[] +\f[V]sec(1df)\f[R] converts \f[V]hh:mm:ss\f[R] or \f[V]mm:ss\f[R] timestamps to seconds. .RE .IP \[bu] 2 Three pipe interaction tools: .RS 2 .IP \[bu] 2 -\f[C]pst(1df)\f[] runs an interactive program on data before passing it +\f[V]pst(1df)\f[R] runs an interactive program on data before passing it along a pipeline. .IP \[bu] 2 -\f[C]ped(1df)\f[] runs \f[C]pst(1df)\f[] with \f[C]$EDITOR\f[] or -\f[C]ed(1)\f[]. +\f[V]ped(1df)\f[R] runs \f[V]pst(1df)\f[R] with \f[V]$EDITOR\f[R] or +\f[V]ed(1)\f[R]. .IP \[bu] 2 -\f[C]pvi(1df)\f[] runs \f[C]pvi(1df)\f[] with \f[C]$VISUAL\f[] or -\f[C]vi(1)\f[]. +\f[V]pvi(1df)\f[R] runs \f[V]pvi(1df)\f[R] with \f[V]$VISUAL\f[R] or +\f[V]vi(1)\f[R]. .RE .IP \[bu] 2 Two editor wrapper tools: .RS 2 .IP \[bu] 2 -\f[C]mked(1df)\f[] creates paths to all its arguments before invoking -\f[C]$EDITOR\f[]. +\f[V]mked(1df)\f[R] creates paths to all its arguments before invoking +\f[V]$EDITOR\f[R]. .IP \[bu] 2 -\f[C]mkvi(1df)\f[] creates paths to all its arguments before invoking -\f[C]$VISUAL\f[]. +\f[V]mkvi(1df)\f[R] creates paths to all its arguments before invoking +\f[V]$VISUAL\f[R]. .RE .IP \[bu] 2 -\f[C]ap(1df)\f[] reads arguments for a given command from the standard +\f[V]ap(1df)\f[R] reads arguments for a given command from the standard input, prompting if appropriate. .IP \[bu] 2 -\f[C]apf(1df)\f[] inserts arguments to a command with ones read from a +\f[V]apf(1df)\f[R] inserts arguments to a command with ones read from a file, intended as a framework for shell wrappers or functions. .IP \[bu] 2 -\f[C]ax(1df)\f[] evaluates an AWK expression given on the command line; +\f[V]ax(1df)\f[R] evaluates an AWK expression given on the command line; this is intended as a quick way to test how AWK would interpret a given expression. .IP \[bu] 2 -\f[C]bcq(1df)\f[] runs \f[C]bc(1)\f[], quieting it down if need be. +\f[V]bcq(1df)\f[R] runs \f[V]bc(1)\f[R], quieting it down if need be. .IP \[bu] 2 -\f[C]bel(1df)\f[] prints a terminal bell character. +\f[V]bel(1df)\f[R] prints a terminal bell character. .IP \[bu] 2 -\f[C]bl(1df)\f[] generates a given number of blank lines. +\f[V]bl(1df)\f[R] generates a given number of blank lines. .IP \[bu] 2 -\f[C]bp(1df)\f[] runs \f[C]br(1df)\f[] after prompting for an URL. +\f[V]bp(1df)\f[R] runs \f[V]br(1df)\f[R] after prompting for an URL. .IP \[bu] 2 -\f[C]br(1df)\f[] launches \f[C]$BROWSER\f[]. +\f[V]br(1df)\f[R] launches \f[V]$BROWSER\f[R]. .IP \[bu] 2 -\f[C]ca(1df)\f[] prints a count of its given arguments. +\f[V]ca(1df)\f[R] prints a count of its given arguments. .IP \[bu] 2 -\f[C]cf(1df)\f[] prints a count of entries in a given directory. +\f[V]cf(1df)\f[R] prints a count of entries in a given directory. .IP \[bu] 2 -\f[C]cfr(1df)\f[] does the same as \f[C]cf(1df)\f[], but recurses into +\f[V]cfr(1df)\f[R] does the same as \f[V]cf(1df)\f[R], but recurses into subdirectories as well. .IP \[bu] 2 -\f[C]chc(1df)\f[] caches the output of a command. +\f[V]chc(1df)\f[R] caches the output of a command. .IP \[bu] 2 -\f[C]chn(1df)\f[] runs a filter over its input a given number of times. +\f[V]chn(1df)\f[R] runs a filter over its input a given number of times. .IP \[bu] 2 -\f[C]clog(1df)\f[] is a tiny timestamped log system. +\f[V]clog(1df)\f[R] is a tiny timestamped log system. .IP \[bu] 2 -\f[C]clrd(1df)\f[] sets up a per\-line file read, clearing the screen +\f[V]clrd(1df)\f[R] sets up a per-line file read, clearing the screen first. .IP \[bu] 2 -\f[C]clwr(1df)\f[] sets up a per\-line file write, clearing the screen +\f[V]clwr(1df)\f[R] sets up a per-line file write, clearing the screen before each line. .IP \[bu] 2 -\f[C]csmw(1df)\f[] prints an English list of monospace\-quoted words +\f[V]csmw(1df)\f[R] prints an English list of monospace-quoted words read from the input. .IP \[bu] 2 -\f[C]dam(1df)\f[] buffers all its input before emitting it as output. +\f[V]dam(1df)\f[R] buffers all its input before emitting it as output. .IP \[bu] 2 -\f[C]ddup(1df)\f[] removes duplicate lines from unsorted input. +\f[V]ddup(1df)\f[R] removes duplicate lines from unsorted input. .IP \[bu] 2 -\f[C]defang(1df)\f[] prevents dangerous URLs from being made into +\f[V]defang(1df)\f[R] prevents dangerous URLs from being made into clickable links. .IP \[bu] 2 -\f[C]dmp(1df)\f[] copies a pass(1) entry selected by \f[C]dmenu(1)\f[] -to the X CLIPBOARD. +\f[V]dub(1df)\f[R] lists the biggest entries in a directory. .IP \[bu] 2 -\f[C]dub(1df)\f[] lists the biggest entries in a directory. +\f[V]edda(1df)\f[R] provides a means to run \f[V]ed(1)\f[R] over a set +of files preserving any options, mostly useful for scripts. .IP \[bu] 2 -\f[C]edda(1df)\f[] provides a means to run \f[C]ed(1)\f[] over a set of -files preserving any options, mostly useful for scripts. +\f[V]eds(1df)\f[R] edits executable script files in \f[V]EDSPATH\f[R], +defaulting to \f[V]\[ti]/.local/bin\f[R], for personal scripting +snippets. .IP \[bu] 2 -\f[C]eds(1df)\f[] edits executable script files in \f[C]EDSPATH\f[], -defaulting to \f[C]~/.local/bin\f[], for personal scripting snippets. +\f[V]exm(1df)\f[R] works around a screen-clearing quirk of Vim\[cq]s +\f[V]ex\f[R] mode. .IP \[bu] 2 -\f[C]exm(1df)\f[] works around a screen\-clearing quirk of Vim's -\f[C]ex\f[] mode. +\f[V]finc(1df)\f[R] counts the number of results returned from a set of +given \f[V]find(1)\f[R] conditions. .IP \[bu] 2 -\f[C]finc(1df)\f[] counts the number of results returned from a set of -given \f[C]find(1)\f[] conditions. -.IP \[bu] 2 -\f[C]fnl(1df)\f[] runs a command and saves its output and error into +\f[V]fnl(1df)\f[R] runs a command and saves its output and error into temporary files, printing their paths and line counts. .IP \[bu] 2 -\f[C]fnp(1df)\f[] prints the given files to standard output, each with a -plain text heading with the filename in it. +\f[V]fnp(1df)\f[R] prints the given files to standard output, each with +a plain text heading with the filename in it. .IP \[bu] 2 -\f[C]gms(1df)\f[] runs a set of \f[C]getmailrc\f[] files; does much the -same thing as the script \f[C]getmails\f[] in the \f[C]getmail\f[] +\f[V]gms(1df)\f[R] runs a set of \f[V]getmailrc\f[R] files; does much +the same thing as the script \f[V]getmails\f[R] in the \f[V]getmail\f[R] suite, but runs the requests in parallel and does up to three silent -retries using \f[C]try(1df)\f[]. +retries using \f[V]try(1df)\f[R]. .IP \[bu] 2 -\f[C]grec(1df)\f[] is a more logically\-named \f[C]grep\ \-c\f[]. +\f[V]grec(1df)\f[R] is a more logically-named \f[V]grep -c\f[R]. .IP \[bu] 2 -\f[C]gred(1df)\f[] is a more logically\-named \f[C]grep\ \-v\f[]. +\f[V]gred(1df)\f[R] is a more logically-named \f[V]grep -v\f[R]. .IP \[bu] 2 -\f[C]gwp(1df)\f[] searches for alphanumeric words in a similar way to -\f[C]grep(1)\f[]. +\f[V]gwp(1df)\f[R] searches for alphanumeric words in a similar way to +\f[V]grep(1)\f[R]. .IP \[bu] 2 -\f[C]han(1df)\f[] provides a \f[C]keywordprg\f[] for Vim's Bash script -file type that will look for \f[C]help\f[] topics. +\f[V]han(1df)\f[R] provides a \f[V]keywordprg\f[R] for Vim\[cq]s Bash +script file type that will look for \f[V]help\f[R] topics. You could use it from the shell too. .IP \[bu] 2 -\f[C]igex(1df)\f[] wraps around a command to allow you to ignore error -conditions that don't actually worry you, exiting with 0 anyway. +\f[V]igex(1df)\f[R] wraps around a command to allow you to ignore error +conditions that don\[cq]t actually worry you, exiting with 0 anyway. .IP \[bu] 2 -\f[C]ix(1df)\f[] posts its input to the \f[C]ix.io\f[] pastebin. +\f[V]ix(1df)\f[R] posts its input to the \f[V]ix.io\f[R] pastebin. .IP \[bu] 2 -\f[C]jfp(1df)\f[] prints its input, excluding any shebang on the first +\f[V]jfp(1df)\f[R] prints its input, excluding any shebang on the first line only. .IP \[bu] 2 -\f[C]loc(1df)\f[] is a quick\-search wrapped around \f[C]find(1)\f[]. +\f[V]loc(1df)\f[R] is a quick-search wrapped around \f[V]find(1)\f[R]. .IP \[bu] 2 -\f[C]maybe(1df)\f[] is like \f[C]true(1)\f[] or \f[C]false(1)\f[]; given -a probability of success, it exits with success or failure. +\f[V]maybe(1df)\f[R] is like \f[V]true(1)\f[R] or \f[V]false(1)\f[R]; +given a probability of success, it exits with success or failure. Good for quick tests. .IP \[bu] 2 -\f[C]mex(1df)\f[] makes given filenames in \f[C]$PATH\f[] executable. +\f[V]mex(1df)\f[R] makes given filenames in \f[V]$PATH\f[R] executable. .IP \[bu] 2 -\f[C]mi5(1df)\f[] is a crude preprocessor for \f[C]m4\f[]. +\f[V]mi5(1df)\f[R] is a crude preprocessor for \f[V]m4\f[R]. .IP \[bu] 2 -\f[C]mim(1df)\f[] starts an interactive Mutt message with its input. +\f[V]mim(1df)\f[R] starts an interactive Mutt message with its input. .IP \[bu] 2 -\f[C]mftl(1df)\f[] finds usable\-looking targets in Makefiles. +\f[V]mftl(1df)\f[R] finds usable-looking targets in Makefiles. .IP \[bu] 2 -\f[C]mkcp(1df)\f[] creates a directory and copies preceding arguments +\f[V]mkcp(1df)\f[R] creates a directory and copies preceding arguments into it. .IP \[bu] 2 -\f[C]mkmv(1df)\f[] creates a directory and moves preceding arguments +\f[V]mkmv(1df)\f[R] creates a directory and moves preceding arguments into it. .IP \[bu] 2 -\f[C]motd(1df)\f[] shows the system MOTD. +\f[V]motd(1df)\f[R] shows the system MOTD. .IP \[bu] 2 -\f[C]msc(1df)\f[] crudely counts messages in an mbox. +\f[V]msc(1df)\f[R] crudely counts messages in an mbox. .IP \[bu] 2 -\f[C]mw(1df)\f[] prints alphabetic space\-delimited words from the input +\f[V]mw(1df)\f[R] prints alphabetic space-delimited words from the input one per line. .IP \[bu] 2 -\f[C]oii(1df)\f[] runs a command on input only if there is any. +\f[V]oii(1df)\f[R] runs a command on input only if there is any. .IP \[bu] 2 -\f[C]onl(1df)\f[] crunches input down to one printable line. +\f[V]onl(1df)\f[R] crunches input down to one printable line. .IP \[bu] 2 -\f[C]osc(1df)\f[] implements a \f[C]netcat(1)\f[]\-like wrapper for -\f[C]openssl(1)\f[]'s \f[C]s_client\f[] sub\-command. +\f[V]osc(1df)\f[R] implements a \f[V]netcat(1)\f[R]-like wrapper for +\f[V]openssl(1)\f[R]\[cq]s \f[V]s_client\f[R] sub-command. .IP \[bu] 2 -\f[C]p(1df)\f[] prints concatenated standard input; \f[C]cat(1)\f[] as +\f[V]p(1df)\f[R] prints concatenated standard input; \f[V]cat(1)\f[R] as it should always have been. .IP \[bu] 2 -\f[C]pa(1df)\f[] prints its arguments, one per line. +\f[V]pa(1df)\f[R] prints its arguments, one per line. .IP \[bu] 2 -\f[C]phpcsff(1df)\f[] wraps around -PHP\-CS\-Fixer (https://github.com/FriendsOfPHP/PHP-CS-Fixer) to make it -a source code filter suitable for use as an \f[C]equalprg\f[] in Vim. +\f[V]phpcsff(1df)\f[R] wraps around +PHP-CS-Fixer (https://github.com/FriendsOfPHP/PHP-CS-Fixer) to make it a +source code filter suitable for use as an \f[V]equalprg\f[R] in Vim. .IP \[bu] 2 -\f[C]pp(1df)\f[] prints the full path of each argument using -\f[C]$PWD\f[]. +\f[V]pp(1df)\f[R] prints the full path of each argument using +\f[V]$PWD\f[R]. .IP \[bu] 2 -\f[C]pph(1df)\f[] runs \f[C]pp(1df)\f[] and includes a leading -\f[C]$HOSTNAME:\f[]. +\f[V]pph(1df)\f[R] runs \f[V]pp(1df)\f[R] and includes a leading +\f[V]$HOSTNAME:\f[R]. .IP \[bu] 2 -\f[C]paz(1df)\f[] print its arguments terminated by NULL chars. +\f[V]paz(1df)\f[R] print its arguments terminated by NULL chars. .IP \[bu] 2 -\f[C]pit(1df)\f[] runs its input through a pager if its standard output +\f[V]pit(1df)\f[R] runs its input through a pager if its standard output looks like a terminal. .IP \[bu] 2 -\f[C]pwg(1df)\f[] generates just one decent password with -\f[C]pwgen(1)\f[]. +\f[V]pwg(1df)\f[R] generates just one decent password with +\f[V]pwgen(1)\f[R]. .IP \[bu] 2 -\f[C]qat(1df)\f[] disables \f[C]stty\ echo\f[] for the duration of a +\f[V]qat(1df)\f[R] disables \f[V]stty echo\f[R] for the duration of a paste. .IP \[bu] 2 -\f[C]rep(1df)\f[] repeats a command a given number of times. +\f[V]rep(1df)\f[R] repeats a command a given number of times. .IP \[bu] 2 -\f[C]rgl(1df)\f[] is a very crude interactive \f[C]grep(1)\f[] loop. +\f[V]rgl(1df)\f[R] is a very crude interactive \f[V]grep(1)\f[R] loop. .IP \[bu] 2 -\f[C]shb(1df)\f[] attempts to build shebang lines for scripts from the +\f[V]shb(1df)\f[R] attempts to build shebang lines for scripts from the system paths. .IP \[bu] 2 -\f[C]sqs(1df)\f[] chops off query strings from filenames, usually +\f[V]sqs(1df)\f[R] chops off query strings from filenames, usually downloads. .IP \[bu] 2 -\f[C]sshi(1df)\f[] prints human\-readable SSH connection details. +\f[V]sshi(1df)\f[R] prints human-readable SSH connection details. .IP \[bu] 2 -\f[C]stex(1df)\f[] strips extensions from filenames. +\f[V]stex(1df)\f[R] strips extensions from filenames. .IP \[bu] 2 -\f[C]sue(8df)\f[] execs \f[C]sudoedit(8)\f[] as the owner of all the +\f[V]sue(8df)\f[R] execs \f[V]sudoedit(8)\f[R] as the owner of all the file arguments given, perhaps in cases where you may not necessarily -have \f[C]root\f[] \f[C]sudo(8)\f[] privileges. +have \f[V]root\f[R] \f[V]sudo(8)\f[R] privileges. .IP \[bu] 2 -\f[C]swr(1df)\f[] allows you to run commands locally specifying remote -files in \f[C]scp(1)\f[]'s HOST:PATH format. +\f[V]swr(1df)\f[R] allows you to run commands locally specifying remote +files in \f[V]scp(1)\f[R]\[cq]s HOST:PATH format. .IP \[bu] 2 -\f[C]td(1df)\f[] manages a to\-do file for you with \f[C]$EDITOR\f[] and -\f[C]git(1)\f[]; I used to use Taskwarrior, but found it too complex and -buggy. +\f[V]td(1df)\f[R] manages a to-do file for you with \f[V]$EDITOR\f[R] +and \f[V]git(1)\f[R]; I used to use Taskwarrior, but found it too +complex and buggy. .IP \[bu] 2 -\f[C]tm(1df)\f[] runs \f[C]tmux(1)\f[] with -\f[C]attach\-session\ \-d\f[] if a session exists, and -\f[C]new\-session\f[] if it doesn't. +\f[V]tm(1df)\f[R] runs \f[V]tmux(1)\f[R] with +\f[V]attach-session -d\f[R] if a session exists, and +\f[V]new-session\f[R] if it doesn\[cq]t. .IP \[bu] 2 -\f[C]trs(1df)\f[] replaces strings (not regular expression) in its +\f[V]trs(1df)\f[R] replaces strings (not regular expression) in its input. .IP \[bu] 2 -\f[C]try(1df)\f[] repeats a command up to a given number of times until +\f[V]try(1df)\f[R] repeats a command up to a given number of times until it succeeds, only printing error output if all three attempts failed. -Good for tolerating blips or temporary failures in \f[C]cron(8)\f[] +Good for tolerating blips or temporary failures in \f[V]cron(8)\f[R] scripts. .IP \[bu] 2 -\f[C]umake(1df)\f[] iterates upwards through the directory tree from -\f[C]$PWD\f[] until it finds a Makefile for which to run -\f[C]make(1)\f[] with the given arguments. +\f[V]umake(1df)\f[R] iterates upwards through the directory tree from +\f[V]$PWD\f[R] until it finds a Makefile for which to run +\f[V]make(1)\f[R] with the given arguments. .IP \[bu] 2 -\f[C]uts(1df)\f[] gets the current UNIX timestamp in an unorthodox way -that should work on all POSIX\-compliant operating systems. +\f[V]uts(1df)\f[R] gets the current UNIX timestamp in an unorthodox way +that should work on all POSIX-compliant operating systems. .IP \[bu] 2 -\f[C]vest(1df)\f[] runs \f[C]test(1)\f[] but fails with explicit output -via \f[C]vex(1df)\f[]. +\f[V]vest(1df)\f[R] runs \f[V]test(1)\f[R] but fails with explicit +output via \f[V]vex(1df)\f[R]. .IP \[bu] 2 -\f[C]vex(1df)\f[] runs a command and prints \f[C]true\f[] or -\f[C]false\f[] explicitly to \f[C]stdout\f[] based on the exit value. +\f[V]vex(1df)\f[R] runs a command and prints \f[V]true\f[R] or +\f[V]false\f[R] explicitly to \f[V]stdout\f[R] based on the exit value. .IP \[bu] 2 -\f[C]vic(1df)\f[] tries to run a POSIX\-compliant \f[C]vi(1)\f[]. +\f[V]vic(1df)\f[R] tries to run a POSIX-compliant \f[V]vi(1)\f[R]. .IP \[bu] 2 -\f[C]xrbg(1df)\f[] applies the same randomly\-selected background to +\f[V]xrbg(1df)\f[R] applies the same randomly-selected background to each X screen. .IP \[bu] 2 -\f[C]xrq(1df)\f[] gets the values of specific resources out of -\f[C]xrdb\ \-query\f[] output. +\f[V]xrq(1df)\f[R] gets the values of specific resources out of +\f[V]xrdb -query\f[R] output. .PP -There's some silly stuff in \f[C]install\-games\f[]: +There\[cq]s some silly stuff in \f[V]install-games\f[R]: .IP \[bu] 2 -\f[C]aaf(6df)\f[] gets a random ASCII Art +\f[V]aaf(6df)\f[R] gets a random ASCII Art Farts (http://www.asciiartfarts.com/) comic. .IP \[bu] 2 -\f[C]acq(6df)\f[] allows you to interrogate AC, the interplanetary +\f[V]acq(6df)\f[R] allows you to interrogate AC, the interplanetary computer. .IP \[bu] 2 -\f[C]aesth(6df)\f[] converts English letters to their full width CJK -analogues, for aesthetic purposes. +\f[V]aesth(6df)\f[R] converts English letters to their full width CJK +analogues, for +\[uFF41]\[uFF45]\[uFF53]\[uFF54]\[uFF48]\[uFF45]\[uFF54]\[uFF49]\[uFF43] +purposes. .IP \[bu] 2 -\f[C]squ(6df)\f[] makes a reduced Latin square out of each line of +\f[V]squ(6df)\f[R] makes a reduced Latin square out of each line of input. .IP \[bu] 2 -\f[C]kvlt(6df)\f[] translates input to emulate a style of typing unique +\f[V]kvlt(6df)\f[R] translates input to emulate a style of typing unique to black metal communities on the internet. .IP \[bu] 2 -\f[C]philsay(6df)\f[] shows a picture to accompany \f[C]pks(6df)\f[] +\f[V]philsay(6df)\f[R] shows a picture to accompany \f[V]pks(6df)\f[R] output. .IP \[bu] 2 -\f[C]pks(6df)\f[] laughs at a randomly selected word. +\f[V]pks(6df)\f[R] laughs at a randomly selected word. .IP \[bu] 2 -\f[C]rndn(6df)\f[] implements an esoteric random number generation +\f[V]rndn(6df)\f[R] implements an esoteric random number generation algorithm. .IP \[bu] 2 -\f[C]strik(6df)\f[] outputs s̶t̶r̶i̶k̶e̶d̶ ̶o̶u̶t̶ struck out text. +\f[V]strik(6df)\f[R] outputs +s\[u0336]t\[u0336]r\[u0336]i\[u0336]k\[u0336]e\[u0336]d\[u0336] +\[u0336]o\[u0336]u\[u0336]t\[u0336] struck out text. .IP \[bu] 2 -\f[C]rot13(6df)\f[] rotates the Latin letters in its input. +\f[V]rot13(6df)\f[R] rotates the Latin letters in its input. .IP \[bu] 2 -\f[C]uuu(6df)\f[] uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu. +\f[V]uuu(6df)\f[R] uuuuu uuuu uu uuuuuu uuuuuuu u uuu uuuuu. .IP \[bu] 2 -\f[C]xyzzy(6df)\f[] teleports to a marked location on the filesystem. +\f[V]xyzzy(6df)\f[R] teleports to a marked location on the filesystem. .IP \[bu] 2 -\f[C]zs(6df)\f[] prefixes \[lq]z\[rq] case\-appropriately to every +\f[V]zs(6df)\f[R] prefixes \[lq]z\[rq] case-appropriately to every occurrence of \[lq]s\[rq] in the text on its standard input. .SS Manuals .PP -The \f[C]install\-bin\f[] and \f[C]install\-games\f[] targets install +The \f[V]install-bin\f[R] and \f[V]install-games\f[R] targets install manuals for each script. If you want to read the manuals, you may need to add -\f[C]~/.local/share/man\f[] to your \f[C]~/.manpath\f[] or -\f[C]/etc/manpath\f[] configuration, depending on your system. +\f[V]\[ti]/.local/share/man\f[R] to your \f[V]\[ti]/.manpath\f[R] or +\f[V]/etc/manpath\f[R] configuration, depending on your system. .SS Testing .PP You can check that both sets of shell scripts are syntactically correct -with \f[C]make\ check\-bash\f[] or \f[C]make\ check\-sh\f[], or -\f[C]make\ check\f[] for everything including the scripts in -\f[C]bin\f[] and \f[C]games\f[]. -There's no proper test suite for the actual functionality (yet). +with \f[V]make check-bash\f[R] or \f[V]make check-sh\f[R], or +\f[V]make check\f[R] for everything including the scripts in +\f[V]bin\f[R] and \f[V]games\f[R]. +There\[cq]s no proper test suite for the actual functionality (yet). .PP -There are also optional \f[C]lint\f[] targets, if you have the +There are also optional \f[V]lint\f[R] targets, if you have the appropriate tools available to run them: .IP \[bu] 2 ShellCheck (https://www.shellcheck.net/): .RS 2 .IP \[bu] 2 -\f[C]lint\-bash\f[] -.IP \[bu] 2 -\f[C]lint\-bin\f[] +\f[V]lint-bash\f[R] .IP \[bu] 2 -\f[C]lint\-games\f[] +\f[V]lint-bin\f[R] .IP \[bu] 2 -\f[C]lint\-ksh\f[] +\f[V]lint-games\f[R] .IP \[bu] 2 -\f[C]lint\-sh\f[] +\f[V]lint-ksh\f[R] .IP \[bu] 2 -\f[C]lint\-xinit\f[] -.RE -.IP \[bu] 2 -Perl::Critic: -.RS 2 +\f[V]lint-sh\f[R] .IP \[bu] 2 -\f[C]lint\-urxvt\f[] +\f[V]lint-x\f[R] .RE .IP \[bu] 2 Vint (https://github.com/Kuniwak/vint): .RS 2 .IP \[bu] 2 -\f[C]lint\-vim\f[] +\f[V]lint-vim\f[R] .RE .SS Future development .PP @@ -1052,11 +1049,12 @@ See IDEAS.md. See ISSUES.md. .SS License .PP -Public domain; see the included \f[C]UNLICENSE\f[] file. -It's just configuration and simple scripts, so do whatever you like with -it if any of it's useful to you. -If you're feeling generous, please join and/or donate to a free software -advocacy group, and let me know you did it because of this project: +Public domain; see the included \f[V]UNLICENSE\f[R] file. +It\[cq]s just configuration and simple scripts, so do whatever you like +with it if any of it\[cq]s useful to you. +If you\[cq]re feeling generous, please join and/or donate to a free +software advocacy group, and let me know you did it because of this +project: .IP \[bu] 2 Free Software Foundation (https://www.fsf.org/) .IP \[bu] 2 diff --git a/mpd/mpdconf b/mpd/mpdconf deleted file mode 100644 index 8dd88810..00000000 --- a/mpd/mpdconf +++ /dev/null @@ -1,15 +0,0 @@ -bind_to_address "~/.mpd/socket" - -db_file "~/.mpd/database" -log_file "~/.mpd/log" - -music_directory "/mnt/media/shares/music" -playlist_directory "~/.mpd/playlists" -pid_file "~/.mpd/pid" -state_file "~/.mpd/state" -sticker_file "~/.mpd/sticker.sql" - -audio_output { - type "pulse" - name "PulseAudio" -} diff --git a/mpd/profile.d/mpd.sh b/mpd/profile.d/mpd.sh deleted file mode 100644 index 5a14aef2..00000000 --- a/mpd/profile.d/mpd.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Start an mpd process if one isn't already running -command -v mpd >/dev/null 2>&1 || return -[ -s "$HOME"/.mpd/pid ] || mpd diff --git a/mpv/mpv.conf b/mpv/mpv.conf index 5a2a05c4..553d73b7 100644 --- a/mpv/mpv.conf +++ b/mpv/mpv.conf @@ -1,2 +1,34 @@ # Don't try to show me album covers when I play FLAC no-audio-display + +# Use yt-dlp instead of youtube-dl, as the latter project appears to have been +# abandonded for some time as at 2022-05-08. +# +# * <https://github.com/ytdl-org/youtube-dl/issues/29965> +# * <https://web.archive.org/web/20220212025407/https://github.com/ytdl-org/youtube-dl/issues/29965> +# +script-opts-append="ytdl_hook-ytdl_path=yt-dlp" + +# Save screenshot images into XDG-respecting location +screenshot-directory="~/.local/share/mpv/screenshots" + +# Use PNG (lossless) for screenshots rather than the default JPEG +screenshot-format="png" + +# Keep the screenshots in directories named after the media file, with the +# screenshot filename including the media filename, the timestamp within it, +# and a numeric suffix to guarantee uniqueness. Full paths look like this: +# +# ~/.local/share/mpv/screenshots/Red Dwarf S01E01.mkv/mpv_Red Dwarf S01E01.mkv_00:08:20.461_0001.png +# +screenshot-template="%f/mpv_%f_%P_%04n" + +# Don't try to find external subtitles for me; I'll specify if I want them. +sub-auto=no + +# Get somewhat lower-resolution (<=640kps), lower-bitrate (<=500kbps) videos, +# so that they come down quicker and slower systems are less likely to stutter +# while playing them at busy times; if I want archival quality, I'll just +# invoke yt-dlp directly. +# +ytdl-format="[height<=?640][tbr<=?500]" diff --git a/mutt/muttrc b/mutt/muttrc index 504ce9a9..aba87363 100644 --- a/mutt/muttrc +++ b/mutt/muttrc @@ -23,7 +23,8 @@ set alias_file \ source $alias_file # Don't send terminal bells on errors, but do send them when new mail arrives, -# because that should light up my tmux window label and/or urxvt window. +# because that should light up either my terminal emulator window or my tmux +# window label. # unset beep set beep_new @@ -47,8 +48,8 @@ set header_cache \ # I really want is to be able to run the same commands again even after I quit # Mutt. We can afford to keep 2^8 of these, since it's the future and all. # -set history_file = \ - ~/.cache/mutt/history +set history_file \ + = ~/.cache/mutt/history set history = 256 set save_history = $history @@ -64,8 +65,8 @@ set index_format = '%4C %Z %{%b %d %Y} %-15.15L (%?l?%4l&%4c?) %?H?[%H] ?%s' # Set a custom mailcap, rather than leaning on the system's # -set mailcap_path = \ - ~/.config/mutt/mailcap +set mailcap_path \ + = ~/.config/mutt/mailcap # When displaying messages with multiple alternatives for display, prefer any # plain text one, but failing that, fall back to enriched text (hey, it could diff --git a/mutt/muttrc.d/src b/mutt/muttrc.d/src.sh index 47cb2df1..60e0c566 100755..100644 --- a/mutt/muttrc.d/src +++ b/mutt/muttrc.d/src.sh @@ -1,5 +1,3 @@ -#!/bin/sh - # Build groups from address lists for rc in "$HOME"/.config/mutt/muttrc.d/groups/*.list ; do [ -e "$rc" ] || continue diff --git a/ncmpcpp/config b/ncmpcpp/config index 7e865a8f..48f5137a 100644 --- a/ncmpcpp/config +++ b/ncmpcpp/config @@ -1,8 +1 @@ -# Configuration directory -ncmpcpp_directory = "~/.ncmpcpp" - -# Server specifics -mpd_host = "~/.mpd/socket" - -# No mouse, it confuses tmux/urxvt, and I never use it anyway -mouse_support = "no" +enable_window_title = no diff --git a/newsboat/systemd/user/newsboat.service b/newsboat/systemd/user/newsboat.service new file mode 100644 index 00000000..020ba328 --- /dev/null +++ b/newsboat/systemd/user/newsboat.service @@ -0,0 +1,10 @@ +[Unit] +Description=Newsboat news reader + +[Service] +Environment=TERM=screen-256color +ExecStart=/usr/bin/dtach -N %t/newsboat.socket /usr/bin/newsboat --log-file=%L/newsboat/%p.log --log-level=2 +Restart=always + +[Install] +WantedBy=default.target diff --git a/newsboat/systemd/user/reload-newsboat.service b/newsboat/systemd/user/reload-newsboat.service deleted file mode 100644 index f495e67b..00000000 --- a/newsboat/systemd/user/reload-newsboat.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=fetch new Newsboat articles -OnFailure=notify-email@%n -ConditionPathExists=!%h/.local/share/newsboat/cache.db.lock - -[Service] -Type=oneshot -LogsDirectory=newsboat -LogsDirectoryMode=0700 -ExecStart=newsboat --execute=reload --log-file=%L/newsboat/%p.log --log-level=5 -TimeoutStartSec=5m diff --git a/newsboat/systemd/user/reload-newsboat.timer b/newsboat/systemd/user/reload-newsboat.timer deleted file mode 100644 index c3c0cb00..00000000 --- a/newsboat/systemd/user/reload-newsboat.timer +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=fetch new Newsboat articles schedule - -[Timer] -OnBootSec=10m -OnUnitActiveSec=10m -RandomizedDelaySec=2m - -[Install] -WantedBy=timers.target diff --git a/parcellite/parcelliterc b/parcellite/parcelliterc new file mode 100644 index 00000000..fad0493e --- /dev/null +++ b/parcellite/parcelliterc @@ -0,0 +1,41 @@ +[rc] +RCVersion=1 +use_copy=true +use_primary=true +synchronize=false +save_history=true +history_pos=false +history_x=1 +history_y=1 +history_limit=64 +data_size=0 +item_size=8 +automatic_paste=false +auto_key=false +auto_mouse=true +key_input=false +restore_empty=true +rc_edit=false +type_search=false +case_search=false +ignore_whiteonly=false +trim_wspace_begend=false +trim_newline=false +hyperlinks_only=false +confirm_clear=true +current_on_top=true +single_line=true +reverse_history=true +item_length=50 +persistent_history=false +persistent_separate=false +persistent_on_top=false +persistent_delim=\\n +nonprint_disp=false +ellipsize=2 +multi_user=true +icon_name=parcellite +menu_key= +history_key= +phistory_key= +actions_key= diff --git a/parcellite/xsession.d/parcellite.sh b/parcellite/xsession.d/parcellite.sh new file mode 100644 index 00000000..39fb6c4e --- /dev/null +++ b/parcellite/xsession.d/parcellite.sh @@ -0,0 +1,2 @@ +# Start X clipboard manager +parcellite & diff --git a/perlcritic/perlcriticrc b/perlcritic/perlcriticrc index 0bd59c98..37f033fe 100644 --- a/perlcritic/perlcriticrc +++ b/perlcritic/perlcriticrc @@ -20,6 +20,11 @@ add_exceptions = inet4 inet6 ipv4 ipv6 # Cool story, bro [-Editor::RequireEmacsFileVariables] +# Postfix dereferencing like $foo->@* causes false positives for this policy, +# a known bug; it's not fixed yet, so we'll just block this policy in the +# meantime: <https://github.com/Perl-Critic/Perl-Critic/issues/578> +[-References::ProhibitDoubleSigils] + # Soften this rather harsh policy a fair bit; tolerate negative one, all the # single-digit integers as literals, three powers of 10 (for percentages, # milliseconds etc), 60 (for angles and clocks), and 1900 (for localtime) diff --git a/plenv/profile.d/plenv.sh b/plenv/profile.d/plenv.sh index b2b491e1..5bfc2d24 100644 --- a/plenv/profile.d/plenv.sh +++ b/plenv/profile.d/plenv.sh @@ -1,5 +1,2 @@ -# Add plenv to PATH and MANPATH if it appears to be in use -[ -d "$HOME"/.plenv ] || return -PATH=$HOME/.plenv/shims:$HOME/.plenv/bin:$PATH -MANPATH=$HOME/.plenv/versions/$(perl -e 'print substr($^V,1)')/man:$MANPATH -export MANPATH +# Add plenv bindir and shims to PATH +PATH=$HOME/.plenv/bin:$HOME/.plenv/shims:$PATH diff --git a/plenv/shrc.d/plenv.sh b/plenv/shrc.d/plenv.sh index bb52ffe2..938bcbf6 100644 --- a/plenv/shrc.d/plenv.sh +++ b/plenv/shrc.d/plenv.sh @@ -1,5 +1,4 @@ # POSIX-compatible version of the plenv Bash shell wrapper -[ -d "$HOME"/.plenv ] || return plenv() { case $1 in rehash) diff --git a/pyenv/profile.d/pyenv.sh b/pyenv/profile.d/pyenv.sh index 296df3ac..ea2455fb 100644 --- a/pyenv/profile.d/pyenv.sh +++ b/pyenv/profile.d/pyenv.sh @@ -1,5 +1,2 @@ -# Define env vars for pyenv if it appears to be in use -[ -d "$HOME"/.pyenv ] || return -PATH=$HOME/.pyenv/shims:$HOME/.pyenv/bin:$PATH -MANPATH=$HOME/.pyenv/versions/$(python -V|cut -d' ' -f2)/share/man:$MANPATH -export MANPATH +# Add pyenv bindir and shims to PATH +PATH=$HOME/.pyenv/bin:$HOME/.pyenv/shims:$PATH diff --git a/pyenv/shrc.d/pyenv.sh b/pyenv/shrc.d/pyenv.sh index 0a946164..60ed8ac7 100644 --- a/pyenv/shrc.d/pyenv.sh +++ b/pyenv/shrc.d/pyenv.sh @@ -1,5 +1,4 @@ # POSIX-compatible version of the pyenv Bash shell wrapper -[ -d "$HOME"/.pyenv ] || return pyenv() { case $1 in rehash) diff --git a/rbenv/profile.d/rbenv.sh b/rbenv/profile.d/rbenv.sh index 52787b4d..5295584c 100644 --- a/rbenv/profile.d/rbenv.sh +++ b/rbenv/profile.d/rbenv.sh @@ -1,5 +1,2 @@ -# Add rbenv to PATH and MANPATH if it appears to be in use -[ -d "$HOME"/.rbenv ] || return -PATH=$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH -MANPATH=$HOME/.rbenv/versions/$(ruby -e 'print "#{ RUBY_VERSION }"')/man:$MANPATH -export MANPATH +# Add rbenv bindir and shims to PATH +PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH diff --git a/rbenv/shrc.d/rbenv.sh b/rbenv/shrc.d/rbenv.sh index ed9ddd03..14403680 100644 --- a/rbenv/shrc.d/rbenv.sh +++ b/rbenv/shrc.d/rbenv.sh @@ -1,5 +1,4 @@ # POSIX-compatible version of the rbenv Bash shell wrapper -[ -d "$HOME"/.rbenv ] || return rbenv() { case $1 in rehash) diff --git a/readline/inputrc b/readline/inputrc index 0da55708..90c53633 100644 --- a/readline/inputrc +++ b/readline/inputrc @@ -1,13 +1,6 @@ -# Don't mess with the eighth bit of characters -set input-meta on -set output-meta on - # Never ring any sort of bell during line reading set bell-style none -# Let readline do stuff like word killing, not stty(1) -set bind-tty-special-chars off - # Color files by type in the same way as `ls` set colored-stats on diff --git a/redshift/redshift.conf b/redshift/redshift.conf new file mode 100644 index 00000000..0c2f5cfb --- /dev/null +++ b/redshift/redshift.conf @@ -0,0 +1,6 @@ +[redshift] +location-provider=manual + +[manual] +lat=-36.8487484 +lon=174.7600435 diff --git a/redshift/xsession.d/redshift.sh b/redshift/xsession.d/redshift.sh new file mode 100644 index 00000000..503877dc --- /dev/null +++ b/redshift/xsession.d/redshift.sh @@ -0,0 +1,2 @@ +# Start X color temperature manager +redshift & diff --git a/rofi/bin/rofi_pass.sh b/rofi/bin/rofi_pass.sh new file mode 100644 index 00000000..fb31a454 --- /dev/null +++ b/rofi/bin/rofi_pass.sh @@ -0,0 +1,92 @@ +# Pick password from local or remote password-store with rofi's dmenu emulation +# mode, and write it to the active X11 window. Optionally, prefix it with the +# username, being the last part of the slash-delimited password's name, and +# a TAB press to move to the next field in a form. +# +self=rofi_pass + +# Abstraction to handle running shell commands (args or stdin) in either +# a remote or local shell. If the environment variable PASSWORD_STORE_HOST is +# set, it's used as the destination SSH hostname to the password store. +# +pass_shell() { + [ "$#" -le 1 ] || return + if [ -n "$PASSWORD_STORE_HOST" ] ; then + ssh -o StrictHostKeyChecking=yes -T -X -- \ + "$PASSWORD_STORE_HOST" "$@" + elif [ "$#" -eq 1 ] ; then + "${SHELL:-/bin/sh}" -c "$1" + else + "${SHELL:-/bin/sh}" -s + fi +} + +# Get a list of all the password paths, relative to the password store root, +# including leading dot-slash and trailing .gpg extension. +# +get_paths() { + pass_shell <<-'EOF' + dir=${PASSWORD_STORE_DIR:-"$HOME"/.password-store} + cd -- "$dir" || exit + find . -name \*.gpg -type f || exit + EOF +} + +# Get a list of all the password names, bytewise-sorted, with leading dot-slash +# and trailing .gpg extension removed. +# +get_names() { + get_paths | + sed -e 's_^[.]/__' -e 's_[.]gpg$__' | + LC_COLLATE=C sort -f +} + +# Write a password name to a shell to retrieve it, and read its first line; +# write the name safely to the shell's input rather than as an argument. +# +get_password() { + name=$1 + [ -n "$name" ] || return + printf '%s\n' "$name" | + pass_shell 'IFS= read -r name ; pass show "$name"' | + head -n 1 +} + +# Check for --login/-l option to paste a username-password combo, not just the +# password (defaults to the latter). +# +login=0 +case $1 in + --login|-l) login=1 ;; +esac + +# Apply rofi -dmenu to pick a password name. Use case-insensitive matching, +# and don't accept arbitrary input. +# +name=$(get_names | rofi -dmenu -i -no-lazy-grab -only_match -p pass) || exit +[ -n "$name" ] || exit + +# Retrieve the username for the chosen password, and then the secret itself; +# check that we actually got more than an empty string back in both cases. +# +username=${name##*/} +[ -n "$username" ] || exit +password=$(get_password "$name") || exit +[ -n "$password" ] || exit + +# Have xdotool type either the username-TAB-password, or just the password; +# receiving it on its standard input rather than its arguments, for security. +# +if [ "$login" -eq 1 ] ; then + printf '%s\t%s' \ + "$username" "$password" +else + printf '%s' \ + "$password" +fi | xdotool type --clearmodifiers --delay=0 --file - || exit + +# Tell the user we wrote the password out, in case they're typing a password +# into a field with echo turned off. +# +notify-send --app-name="$self" --icon=gcr-password -- \ + 'Password typed' "$name" @@ -1,17 +1,38 @@ -# Add ~/.local/bin to PATH if it exists -if [ -d "$HOME"/.local/bin ] ; then - PATH=$HOME/.local/bin:$PATH -fi +# Use lynx as our terminal browser +BROWSER=lynx +export BROWSER -# Load all supplementary scripts in ~/.profile.d +# Use ed as our line editor and vi as our visual editor +EDITOR=ed +VISUAL=vi +export EDITOR VISUAL + +# Set the POSIX interactive startup file to ~/.shinit +ENV=$HOME/.shinit +export ENV + +# Use NZ English, but bytewise sorting +LANG=en_NZ.UTF-8 +LANGUAGE=en_NZ:en +LC_COLLATE=C +export LANG LANGUAGE LC_COLLATE + +# Use less as my pager +PAGER=less +export PAGER + +# Assume I'm at home unless something overrides it +TZ=Pacific/Auckland +export TZ + +# Source all scripts in ~/.profile.d; many of them will be modifying $PATH, so +# we'll get that sorted out first for sh in "$HOME"/.profile.d/*.sh ; do [ -e "$sh" ] || continue . "$sh" done unset -v sh -# If ~/.shinit exists, set ENV to that -if [ -f "$HOME"/.shinit ] ; then - ENV=$HOME/.shinit - export ENV -fi +# Add ~/.local/bin and ~/.local/games to the very front of PATH, so that it +# overrides everything else +PATH=$HOME/.local/bin:$HOME/.local/games:$PATH diff --git a/sh/profile.d/browser.sh b/sh/profile.d/browser.sh deleted file mode 100644 index 2c724505..00000000 --- a/sh/profile.d/browser.sh +++ /dev/null @@ -1,4 +0,0 @@ -# Set command-line browser to lynx; ~/.xinitrc will change this to something -# graphical instead -BROWSER=lynx -export BROWSER diff --git a/sh/profile.d/downloads.sh b/sh/profile.d/downloads.sh deleted file mode 100644 index 1a89bc3f..00000000 --- a/sh/profile.d/downloads.sh +++ /dev/null @@ -1,33 +0,0 @@ -# Only if shell is interactive -case $- in - *i*) ;; - *) return ;; -esac - -# Only if not in a tmux window -[ -z "$TMUX" ] || return - -# Not if ~/.hushlogin exists -! [ -e "$HOME"/.hushlogin ] || return - -# Not if ~/.downloads doesn't -[ -f "$HOME"/.downloads ] || return - -# Count files in each directory, report if greater than zero -( - lc=0 - while IFS= read -r dir ; do - case $dir in - '#'*) continue ;; - esac - [ -d "$dir" ] || continue - set -- "$dir"/* - [ -e "$1" ] || shift - [ "$#" -gt 0 ] || continue - printf 'You have %u unsorted files in %s.\n' "$#" "$dir" - lc=$((lc+1)) - done < "$HOME"/.downloads - if [ "$lc" -gt 0 ] ; then - printf '\n' - fi -) diff --git a/sh/profile.d/editor.sh b/sh/profile.d/editor.sh deleted file mode 100644 index 37146fb9..00000000 --- a/sh/profile.d/editor.sh +++ /dev/null @@ -1,25 +0,0 @@ -# Ideally, we'd use plain old ed(1), but many Linux distributions don't install -# it by default -if command -v ed >/dev/null 2>&1 ; then - EDITOR='ed' - -# Failing that, if the system's implementation of ex(1) looks like Vim and we -# have exm(1df) in our $PATH, use the latter to work around Vim's ex mode -# screen-clearing -elif ( - command -v ex >/dev/null 2>&1 || exit 1 - command -v exm >/dev/null 2>&1 || exit 1 - ver=$(ex --version 2>/dev/null | awk '{print $1;exit}') - case $ver in - (VIM) exit 0 ;; - (*) exit 1 ;; - esac -) >/dev/null 2>&1 ; then - EDITOR='exm' - -# Otherwise, we can just call ex(1) directly -else - EDITOR='ex' -fi - -export EDITOR diff --git a/sh/profile.d/games.sh b/sh/profile.d/games.sh deleted file mode 100644 index 956d1de1..00000000 --- a/sh/profile.d/games.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Add ~/.local/games to PATH if it exists -[ -d "$HOME"/.local/games ] || return -PATH=$PATH:$HOME/.local/games diff --git a/sh/profile.d/lang.sh b/sh/profile.d/lang.sh deleted file mode 100644 index 21f67d5b..00000000 --- a/sh/profile.d/lang.sh +++ /dev/null @@ -1,4 +0,0 @@ -# Always use bytewise sorting if not already set -[ -z "$LC_COLLATE" ] || return -LC_COLLATE=C -export LC_COLLATE diff --git a/sh/profile.d/os.sh b/sh/profile.d/os.sh deleted file mode 100644 index f9d5a79b..00000000 --- a/sh/profile.d/os.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Store the operating system in an environment variable -OS=$(uname) -export OS diff --git a/sh/profile.d/pager.sh b/sh/profile.d/pager.sh deleted file mode 100644 index f0c4fab4..00000000 --- a/sh/profile.d/pager.sh +++ /dev/null @@ -1,7 +0,0 @@ -# If we don't have less(1), we'll just use whatever pager the application or -# system deems fit -command -v less >/dev/null 2>&1 || return - -# Use less(1) as my PAGER -PAGER=less -export PAGER diff --git a/sh/profile.d/timezone.sh b/sh/profile.d/timezone.sh deleted file mode 100644 index cbd33539..00000000 --- a/sh/profile.d/timezone.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Timezone -TZ=Pacific/Auckland -export TZ diff --git a/sh/profile.d/visual.sh b/sh/profile.d/visual.sh deleted file mode 100644 index eb3c1143..00000000 --- a/sh/profile.d/visual.sh +++ /dev/null @@ -1,14 +0,0 @@ -# For a visual editor, use Vim explicitly if we've got it, but otherwise any vi -# implementation will be fine -if command -v vim >/dev/null 2>&1 ; then - VISUAL='vim' -else - VISUAL='vi' -fi -export VISUAL - -# If systemctl is installed, use $VISUAL as its editor, not $EDITOR -if command -v systemctl >/dev/null 2>&1 ; then - SYSTEMD_EDITOR=$VISUAL - export SYSTEMD_EDITOR -fi diff --git a/sh/profile.d/welcome.sh b/sh/profile.d/welcome.sh deleted file mode 100644 index 19231c2e..00000000 --- a/sh/profile.d/welcome.sh +++ /dev/null @@ -1,53 +0,0 @@ -# Only if shell is interactive -case $- in - *i*) ;; - *) return ;; -esac - -# Only if not in a tmux window -[ -z "$TMUX" ] || return - -# Only if ~/.hushlogin doesn't exist -! [ -e "$HOME"/.hushlogin ] || return - -# Run all of this in a subshell to clear it away afterwards -( - # Temporary helper function - welcome() { - test -e "${XDG_CONFIG_HOME:-"$HOME"/.config}"/welcome/"$1" - } - - # Show a fortune - if welcome fortune ; then - if [ -z "$FORTUNE_PATH" ] ; then - FORTUNE_PATH=${XDG_DATA_HOME:-$HOME}/.local/share/fortune - set -- "$FORTUNE_PATH"/*.dat - if ! [ -e "$1" ] ; then - FORTUNE_PATH= - fi - fi - fortune -s "$FORTUNE_PATH" - printf '\n' - fi - - # Print today's reminders with asterisks - if welcome rem ; then - rem -hq | sed 's/^/* /' - printf '\n' - fi - - # Run verse(1) if we haven't seen it already today - if welcome verse ; then - cache=${XDG_CACHE_HOME:-$HOME/.cache}/welcome - mkdir -p -- "$cache" || return - if [ -f "$cache"/verse ] ; then - read -r last <"$cache"/verse - fi - now=$(date +%Y%m%d) - if [ "$now" -gt "${last:-0}" ] ; then - verse - printf '\n' - printf '%s\n' "$now" >"$cache"/verse - fi - fi -) @@ -4,8 +4,8 @@ command -p mesg n 2>/dev/null # Turn off flow control and control character echo command -p stty -ixon -ctlecho 2>/dev/null -# Keep around 4K lines of history in memory -HISTSIZE=$((1 << 12)) +# Keep around 16K lines of history in memory +HISTSIZE=16384 # If HOSTNAME isn't set by this shell, we'll do it if [ -z "$HOSTNAME" ] ; then diff --git a/sh/shrc.d/ed.sh b/sh/shrc.d/ed.sh index dc8433f6..0591e18d 100644 --- a/sh/shrc.d/ed.sh +++ b/sh/shrc.d/ed.sh @@ -22,7 +22,7 @@ ed() { # Run in rlwrap(1) if available set -- ed "$@" if command -v rlwrap >/dev/null 2>&1 ; then - set -- rlwrap --history-filename=/dev/null "$@" + set -- rlwrap --history-filename=/dev/null --no-warnings "$@" fi # Run determined command diff --git a/sh/shrc.d/gdb.sh b/sh/shrc.d/gdb.sh index ec9d4137..4fb459cb 100644 --- a/sh/shrc.d/gdb.sh +++ b/sh/shrc.d/gdb.sh @@ -1,4 +1,4 @@ # Don't print the GDB copyright message on every invocation gdb() { - command gdb -q "$@" + command gdb --quiet "$@" } diff --git a/sh/shrc.d/ls.sh b/sh/shrc.d/ls.sh index c6558fc3..6fbfbf61 100644 --- a/sh/shrc.d/ls.sh +++ b/sh/shrc.d/ls.sh @@ -41,16 +41,6 @@ ls() { set -- --time-style='+%Y-%m-%d %H:%M:%S' "$@" fi - # If the operating system is FreeBSD, there are some specific options we - # can add that might mean different things to e.g. GNU ls(1) - case $OS in - FreeBSD) - # -D: Timestamp format - # -G: Use color - set -- -D '%Y-%m-%d %H:%M:%S' -G "$@" - ;; - esac - # Run ls(1) with the concluded arguments command ls "$@" } diff --git a/sh/shrc.d/path.sh b/sh/shrc.d/path.sh index a854e148..812f5f0f 100644 --- a/sh/shrc.d/path.sh +++ b/sh/shrc.d/path.sh @@ -130,7 +130,7 @@ path(): Manage contents of PATH variable USAGE: path [list] - Print the current directories in PATH, one per line (default command) + Print the current directories in PATH, one per line (default) path insert [DIR] Add directory DIR (default $PWD) to the front of PATH path append [DIR] @@ -142,7 +142,7 @@ USAGE: path pop Remove the last directory from PATH path check [DIR] - Return whether directory DIR (default $PWD) is a component of PATH + Return whether directory DIR (default $PWD) is in PATH path help Print this help message EOF @@ -150,7 +150,9 @@ EOF # Command not found *) - printf >&2 'path(): %s: Unknown command (try "help")\n' "$1" + printf >&2 \ + 'path(): %s: Unknown command (try "help")\n' \ + "$1" return 2 ;; esac diff --git a/sh/shrc.d/pd.sh b/sh/shrc.d/pd.sh index 77f6bae9..e99049d3 100644 --- a/sh/shrc.d/pd.sh +++ b/sh/shrc.d/pd.sh @@ -2,8 +2,6 @@ # use when you've got a file path in a variable, or in history, or in Alt+., # and want to quickly move to its containing directory. In the absence of an # argument, this just shifts up a directory, i.e. `cd ..` -# -# Note this is equivalent to `ud 1`. pd() { # Check arguments; default to $PWD diff --git a/sh/shrc.d/prompt.sh b/sh/shrc.d/prompt.sh index cb32c113..72cf59b6 100644 --- a/sh/shrc.d/prompt.sh +++ b/sh/shrc.d/prompt.sh @@ -11,8 +11,7 @@ PS3='? ' unset PS4 PS4='+ ' -# If we have an SSH_CLIENT or SSH_CONNECTION environment variable, put the -# hostname in PS1 too. -if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_CONNECTION" ] ; then - PS1=$(hostname -s)'$ ' +# Prompt has hostname via SSH outside of screen/tmux +if [ -n "$SSH_CLIENT" ] && [ -z "$STY" ] && [ -z "$TMUX" ] ; then + PS1=$(hostname -s)$PS1 fi diff --git a/sh/shrc.d/rd.sh b/sh/shrc.d/rd.sh index e6d761a6..3e1b4d9c 100644 --- a/sh/shrc.d/rd.sh +++ b/sh/shrc.d/rd.sh @@ -11,6 +11,7 @@ # $ rd usr opt # $ pwd # /opt/bin +# rd() { # Check argument count diff --git a/sh/shrc.d/sd.sh b/sh/shrc.d/sd.sh index 10597832..1fe748c4 100644 --- a/sh/shrc.d/sd.sh +++ b/sh/shrc.d/sd.sh @@ -30,6 +30,7 @@ # /tmp/tmp.ZSunna5Eup/a # # Seems to work for symbolic links. +# sd() { # Check argument count diff --git a/sh/shrc.d/tor.sh b/sh/shrc.d/tor.sh new file mode 100644 index 00000000..e6e31341 --- /dev/null +++ b/sh/shrc.d/tor.sh @@ -0,0 +1,33 @@ +# Manage Torsocks for the current shell +tor() { + + # Check first argument to figure out operation + case $1 in + + # Show whether Torsocks + show|'') + case $LD_PRELOAD: in + (*/libtorsocks.so:*) + printf 'on\n' + ;; + (*) + printf 'off\n' + ;; + esac + ;; + + # Turn Torsocks on or off + on|off) + command -v torsocks >/dev/null 2>&1 || return + . "$(command -v torsocks)" + ;; + + # Command not found + *) + printf >&2 \ + 'tor(): %s: Unknown command (try "help")\n' \ + "$1" + return 2 + ;; + esac +} diff --git a/sh/shrc.d/which.sh b/sh/shrc.d/which.sh index 9d8c899a..528e5048 100644 --- a/sh/shrc.d/which.sh +++ b/sh/shrc.d/which.sh @@ -1,3 +1,5 @@ +# Try to stop me using the non-standard `which`: +# <http://mywiki.wooledge.org/BadUtils#which> which() { printf >&2 'Whichcraft detected! Did you mean: command -v %s\n' "$*" return 2 diff --git a/sxhkd/sxhkdrc b/sxhkd/sxhkdrc new file mode 100644 index 00000000..b4f823b6 --- /dev/null +++ b/sxhkd/sxhkdrc @@ -0,0 +1,53 @@ +super + Return + exec x-terminal-emulator + +super + {control,shift,alt} + Return + exec x-terminal-emulator -e {sh,ksh,zsh} + +super + b + exec x-www-browser + +super + d + exec rofi -modi drun -show drun + +super + g + exec xgoc + +super + i + exec gimp + +super + m + exec x-terminal-emulator -title tm -e tm + +super + p + exec rofi_pass + +super + shift + p + exec rofi_pass --login + +super + t + exec thunar + +super + v + exec x-terminal-emulator -title "$VISUAL" -e "$VISUAL" + +Print + exec xsnap + +control + Print + exec xsnap --freeze --select + +super + Print + exec xsnap --focused + +Pause + exec xlock + +XF86AudioMute + exec pactl set-sink-mute @DEFAULT_SINK@ toggle + +XF86Audio{Lower,Raise}Volume + exec pactl set-sink-volume @DEFAULT_SINK@ {-5%,+5%} + +XF86Calculator + exec x-terminal-emulator -title bcq -e bcq diff --git a/sxhkd/xsession.d/sxhkd.sh b/sxhkd/xsession.d/sxhkd.sh new file mode 100644 index 00000000..ca0e27e3 --- /dev/null +++ b/sxhkd/xsession.d/sxhkd.sh @@ -0,0 +1,2 @@ +# Start X hotkey daemon +sxhkd & diff --git a/systemd/profile.d/systemd.sh b/systemd/profile.d/systemd.sh new file mode 100644 index 00000000..b5f05c24 --- /dev/null +++ b/systemd/profile.d/systemd.sh @@ -0,0 +1,3 @@ +# Use $VISUAL for editing systemd unit files, not $EDITOR +SYSTEMD_EDITOR=$VISUAL +export SYSTEMD_EDITOR diff --git a/systemd/user/notify-email@.service b/systemd/user/notify-email@.service index fba9cdaf..2d356c79 100644 --- a/systemd/user/notify-email@.service +++ b/systemd/user/notify-email@.service @@ -3,5 +3,5 @@ Description=unit status mailer service for %i [Service] Type=oneshot -ExecStart=sh -c 'systemctl --user status %i | mail -a "X-systemd: %H %m %b" -s "[systemd] %i failure" %u' +ExecStart=sh -c 'systemctl --user status --full %i | mail -a "X-systemd: %H %m %b" -s "[systemd] %i failure" %u' TimeoutStartSec=1m diff --git a/systemd/user/notify-email@.service.d/50-notify-email.conf b/systemd/user/notify-email@.service.d/50-notify-email.conf new file mode 100644 index 00000000..dc548c73 --- /dev/null +++ b/systemd/user/notify-email@.service.d/50-notify-email.conf @@ -0,0 +1,2 @@ +[Unit] +OnFailure= diff --git a/systemd/user/run-.service.d/50-notify-email.conf b/systemd/user/run-.service.d/50-notify-email.conf new file mode 100644 index 00000000..e5a45b8c --- /dev/null +++ b/systemd/user/run-.service.d/50-notify-email.conf @@ -0,0 +1,5 @@ +[Unit] +OnFailure= + +[Service] +ExecStopPost=sh -c 'systemctl --user status --full %n | mail -a "X-systemd: %H %m %b" -s "[systemd] %n completed" %u' diff --git a/systemd/user/service.d/50-notify-email.conf b/systemd/user/service.d/50-notify-email.conf new file mode 100644 index 00000000..11b8b2f2 --- /dev/null +++ b/systemd/user/service.d/50-notify-email.conf @@ -0,0 +1,2 @@ +[Unit] +OnFailure=notify-email@%N.service diff --git a/terminfo/putty-256color.ti b/terminfo/putty-256color.ti deleted file mode 100644 index 09d022b8..00000000 --- a/terminfo/putty-256color.ti +++ /dev/null @@ -1,7 +0,0 @@ -putty-256color| PuTTY with 256 colors, - use=putty, - colors#256, - initc@, - pairs#32767, - setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, - setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, diff --git a/terminfo/putty.ti b/terminfo/putty.ti deleted file mode 100644 index 068dbbd5..00000000 --- a/terminfo/putty.ti +++ /dev/null @@ -1,128 +0,0 @@ -putty| PuTTY, - acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, - am, - bce, - bel=^G, - blink=\E[5m, - bold=\E[1m, - bw, - cbt=\E[Z, - ccc, - civis=\E[?25l, - clear=\E[H\E[J, - cnorm=\E[?25h, - colors#8, - cr=^M, - csr=\E[%i%p1%d;%p2%dr, - cub1=^H, - cub=\E[%p1%dD, - cud1=\ED, - cud=\E[%p1%dB, - cuf1=\E[C, - cuf=\E[%p1%dC, - cup=\E[%i%p1%d;%p2%dH, - cuu1=\EM, - cuu=\E[%p1%dA, - dch1=\E[P, - dch=\E[%p1%dP, - dispc=%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G\342\227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e%p1%{13}%=%t\E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G\342\231\253\E%%@%e%p1%{15}%=%t\E%%G\342\230\274\E%%@%e%p1%{27}%=%t\E%%G\342\206\220\E%%@%e%p1%{155}%=%t\E%%G\340\202\242\E%%@%e%p1%c%;, - dl1=\E[M, - dl=\E[%p1%dM, - dsl=\E]0;\007, - ech=\E[%p1%dX, - ed=\E[J, - el1=\E[1K, - el=\E[K, - enacs=\E(B\E)0, - flash=\E[?5h\E[?5l, - fsl=^G, - home=\E[H, - hpa=\E[%i%p1%dG, - hs, - ht=^I, - hts=\EH, - il1=\E[L, - il=\E[%p1%dL, - ind=^J, - indn=\E[%p1%dS, - initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x, - is2=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R, - it#8, - kb2=\E[G, - kbs=\177, - kcbt=\E[Z, - kcub1=\E[D, - kcud1=\E[B, - kcuf1=\E[C, - kcuu1=\E[A, - kdch1=\E[3~, - kend=\E[4~, - kf10=\E[21~, - kf11=\E[23~, - kf12=\E[24~, - kf13=\E[25~, - kf14=\E[26~, - kf15=\E[28~, - kf16=\E[29~, - kf17=\E[31~, - kf18=\E[32~, - kf19=\E[33~, - kf1=\E[11~, - kf20=\E[34~, - kf2=\E[12~, - kf3=\E[13~, - kf4=\E[14~, - kf5=\E[15~, - kf6=\E[17~, - kf7=\E[18~, - kf8=\E[19~, - kf9=\E[20~, - khome=\E[1~, - kich1=\E[2~, - kmous=\E[M, - knp=\E[6~, - kpp=\E[5~, - kspd=^Z, - mir, - msgr, - ncv#22, - nel=^M^J, - oc=\E]R, - op=\E[39;49m, - pairs#64, - rc=\E8, - rev=\E[7m, - ri=\EM, - rin=\E[%p1%dT, - rmacs=^O, - rmam=\E[?7l, - rmcup=\E[2J\E[?47l, - rmir=\E[4l, - rmpch=\E[10m, - rmso=\E[27m, - rmul=\E[24m, - rs2=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l, - s0ds=\E[10m, - s1ds=\E[11m, - s2ds=\E[12m, - sc=\E7, - setab=\E[4%p1%dm, - setaf=\E[3%p1%dm, - sgr0=\E[m\017, - sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;, - smacs=^N, - smam=\E[?7h, - smcup=\E[?47h, - smir=\E[4h, - smpch=\E[11m, - smso=\E[7m, - smul=\E[4m, - tbc=\E[3g, - tsl=\E]0;, - u6=\E[%i%d;%dR, - u7=\E[6n, - u8=\E[?6c, - u9=\E[c, - vpa=\E[%i%p1%dd, - xenl, - xon, diff --git a/terminfo/rxvt-256color.ti b/terminfo/rxvt-256color.ti deleted file mode 100644 index 22c35ec2..00000000 --- a/terminfo/rxvt-256color.ti +++ /dev/null @@ -1,8 +0,0 @@ -rxvt-256color| rxvt with 256 colors, - use=rxvt, - ccc, - colors#256, - initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, - pairs#32767, - setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, - setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, diff --git a/terminfo/rxvt-unicode-256color.ti b/terminfo/rxvt-unicode-256color.ti deleted file mode 100644 index 1a34a46f..00000000 --- a/terminfo/rxvt-unicode-256color.ti +++ /dev/null @@ -1,4 +0,0 @@ -rxvt-unicode-256color| rxvt-unicode with 256 colors, - use=rxvt-unicode, - colors#256, - pairs#32767, diff --git a/terminfo/rxvt-unicode.ti b/terminfo/rxvt-unicode.ti deleted file mode 100644 index 05bef84a..00000000 --- a/terminfo/rxvt-unicode.ti +++ /dev/null @@ -1,160 +0,0 @@ -rxvt-unicode| rxvt-unicode, - acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, - am, - bce, - bel=^G, - blink=\E[5m, - bold=\E[1m, - btns#5, - bw, - ccc, - civis=\E[?25l, - clear=\E[H\E[2J, - cnorm=\E[?25h, - colors#88, - cols#80, - cr=^M, - csr=\E[%i%p1%d;%p2%dr, - cub1=^H, - cub=\E[%p1%dD, - cud1=^J, - cud=\E[%p1%dB, - cuf1=\E[C, - cuf=\E[%p1%dC, - cup=\E[%i%p1%d;%p2%dH, - cuu1=\E[A, - cuu=\E[%p1%dA, - cvvis=\E[?25h, - dch1=\E[P, - dch=\E[%p1%dP, - dl1=\E[M, - dl=\E[%p1%dM, - dsl=\E]2;\007, - ech=\E[%p1%dX, - ed=\E[J, - el1=\E[1K, - el=\E[K, - enacs=, - eo, - flash=\E[?5h$<20/>\E[?5l, - fsl=^G, - home=\E[H, - hpa=\E[%i%p1%dG, - hs, - ht=^I, - hts=\EH, - ich1=\E[@, - ich=\E[%p1%d@, - il1=\E[L, - il=\E[%p1%dL, - ind=^J, - indn=\E[%p1%dS, - initc=\E]4;%p1%d;rgb\:%p2%{65535}%*%{1000}%/%4.4X/%p3%{65535}%*%{1000}%/%4.4X/%p4%{65535}%*%{1000}%/%4.4X\E\\, - is1=\E[!p, - is2=\E[r\E[m\E[2J\E[?7;25h\E[?1;3;4;5;6;9;66;1000;1001;1049l\E[4l, - it#8, - kDC=\E[3$, - kEND=\E[8$, - kHOM=\E[7$, - kIC=\E[2$, - kLFT=\E[d, - kNXT=\E[6$, - kPRV=\E[5$, - kRIT=\E[c, - ka1=\EOw, - ka3=\EOy, - kb2=\EOu, - kbs=\177, - kc1=\EOq, - kc3=\EOs, - kcbt=\E[Z, - kcub1=\E[D, - kcud1=\E[B, - kcuf1=\E[C, - kcuu1=\E[A, - kdch1=\E[3~, - kel=\E[8\^, - kend=\E[8~, - kent=\EOM, - kf10=\E[21~, - kf11=\E[23~, - kf12=\E[24~, - kf13=\E[25~, - kf14=\E[26~, - kf15=\E[28~, - kf16=\E[29~, - kf17=\E[31~, - kf18=\E[32~, - kf19=\E[33~, - kf1=\E[11~, - kf20=\E[34~, - kf2=\E[12~, - kf3=\E[13~, - kf4=\E[14~, - kf5=\E[15~, - kf6=\E[17~, - kf7=\E[18~, - kf8=\E[19~, - kf9=\E[20~, - kfnd=\E[1~, - khome=\E[7~, - kich1=\E[2~, - km, - kmous=\E[M, - knp=\E[6~, - kpp=\E[5~, - kslt=\E[4~, - lines#24, - lm#0, - mc0=\E[i, - mc4=\E[4i, - mc5=\E[5i, - mc5i, - mir, - msgr, - ncv#0, - npc, - op=\E[39;49m, - pairs#7744, - rc=\E8, - rev=\E[7m, - ri=\EM, - rin=\E[%p1%dT, - ritm=\E[23m, - rmacs=\E(B, - rmam=\E[?7l, - rmcup=\E[r\E[?1049l, - rmir=\E[4l, - rmkx=\E>, - rmso=\E[27m, - rmul=\E[24m, - rs1=\Ec, - rs2=\E[r\E[m\E[?7;25h\E[?1;3;4;5;6;9;66;1000;1001;1049l\E[4l, - s0ds=\E(B, - s1ds=\E(0, - s2ds=\E*B, - s3ds=\E+B, - sc=\E7, - setab=\E[48;5;%p1%dm, - setaf=\E[38;5;%p1%dm, - setb=%?%p1%{7}%>%t\E[48;5;%p1%dm%e\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m%;, - setf=%?%p1%{7}%>%t\E[38;5;%p1%dm%e\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m%;, - sgr0=\E[m\E(B, - sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\E(0%e\E(B%;, - sitm=\E[3m, - smacs=\E(0, - smam=\E[?7h, - smcup=\E[?1049h, - smir=\E[4h, - smkx=\E=, - smso=\E[7m, - smul=\E[4m, - tbc=\E[3g, - tsl=\E]2;, - u6=\E[%i%d;%dR, - u7=\E[6n, - u8=\E[?1;2c, - u9=\E[c, - vpa=\E[%i%p1%dd, - xenl, - xon, diff --git a/terminfo/rxvt.ti b/terminfo/rxvt.ti deleted file mode 100644 index 62808d3c..00000000 --- a/terminfo/rxvt.ti +++ /dev/null @@ -1,151 +0,0 @@ -rxvt| rxvt, - acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, - am, - bce, - bel=^G, - blink=\E[5m, - bold=\E[1m, - civis=\E[?25l, - clear=\E[H\E[2J, - cnorm=\E[?25h, - colors#8, - cols#80, - cr=^M, - csr=\E[%i%p1%d;%p2%dr, - cub1=^H, - cub=\E[%p1%dD, - cud1=^J, - cud=\E[%p1%dB, - cuf1=\E[C, - cuf=\E[%p1%dC, - cup=\E[%i%p1%d;%p2%dH, - cuu1=\E[A, - cuu=\E[%p1%dA, - dl1=\E[M, - dl=\E[%p1%dM, - ed=\E[J, - el1=\E[1K, - el=\E[K, - enacs=\E(B\E)0, - eo, - flash=\E[?5h\E[?5l, - home=\E[H, - hpa=\E[%i%p1%dG, - ht=^I, - hts=\EH, - ich1=\E[@, - ich=\E[%p1%d@, - il1=\E[L, - il=\E[%p1%dL, - ind=^J, - is1=\E[?47l\E=\E[?1l, - is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, - it#8, - kDC=\E[3$, - kEND=\E[8$, - kHOM=\E[7$, - kLFT=\E[d, - kNXT=\E[6$, - kPRV=\E[5$, - kRIT=\E[c, - ka1=\EOw, - ka3=\EOy, - kb2=\EOu, - kbs=\177, - kc1=\EOq, - kc3=\EOs, - kcbt=\E[Z, - kcub1=\E[D, - kcud1=\E[B, - kcuf1=\E[C, - kcuu1=\E[A, - kdch1=\E[3~, - kel=\E[8\^, - kend=\E[8~, - kent=\EOM, - kf10=\E[21~, - kf11=\E[23~, - kf12=\E[24~, - kf13=\E[25~, - kf14=\E[26~, - kf15=\E[28~, - kf16=\E[29~, - kf17=\E[31~, - kf18=\E[32~, - kf19=\E[33~, - kf1=\E[11~, - kf20=\E[34~, - kf21=\E[23$, - kf22=\E[24$, - kf23=\E[11\^, - kf24=\E[12\^, - kf25=\E[13\^, - kf26=\E[14\^, - kf27=\E[15\^, - kf28=\E[17\^, - kf29=\E[18\^, - kf2=\E[12~, - kf30=\E[19\^, - kf31=\E[20\^, - kf32=\E[21\^, - kf33=\E[23\^, - kf34=\E[24\^, - kf35=\E[25\^, - kf36=\E[26\^, - kf37=\E[28\^, - kf38=\E[29\^, - kf39=\E[31\^, - kf3=\E[13~, - kf40=\E[32\^, - kf41=\E[33\^, - kf42=\E[34\^, - kf43=\E[23@, - kf44=\E[24@, - kf4=\E[14~, - kf5=\E[15~, - kf6=\E[17~, - kf7=\E[18~, - kf8=\E[19~, - kf9=\E[20~, - kfnd=\E[1~, - khome=\E[7~, - kich1=\E[2~, - km, - kmous=\E[M, - knp=\E[6~, - kpp=\E[5~, - kslt=\E[4~, - lines#24, - mir, - msgr, - ncv@, - op=\E[39;49m, - pairs#64, - rc=\E8, - rev=\E[7m, - ri=\EM, - rmacs=^O, - rmcup=\E[2J\E[?47l\E8, - rmir=\E[4l, - rmkx=\E>, - rmso=\E[27m, - rmul=\E[24m, - rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, - rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E=\E[?1000l\E[?25h, - s0ds=\E(B, - s1ds=\E(0, - sc=\E7, - setab=\E[4%p1%dm, - setaf=\E[3%p1%dm, - sgr0=\E[m\017, - sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;, - smacs=^N, - smcup=\E7\E[?47h, - smir=\E[4h, - smkx=\E=, - smso=\E[7m, - smul=\E[4m, - tbc=\E[3g, - vpa=\E[%i%p1%dd, - xenl, - xon, diff --git a/terminfo/screen-256color.ti b/terminfo/screen-256color.ti deleted file mode 100644 index cc7faffe..00000000 --- a/terminfo/screen-256color.ti +++ /dev/null @@ -1,7 +0,0 @@ -screen-256color| GNU Screen or tmux with 256 colors, - use=screen, - colors#256, - initc@, - pairs#32767, - setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, - setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, diff --git a/terminfo/screen.ti b/terminfo/screen.ti deleted file mode 100644 index 4658f424..00000000 --- a/terminfo/screen.ti +++ /dev/null @@ -1,100 +0,0 @@ -screen| GNU Screen or tmux, - acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, - am, - bel=^G, - blink=\E[5m, - bold=\E[1m, - cbt=\E[Z, - civis=\E[?25l, - clear=\E[H\E[J, - cnorm=\E[34h\E[?25h, - colors#8, - cols#80, - cr=^M, - csr=\E[%i%p1%d;%p2%dr, - cub1=^H, - cub=\E[%p1%dD, - cud1=^J, - cud=\E[%p1%dB, - cuf1=\E[C, - cuf=\E[%p1%dC, - cup=\E[%i%p1%d;%p2%dH, - cuu1=\EM, - cuu=\E[%p1%dA, - cvvis=\E[34l, - dch1=\E[P, - dch=\E[%p1%dP, - dl1=\E[M, - dl=\E[%p1%dM, - ed=\E[J, - el1=\E[1K, - el=\E[K, - enacs=\E(B\E)0, - flash=\Eg, - home=\E[H, - ht=^I, - hts=\EH, - ich=\E[%p1%d@, - il1=\E[L, - il=\E[%p1%dL, - ind=^J, - is2=\E)0, - it#8, - kbs=\177, - kcbt=\E[Z, - kcub1=\EOD, - kcud1=\EOB, - kcuf1=\EOC, - kcuu1=\EOA, - kdch1=\E[3~, - kend=\E[4~, - kf10=\E[21~, - kf11=\E[23~, - kf12=\E[24~, - kf1=\EOP, - kf2=\EOQ, - kf3=\EOR, - kf4=\EOS, - kf5=\E[15~, - kf6=\E[17~, - kf7=\E[18~, - kf8=\E[19~, - kf9=\E[20~, - khome=\E[1~, - kich1=\E[2~, - km, - kmous=\E[M, - knp=\E[6~, - kpp=\E[5~, - lines#24, - mir, - msgr, - ncv@, - nel=\EE, - op=\E[39;49m, - pairs#64, - rc=\E8, - rev=\E[7m, - ri=\EM, - ritm=\E[23m, - rmacs=^O, - rmcup=\E[?1049l, - rmir=\E[4l, - rmkx=\E[?1l\E>, - rmso=\E[27m, - rmul=\E[24m, - rs2=\Ec\E[?1000l\E[?25h, - sc=\E7, - setab=\E[4%p1%dm, - setaf=\E[3%p1%dm, - sgr0=\E[m\017, - sgr=\E[0%?%p6%t;1%;%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;, - sitm=\E[3m, - smacs=^N, - smcup=\E[?1049h, - smir=\E[4h, - smkx=\E[?1h\E=, - smso=\E[7m, - smul=\E[4m, - tbc=\E[3g, - xenl, diff --git a/tmux/bin/tmux.sh b/tmux/bin/tmux.sh new file mode 100644 index 00000000..bbe11636 --- /dev/null +++ b/tmux/bin/tmux.sh @@ -0,0 +1,11 @@ +# +# Simple wrapper to force acting only as client; can't do anything if the +# server isn't actually running. The correct way to do this is of course +# socket activation, but Debian's version doesn't have --enable-systemd yet. +# This will do fine in the meantime. +# +if ! systemctl --user is-active --quiet tmux.service ; then + printf >&2 'tmux: server not running\n' + exit +fi +exec /usr/bin/tmux "$@" diff --git a/tmux/profile.d/tmux.sh b/tmux/profile.d/tmux.sh new file mode 100644 index 00000000..15ba00ff --- /dev/null +++ b/tmux/profile.d/tmux.sh @@ -0,0 +1,4 @@ +# Encourage tmux to put its sockets into XDG_RUNTIME_DIR rather than /tmp +[ -n "$XDG_RUNTIME_DIR" ] || return +TMUX_TMPDIR=$XDG_RUNTIME_DIR +export TMUX_TMPDIR diff --git a/tmux/systemd/user/tmux.service b/tmux/systemd/user/tmux.service new file mode 100644 index 00000000..404f1888 --- /dev/null +++ b/tmux/systemd/user/tmux.service @@ -0,0 +1,11 @@ +[Unit] +Description=tmux server +Documentation=man:tmux(1) + +[Service] +ExecStart=/bin/sh -lc 'exec /usr/bin/tmux start-server \\; set-option -s exit-empty off' +KillMode=mixed +Type=forking + +[Install] +WantedBy=default.target diff --git a/tmux/tmux.conf b/tmux/tmux.conf index 05e21f81..ad420528 100644 --- a/tmux/tmux.conf +++ b/tmux/tmux.conf @@ -1,20 +1,8 @@ -# Strip out a lot of machine and X11 dependent crap from the initial -# environment -set-environment -gru DISPLAY -set-environment -gru SSH_CLIENT -set-environment -gru SSH_CONNECTION -set-environment -gru SSH_TTY -set-environment -gru WINDOWID - -# Otherwise, use the environment we had when we started; don't touch it during -# a session unless I specifically ask -set-option -g update-environment 'COLORFGBG COLORTERM' +# Don't update the environment from anywhere; too confusing +set-option -g update-environment '' # Setting this makes each new pane a non-login shell, which suits me better -set-option -g default-command "$SHELL" - -# Expect a 256-color terminal -set-option -g default-terminal 'screen-256color' +set-option -g default-command "exec $SHELL" # Change the prefix to ^A rather than the default of ^B, because I'm a godless # GNU Screen refugee, and also I like using ^B in my shell and in Vim more @@ -81,9 +69,6 @@ set-option -g base-index 1 # meta and prefer things to be snappier set-option -g escape-time 0 -# Keep plenty of history -set-option -g history-limit 100000 - # Don't interfere with my system clipboard set-option -g set-clipboard off diff --git a/urxvt/ext/select.pl b/urxvt/ext/select.pl deleted file mode 100644 index 90b13960..00000000 --- a/urxvt/ext/select.pl +++ /dev/null @@ -1,93 +0,0 @@ -# Tom Ryder's choice of selection behaviours for urxvt, butchered from included -# URxvt extension scripts. - -# Force me to write this properly -use strict; -use warnings; -use utf8; - -# Require at least this version of Perl -use 5.006; - -# Use plain-English variable names -use English qw(-no_match_vars); - -# Set version of this extension -our $VERSION = 1.0; - -# On creation, read all of cutchars into a list of regex-quoted patterns -sub on_init { - my ($self) = @_; - if ( defined( my $res = $self->resource('cutchars') ) ) { - $res = $self->locale_decode($res); - push @{ $self->{patterns} }, - qr{\G [\Q$res\E[:space:]]* ([^\Q$res\E[:space:]]+) }msx; - } - return (); -} - -# Handle multiple-clicking selection extension -sub on_sel_extend { - my ($self) = @_; - - # Get attributes of the current selection - my ( $row, $col ) = $self->selection_mark; - my $line = $self->line($row); - my $text = $line->t; - my $markofs = $line->offset_of( $row, $col ); - my $curlen = - $line->offset_of( $self->selection_end ) - - $line->offset_of( $self->selection_beg ); - - # Find all the possible matches - my @matches; - if ( $markofs < $line->l ) { - - # `perldoc -f study` says this does nothing useful anymore since - # version 5.16 - study $text; - - for my $regex ( @{ $self->{patterns} } ) { - while ( $text =~ m{$regex}gmsx ) { - if ( $LAST_MATCH_START[1] <= $markofs - and $markofs <= $LAST_MATCH_END[1] ) - { - my $ofs = $LAST_MATCH_START[1]; - my $match = $1; - - push @matches, [ $ofs, length $match ]; - } - } - } - } - - # If no more clever patterns matched, just snarf the whole line - push @matches, [ 0, ( $line->end - $line->beg + 1 ) * $self->ncol ]; - - # Iterate over the matches to choose the shortest one - MATCH: - for ( - sort { ## no critic (ProhibitReverseSortBlock) - $a->[1] <=> $b->[1] - or $b->[0] <=> $a->[0] - } @matches - ) - { - my ( $ofs, $len ) = @{$_}; - next MATCH if $len <= $curlen; - $self->selection_beg( $line->coord_of($ofs) ); - $self->selection_end( $line->coord_of( $ofs + $len ) ); - return 1; - } - - # Done - return (); -} - -# Copy selections to CLIPBOARD as well as PRIMARY. -sub on_sel_grab { - my ( $self, $time ) = @_; - $self->selection( $self->selection, 1 ); - $self->selection_grab( $time, 1 ); - return (); -} diff --git a/vim/after/ftplugin/python.vim b/vim/after/ftplugin/python.vim new file mode 100644 index 00000000..2ca1ae89 --- /dev/null +++ b/vim/after/ftplugin/python.vim @@ -0,0 +1,35 @@ +" The Python runtime files didn't define b:undo_ftplugin until Vim v8.1.1048; +" if it's not set yet, set it here (to something innoccuous) so that the +" appending :let commands in the rest of this file don't break. +" +if !exists('b:undo_ftplugin') + let b:undo_ftplugin = 'setlocal tabstop<' +endif + +" Use pyflakes for syntax checking and autopep8 for tidying +compiler pyflakes +if executable('autopep8') + setlocal equalprg=autopep8\ -aaa\ --\ - + let b:undo_ftplugin .= '|setlocal equalprg<' +endif + +" Stop here if the user doesn't want ftplugin mappings +if exists('no_plugin_maps') || exists('no_python_maps') + finish +endif + +" Mappings to choose compiler +nnoremap <buffer> <LocalLeader>c + \ :<C-U>compiler pyflakes<CR> +nnoremap <buffer> <LocalLeader>l + \ :<C-U>compiler pylint<CR> +let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>c' + \ . '|nunmap <buffer> <LocalLeader>l' + +" Mappings to choose 'equalprg' +nnoremap <buffer> <LocalLeader>t + \ :<C-U>setlocal equalprg=autopep8\ -aaa\ --\ -<CR> +nnoremap <buffer> <LocalLeader>i + \ :<C-U>setlocal equalprg<<CR> +let b:undo_ftplugin .= '|nunmap <buffer> <LocalLeader>t' + \ . '|nunmap <buffer> <LocalLeader>i' diff --git a/vim/after/indent/vim.vim b/vim/after/indent/vim.vim index da34eb75..4300e125 100644 --- a/vim/after/indent/vim.vim +++ b/vim/after/indent/vim.vim @@ -1,9 +1,9 @@ -" Use two (not four!) spaces for indentation, per convention -call indent#Spaces(2) - " Remove inapplicable defaults from 'indentkeys'; we should only need to undo " this if the stock plugin didn't already arrange that (before v7.3.539) setlocal indentkeys-=0#,0{,0},0),: if !exists('b:undo_indent') let b:undo_indent = 'setlocal indentkeys<' endif + +" Use two (not four!) spaces for indentation, per convention +call indent#Spaces(2) diff --git a/vim/after/indent/yaml.vim b/vim/after/indent/yaml.vim new file mode 100644 index 00000000..d0478631 --- /dev/null +++ b/vim/after/indent/yaml.vim @@ -0,0 +1,2 @@ +" Use two (not four!) spaces for indentation, per convention +call indent#Spaces(2) diff --git a/vim/autoload/html/timestamp.vim b/vim/autoload/html/timestamp.vim index 6d525afb..8f250710 100644 --- a/vim/autoload/html/timestamp.vim +++ b/vim/autoload/html/timestamp.vim @@ -34,7 +34,7 @@ function! s:Timestamp(time) abort endfunction " Define timestamp prefix string -let s:prefix = '<strong>Last updated:</strong> ' +let s:prefix = 'Last updated: ' " Define pattern to match date timestamps; no ZALGO, please let s:pattern = '\m\C' diff --git a/vim/autoload/indent.vim b/vim/autoload/indent.vim index 5f62fb0b..19a9f03d 100644 --- a/vim/autoload/indent.vim +++ b/vim/autoload/indent.vim @@ -19,27 +19,17 @@ endfunction " Set the current buffer to tab indent function! indent#Tabs() abort - setlocal noexpandtab - setlocal shiftwidth< softtabstop< + setlocal noexpandtab shiftwidth< softtabstop< call indent#Undo() endfunction " Add commands to b:undo_indent to clean up buffer-local indentation changes " on a change of filetype function! indent#Undo() abort - - " Check and set a flag so that we only do this once per buffer - if exists('b:undo_indent_type_set') - return - endif - let b:undo_indent_type_set = 1 - - " Either set or append relevant commands to b:undo_indent - let l:undo = 'setlocal expandtab< shiftwidth< softtabstop< tabstop<' + let undo = 'setlocal expandtab< shiftwidth< softtabstop<' if exists('b:undo_indent') - let b:undo_indent .= '|'.l:undo + let b:undo_indent .= '|'.undo else - let b:undo_indent = l:undo + let b:undo_indent = undo endif - endfunction diff --git a/vim/autoload/xdg.vim b/vim/autoload/xdg.vim index 67a9c5b2..cb7adcf5 100644 --- a/vim/autoload/xdg.vim +++ b/vim/autoload/xdg.vim @@ -5,6 +5,7 @@ let s:defaults = { \ 'XDG_CONFIG_DIRS': '/etc/xdg', \ 'XDG_DATA_HOME': $HOME.'/.local/share', \ 'XDG_DATA_DIRS': '/usr/local/share:/usr/share', + \ 'XDG_STATE_HOME': $HOME.'/.local/state', \} function! s:Get(name) abort @@ -42,21 +43,25 @@ function! s:Dirs(name) abort endfunction function! xdg#CacheHome() abort - return s:Home('XDG_CACHE_HOME') + return has('unix') ? s:Home('XDG_CACHE_HOME') : '' endfunction function! xdg#ConfigHome() abort - return s:Home('XDG_CONFIG_HOME') + return has('unix') ? s:Home('XDG_CONFIG_HOME') : '' endfunction function! xdg#DataHome() abort - return s:Home('XDG_DATA_HOME') + return has('unix') ? s:Home('XDG_DATA_HOME') : '' +endfunction + +function! xdg#StateHome() abort + return has('unix') ? s:Home('XDG_STATE_HOME') : '' endfunction function! xdg#ConfigDirs() abort - return s:Dirs('XDG_CONFIG_DIRS') + return has('unix') ? s:Dirs('XDG_CONFIG_DIRS') : [] endfunction function! xdg#DataDirs() abort - return s:Dirs('XDG_DATA_DIRS') + return has('unix') ? s:Dirs('XDG_DATA_DIRS') : [] endfunction diff --git a/vim/bundle/copy_linebreak b/vim/bundle/copy_linebreak -Subproject 6692eef760ccfc2e1b888d1d604e3e1a156fcbc +Subproject a0004c18da5f524f62e2da6e19be1a51ce282f3 diff --git a/vim/bundle/detect_indent b/vim/bundle/detect_indent -Subproject b41d085cdcaf1f957b2c219630f332023baba72 +Subproject 96f46cae148517e4b8e8a5bbe13b623ddde6b70 diff --git a/vim/bundle/html_spelllang b/vim/bundle/html_spelllang new file mode 160000 +Subproject 161e47f00cd5a1bdcef61097b7ba100ffd69a48 diff --git a/vim/bundle/redact_pass b/vim/bundle/redact_pass -Subproject 337e7498e2b483e79c9abb33a2feb670655b23d +Subproject 403a44dc32533e631384dfcca40d520b9088b0d diff --git a/vim/bundle/spellfile_local b/vim/bundle/spellfile_local -Subproject 8772445433cffa3722c441569ae82f5ade4938c +Subproject 6199ee785c6fb964292ec6e82c5b8a0f79e2606 diff --git a/vim/bundle/strip_trailing_whitespace b/vim/bundle/strip_trailing_whitespace -Subproject 90e60095bcfcfeb60bea60ba7f51bbfac3bf469 +Subproject 03782cdaf9db6329665316e1dc2d1b8270714a3 diff --git a/vim/compiler/pyflakes.vim b/vim/compiler/pyflakes.vim new file mode 100644 index 00000000..727fbd76 --- /dev/null +++ b/vim/compiler/pyflakes.vim @@ -0,0 +1,9 @@ +" :compiler support for Python syntax checking with pyflakes +" <https://pypi.org/project/pyflakes/> +if exists('current_compiler') || &compatible || !has('patch-7.4.191') + finish +endif +let current_compiler = 'pyflakes' + +CompilerSet makeprg=pyflakes\ %:S +CompilerSet errorformat=%f:%l:%c:\ %m diff --git a/vim/compiler/pylint.vim b/vim/compiler/pylint.vim new file mode 100644 index 00000000..589f78e3 --- /dev/null +++ b/vim/compiler/pylint.vim @@ -0,0 +1,9 @@ +" :compiler support for Python linting with pylint +" <https://pypi.org/project/pyflakes/> +if exists('current_compiler') || &compatible || !has('patch-7.4.191') + finish +endif +let current_compiler = 'pylint' + +CompilerSet makeprg=pylint\ --output-format=parseable\ --score=n\ %:S +CompilerSet errorformat=%f:%l:\ %m diff --git a/vim/filetype.vim b/vim/filetype.vim index 4ecc7aab..eea7f1f5 100644 --- a/vim/filetype.vim +++ b/vim/filetype.vim @@ -24,6 +24,7 @@ augroup filetypedetect " Apache config autocmd BufNewFile,BufRead \ .htaccess + \,htaccess \,*/apache*/?*.conf \ setfiletype apache " Assembly language files @@ -67,6 +68,16 @@ augroup filetypedetect autocmd BufNewFile,BufRead \ ?*.csv \ setfiletype csv + " Debian package sources + autocmd BufNewFile,BufRead + \ sources.list + \,*/etc/apt/sources.list.d/*.list + \ setfiletype debsources + " Desktop files + autocmd BufNewFile,BufRead + \ ?*.desktop + \,?*.directory + \ setfiletype desktop " Diff and patch files autocmd BufNewFile,BufRead \ ?*.diff @@ -76,6 +87,7 @@ augroup filetypedetect " INI format files autocmd BufNewFile,BufRead \ ?*.ini + \,.editorconfig \,perlcriticrc \,.perlcriticrc \ setfiletype dosini @@ -83,6 +95,10 @@ augroup filetypedetect autocmd BufNewFile,BufRead \ ?*.dot \ setfiletype dot + " NFS exports + autocmd BufNewFile,BufRead + \ exports + \ setfiletype exports " Forth autocmd BufNewFile,BufRead \ ?*.fs,?*.ft @@ -95,11 +111,18 @@ augroup filetypedetect autocmd BufNewFile,BufRead \ .gdbinit \ setfiletype gdb + " Gemini markup + autocmd BufNewFile,BufRead + \ *.gmi + \,*.gemini + \ setfiletype gemtext " Git commit messages autocmd BufNewFile,BufRead \ COMMIT_EDITMSG + \,EDIT_DESCRIPTION \,MERGE_MSG \,TAG_EDITMSG + \,NOTES_EDITMSG \ setfiletype gitcommit " Git config files autocmd BufNewFile,BufRead @@ -107,7 +130,7 @@ augroup filetypedetect \,.gitconfig \,.gitmodules \,gitconfig - \,~/.config/git/config + \,*/.config/git/config \ setfiletype gitconfig " Git rebase manifests autocmd BufNewFile,BufRead @@ -118,26 +141,29 @@ augroup filetypedetect \ *gnupg/options \,*gnupg/gpg.conf \ setfiletype gpg + " Golang + autocmd BufNewFile,BufRead + \ ?*.go + \ setfiletype go " UNIX group file autocmd BufNewFile,BufRead - \ /etc/group - \,/etc/group- - \,/etc/group.edit - \,/etc/gshadow - \,/etc/gshadow- - \,/etc/gshadow.edit + \ */etc/group + \,*/etc/group- + \,*/etc/group.edit + \,*/etc/gshadow + \,*/etc/gshadow- + \,*/etc/gshadow.edit \ setfiletype group " GTK settings files autocmd BufNewFile,BufRead - \ .gktrc*, - \,gktrc* + \ .gtkrc* + \,gtkrc* \ setfiletype gtkrc " Vim help files autocmd BufNewFile,BufRead - \ ~/.vim/doc/?*.txt + \ */*.vim/doc/?*.txt \,*/vim-*/doc/?*.txt \,*/vim/*/doc/?*.txt - \,*/*.vim/doc/?*.txt \,$VIMRUNTIME/doc/?*.txt \ setfiletype help " HTML files @@ -147,7 +173,7 @@ augroup filetypedetect \ setfiletype html " hosts(5) file autocmd BufNewFile,BufRead - \ /etc/hosts + \ */etc/hosts \ setfiletype hostconf " inittab(5) files autocmd BufNewFile,BufRead @@ -158,6 +184,10 @@ augroup filetypedetect \ ?*.java \,?*.jav \ setfiletype java + " Jinja2 templates + autocmd BufNewFile,BufRead + \ ?*.j2 + \ setfiletype jinja2 " JSON files autocmd BufNewFile,BufRead \ ?*.js @@ -183,10 +213,19 @@ augroup filetypedetect \,.emacs \,emacs \ setfiletype lisp + " Login configuration + autocmd BufNewFile,BufRead + \ */etc/login.defs + \ setf logindefs " Lua files autocmd BufNewFile,BufRead \ ?*.lua \ setfiletype lua + " Lynx configuration + au BufNewFile,BufRead + \ lynx.cfg + \,.lynxrc + \ setfiletype lynx " m4 files autocmd BufNewFile,BufRead \ ?*.m4 @@ -216,6 +255,16 @@ augroup filetypedetect \ ?*.markdown \,?*.md \ setfiletype markdown + " Meson configuration + autocmd BufNewFile,BufRead + \ meson.build + \,meson_options.txt + \ setfiletype meson + " SNMP MIB files + autocmd BufNewFile,BufRead + \ *.mib + \,*.my + \ setfiletype mib " Mutt configuration files autocmd BufNewFile,BufRead \ Muttrc @@ -223,7 +272,7 @@ augroup filetypedetect \,*/muttrc.d/?*.rc \,.muttrc \,muttrc - \,/etc/Muttrc.d/* + \,*/etc/Muttrc.d/* \ setfiletype muttrc " BIND configuration file autocmd BufNewFile,BufRead @@ -249,18 +298,18 @@ augroup filetypedetect \ setfiletype nroff " UNIX password and shadow files autocmd BufNewFile,BufRead - \ /etc/passwd - \,/etc/passwd- - \,/etc/passwd.edit - \,/etc/shadow - \,/etc/shadow- - \,/etc/shadow.edit + \ */etc/passwd + \,*/etc/passwd- + \,*/etc/passwd.edit + \,*/etc/shadow + \,*/etc/shadow- + \,*/etc/shadow.edit \ setfiletype passwd " Packet capture files autocmd BufNewFile,BufRead \ ?*.pcap \ setfiletype pcap - " Perl 5 files + " Perl files autocmd BufNewFile,BufRead \ ?*.pl \,?*.pm @@ -268,12 +317,6 @@ augroup filetypedetect \,*/xt/?*.t \,Makefile.PL \ setfiletype perl - " Perl 6 files - autocmd BufNewFile,BufRead - \ ?*.p6 - \,?*.pl6 - \,?*.pm6 - \ setfiletype perl6 " PHP files autocmd BufNewFile,BufRead \ ?*.php @@ -298,6 +341,9 @@ augroup filetypedetect " Python files autocmd BufNewFile,BufRead \ ?*.py + \,?*.pyw + \,?*.pythonstartup + \,?*.pythonrc \ setfiletype python " Readline configuration file autocmd BufNewFile,BufRead @@ -322,17 +368,27 @@ augroup filetypedetect autocmd BufNewFile,BufRead \ ?*.rb \ setfiletype ruby + " Rust + autocmd BufNewFile,BufRead + \ ?*.rs + \ setfiletype rust " Samba config autocmd BufNewFile,BufRead \ smb.conf \ setfiletype samba + " Scheme + au BufNewFile,BufRead + \ ?*.scm + \,*.ss + \,*.sld + \ setfiletype scheme " sed files autocmd BufNewFile,BufRead \ ?*.sed \ setfiletype sed " Services files autocmd BufNewFile,BufRead - \ /etc/services + \ */etc/services \ setfiletype services " Bash shell autocmd BufNewFile,BufRead @@ -365,12 +421,21 @@ augroup filetypedetect \,.shinit \,.shrc \,.xinitrc - \,/etc/default/* + \,.xprofile + \,.xsession + \,.xsessionrc + \,*/etc/default/* \,configure \,profile \,shinit \,shrc \,xinitrc + \,xprofile + \,xsession + \,xsessionrc + \,*/etc/X11/xinit + \,*/etc/X11/Xreset + \,*/etc/X11/Xsession \ let b:is_posix = 1 \|setfiletype sh " SQL @@ -378,17 +443,22 @@ augroup filetypedetect \ ?*.sql \ setfiletype sql " OpenSSH configuration + "" client autocmd BufNewFile,BufRead - \ ssh_config,*/.ssh/config + \ ssh_config + \,*/ssh_config.d/*.conf + \,*/.ssh/config, + \,*/.ssh/config.d/*.conf \ setfiletype sshconfig + "" server + autocmd BufNewFile,BufRead + \ sshd_config + \,*/sshd_config.d/*.conf + \ setfiletype sshdconfig " sudoers(5) autocmd BufNewFile,BufRead \ sudoers \,sudoers.tmp - \ setfiletype sshdconfig - " OpenSSH server configuration - autocmd BufNewFile,BufRead - \ sshd_config \ setfiletype sudoers " Subversion commit autocmd BufNewFile,BufRead @@ -396,8 +466,8 @@ augroup filetypedetect \ setfiletype svn " sysctl configuration files autocmd BufNewFile,BufRead - \ /etc/sysctl.conf - \,/etc/sysctl.d/*.conf + \ */etc/sysctl.conf + \,*/etc/sysctl.d/*.conf \ setfiletype sysctl " Systemd unit files autocmd BufNewFile,BufRead @@ -411,10 +481,6 @@ augroup filetypedetect autocmd BufNewFile,BufRead \ ?*.ti \ setfiletype terminfo - " TextEditorAnywhere text field - autocmd BufNewFile,BufRead - \ TextEditorAnywhere_??_??_??.txt - \ setfiletype textarea " Tidy config autocmd BufNewFile,BufRead \ .tidyrc @@ -425,6 +491,10 @@ augroup filetypedetect \ .tmux.conf \,tmux.conf \ setfiletype tmux + " TOML configuration files + autocmd BufNewFile,BufRead + \ ?*.toml + \ setfiletype toml " Tab-separated (TSV) files autocmd BufNewFile,BufRead \ ?*.tsv @@ -453,9 +523,7 @@ augroup filetypedetect " Add automatic commands to find .Xresources subfiles autocmd BufNewFile,BufRead \ .Xresources - \,*/.Xresources.d/* \,Xresources - \,*/Xresources.d/* \ setfiletype xdefaults " XHTML files autocmd BufNewFile,BufRead @@ -505,8 +573,8 @@ augroup filetypedetect " Clumsy attempt at typing files in `sudo -e` if a filename hasn't already " been found autocmd BufNewFile,BufRead - \ /var/tmp/?*????????.* - \,/var/tmp/?*.???????? + \ */var/tmp/?*????????.* + \,*/var/tmp/?*.???????? \ if !did_filetype() \| call filetype#repeat#Sudo() \|endif @@ -517,14 +585,14 @@ augroup filetypedetect \,?*.txt \,INSTALL \,README - \,/etc/issue - \,/etc/motd + \,*/etc/issue + \,*/etc/motd \ setfiletype text autocmd BufNewFile,BufRead \ ?*.cfg \,?*.conf \,?*.config - \,/etc/* + \,*/etc/* \ setfiletype conf autocmd BufNewFile,BufRead \ */log/* diff --git a/vim/ftplugin/textarea.vim b/vim/ftplugin/textarea.vim deleted file mode 100644 index 4db97b58..00000000 --- a/vim/ftplugin/textarea.vim +++ /dev/null @@ -1,12 +0,0 @@ -" Set mail message as an alternative filetype -if !exists('b:alternate_filetypes') - let b:alternate_filetypes = [&filetype, 'mail'] -endif - -" Stop here if the user doesn't want ftplugin mappings -if exists('no_plugin_maps') || exists('no_textarea_maps') - finish -endif - -" #s expands to the #signature tag used in Cerb -inoreabbrev #s #signature diff --git a/vim/plugin/matchit.vim b/vim/plugin/matchit.vim index f842bd9c..392b2728 100644 --- a/vim/plugin/matchit.vim +++ b/vim/plugin/matchit.vim @@ -1,5 +1,5 @@ " Get matchit.vim, one way or another -if has('packages') && !has('nvim') +if has('packages') packadd matchit else runtime macros/matchit.vim diff --git a/vim/scripts.vim b/vim/scripts.vim index 3c3c53cd..e025a77a 100644 --- a/vim/scripts.vim +++ b/vim/scripts.vim @@ -13,14 +13,14 @@ if s:line !~# '^#!' elseif s:line =~# '\<[gm]\=awk\d*\>' setfiletype awk -" Perl 5 +" Lua +elseif s:line =~# '\<lua\d*\>' + setfiletype lua + +" Perl elseif s:line =~# '\<perl5\=\>' setfiletype perl -" Perl 6 -elseif s:line =~# '\<perl6\>' - setfiletype perl6 - " PHP elseif s:line =~# '\<php\d*\>' setfiletype php diff --git a/vim/syntax/jinja2.vim b/vim/syntax/jinja2.vim new file mode 100644 index 00000000..2b4aef1a --- /dev/null +++ b/vim/syntax/jinja2.vim @@ -0,0 +1,2 @@ +" Django is similar enough to Jinja2 to be useful for highlighting +runtime! syntax/django.vim @@ -1,31 +1,31 @@ -" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -" Tom Ryder (tejr)’s Literate Vimrc -" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +" ----------------------------------- +" Tom Ryder (tejr)'s Literate Vimrc +" ----------------------------------- " -" Last updated: Fri, 09 Oct 2020 08:52:09 UTC +" Last updated: Fri, 06 May 2022 12:23:48 +0000 " -" │ And I was lifted up in heart, and thought -" │ Of all my late-shown prowess in the lists, -" │ How my strong lance had beaten down the knights, -" │ So many and famous names; and never yet -" │ Had heaven appeared so blue, nor earth so green, -" │ For all my blood danced in me, and I knew -" │ That I should light upon the Holy Grail. +" > And I was lifted up in heart, and thought +" > Of all my late-shown prowess in the lists, +" > How my strong lance had beaten down the knights, +" > So many and famous names; and never yet +" > Had heaven appeared so blue, nor earth so green, +" > For all my blood danced in me, and I knew +" > That I should light upon the Holy Grail. " -" —Tennyson +" ---Tennyson " -" │ your vimrc is better than the bible +" > your vimrc is better than the bible " -" —@polanco@mastodon.sdf.org +" ---@polanco@mastodon.sdf.org " <https://mastodon.sdf.org/@polanco/104069285780040986> " -" This file is an attempt at something like a “literate vimrc”, in the -" tradition of Donald Knuth’s “literate programming”: +" This file is an attempt at something like a "literate vimrc", in the +" tradition of Donald Knuth's "literate programming": " <http://www.literateprogramming.com/> " " The dotfiles project as part of which it is maintained is here: -" <https://sanctum.geek.nz/cgit/dotfiles.git> +" <https://dev.sanctum.geek.nz/cgit/dotfiles.git> " " This is a long file, and comments abound. Should this be bothersome, one " could execute this command in Vim itself, to strip out comment blocks and @@ -33,9 +33,9 @@ " " :g/\m^$\|^\s*"/d " -" This file should be saved as ‘vimrc’—note no leading period—in the user +" This file should be saved as `vimrc`---note no leading period---in the user " runtime directory. On GNU/Linux, Mac OS X, and BSD, that directory is -" ‘~/.vim’. On Windows, it’s ‘~/vimfiles’. It requires Vim v7.0.0 or newer, +" `~/.vim`. On Windows, it's `~/vimfiles`. It requires Vim v7.0.0 or newer, " including the +eval feature, and with the 'compatible' option turned off. " That's to allow line continuations. The vimrc stub at ~/.vimrc (Unix) or " ~/_vimrc (Windows) checks that these conditions are met before loading this @@ -45,25 +45,25 @@ " problems with this file. <https://github.com/Kuniwak/vint> " -" We’ll begin by making sure that this file and Vim are speaking the same -" language. Since it’s been the future for a few years now, this file +" We'll begin by making sure that this file and Vim are speaking the same +" language. Since it's been the future for a few years now, this file " indulges in characters outside the ASCII character set. The presence of " such characters prompts Vint to suggest declaring the file encoding with " a :scriptencoding command: " -" │ vim/vimrc:1:1: Use scriptencoding when multibyte char exists (see :help -" │ :scriptencoding) +" > vim/vimrc:1:1: Use scriptencoding when multibyte char exists (see :help +" > :scriptencoding) " " Furthermore, the :help for :scriptencoding specifies that :scriptencoding " should be set *after* 'encoding'. " " Which encoding to use? The answer is the UTF-8 encoding for Unicode, " wherever possible. On POSIX-fearing operating systems, I define the primary -" locale environment variable $LANG to ‘en_NZ.UTF-8’. This informs Vim’s +" locale environment variable $LANG to `en_NZ.UTF-8`. This informs Vim's " choice of internal character encoding. In the absence of such a setting, -" 'encoding' defaults to ‘latin1’ (ISO-8859-1) in most circumstances. Since +" 'encoding' defaults to `latin1` (ISO-8859-1) in most circumstances. Since " this is almost never what I want, even if I haven't said so explicitly by -" exporting $LANG, we’ll fall back to UTF-8 instead. +" exporting $LANG, we'll fall back to UTF-8 instead. " " However, we need to test that the +multi_byte feature is available before " doing any of this, because it was a compile-time feature that wasn't even @@ -79,42 +79,42 @@ if has('multi_byte') scriptencoding utf-8 endif -" With encoding handled, we’ll turn our attention to the value of the +" With encoding handled, we'll turn our attention to the value of the " 'runtimepath' option, since any scripts loaded from the paths specified " therein control so much of the behavior of Vim. We build this path up as -" accurately as possible, accounting for Vim’s unusual escaping behavior for +" accurately as possible, accounting for Vim's unusual escaping behavior for " these list options. " -" One of the first things we’ll need to be able to do is split the value of +" One of the first things we'll need to be able to do is split the value of " 'runtimepath' into its constituent paths. Correctly splitting the values of " comma-separated Vim options is surprisingly complicated. It's not as simple " as just splitting on commas, or even unescaped commas; a more accurate " definition of the delimiter is: " -" │ Any comma not preceded by a backslash, followed by any number of spaces -" │ and commas. +" > Any comma not preceded by a backslash, followed by any number of spaces +" > and commas. " " The pattern we use for the call to split() therefore breaks down like this: " -" \\ ← A literal backslash -" \@<! ← A negative lookbehind assertion; this means that whatever -" occurred before this pattern—in this case, a backslash—cannot -" precede what follows, but anything that *does* precede it is -" considered part of the datum, and not the delimiter. -" , ← A literal comma -" [, ]* ← Any number of commas and spaces +" \\ <- A literal backslash +" \@<! <- A negative lookbehind assertion; this means that whatever +" occurred before this pattern---in this case, a backslash--- +" cannot precede what follows, but anything that *does* precede it +" is considered part of the datum, and not the delimiter. +" , <- A literal comma +" [, ]* <- Any number of commas and spaces " -" We don’t, however, have to deal with backslashes before other backslashes, +" We don't, however, have to deal with backslashes before other backslashes, " nor before any other character. If this seems wrong to you, I encourage you " to read the source code for the ad-hoc tokenizer in copy_option_part() in -" src/misc2.c in Vim’s source code. +" src/misc2.c in Vim's source code. " " Vim, I do love you, but sometimes you're really weird. " " We fold all that mess away into an autoloaded function option#Split(); see " vim/autoload/option.vim. Provided a 'runtimepath' is actually set, using " the list returned from that function, we define an environment variable -" MYVIM—to complement MYVIMRC—for ~/.vim or ~/vimfiles, by retrieving the +" MYVIM---to complement MYVIMRC---for ~/.vim or ~/vimfiles, by retrieving the " first value from the 'runtimepath'. We'll use this later on in the file to " comprehensively match expected paths for vimrc files. " @@ -124,21 +124,19 @@ endif let $MYVIM = option#Split(&runtimepath)[0] " The next components of the runtime directory that we'll set up here will -" make use of the user’s configured XDG base directories: +" make use of the user's configured XDG base directories: " " <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html#variables> " " Note that this isn't an attempt to shoehorn all of Vim into the XDG mold; " all of this distribution's files are still expected to be installed into -" $MYVIM, per the above. We're just leaning on XDG’s conventions to provide +" $MYVIM, per the above. We're just leaning on XDG's conventions to provide " separate locations for cache files and other configuration. " " We'll start by retrieving the list of valid paths for configuration from " both the XDG_CONFIG_HOME and XDG_CONFIG_DIRS variables, or from their " defaults, using autoloaded xdg# functions. " -let s:xdgcachehome - \ = xdg#CacheHome() let s:xdgconfigdirs \ = xdg#ConfigDirs() let s:xdgconfighome @@ -147,19 +145,21 @@ let s:xdgdatadirs \ = xdg#DataDirs() let s:xdgdatahome \ = xdg#DataHome() +let s:xdgstatehome + \ = xdg#StateHome() " We put XDG_CONFIG_HOME at the front of the 'runtimepath' list with insert(), " provided it isn't empty, which is what the function returns when the " configured path isn't absolute. This is per the standard's dictum: " -" │ All paths set in these environment variables must be absolute. If an -" │ implementation encounters a relative path in any of these variables it -" │ should consider the path invalid and ignore it. +" > All paths set in these environment variables must be absolute. If an +" > implementation encounters a relative path in any of these variables it +" > should consider the path invalid and ignore it. " -" —XDG Base Directory Specification v0.7 (24th November 2010), "Basics", +" ---XDG Base Directory Specification v0.7 (24th November 2010), "Basics", " <https://specifications.freedesktop.org/basedir-spec/0.7/ar01s02.html> " -" Ours not to reason why… +" Ours not to reason why... " if s:xdgconfighome !=# '' || !empty(s:xdgconfigdirs) execute 'set runtimepath^='.option#Escape(join(map( @@ -184,16 +184,16 @@ endif " write its own history to the default viminfo path instead. " " This is the portable way to specify the path to the viminfo file, as an -" addendum of the path to the 'viminfo' option with an ‘n’ prefix. Vim +" addendum of the path to the 'viminfo' option with an `n` prefix. Vim " v8.1.716 introduced a way to set this with an option named 'viminfofile', " but I don't see a reason to use that. " -if s:xdgcachehome !=# '' - if !isdirectory(s:xdgcachehome) - call mkdir(s:xdgcachehome, 'p', 0700) +if s:xdgstatehome !=# '' + if !isdirectory(s:xdgstatehome) + call mkdir(s:xdgstatehome, 'p', 0700) endif execute 'set viminfo+='.option#Escape( - \ 'n'.s:xdgcachehome.'/viminfo' + \ 'n'.s:xdgstatehome.'/viminfo' \) endif @@ -207,16 +207,16 @@ endif " set history=300 -" We’ll now enable automatic backups of most file buffers, since that’s off by -" default. In practice, I don’t need these backups very much, at least if I’m +" We'll now enable automatic backups of most file buffers, since that's off by +" default. In practice, I don't need these backups very much, at least if I'm " using version control sensibly, but they have still saved my bacon a few " times. " -" We’ll try to keep the backup files in a dedicated cache directory, to stop +" We'll try to keep the backup files in a dedicated cache directory, to stop " them popping up next to the file to which they correspond, and getting " accidentally committed to version control. " -" If Vim is new enough, we’ll add two trailing slashes to the path we’re +" If Vim is new enough, we'll add two trailing slashes to the path we're " inserting, which prompts Vim to incorporate the full escaped path of the " relevant buffer in the backup filename, avoiding collisions. " @@ -224,26 +224,26 @@ set history=300 " this trailing slashes hint for a long time before 'backupdir' caught up to " them. The 'directory' option for swap files has supported it at least as " far back as v5.8.0 (2001), and 'undodir' appears to have supported it since -" its creation in v7.2.438. Even though ‘:help 'backupdir'’ didn’t say so, +" its creation in v7.2.438. Even though `:help 'backupdir'` didn't say so, " people assumed it would work the same way, when in fact Vim simply ignored " it until v8.1.0251. " -" I don’t want to add the slashes to the option value in older versions of Vim -" where they don’t do anything, so we’ll check the version ourselves to see if -" there’s any point in including them. +" I don't want to add the slashes to the option value in older versions of Vim +" where they don't do anything, so we'll check the version ourselves to see if +" there's any point in including them. " " <https://github.com/vim/vim/releases/tag/v8.1.0251> " -" It’s all so awkward. Surely separate options named something like +" It's all so awkward. Surely separate options named something like " 'backupfullname', 'swapfilefullname' would have been clearer. " set backup -if s:xdgcachehome !=# '' - if !isdirectory(s:xdgcachehome.'/backup') - call mkdir(s:xdgcachehome.'/backup', 'p', 0700) +if s:xdgstatehome !=# '' + if !isdirectory(s:xdgstatehome.'/backup') + call mkdir(s:xdgstatehome.'/backup', 'p', 0700) endif execute 'set backupdir^='.option#Escape(option#item#Escape( - \ s:xdgcachehome.'/backup'.(patch#('8.1.251') ? '//' : '') + \ s:xdgstatehome.'/backup'.(patch#('8.1.251') ? '//' : '') \)) endif @@ -255,13 +255,13 @@ endif " if has('unix') - " Prior to v8.1.1519, Vim didn’t check patterns added to 'backupskip' for - " uniqueness, so adding the same path repeatedly resulted in duplicate strings - " in the value. This was due to the absence of the P_NODUP flag for the - " option’s definition in src/option.c in the Vim source code. If we’re using - " a version older than v8.1.1519, we’ll need to explicitly reset 'backupskip' - " to its default value before adding patterns to it, so that reloading this - " file doesn’t stack up multiple copies of any added paths. + " Prior to v8.1.1519, Vim didn't check patterns added to 'backupskip' for + " uniqueness, so adding the same path repeatedly resulted in duplicate + " strings in the value. This was due to the absence of the P_NODUP flag for + " the option's definition in src/option.c in the Vim source code. If we're + " using a version older than v8.1.1519, we'll need to explicitly reset + " 'backupskip' to its default value before adding patterns to it, so that + " reloading this file doesn't stack up multiple copies of any added paths. " " <https://github.com/vim/vim/releases/tag/v8.1.1519> " @@ -270,7 +270,7 @@ if has('unix') endif " Typical temporary file locations - "" RAM disk, default path for password-store’s temporary files + "" RAM disk, default path for password-store's temporary files set backupskip+=/dev/shm/* "" Hard-coded paths for sudoedit set backupskip+=/usr/tmp/*,/var/tmp/* @@ -299,12 +299,12 @@ endif " its name, in order to avoid filename collisions, since the 'directory' " option has supported that hint for much longer than 'backupdir' has. " -if s:xdgcachehome !=# '' - if !isdirectory(s:xdgcachehome.'/swap') - call mkdir(s:xdgcachehome.'/swap', 'p', 0700) +if s:xdgstatehome !=# '' + if !isdirectory(s:xdgstatehome.'/swap') + call mkdir(s:xdgstatehome.'/swap', 'p', 0700) endif execute 'set directory^='.option#Escape(option#item#Escape( - \ s:xdgcachehome.'/swap//' + \ s:xdgstatehome.'/swap//' \)) endif @@ -315,18 +315,18 @@ endif " The 'undodir' option has the same structure as 'backupdir' and 'directory'; " if we have a user cache directory, create a subdirectory within it dedicated " to the undo files cache. Note also the trailing double-slash as a signal to -" Vim to use the full path of the original file in its undo file cache’s name. +" Vim to use the full path of the original file in its undo file cache's name. " " Support for these persistent undo file caches was not released until v7.3.0, -" so we need to check for the feature’s presence before we enable it. +" so we need to check for the feature's presence before we enable it. " -if s:xdgcachehome !=# '' && has('persistent_undo') +if s:xdgstatehome !=# '' && has('persistent_undo') set undofile - if !isdirectory(s:xdgcachehome.'/undo') - call mkdir(s:xdgcachehome.'/undo', 'p', 0700) + if !isdirectory(s:xdgstatehome.'/undo') + call mkdir(s:xdgstatehome.'/undo', 'p', 0700) endif execute 'set undodir^='.option#Escape(option#item#Escape( - \ s:xdgcachehome.'/undo//' + \ s:xdgstatehome.'/undo//' \)) endif @@ -335,12 +335,12 @@ endif " directories of this type. This isn't a comma-separated list like the others " ('backupdir', 'directory', 'spell', 'undodir') " -if s:xdgcachehome !=# '' && has('mksession') - if !isdirectory(s:xdgcachehome.'/view') - call mkdir(s:xdgcachehome.'/view', 'p', 0700) +if s:xdgstatehome !=# '' && has('mksession') + if !isdirectory(s:xdgstatehome.'/view') + call mkdir(s:xdgstatehome.'/view', 'p', 0700) endif execute 'set viewdir='.option#Escape(option#item#Escape( - \ s:xdgcachehome.'/view' + \ s:xdgstatehome.'/view' \)) endif @@ -398,7 +398,7 @@ if exists('##SourceCmd') \ ReloadVimrc endif -" For spelling, use New Zealand English by default, but later on we’ll +" For spelling, use New Zealand English by default, but later on we'll " configure a leader mapping to switch to United States English, since I so " often have to write for Yankees. " @@ -407,11 +407,11 @@ set spelllang=en_nz " Spell checking includes optional support for catching lower case letters at " the start of sentences, and defines a pattern in 'spellcapcheck' for the end " of a sentence. The default is pretty good, but with two-spacing with -" 'cpoptions' including ‘J’ and 'formatoptions' including ‘p’ as set later in +" 'cpoptions' including `J` and 'formatoptions' including `p` as set later in " this file, we can be less ambiguous in this pattern. We require two " consecutive spaces, a newline, a carriage return, or a tab to mark the end -" of a sentence. This means that we could make abbreviations like “i.e. -" something” without flagging “something” as a spelling error. +" of a sentence. This means that we could make abbreviations like "i.e. +" something" without flagging "something" as a spelling error. " set spellcapcheck=[.?!]\\%(\ \ \\\|[\\n\\r\\t]\\) @@ -427,18 +427,18 @@ if exists('+spelloptions') endif " For word completion in insert mode with CTRL-X CTRL-K, or if 'complete' -" includes the ‘k’ flag, the 'dictionary' option specifies the path to the +" includes the `k` flag, the 'dictionary' option specifies the path to the " system word list. This makes the dictionary completion work consistently, -" even if 'spell' isn’t set at the time to coax it into using 'spellfile'. +" even if 'spell' isn't set at the time to coax it into using 'spellfile'. " -" It’s not an error if the system directory file added first doesn’t exist; -" it’s just a common location that often yields a workable word list, and does +" It's not an error if the system directory file added first doesn't exist; +" it's just a common location that often yields a workable word list, and does " so on all of my main machines. " " At some point, I may end up having to set this option along with 'spellfile' " a bit more intelligently to ensure that spell checking and dictionary " function consistently, and with reference to the same resources. For the -" moment, I’ve just added additional entries referring to the user runtime +" moment, I've just added additional entries referring to the user's data " directory. " set dictionary^=/usr/share/dict/words @@ -453,11 +453,11 @@ if s:xdgdatahome !=# '' || !empty(s:xdgdatadirs) endif " In much the same way as 'dictionary', we add an expected path to -" a thesaurus, for completion with CTRL-X CTRL-T in insert mode, or with ‘t’ -" added to 'completeopt'. The thesaurus data isn’t installed as part of the -" default ‘install-vim’ target in tejr’s dotfiles, but a decent one can be +" a thesaurus, for completion with CTRL-X CTRL-T in insert mode, or with `t` +" added to 'completeopt'. The thesaurus data isn't installed as part of the +" default `install-vim` target in tejr's dotfiles, but a decent one can be " retrieved from my website at <https://sanctum.geek.nz/ref/thesaurus.txt>. -" I got this from the link in the :help for 'thesaurus' in v8.1. It’s from +" I got this from the link in the :help for 'thesaurus' in v8.1. It's from " WordNet and MyThes-1. I had to remove the first two metadata lines from " thesaurus.txt, as Vim appeared to interpret them as part of the body data. " @@ -471,11 +471,11 @@ if s:xdgdatahome !=# '' || !empty(s:xdgdatadirs) \), ',')) endif -" Next, we’ll modernize a little in adjusting some options with old +" Next, we'll modernize a little in adjusting some options with old " language-specific defaults. " " Traditional vi was often used for development in the C programming language. -" The default values for a lot of Vim’s options still reflect this common use +" The default values for a lot of Vim's options still reflect this common use " pattern. In this case, the 'comments' and 'commentstring' options reflect " the C syntax for comments: " @@ -490,20 +490,20 @@ endif " " #include "baz.h" " -" Times change, however, and I don’t get to work with C nearly as much as I’d +" Times change, however, and I don't get to work with C nearly as much as I'd " like. The defaults for these options no longer make sense, and so we blank " them, compelling filetype plugins to set them as they need instead. " " The default value for the 'path' option is similar, in that it has an aged " default; this option specifies directories in which project files and -" includes can be unearthed by navigation commands like 'gf'. Specifically, -" its default value comprises /usr/include, which is another C default. Let’s +" includes can be unearthed by navigation commands like `gf`. Specifically, +" its default value comprises /usr/include, which is another C default. Let's " get rid of that, too. " set comments= commentstring= define= include= set path-=/usr/include -" Relax traditional vi’s harsh standards over what regions of the buffer can +" Relax traditional vi's harsh standards over what regions of the buffer can " be removed with backspace in insert mode. While this admittedly allows bad " habits to continue, since insert mode by definition is not really intended " for deleting text, I feel the convenience outweighs that in this case. @@ -513,7 +513,7 @@ set backspace+=indent " Leading whitespace characters created by 'autoindent' set backspace+=start " Text before the start of the current insertion " When soft-wrapping text with the 'wrap' option on, which is off by default, -" break the lines between words, rather than within them; it’s much easier to +" break the lines between words, rather than within them; it's much easier to " read. " set linebreak @@ -526,9 +526,9 @@ set linebreak " … U+2026 HORIZONTAL ELLIPSIS " " Note that we test for the presence of a multi-byte encoding with a special -" feature from ‘:help feature-list’, as recommended by ‘:help encoding’. -" Checking that ‘&encoding ==# 'utf-8'’ is not quite the same thing, though -" it’s unlikely I’ll ever use a different Unicode encoding by choice. +" feature from `:help feature-list`, as recommended by `:help encoding`. +" Checking that `&encoding ==# 'utf-8'` is not quite the same thing, though +" it's unlikely I'll ever use a different Unicode encoding by choice. " if has('multi_byte_encoding') set showbreak=… @@ -538,16 +538,16 @@ endif " The visual structure of code provided by indents breaks down if a lot of the " lines wrap. Ideally, most if not all lines would be kept below 80 -" characters, but in cases where this isn’t possible, soft-wrapping longer +" characters, but in cases where this isn't possible, soft-wrapping longer " lines when 'wrap' is on so that the indent is preserved in the following " line mitigates this breakdown somewhat. " -" With this 'breakindent' option set, it’s particularly important to have +" With this 'breakindent' option set, it's particularly important to have " 'showbreak' set to something besides an empty string, as done above, -" otherwise without line numbers it’s hard to tell what’s a logical line and -" what’s not. +" otherwise without line numbers it's hard to tell what's a logical line and +" what's not. " -" The 'breakindent' option wasn’t added until v7.4.338, so we need to check it +" The 'breakindent' option wasn't added until v7.4.338, so we need to check it " exists before we set it. " " <https://github.com/vim/vim/releases/tag/v7.4.338> @@ -558,18 +558,18 @@ endif " Rather than rejecting operations like :write or :saveas when 'readonly' is " set or in other situations in which data might be lost, Vim should give me -" a prompt to allow me to confirm that I know what I’m doing. +" a prompt to allow me to confirm that I know what I'm doing. " set confirm -" If Vim receives an Escape key code in insert mode, it shouldn’t wait to see -" if it’s going to be followed by another key code, despite this being how the +" If Vim receives an Escape key code in insert mode, it shouldn't wait to see +" if it's going to be followed by another key code, despite this being how the " function keys and Meta/Alt modifier are implemented for many terminal types. -" Otherwise, if I press Escape, there’s an annoying delay before 'showmode' -" stops showing '--INSERT--'. +" Otherwise, if I press Escape, there's an annoying delay before 'showmode' +" stops showing `--INSERT--`. " " This breaks the function keys and the Meta/Alt modifier in insert mode in -" most or maybe all of the terminals I use, but I don’t want those keys in +" most or maybe all of the terminals I use, but I don't want those keys in " insert mode, anyway. All of this works fine in the GUI, of course. " set noesckeys @@ -580,35 +580,35 @@ set noesckeys set foldlevel=256 " Automatic text wrapping options using flags in the 'formatoptions' option -" begin here. I rely on the filetype plugins to set the ‘t’ and ‘c’ flags for +" begin here. I rely on the filetype plugins to set the `t` and `c` flags for " this option to configure whether text or comments should be wrapped, as -" appropriate for the document type or language, and so I don’t mess with +" appropriate for the document type or language, and so I don't mess with " either of those flags here. " If a line is already longer than 'textwidth' would otherwise limit when -" editing of that line begins in insert mode, don’t suddenly automatically -" wrap it; I’ll break it apart myself with a command like ‘gq’. This doesn’t -" seem to stop paragraph reformatting with ‘a’, if that’s set. +" editing of that line begins in insert mode, don't suddenly automatically +" wrap it; I'll break it apart myself with a command like `gq`. This doesn't +" seem to stop paragraph reformatting with `a`, if that's set. " set formatoptions+=l -" Don’t wrap a line in such a way that a single-letter word like “I” or “a” is +" Don't wrap a line in such a way that a single-letter word like "I" or "a" is " at the end of it. Typographically, as far as I can tell, this seems to be -" a stylistic preference rather than a rule, rather like avoiding “widow” and -" “orphan” lines in typesetting. I think it generally looks better to have -" the short word start the line, so we’ll switch it on. +" a stylistic preference rather than a rule, rather like avoiding "widow" and +" "orphan" lines in typesetting. I think it generally looks better to have +" the short word start the line, so we'll switch it on. " set formatoptions+=1 " If the filetype plugins have correctly described what the comment syntax for -" the buffer’s language looks like, it makes sense to use that to figure out +" the buffer's language looks like, it makes sense to use that to figure out " how to join lines within comments without redundant comment syntax cropping -" up. For example, with this set, joining lines in this very comment with ‘J’ -" would remove the leading ‘"’ characters. +" up. For example, with this set, joining lines in this very comment with `J` +" would remove the leading `"` characters. " -" This 'formatoptions' flag wasn’t added until v7.3.541. Because we can’t +" This 'formatoptions' flag wasn't added until v7.3.541. Because we can't " test for the availability of option flags directly, we resort to a version -" number check before attempting to set it. I don’t like using :silent! to +" number check before attempting to set it. I don't like using :silent! to " suppress errors for this sort of thing when I can reasonably avoid it, even " if the tests are somewhat more verbose. " @@ -618,37 +618,37 @@ if patch#('7.3.541') set formatoptions+=j endif -" A momentary digression here into the doldrums of 'cpoptions'—after staunchly -" opposing it for years, I have converted to two-spacing. You can blame Steve -" Losh: +" A momentary digression here into the doldrums of 'cpoptions'---after +" staunchly opposing it for years, I have converted to two-spacing. You can +" blame Steve Losh: " " <http://stevelosh.com/blog/2012/10/why-i-two-space/> " -" Consequently, we specify that sentence objects for the purposes of the ‘s’ -" text object, the ‘(’ and ‘)’ sentence motions, and formatting with the 'gq' +" Consequently, we specify that sentence objects for the purposes of the `s` +" text object, the `(` and `)` sentence motions, and formatting with the 'gq' " command must be separated by *two* spaces. One space does not suffice. " " My defection to the two-spacers is also the reason I now leave 'joinspaces' " set, per its default, so that two spaces are inserted when consecutive -" sentences separated by a line break are joined onto one line by the ‘J’ +" sentences separated by a line break are joined onto one line by the `J` " command. " set cpoptions+=J " Separating sentences with two spaces has an advantage in making a clear " distinction between two different types of periods: periods that abbreviate -" longer words, as in “Mr. Moolenaar”, and periods that terminate sentences, +" longer words, as in "Mr. Moolenaar", and periods that terminate sentences, " like this one. " -" If we’re using two-period spacing for sentences, Vim can interpret the +" If we're using two-period spacing for sentences, Vim can interpret the " different spacing to distinguish between the two types, and can thereby " avoid breaking a line just after an abbreviating period. For example, the -" two words in “Mr. Moolenaar” should never be split apart, lest the -" abbreviation “Mr.” look too much like the end of a sentence. This also +" two words in "Mr. Moolenaar" should never be split apart, lest the +" abbreviation "Mr." look too much like the end of a sentence. This also " preserves the semantics of that same period for subsequent reformatting; its -" single-space won’t get lost. +" single-space won't get lost. " -" So, getting back to our 'formatoptions' settings, that is what the ‘p’ flag +" So, getting back to our 'formatoptions' settings, that is what the `p` flag " does. I wrote the patch that added it, after becoming envious of an " analogous feature during an ill-fated foray into GNU Emacs usage. " @@ -660,9 +660,9 @@ endif " In an effort to avoid loading unnecessary files, we add a flag to the " 'guioptions' option to prevent the menu.vim runtime file from being loaded. -" It doesn’t do any harm, but I never use it, and it’s easy to turn it off. +" It doesn't do any harm, but I never use it, and it's easy to turn it off. " -" The documentation for this flag in ‘:help 'go-M'’ includes a note saying the +" The documentation for this flag in `:help 'go-M'` includes a note saying the " flag should be set here, rather that in the GUI-specific gvimrc file, as one " might otherwise think. " @@ -670,19 +670,19 @@ if has('gui_running') set guioptions+=M endif -" By default, Vim doesn’t allow a file buffer to have unwritten changes if -" it’s not displayed in a window. Setting this option removes that +" By default, Vim doesn't allow a file buffer to have unwritten changes if +" it's not displayed in a window. Setting this option removes that " restriction so that buffers can remain in a modified state while not " actually displayed anywhere. " -" This option is set in almost every vimrc I read; it’s so pervasive that -" I sometimes see comments expressing astonishment or annoyance that it isn’t -" set by default. However, I didn’t actually need this option for several +" This option is set in almost every vimrc I read; it's so pervasive that +" I sometimes see comments expressing astonishment or annoyance that it isn't +" set by default. However, I didn't actually need this option for several " years of Vim usage, because I instinctively close windows onto buffers only " after the buffers within them have been written anyway. " " However, the option really is required for batch operations performed with -" commands like :argdo or :bufdo, because Vim won’t otherwise tolerate +" commands like :argdo or :bufdo, because Vim won't otherwise tolerate " unwritten changes to a litany of buffers that are not displayed in any " window. After I started using such command maps a bit more often, " I realized I finally had a reason to turn this on permanently. @@ -697,16 +697,16 @@ set hidden set hlsearch nohlsearch -" Highlight search matches in my text while I’m still typing my pattern, +" Highlight search matches in my text while I'm still typing my pattern, " including scrolling the screen to show the first such match if necessary. " This can be somewhat jarring, particularly when the cursor ends up scrolling " a long way from home in a large file, but I think the benefits of being able -" to see instances of what I’m trying to match as I type the pattern do +" to see instances of what I'm trying to match as I type the pattern do " outweigh that discomfort. " set incsearch -" Don’t waste cycles and bandwidth redrawing the screen during execution of +" Don't waste cycles and bandwidth redrawing the screen during execution of " macro recordings and scripts. " set lazyredraw @@ -723,19 +723,19 @@ set listchars+=trail:- " Trailing spaces set listchars+=nbsp:+ " Non-breaking spaces " The next pair of 'list' characters are arguably somewhat misplaced, in that -" they don’t really represent invisible characters in the same way as the +" they don't really represent invisible characters in the same way as the " others, but are hints for the presence of other characters on unwrapped -" lines that are wider than the screen. They’re very useful, though. +" lines that are wider than the screen. They're very useful, though. " " If the current encoding supports it, use these non-ASCII characters for the -" markers, as they’re visually distinctive: +" markers, as they're visually distinctive: " " extends: Signals presence of unwrapped text to screen right " » U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK " precedes: Signals presence of unwrapped text to screen left " « U+00BB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK " -" Failing that, ‘<’ and ‘>’ will do the trick. +" Failing that, `<` and `>` will do the trick. " if has('multi_byte_encoding') set listchars+=extends:»,precedes:« @@ -743,19 +743,19 @@ else set listchars+=extends:>,precedes:< endif -" Don’t let your editor’s options be configured by content in arbitrary files! -" Down with modelines! Purge them from your files! Écrasez l’infâme! +" Don't let your editor's options be configured by content in arbitrary files! +" Down with modelines! Purge them from your files! Écrasez l'infâme! " -" I think that modelines are Vim’s worst misfeature, and that 'nomodeline' -" should be the default. It’s enabled pretty bad security vulnerabilities -" over the years, and it’s a lot more effective to use filetype detection, +" I think that modelines are Vim's worst misfeature, and that 'nomodeline' +" should be the default. It's enabled pretty bad security vulnerabilities +" over the years, and it's a lot more effective to use filetype detection, " other automatic command hooks, or methods like .editorconfig to set " variables specifically for a buffer or project. " set nomodeline " The only octal numbers I can think of that I ever even encounter are Unix -" permissions masks, and I’d never use CTRL-A or CTRL-X to increment them. +" permissions masks, and I'd never use CTRL-A or CTRL-X to increment them. " Numbers with leading zeroes are far more likely to be decimals. " set nrformats-=octal @@ -771,7 +771,7 @@ set nrformats-=octal set noruler " Sessions preserve window, tab, and buffer layout, and are thereby great for -" more complex and longer-term projects like books, but they don’t play +" more complex and longer-term projects like books, but they don't play " together well with plugins and filetype plugins. Restoring the same " settings from both reloaded plugins and from the session causes screeds of " errors. Adjusting session behavior to stop it trying to restore the sorts @@ -780,65 +780,60 @@ set noruler set sessionoptions-=localoptions " No buffer options or mappings set sessionoptions-=options " No global options or mappings -" Turn 'showcmd' off if a system vimrc has been rude enough to set it; I don’t +" Turn 'showcmd' off if a system vimrc has been rude enough to set it; I don't " like how it can interfere with the display of longer lines. " set noshowcmd -" The ‘I’ flag for the 'shortmess' option prevents the display of the Vim +" The `I` flag for the 'shortmess' option prevents the display of the Vim " startup screen with version information, :help hints, and donation -" suggestion. After I registered Vim and donated to Uganda per the screen’s -" plea, I didn’t feel bad about turning this off anymore. Even with this -" setting in place, I wouldn’t normally see it too often anyway, as I seldom +" suggestion. After I registered Vim and donated to Uganda per the screen's +" plea, I didn't feel bad about turning this off anymore. Even with this +" setting in place, I wouldn't normally see it too often anyway, as I seldom " start Vim with no file arguments. " -" I haven’t felt the need to mess with the other flags in this option. -" I don’t have any problems with spurious Enter prompts, which seems to be the +" I haven't felt the need to mess with the other flags in this option. +" I don't have any problems with spurious Enter prompts, which seems to be the " main reason people pile it full of letters. " set shortmess+=I " I find the defaults of new windows opening above or to the left of the -" previous window too jarring, because I’m used to both the i3 window manager +" previous window too jarring, because I'm used to both the i3 window manager " and the tmux terminal multiplexer doing it the other way around, in reading " order. I prefer the visual effect of the previous text staying where it is, " and the new window occupying previously blank space. " set splitbelow splitright -" Vim has an internal list of terminal types that support using smoother -" terminal redrawing, and for which 'ttyfast' is normally set, described in -" ‘:help 'ttyfast'’. That list includes most of the terminals I use, but -" there are a couple more for which the 'ttyfast' option should apply: the -" windows terminal emulator PuTTY, and the terminal multiplexer tmux, both of -" which I use heavily. +" I don't like the titles of my terminal windows being changed, especially +" when changing them back doesn't actually work. Just leave them alone, Vim, +" even if you think you can handle it. " -if &term =~# '^putty\|^tmux' - set ttyfast -endif +set notitle -" We really don’t want a mouse; while I use it a lot for cut and paste in X, +" We really don't want a mouse; while I use it a lot for cut and paste in X, " it just gets in the way if the tool running in the terminal tries to use it " too. Mouse events should be exclusively handled by the terminal emulator -" application, so Vim shouldn’t try to give me terminal mouse support, even if +" application, so Vim shouldn't try to give me terminal mouse support, even if " it would work. " " The manual suggests that disabling this should be done by clearing 't_RV', -" but that didn’t actually seem to work when I tried it. +" but that didn't actually seem to work when I tried it. " set ttymouse= " While using virtual block mode, allow me to navigate to any column of the -" buffer window; don’t confine the boundaries of the block to the coordinates +" buffer window; don't confine the boundaries of the block to the coordinates " of characters that actually exist in the buffer text. While working with -" formatted columnar data with this off is generally OK, it’s a hassle for +" formatted columnar data with this off is generally OK, it's a hassle for " more subtle applications of visual block mode. " set virtualedit+=block -" I can’t recall a time that Vim’s error beeping or flashing was actually +" I can't recall a time that Vim's error beeping or flashing was actually " useful to me, and so we turn it off in the manner that the manual instructs -" in ‘:help 'visualbell'’. This enables visual rather than audio error bells, +" in `:help 'visualbell'`. This enables visual rather than audio error bells, " but in the same breath, blanks the terminal attribute that would be used to " trigger such screen blinking, indirectly disabling the bell altogether. " @@ -857,7 +852,7 @@ set visualbell t_vb= " " The default value of 'full' for the 'wildmode' option puts the full " completion onto the line immediately, which I tolerate for insert mode -" completion but don’t really like on the Ex command line. Instead, I arrange +" completion but don't really like on the Ex command line. Instead, I arrange " for that to happen only with a second key press. " set wildmenu @@ -865,7 +860,7 @@ set wildmode=list:longest,full " Define a list of patterns to ignore for file and directory command line " completion. Files and directories with names matching any of these patterns -" won’t be presented as candidates for tab completion on the command line. +" won't be presented as candidates for tab completion on the command line. " " To make this list, I went right through my home directory with " a `find`-toothed comb; counted the occurrences of every extension, forced @@ -874,7 +869,7 @@ set wildmode=list:longest,full " " The following incantation does the trick with POSIX-compatible shell tools, " giving patterns for the top 100 alphanumeric extensions for files from the -" running user’s home directory: +" running user's home directory: " " $ (LC_ALL=C ; find "$HOME" ! -type d -name '*.?*' -exec \ " sh -c 'for fn ; do @@ -889,9 +884,9 @@ set wildmode=list:longest,full " " I turned out to have rather a lot of .html and .vim files. " -" If you’re scoffing at that and thinking “I could write a much simpler one,” +" If you're scoffing at that and thinking "I could write a much simpler one," " please do so, and send it to me at <tom@sanctum.geek.nz> to have yours put -" in here instead, with appropriate credit. Don’t forget to handle more than +" in here instead, with appropriate credit. Don't forget to handle more than " ARG_MAX files, include filenames with newlines, and that the -z or -0 null " separator extensions are not standardized in POSIX. " @@ -907,12 +902,12 @@ set wildignore=*~,#*#,*.7z,.DS_Store,.git,.hg,.svn,*.a,*.adf,*.asc,*.au,*.aup " Allow me to type a path to complete on the Ex command line in all-lowercase, " and transform the consequent completion to match the appropriate case, like -" the Readline setting ‘completion-ignore-case’ can be used for GNU Bash. +" the Readline setting `completion-ignore-case` can be used for GNU Bash. " " When completing filenames on the command line, choose completions without " regard to case, allowing me the ease of typing a partial path in " all-lowercase. This is very similar to the Readline setting -" ‘completion-ignore-case’ used for Bash. +" `completion-ignore-case` used for Bash. " " The 'wildignorecase' option is not related to the similarly-named " 'wildignore' option, nor to the +wildmenu feature. @@ -926,7 +921,7 @@ if exists('+wildignorecase') set wildignorecase endif -" Enable syntax highlighting, but only if it’s not already on, to save +" Enable syntax highlighting, but only if it's not already on, to save " reloading the syntax files unnecessarily. " " <https://sanctum.geek.nz/blinkenlights/syntax-on.jpg> @@ -934,41 +929,41 @@ endif " For several months in 2018, as an experiment, I tried using terminals with " no color at all, imitating a phenomenally productive BSD purist co-worker " who abhorred color in any form on his terminals. He only drank black -" coffee, too. If you’re reading this: Hello, bdh! +" coffee, too. If you're reading this: Hello, bdh! " " That experiment was instructive and interesting, and I found I had been " leaning on color information in some surprising ways. However, some months " later, I found I still missed my colors, and so I went back to my -" Kodachrome roots, and didn’t pine at all for that monochrome world. +" Kodachrome roots, and didn't pine at all for that monochrome world. " " The thing I most like about syntax highlighting is detecting runaway " strings, which generally works in even the most threadbare language syntax -" highlighting definitions. I kept missing such errors when I didn’t have the -" colors. I don’t have high standards for it otherwise, except maybe for +" highlighting definitions. I kept missing such errors when I didn't have the +" colors. I don't have high standards for it otherwise, except maybe for " shell script. " if !exists('syntax_on') syntax enable endif -" Before we attempt to pick a syntax highlighting color scheme, we’ll set up +" Before we attempt to pick a syntax highlighting color scheme, we'll set up " a couple of hooks for color scheme loading. In this case, we turn -" 'cursorline' on if my 'sahara' color scheme is loaded, since I’ve configured -" it to be a very dark gray that doesn’t stand out too much against a black +" 'cursorline' on if my 'sahara' color scheme is loaded, since I've configured +" it to be a very dark gray that doesn't stand out too much against a black " background. For any other color scheme, turn the option off, because it " almost always stands out too much for my liking. " -" You’d think the pattern here could be used to match the color scheme name, -" and it can be—after patch v7.4.108, when Christian Brabandt fixed it. Until -" that version, it matched against the current buffer name, so we’re forced to -" have an explicit test in the command instead. +" You'd think the pattern here could be used to match the color scheme name, +" and it can be---after patch v7.4.108, when Christian Brabandt fixed it. +" Until that version, it matched against the current buffer name, so we're +" forced to have an explicit test in the command instead. " " <https://github.com/vim/vim/releases/tag/v7.4.108> " autocmd vimrc ColorScheme * \ call colorscheme#UpdateCursorline(g:colors_name, ['sahara']) -" Use 'dark' as my default value for 'background', in the absence of an +" Use `dark` as my default value for 'background', in the absence of an " environment variable COLORFGBG or a response in v:termrbgresp that would set " it specifically. " @@ -981,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 @@ -1002,33 +997,33 @@ endif " use selection mode directly. " " * Avoid mapping in insert mode; let characters be literal to the greatest -" extent possible, and avoid “doing more” in insert mode besides merely -" inserting text as it’s typed. +" extent possible, and avoid "doing more" in insert mode besides merely +" inserting text as it's typed. " " * Avoid key chords with CTRL in favor of leader keys. " " * Never use Alt/Meta key chords; the terminal support for them is just too " confusing and flaky. " -" * Don’t suppress display of mapped commands for no reason; it’s OK to show -" the user the command that’s being run under the hood. Do avoid HIT-ENTER +" * Don't suppress display of mapped commands for no reason; it's OK to show +" the user the command that's being run under the hood. Do avoid HIT-ENTER " prompts, though. " -" * Avoid shadowing any of Vim’s existing functionality. If possible, extend +" * Avoid shadowing any of Vim's existing functionality. If possible, extend " or supplement what Vim does, rather than replacing it. " -" We’ll start with the non-leader mappings. Ideally, there shouldn’t be too +" We'll start with the non-leader mappings. Ideally, there shouldn't be too " many of these. " -" Use backspace as an even quicker way to switch to the current buffer’s +" Use backspace as an even quicker way to switch to the current buffer's " alternate buffer. User nickspoons of #vim was incredulous that I had never " used CTRL-^ and indeed did not know about it. I have since repented. " nnoremap <Backspace> \ <C-^> -" I find the space bar’s default behavior in normal mode of moving right one +" I find the space bar's default behavior in normal mode of moving right one " character to be useless. Instead, I remap it to be a lazy way of paging " through the argument list buffers, scrolling a page until the last line of " the buffer is visible, and then moving to the :next buffer. @@ -1040,10 +1035,10 @@ nnoremap <expr> <Space> \ ? "\<PageDown>" \ : ":\<C-U>next\<CR>" -" I often can’t remember (or guess) digraph codes, and want to look up how to +" I often can't remember (or guess) digraph codes, and want to look up how to " compose a specific character that I can name, at least in part. The table -" in ‘:help digraph-table’ is what to use for that situation, and it solves -" the problem, but I didn’t like the overhead of repeated lookups therein. +" in `:help digraph-table` is what to use for that situation, and it solves +" the problem, but I didn't like the overhead of repeated lookups therein. " " Steve Losh has a solution I liked where a double-tap of CTRL-K in insert " mode brought up the applicable :help window: @@ -1062,13 +1057,13 @@ nnoremap <expr> <Space> " > Í I' LATIN CAPITAL LETTER I WITH ACUTE " > ...etc... " -" <https://sanctum.geek.nz/cgit/vim-digraph-search.git/about/> +" <https://dev.sanctum.geek.nz/cgit/vim-digraph-search.git/about/> " " This leaves you in insert mode, ready to hit CTRL-K one more time and then -" type the digraph that you’ve hopefully found. +" type the digraph that you've hopefully found. " -" Since a double-tap of CTRL-K does nothing in default Vim, we don’t bother -" checking that the plugin’s available before we map to it; it’ll just quietly +" Since a double-tap of CTRL-K does nothing in default Vim, we don't bother +" checking that the plugin's available before we map to it; it'll just quietly " do nothing. " imap <C-K><C-K> @@ -1078,56 +1073,56 @@ imap <C-K><C-K> " and tools like Mutt and Vim pretty often. It feels natural to me to stack " issuing a :nohlsearch command to stop highlighting searches on top of this. " -" This gets by far the most use in normal mode, but I’d like it to work in -" insert and visual modes, too, where it’s occasionally useful, especially on +" This gets by far the most use in normal mode, but I'd like it to work in +" insert and visual modes, too, where it's occasionally useful, especially on " things like mobile phone terminal emulators that can be choppy and require " a lot of redrawing. " " For each of these, we end the mapping with a CTRL-L in normal mode, thereby -" extending rather than replacing Vim’s normal behavior. +" extending rather than replacing Vim's normal behavior. " nnoremap <C-L> \ :<C-U>nohlsearch<CR><C-L> " The insert mode wrapper for normal CTRL-L uses i_CTRL-O to issue a single -" normal mode command. We intentionally use ‘:normal’ rather than ‘:normal!’ +" normal mode command. We intentionally use `:normal` rather than `:normal!` " so that the mapping works recursively. I tried using <C-O><C-L> with :imap -" for this, but it didn’t work. Maybe i_CTRL-O doesn’t respect mappings. -" I couldn’t find any documentation about it. +" for this, but it didn't work. Maybe i_CTRL-O doesn't respect mappings. +" I couldn't find any documentation about it. " inoremap <C-L> \ <C-O>:execute "normal \<C-L>"<CR> " We use :vmap here rather than :xmap to have the mapping applied for select -" mode as well as visual mode. This is because CTRL-L doesn’t reflect +" mode as well as visual mode. This is because CTRL-L doesn't reflect " a printable character, and so we don't shadow anything by making it work, -" even though I don’t actually use select mode directly very much. +" even though I don't actually use select mode directly very much. " vmap <C-L> \ <Esc><C-L>gv -" By default, the very-useful normal mode command ‘&’ that repeats the -" previous :substitute command doesn’t preserve the flags from that -" substitution. I’d prefer it to do so, like the :&& command does, and it’s -" easily remapped for both normal and visual mode, so let’s just do it. +" By default, the very-useful normal mode command `&` that repeats the +" previous :substitute command doesn't preserve the flags from that +" substitution. I'd prefer it to do so, like the :&& command does, and it's +" easily remapped for both normal and visual mode, so let's just do it. " noremap & \ :&&<CR> ounmap & sunmap & -" I really like using the ‘!’ command in normal mode as an operator to filter +" I really like using the `!` command in normal mode as an operator to filter " text through a shell command. It always bugged me a little that there -" didn’t seem to be an analogue for a motion to filter text through an +" didn't seem to be an analogue for a motion to filter text through an " internal command like :sort, so I wrote one. " -" <https://sanctum.geek.nz/cgit/vim-colon-operator.git/about/> +" <https://dev.sanctum.geek.nz/cgit/vim-colon-operator.git/about/> " nmap g: \ <Plug>(ColonOperator) -" I used Tim Pope’s unimpaired.vim plugin for ages, and I liked some of these -" bracket pair mappings, so I’ve carried a few of the simpler ones over. All +" I used Tim Pope's unimpaired.vim plugin for ages, and I liked some of these +" bracket pair mappings, so I've carried a few of the simpler ones over. All " of these can be prefixed with a count if needed, too. I use all of them " pretty regularly, even though cycling through lists to look for something " can be a bit wasteful. @@ -1153,26 +1148,26 @@ nnoremap [l nnoremap ]l \ :lnext<CR> -" Here’s another mapping I particularly liked from unimpaired.vim; insert +" Here's another mapping I particularly liked from unimpaired.vim; insert " blank lines from normal mode, using a custom plugin of mine called -" put_blank_lines.vim. These use operator functions so that they’re +" put_blank_lines.vim. These use operator functions so that they're " repeatable without repeat.vim. They accept count prefixes, too. " -" <https://sanctum.geek.nz/cgit/vim-put-blank-lines.git/about/> +" <https://dev.sanctum.geek.nz/cgit/vim-put-blank-lines.git/about/> " nmap [<Space> \ <Plug>(PutBlankLinesAbove) nmap ]<Space> \ <Plug>(PutBlankLinesBelow) -" We’re on to the leader maps, now. It’s difficult to know in what order to +" We're on to the leader maps, now. It's difficult to know in what order to " describe and specify these. I used to have them in alphabetical order, but " it seems much more useful to group them by the type of action they take. " -" First of all, let’s set the leader keys; backslash happens to be the -" default, but I like to make my choice explicit here. As of 2019, I’m still +" First of all, let's set the leader keys; backslash happens to be the +" default, but I like to make my choice explicit here. As of 2019, I'm still " not certain that comma is the best choice for my local leader. I use it all -" the time for this purpose, and it works well, but I don’t much like that it +" the time for this purpose, and it works well, but I don't much like that it " shadows a useful function in the fFtT;, group, and I sometimes wonder if " I would use the key for its original function more, had I not shadowed it. " @@ -1189,20 +1184,20 @@ if maplocalleader ==# ',' sunmap ,, endif -" Let’s start with some simple ones; these ones all just toggle a boolean -" option, and print its new value. They’re dirt simple to specify, and don’t +" Let's start with some simple ones; these ones all just toggle a boolean +" option, and print its new value. They're dirt simple to specify, and don't " require any plugins. " -" These are sometimes applicable in visual mode, and sometimes not. We’ll +" These are sometimes applicable in visual mode, and sometimes not. We'll " start with the ones that only make sense as normal mode maps. Annoyingly, -" a visual mode mapping for 'cursorline' toggling doesn’t work at all; +" a visual mode mapping for 'cursorline' toggling doesn't work at all; " 'cursorline' is always off when in any visual mode, including block mode, " where it actually might have been really handy. "" Leader,TAB toggles automatic indentation based on the previous line nnoremap <Leader><Tab> \ :<C-U>set autoindent! autoindent?<CR> -"" Leader,c toggles highlighted cursor row; doesn’t work in visual mode +"" Leader,c toggles highlighted cursor row; doesn't work in visual mode nnoremap <Leader>c \ :<C-U>set cursorline! cursorline?<CR> "" Leader,h toggles highlighting search results @@ -1245,17 +1240,10 @@ noremap <Leader>w ounmap <Leader>w sunmap <Leader>w -" This next one just shows option state of the 'formatoptions' affecting how -" text is automatically formatted; it doesn’t change its value. - -"" Leader,f shows the current 'formatoptions' at a glance -nnoremap <Leader>f - \ :<C-U>set formatoptions?<CR> - " I often have to switch between US English and NZ English. The latter is " almost exactly the same as UK English in most locales, although we use " dollars rather than pounds. This is mostly so I remember things like -" excluding or including the ‘u’ in words like ‘favourite’, depending on the +" excluding or including the `u` in words like `favourite`, depending on the " target audience. I generally use US English for international audiences. " nnoremap <Leader>z @@ -1263,20 +1251,31 @@ nnoremap <Leader>z nnoremap <Leader>u \ :<C-U>set spelllang=en_us<CR> -" The next mapping is also for toggling an option, but it’s more complicated; +" I've also been trying to learn French lately (2023-04-03), and having +" a spelling check there is handy for doing my homework. +" +" This mapping used to show the state of 'formatoptions', but I haven't been +" using that nearly as often lately. +" +" <https://sanctum.geek.nz/images/ze-cultured-frenchman.png> +" +nnoremap <Leader>f + \ :<C-U>set spelllang=fr<CR> + +" The next mapping is also for toggling an option, but it's more complicated; " it uses a simple plugin of mine called copy_linebreak.vim to manage several " options at once, related to the 'wrap' option that soft-wraps text. " -" It’s designed for usage in terminal emulators and multiplexers to +" It's designed for usage in terminal emulators and multiplexers to " temporarily make the buffer text suitable for copying in such a way that the -" wrapping and any associated soft formatting won’t pervert the text, +" wrapping and any associated soft formatting won't pervert the text, " including 'breakindent', 'linebreak', and 'showbreak' artifacts. " " This is really handy for quick selections of small regions of text. For " larger blocks of text or for manipulating the text as it leaves the buffer, " it makes more sense to use :! commands. " -" <https://sanctum.geek.nz/cgit/vim-copy-linebreak.git/about/> +" <https://dev.sanctum.geek.nz/cgit/vim-copy-linebreak.git/about/> " "" Leader,b toggles settings friendly to copying and pasting @@ -1284,13 +1283,13 @@ nmap <Leader>b \ <Plug>(CopyLinebreakToggle) " The above mappings show that mappings for toggling boolean options are -" simple, but there isn’t a way to toggle single flags within option strings +" simple, but there isn't a way to toggle single flags within option strings " with just the :set command, so I wrote a plugin called toggle_flags.vim to " provide :ToggleFlag and :ToggleFlagLocal commands. The first argument is " the name of an option, and the second is the flag within it that should be " toggled on or off. -"" Leader,a toggles 'formatoptions' ‘a’ auto-flowing flag +"" Leader,a toggles 'formatoptions' `a` auto-flowing flag nnoremap <Leader>a \ :<C-U>ToggleFlagLocal formatoptions a<CR> "" Leader,L toggles 'colorcolumn' showing the first column beyond 'textwidth' @@ -1300,9 +1299,9 @@ ounmap <Leader>L sunmap <Leader>L " This mapping uses my paste_insert.vim plugin to queue up automatic commands -" for the next insert operation. It’s still pretty new. It replaces my old +" for the next insert operation. It's still pretty new. It replaces my old " paste_open.vim plugin which did this only for opening new lines, and which -" kept confusing me. I’m hoping this will be better. +" kept confusing me. I'm hoping this will be better. "" Leader,p prepares the next insert for paste mode nmap <Leader>p @@ -1335,17 +1334,17 @@ nnoremap <Leader>D " This group contains mappings that are to do with file and path management " relative to the current buffer. -"" Leader,g shows the current file’s fully expanded path +"" Leader,g shows the current file's fully expanded path nnoremap <Leader>g \ :<C-U>echo expand('%:p')<CR> -"" Leader,G changes directory to the current file’s location +"" Leader,G changes directory to the current file's location nnoremap <Leader>G \ :<C-U>cd %:h <Bar> pwd<CR> -"" Leader,P creates the path to the current file if it doesn’t exist +"" Leader,P creates the path to the current file if it doesn't exist nnoremap <Leader>P \ :<C-U>call mkdir(expand('%:h'), 'p')<CR> -" This group contains mappings that show information about Vim’s internals: +" This group contains mappings that show information about Vim's internals: " marks, registers, variables, and the like. "" Leader,H shows command history @@ -1380,8 +1379,8 @@ nnoremap <Leader>y \ :<C-U>registers<CR> " This group contains mappings concerned with buffer navigation and -" management. I use the “jetpack” buffer jumper one a lot. I got it from one -" of bairui’s “Vim and Vigor” comics: +" management. I use the "jetpack" buffer jumper one a lot. I got it from one +" of bairui's "Vim and Vigor" comics: " " <http://of-vim-and-vigor.blogspot.com/p/vim-vigor-comic.html> @@ -1397,12 +1396,12 @@ nnoremap <Leader>e "" Leader,E locks a buffer, reversible with <Leader>e nnoremap <Leader>E \ :<C-U>set nomodifiable readonly<CR> -"" Leader,j jumps to buffers—the “jetpack” +"" Leader,j jumps to buffers---the "jetpack" nnoremap <Leader>j \ :<C-U>buffers<CR>:buffer<Space> " Leader,o hacks up the list of old files from viminfo just long enough to -" ensure that :browse :oldfiles fits in a screen, avoiding an Enter or ‘q’ +" ensure that :browse :oldfiles fits in a screen, avoiding an Enter or `q` " keystroke before entering the number. This one is handy followed by " <Leader>,\ to jump back to the last remembered position in that file, since " by definition viminfo remembers that mark, too. @@ -1414,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 @@ -1440,7 +1439,7 @@ nnoremap <Leader>+ \ :<C-U>KeepPosition execute 'normal! 1GgqG'<CR> " This group defines a few :onoremap commands to make my own text objects. -" I should probably make some more of these, as they’ve proven to be +" I should probably make some more of these, as they've proven to be " terrifically handy. "" Leader,_ uses last changed or yanked text as an object @@ -1455,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 @@ -1465,7 +1464,7 @@ sunmap <Leader>{ map <Leader>} \ <Plug>(VerticalRegionDown) sunmap <Leader>} -"" Leader,\ jumps to the last edit position mark; think “Now, where was I?” +"" Leader,\ jumps to the last edit position mark; think "Now, where was I?" noremap <Leader>\ \ `" sunmap <Leader>\ @@ -1487,14 +1486,14 @@ nnoremap <Leader>/ nnoremap <Leader>? \ :<C-U>lhelpgrep \c<S-Left> -" This group contains miscellaneous mappings for which I couldn’t find any +" This group contains miscellaneous mappings for which I couldn't find any " other place. The plugin mappings probably require their own documentation " comment block, but my hands are getting tired from all this typing. " -" * <https://sanctum.geek.nz/cgit/vim-alternate-filetype.git/about/> -" * <https://sanctum.geek.nz/cgit/vim-regex-escape.git/about/> -" * <https://sanctum.geek.nz/cgit/vim-replace-operator.git/about/> -" * <https://sanctum.geek.nz/cgit/vim-scratch-buffer.git/about/> +" * <https://dev.sanctum.geek.nz/cgit/vim-alternate-filetype.git/about/> +" * <https://dev.sanctum.geek.nz/cgit/vim-regex-escape.git/about/> +" * <https://dev.sanctum.geek.nz/cgit/vim-replace-operator.git/about/> +" * <https://dev.sanctum.geek.nz/cgit/vim-scratch-buffer.git/about/> " "" Leader,. runs the configured make program into the location list @@ -1547,17 +1546,17 @@ nnoremap <Leader>~ " digraphs zs 8203 -" And last, but definitely not least, I’m required by Vim fanatic law to +" And last, but definitely not least, I'm required by Vim fanatic law to " include a mapping that reloads my whole configuration. This uses the " command wrapper defined much earlier in the file, so that filetypes also get -" reloaded afterwards, meaning I don’t need to follow <Leader>R with +" reloaded afterwards, meaning I don't need to follow <Leader>R with " a <Leader>F to fix up broken global settings. " nnoremap <Leader>R \ :<C-U>ReloadVimrc<CR> -" I’ll close this file with a few abbreviations. Perhaps of everything in -" here, I’m least confident that these should be in here, but they’ve proven +" I'll close this file with a few abbreviations. Perhaps of everything in +" here, I'm least confident that these should be in here, but they've proven " pretty useful. First, some 'deliberate' abbreviations for stuff I type " a lot: " @@ -1586,10 +1585,10 @@ inoreabbrev THere " Here endeth the literate vimrc. Let us praise God. " -" │ Consequently, it is soon recognized that they write for the sake of -" │ filling up the paper, and this is the case sometimes with the best -" │ authors…as soon as this is perceived the book should be thrown away, -" │ for time is precious. -" │ -" │ —Schopenhauer +" > Consequently, it is soon recognized that they write for the sake of +" > filling up the paper, and this is the case sometimes with the best +" > authors...as soon as this is perceived the book should be thrown away, +" > for time is precious. +" > +" > ---Schopenhauer " diff --git a/vim/vimrc.stub b/vim/vimrc.stub index f9ad4d4f..92c53dfb 100644 --- a/vim/vimrc.stub +++ b/vim/vimrc.stub @@ -1,26 +1,25 @@ " We have a big, important decision to make here. " -" Check that we’re not running in 'compatible' mode, nor that the environment -" calls for the same, that we’re running Vim v7.0.0 or newer, and that we -" haven't been invoked as just plain `vi`. If it’s all clear, we can load the -" main vimrc file from ~/.vim/vimrc to use Vim in all of its incompatible -" glory, and then stop sourcing the rest of this file. +" Check that we're not running in 'compatible' mode, nor that the environment +" calls for the same, and that we're running Vim v7.0.0 or newer. If it's all +" clear, we can load the main vimrc file from ~/.vim/vimrc to use Vim in all +" of its incompatible glory, and then stop sourcing the rest of this file. " if !&compatible && !exists('$POSIXLY_CORRECT') - if v:version >=700 && v:progname !=# 'vi' + if v:version >= 700 runtime vimrc finish endif endif -" If we got this far, it means we’re running a tiny, 'compatible', and/or +" If we got this far, it means we're running a tiny, 'compatible', and/or " ancient version of Vim. " " So, strip out the user runtime directories from 'runtimepath', force -" 'compatible' on, source your trusty ‘~/.exrc’, put on your dubbed cassette -" copy of Kraftwerk’s ‘Computerwelt’, and start using vi v3.7 on your -" engineering department’s Sun OS 4.x server via your VT220 terminal. It’s -" July 1985, you write K&R C, and it’s good for you, like raisin bran. +" 'compatible' on, source your trusty '~/.exrc', put on your dubbed cassette +" copy of Kraftwerk's 'Computerwelt', and start using vi v3.7 on your +" engineering department's Sun OS 4.x server via your VT220 terminal. It's +" July 1985, you write K&R C, and it's good for you, like raisin bran. " set runtimepath-=~/.vim set runtimepath-=~/.vim/after diff --git a/x/Xresources b/x/Xresources new file mode 100644 index 00000000..829b208e --- /dev/null +++ b/x/Xresources @@ -0,0 +1,106 @@ +/* Declare our xterms have 256 colors */ +XTerm.termName: xterm-256color + +/** + * Just use "xterm" as the title, no need to complicate it with the name of the + * actual binary called. + */ +XTerm.title: xterm + +/** + * Don't pass mouse events to applications, even if they ask for it; mouse + * interaction with command-line tools isn't normally very well-written anyway. + * Better just to treat it as text. + */ +XTerm.vt100.allowMouseOps: false + +/** + * Don't let applications set the window title; it's usually more confusing + * than helpful, with things like command wrappers getting in the way. + */ +XTerm.vt100.allowTitleOps: false + +/* Don't munge characters' 8th bit with Alt, send Escape prefix instead */ +XTerm.vt100.altIsNotMeta: true +XTerm.vt100.altSendsEscape: true + +/* Flash my window manager if a BEL is sounded in an xterm */ +XTerm.vt100.bellIsUrgent: true + +/** + * Stick all of the non-control ASCII characters into the same xterm selection + * group as the alphanumeric ones added by default, except for space and the + * left and right angle brackets (less-than and greater-than), because being + * able to click URLs quickly outweighs anything else. + */ +XTerm.vt100.charClass: \ + 33-59:48, \ + 60:60, \ + 61:48, \ + 62:60, \ + 63-126:48 + +/** + * Set some less harsh colors than the xterm defaults; I think I got these from + * somewhere else and tweaked them, but I can't remember where it was now. + */ +XTerm.vt100.background: rgb:03/03/03 +XTerm.vt100.foreground: rgb:e0/e0/e0 +XTerm.vt100.color0: rgb:03/03/03 +XTerm.vt100.color1: rgb:cc/00/00 +XTerm.vt100.color2: rgb:3e/aa/06 +XTerm.vt100.color3: rgb:c4/a0/00 +XTerm.vt100.color4: rgb:34/65/a4 +XTerm.vt100.color5: rgb:75/50/7b +XTerm.vt100.color6: rgb:06/98/9a +XTerm.vt100.color7: rgb:d3/d7/cf +XTerm.vt100.color8: rgb:30/30/30 +XTerm.vt100.color9: rgb:ef/29/29 +XTerm.vt100.color10: rgb:7a/f2/34 +XTerm.vt100.color11: rgb:fc/e9/4f +XTerm.vt100.color12: rgb:72/9f/cf +XTerm.vt100.color13: rgb:ad/7f/a8 +XTerm.vt100.color14: rgb:34/e2/e2 +XTerm.vt100.color15: rgb:ee/ee/ec + +/** + * Use Ubuntu Mono as a TrueType font if I decide to switch to it, but default + * to using the default bitmap font. + */ +XTerm.vt100.faceName: xft:Ubuntu Mono +XTerm.vt100.faceSize: 9 +XTerm.vt100.renderFont: defaultOff + +/** + * Draw our own box characters, even if the font seems to support them. Using + * Ubuntu Mono at least, this removes gaps between vertical lines. + */ +XTerm.vt100.forceBoxChars: true + +/** + * Put the terminal text contents flush against the edges of the window, + * otherwise things like tmux look awkward. + */ +XTerm.vt100.internalBorder: 0 + +/** + * Jump to the end of the buffer if I write to it, but don't if there's just + * something new to read. Funny how the defaults are the other way around... + */ +XTerm.vt100.scrollKey: true +XTerm.vt100.scrollTtyOutput: false + +/** + * Bind extra keys to copy/paste to/from CLIPBOARD rather than PRIMARY, as + * a simple selection does. + */ +XTerm.vt100.translations: #override \n\ + Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\ + Ctrl Shift <Key>V: insert-selection(CLIPBOARD) + +/** + * Trim trailing spaces from selections; if I'm copying text from a terminal + * emulator window, I probably don't want it byte-perfect for hashing purposes + * or anything like that. + */ +XTerm.vt100.trimSelection: true diff --git a/x/logrotate/config.d/xsession b/x/logrotate/config.d/xsession new file mode 100644 index 00000000..1541375d --- /dev/null +++ b/x/logrotate/config.d/xsession @@ -0,0 +1,7 @@ +~/.xsession-errors { + copytruncate + daily + missingok + olddir .local/state/xsession/log + rotate 30 +} diff --git a/sh/shrc.d/x.sh b/x/shrc.d/x.sh index ed921c68..ed921c68 100644 --- a/sh/shrc.d/x.sh +++ b/x/shrc.d/x.sh diff --git a/x/xsession.sh b/x/xsession.sh new file mode 100644 index 00000000..9cf4a99a --- /dev/null +++ b/x/xsession.sh @@ -0,0 +1,64 @@ +# +# Custom i3wm X session to fit into Debian's way of doing things, for use with +# startx(1) or xinit(1). From Debian's `man 1 startx` (xinit dpkg 1.4.0-1): +# +# > Note that in the Debian system, what many people traditionally put in the +# > .xinitrc file should go in .xsession instead; this permits the same X +# > environment to be presented whether startx, xdm, or xinit is used to start +# > the X session. All discussion of the .xinitrc file in the xinit(1) manual +# > page applies equally well to .xsession. +# +# This turns out to be important for having the X session wrappers in /etc/X11 +# on Debian-derived systems do things like dbus daemon and accessibility setup. +# +# At the time of writing, none of my machines running X are using anything +# other than the Debian-derived X startup script layout, so we'll just conform +# to that unless and until I actually need to abstract this. +# + +# Monitor and wallpaper setup is very machine-specific, and isn't versioned in +# here. Neither xrandr(1) nor xwallpaper(1) have config files, so we fake it +# with xargs and looking for a file with argument tokens to read in +# XDG_CONFIG_HOME, which will almost always be: +# +# - ~/.config/xrandr/config +# - ~/.config/xwallpaper/config +# +xargs xrandr \ + < "${XDG_CONFIG_HOME:-"$HOME"/.config}"/xrandr/config +xargs xwallpaper \ + < "${XDG_CONFIG_HOME:-"$HOME"/.config}"/xwallpaper/config + +# Set a few X user preferences: +# +# - No bell +# - Power management on, but start with no timeouts +# - Quick curved mouse acceleration +# - No screen saver +# +xset \ + b off \ + dpms 0 0 0 \ + mouse 5/2 0 \ + s off + +# Start a few daemons if we can; it's OK if any of these don't exist, but we'll +# log the failed attempt to start them to the errors file, as a hint that +# I might want to install them. +# +## Message display (libnotify) +dunst & +## PulseAudio system tray tool +pasystray & +## Hide mouse after inactivity +unclutter & + +# Load all supplementary scripts in ~/.xsession.d +for sh in "$HOME"/.xsession.d/*.sh ; do + [ -e "$sh" ] || continue + . "$sh" +done +unset -v sh + +# Become an i3 window manager process, having set everything else up +exec i3 diff --git a/x/xsessionrc b/x/xsessionrc new file mode 100644 index 00000000..8d46ed0b --- /dev/null +++ b/x/xsessionrc @@ -0,0 +1,17 @@ +# X startup commands go in here if they should run on every X session, whether +# classic `startx` or a modern DE like LightDM. xsessionrc is a dpkg-specific +# file. +# + +# If $ENV isn't set, then this X startup process wasn't started from somewhere +# beneath a login shell that sources ~/.profile to set up environment variables +# yet, most likely because it's being opened by a display manager, so we'll do +# it here. +# +if [ -z "$ENV" ] ; then + . "$HOME"/.profile +fi + +# Update BROWSER, since .profile has already set this to a curses browser +# shellcheck disable=SC2034 +BROWSER=x-www-browser @@ -15,7 +15,7 @@ bindkey -e # History settings setopt histignorealldups sharehistory HISTFILE=$HOME/.zsh_history -SAVEHIST=$((1 << 12)) +SAVEHIST=4096 # Load Zsh-specific startup files for zsh in "$HOME"/.zshrc.d/*.zsh(N) ; do diff --git a/zsh/zshrc.d/keep.zsh b/zsh/zshrc.d/keep.zsh index 8a2b9449..36d2f57d 100644 --- a/zsh/zshrc.d/keep.zsh +++ b/zsh/zshrc.d/keep.zsh @@ -89,8 +89,8 @@ EOF case $name in # NAME must start with letters or an underscore, and contain no - # characters besides letters, numbers, or underscores - *[!a-zA-Z0-9_]*|[!a-zA-Z_]*) + # characters besides letters, numbers, underscores, or dashes + [!a-zA-Z_]*|*[!a-zA-Z0-9_-]*) printf 'zsh: %s: %s not a valid NAME\n' \ "${FUNCNAME[0]}" "$name" >&2 ((errors++)) diff --git a/zsh/zshrc.d/prompt.zsh b/zsh/zshrc.d/prompt.zsh index 980d8669..245f2973 100644 --- a/zsh/zshrc.d/prompt.zsh +++ b/zsh/zshrc.d/prompt.zsh @@ -8,22 +8,23 @@ prompt() { on) setopt promptsubst promptpercent - # Basic prompt shape depends on whether we're in SSH or not + # Prompt has hostname via SSH outside of screen/tmux PS1= - if [[ -n $SSH_CLIENT || -n $SSH_CONNECTION ]] ; then + if [[ -n $SSH_CLIENT && -z $STY && -z $TMUX ]] ; then PS1=$PS1'%m:' fi PS1=$PS1'%~' - # Add sub-commands; VCS, job, and return status checks - PS1=$PS1'$(ret=$?;prompt vcs;prompt job;prompt ret)' - # Add a helpful prefix if this shell appears to be exotic case ${SHELL##*/} in (zsh) ;; (*) PS1=zsh:$PS1 ;; esac + # Add sub-commands: + ## VCS, job, and return status checks as suffixes + PS1=$PS1'$(ret=$?;prompt vcs;prompt job;prompt ret)' + # Add prefix and suffix PS1='${PROMPT_PREFIX}'$PS1'${PROMPT_SUFFIX}' @@ -53,7 +54,6 @@ prompt() { fi ;; - # Git prompt function git) # Wrap as compound command; we don't want to see output from any of |