21 KiB
obligatory personal dotfiles repository
(plus some little shell scripts)
quick install for random boxes:
cd && curl -L https://github.com/notwa/rc/archive/master.tar.gz | tar zx && mv rc-master rc && rc/install
NOTE: everything below this line is overwritten and automatically regenerated.
shell functions
argc
validate the number of arguments in a function.
# usage: myfunc() { argc -(eq|le|ge) [0-9] "$0" "$@" || return; }
myfunc() {
# use one of the following:
argc -eq N "$0" "$@" || return
argc -le N "$0" "$@" || return
argc -ge N "$0" "$@" || return
# where N is an integer between 0 and 9.
}
arith
perform arithmetic using the shell and display the result.
see also hex
and bin
.
% db=6
% noglob arith 10**(db/20.)
1.9952623149688795
aur
download, edit, make, and install packages from the AUR. it's a little broken.
$ aur -eyoI cmdpack-uips applyppf
autosync
combine inotifywait
and rsync
.
this is sometimes nicer than ssh
-ing into a server and running vim
remotely.
bak
backup files by copying each and appending ".bak" to their names. this calls itself recursively to avoid clobbering existing backups.
$ touch -d '2001-12-25 16:30:00' butts
$ bak butts
$ touch butts
$ bak butts
$ ls -l
total 0
-rw-r--r-- 1 notwa None 0 Aug 1 08:02 butts
-rw-r--r-- 1 notwa None 0 Aug 1 08:02 butts.bak
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.bak.bak
baknow
backup a single file by appending its timestamp given by now
.
$ touch -d '2001-12-25 16:30:00' butts
$ baknow butts
$ baknow butts
cp: overwrite 'butts.2001-12-26_01800000.bak'? n
$ ls -l
total 0
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.2001-12-26_01800000.bak
TODO: support multiple files at once.
baks
backup files by copying each and appending the current date-time, irrespective of when the files were modified or created.
$ touch -d '2001-12-25 16:30:00' butts
$ baks butts
$ baks butts
$ ls -l
total 0
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.21-08-01_14-54-07.bak
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.21-08-01_14-54-09.bak
bin
perform arithmetic using the shell and display the result as
an unsigned 8-bit integer in binary.
see also arith
and hex
.
$ bin 123
01111011
cdbusiest
cd to the directory with the most files in it, counted recursively.
$ cd
$ cdbusiest
152364 src
$ pwd
/home/notwa/src
colors
display all combinations of foreground and background terminal colors. this only includes the basic 16-color palette. excluding boilerplate, this script is a mere a 76-characters long!
compandy
generate compand arguments for ffmpeg audio filters. this is kinda pointless now that acompressor is wildly supported.
setup_clang_ubuntu (sh/compile)
print (but don't execute) the commands necessary to install a fairly recent version of clang on ubuntu-based distros.
$ setup_clang_ubuntu bionic
wget -O - http://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
echo -n "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic main
# deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic main
# 12
deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-12 main
# deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-12 main
" > /etc/apt/sources.list.d/llvm-toolchain-bionic.list
apt-get update
apt-get install clang-12
apt-get install lld-12
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-12 1200
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-12 1200
update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-12 1200
compile
compile single-file C and C++ programs, messily.
supports gcc and clang on *nix, and mingw64 gcc, msvc clang, and regular msvc on Windows. tested on x86_64 and on ARMv7 as well. does not support MacOS, maybe someday…
defaults to gnu11 and gnu++1z as C and C++ standards respectively. defaults to clang, gcc, and msvc in that order.
compile
attempts to guess the most sane switches for any program, so that compilation may reduce to:
# debug build
compile rd.c
compile debug rd.c
# debug build with warning/error flags defined in .-shrc
# (requires .zshrc for global alias expansion)
compile WHOA rd.c
# likewise for C++
compile WHOA WELP rd.cc
compile WHOA WELP rd.cpp
# "derelease" build (release build with debug information)
compile derelease WHOA rd.c
# release build (with symbols stripped)
compile release WHOA rd.c
# hardened build (only useful on *nix)
compile hardened WHOA rd.c
# specifying compiler
compile gcc WHOA rd.c
compile msvc WHOA rd.c
compile release clang WHOA rd.c
# compile and execute (FIXME: writing to /tmp is a security concern)
compile derelease rd.c && /tmp/rd
confirm
display a simple yes-or-no prompt and return 0-or-1 respectively.
$ confirm && echo yay || echo nay
Continue? [y/N] y
yay
$ confirm && echo yay || echo nay
Continue? [y/N] n
nay
countdiff
count the number of lines changed between two files.
TODO: don't use git for this. also, use patience algorithm.
$ countdiff README-old.md README.md
739
cutv
(WIP) create a short clip of a long video file.
days
compute the number of days since a given date.
$ days 'January 1 1970'
18838
dbusiest
list directories ordered descending by the number of files in them,
counted recursively. see also cdbusiest
.
$ cd
$ dbusiest | head -n3
152364 src
46518 work
20903 play
dfu
pretty-print df
in GiB.
$ dfu
Filesystem Used Max Left Misc
/dev 0.00 0.46 0.46 0.00
/ 17.20 23.22 6.01 1.27
disf
disassemble a single function from an unstripped executable, unreliably.
document
generate a markdown file out of docstrings in shell scripts.
TODO: describe. i have a rough outline written in my scrap file.
e
wrap around $EDITOR
to run it as root if necessary.
this still needs some work to detect root-owned directories.
$ e /etc/sudoers
[sudo] password for notwa:
eahead (sh/ea)
eaget (sh/ea)
eaput (sh/ea)
eamove (sh/ea)
eacopy (sh/ea)
eadelete (sh/ea)
eamv (sh/ea)
eacp (sh/ea)
earm (sh/ea)
echo2
print arguments joined by spaces to stderr without parsing anything.
$ echo -e 'this\nthat' those
this
that those
$ echo2 -e 'this\nthat' those
-e this\nthat those
explore
open a single directory in explorer.exe
, defaulting to $PWD
.
ff
select a file from a given or current directory using fzy
.
ghmd
convert a markdown file to HTML in the style of GitHub. note that this uses GitHub's API, so it requires internet connectivity.
this script utilizes the CSS provided at sindresorhus/github-markdown-css.
has
print the result of which
if the program is found, else simply return 1.
export CC="$(has clang || has clang-3.8 || has gcc)"
hex
perform arithmetic using the shell and display the result as
an unsigned 32-bit integer in hexadecimal.
see also arith
and bin
.
$ hex 0x221EA8-0x212020
0000FE88
ify
pipe one command through another, so you can still pass arguments to the former.
this is mainly useful for aliases. 99% of the time you'll use this with less
.
$ alias ll="ify less ls -ACX --group-directories-first --color=force"
$ ll /etc
is_empty
return 0 if the directory given by argument is empty.
isup
return 0 if a given website returns a 2xx HTTP code.
maybesudo_ (sh/maybesudo)
mimic certain features of sudo
for systems without it installed.
as it stands, this mostly just handles some environment variables.
minutemaid
return 0 if the current minute is divisible by a number. note that a minute is relative to the seconds since the epoch, not the minute of the hour.
# crontab usage:
* * * * * minutemaid 9 ~/work/do_my_bidding # runs every nine minutes
monitor
this is watch(1) loosely reimplemented as a shell script.
usage: monitor [-fs] [-n {period}] {command} [{args...}]
noccom
strip C-like comments; both multi-line and single-line.
note
act like echo2
, but use a bright color to stand out more.
now
print a date-time (UTC) in a sortable format. this takes a date or file as an argument, else it defaults to the current time.
$ now
2019-05-27_35083906
$ now ~/sh/monitor
2017-03-14_82387259
$ now '@1234567890'
2009-02-13_84690000
pacbm
display and order installed pacman packages by their filesize ascending,
and their sum. requires expac
.
$ pacbm | head -n -1 | tail -2
204.78M clang
235.44M linux-firmware
pause
pause — the companion script of confirm
.
$ pause
Press any key to continue
$
pegg
download and (pip) install a Python "egg" from a project on GitHub,
defaulting to the master branch. this uses pippy
internally.
# install the development version of https://github.com/rthalley/dnspython
$ pegg rthalley dnspython
# or instead install the latest stable version (as of writing)
$ pegg rthalley dnspython 3933b49
pippy
install Python packages using pip,
but only update their dependencies as required.
this uses maybesudo
internally.
pre
dump all the #define
s that $CC $CPPFLAGS $CFLAGS $LDFLAGS
would result in.
$ pre | shuf | head -n10
#define __GNUC_MINOR__ 3
#define __SIZEOF_LONG__ 4
#define __UINT_LEAST16_TYPE__ short unsigned int
#define __ORDER_BIG_ENDIAN__ 4321
#define __SIZEOF_FLOAT__ 4
#define __INTMAX_MAX__ 0x7fffffffffffffffLL
#define __INT64_C(c) c ## LL
#define __UINT16_MAX__ 0xffff
#define __DEC64_MANT_DIG__ 16
#define __DBL_HAS_INFINITY__ 1
psbm
display and order processes by their memory usage ascending, and their sum.
$ psbm | head -n -1 | tail -2
185.08M 1163 chromium
199.95M 1060 chromium
randir
display a random directory in the current working directory.
$ randir
./sh
refresh
invoke hash -r
.
rs
record screen. does not record audio. currently only works on Windows (gdigrab). i'm sure there's something equivalent for Linux.
sc
upload given files to a webserver and return a direct link for sharing them.
you'll want to tweak this if you use it yourself.
this contains some extra logic for screenshots created by scropt
.
scramble
scrambles text in a predictable way using regex.
sacbremls ttex in a pdrceailtbe way unsig reegx.
screeny
i don't use this anymore~
scropt
run scrot
through optipng
and save the result to ~/play/$(now).png
.
$ ~/sh/sc $(~/sh/scropt -s -d0.5)
similar
highlight adjacent lines up to the first inequivalent character.
slit
view specific columns of text.
slitt
view specific columns of text.
this version of slit
uses tabs for its field separators.
sram
convert between a couple saveram formats for N64 emulators.
stfu
invoke a command, silencing stdout and stderr unless the command fails.
NOTE: don't use stfu
for handling sensitive data or commands!
use it for 7zip.
$ touch butts
$ stfu 7z a butts.7z butts
$ stfu 7z a butts.7z asses
command failed with exit status 1:
7z a butts.7z asses
$ tail -n 20 /tmp/stfu/out_1627834220
Solid = -
Blocks = 0
Scanning the drive:
0 files, 0 bytes
Updating archive: butts.7z
Keep old data in archive: 1 file, 0 bytes
Add new data to archive: 0 files, 0 bytes
Files read from disk: 0
Archive size: 82 bytes (1 KiB)
Scan WARNINGS for files and folders:
asses : The system cannot find the file specified.
----------------
Scan WARNINGS: 1
$ tail -n 20 /tmp/stfu/err_1627834220
WARNING: The system cannot find the file specified.
asses
mpvs (sh/streamcrap)
invoke mpv with some extra flags suited for streamed sources.
mpv_watch (sh/streamcrap)
watch something in mpv with a bunch of extra audio filtering crap.
mpv_stream (sh/streamcrap)
watch a stream in mpv with a bunch of extra audio filtering crap.
twitch (sh/streamcrap)
watch a twitch stream in mpv with a bunch of extra audio filtering crap.
yt (sh/streamcrap)
watch a youtube video in mpv with a bunch of extra audio filtering crap. this can be given a full URL or just a video ID. remaining arguments are passed to mpv.
there exist several variants for more specific use cases.
ytg (sh/streamcrap)
watch a youtube video. like yt
, but with a preference for different formats.
ytll (sh/streamcrap)
watch a stream on youtube in mpv, etcetera etcetera. this is the low latency version that does not support seeking.
ytgll (sh/streamcrap)
watch a stream on youtube in mpv. like ytll
, but with a preference for different formats.
sum
compute the summation of its arguments without forking processes. this relies on the shell's built-in arithmetic operators.
$ sum 1 2 3
6
TODO: consider renaming because sum(1) already exists.
sv
collect the lastmost value of every key. the field separator can be given as its sole argument, it defaults to a single space otherwise.
$ echo "alpha=first\nbeta=second\nalpha=third" | sv =
alpha=third
beta=second
this next example uses sv
to only print the lastmost line
matching a pattern in each file. in other words, it uses
the filename printed by grep as the key in its key-value pairs.
$ cd ~/play/hash && grep -r 'ing$' . | sv :
./dic_win32.txt:WriteProfileString
./cracklib-small.txt:zoning
./english-words.txt:zooming
./usernames-125k.txt:flats_gaming
./cain.txt:zoografting
./pokemon.txt:Fletchling
./pokemon8.txt:Fletchling
TODO: rename because busybox(1) sv already exists.
tpad
add a 1px transparent border around an image to prevent twitter from mangling it into a jpg. sadly, this trick doesn't work anymore.
trash
output a given number of bytes from /dev/random
.
$ trash 10 | hexdump -e '15 1 "%02X " 1 1 "%02X\n"'
CB 72 31 A1 BB F0 EC 9F 6E BE
trunc
truncate text to fit within your terminal using the unicode character …
.
$ echo $COLUMNS
84
$ seq 1 100 | tr '\n' ' ' | trunc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31…
unscreen
i don't use this anymore~
wat
wat — a better and recursive which/whence. for zsh only.
written by leah2.
wipe
clear the screen and its scrollback, then print a high-contrast horizontal line. using this, you'll know with absolute certainty that you're looking at the top of your history, and that your terminal's scrollback didn't cap out and eat text.
TODO: rename because wipe(1) already exists.
miscellaneous
dirprev (zshrc)
rotate and change to the previous directory in the directory stack without consuming the prompt.
dirnext (zshrc)
rotate and change to the next directory in the directory stack without consuming the prompt.
dirup (zshrc)
change to the parent directory of the current working directory without consuming the prompt.
dirview (zshrc)
use a fuzzy finder to select a recent directory in the directory stack and change to it without consuming the prompt.
OMFG (zshrc)
silence stdout.
STFU (zshrc)
silence stderr.
WHOA (zshrc)
expand to several C/C++ flags to ease development.
WELP (zshrc)
expand to C++ flags to enable a C++-as-C facade.
pl (zshrc)
print each argument on its own line.
tw (zshrc)
invoke twitch
as a job with both stdout and stderr silenced.
reload (zshrc)
reload zsh by wiping temp files, recompiling rc files, and replacing the current process with a new zsh process.
reload (bashrc)
TODO: respect initctl like in .zshrc
.
has (-shrc)
hardcoded here for convenience.
ADDPATH (-shrc)
append a directory to $PATH
if it isn't already present.
fils (-shrc)
(GNU du) display human-friendly filesizes for the files in a directory.
lsa (-shrc)
(GNU ls) list files with directories and dotfiles ordered first.
perlu (-shrc)
invoke perl expecting files with UTF-8 encoding.
rgn (-shrc)
invoke ripgrep without respecting .gitignore
files.
cms (-shrc)
invoke cryptominisat5 with less noise.
curls (-shrc)
invoke curl with less noise.
get (-shrc)
retrieve the most recent files from the default branch of a git repository, and not much else.
gs (-shrc)
invoke git's status subcommand.
gd (-shrc)
invoke git's diff subcommand with fewer lines of context.
gds (-shrc)
display difference stats from git.
gl (-shrc)
invoke git's log subcommand with a single line per commit.
glo (-shrc)
navigate git's commit tree succinctly.
g1 (-shrc)
display the most recent git commit.
gr (-shrc)
display remote git repositories verbosely.
gb (-shrc)
display the current git branch.
revend (-shrc)
reverse the 4-byte endianness of a single file. this is an in-place operation!
clone (-shrc)
invoke rsync suitably for creating virtually indistinguishable copies of files.
aligntabs (-shrc)
align tab-delimited fields in stdin.
crawla (-shrc)
play Dungeon Crawl: Stone Soup through ssh on the akrasiac server.
crawlz (-shrc)
play Dungeon Crawl: Stone Soup through ssh on the develz server.
ll (-shrc)
list files verbosely, fancily, ordered, but not recursively.
diff (-shrc)
use git's diff subcommand for general diffing.
gc (-shrc)
columnize text by using git's column subcommand.
counts (-shrc)
count files in the current directory, including files found recursively.
exts (-shrc)
count and sort file extensions in the current directory, including files found recursively.
nocom (-shrc)
strip single-line C-like and shell-like comments.
sortip (-shrc)
sort numerically by IPv4 segments.
jrep (-shrc)
extract strings comprised of basic ASCII or Japanese codepoints.
bomb (-shrc)
add a Byte-Order Mark to a file.
cleanse (-shrc)
strip unprintable and non-ASCII characters.
rot13 (-shrc)
rot13 with numbers rotated as well.
unwrap (-shrc)
join paragraphs into one line each.
double (-shrc)
print every line twice.
print every line twice.
join2 (-shrc)
join every other line.
katagana (-shrc)
convert katakana codepoints to their equivalent hiragana. useful for translating debug text from ancient games.
picky (-shrc)
TODO
unused (-shrc)
TODO
makepkgf (-shrc)
make the freakin' package!
rakef (-shrc)
make the freakin' gem!
eashare (-shrc)
upload a file and copy its URL to the clipboard.
NOTE: this only works on MSYS2 for now.
NOTE: i lied, this doesn't work at all.