File: clamor.sh
   1 #!/bin/sh
   2 
   3 # The MIT License (MIT)
   4 #
   5 # Copyright © 2024 pacman64
   6 #
   7 # Permission is hereby granted, free of charge, to any person obtaining a copy
   8 # of this software and associated documentation files (the “Software”), to deal
   9 # in the Software without restriction, including without limitation the rights
  10 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 # copies of the Software, and to permit persons to whom the Software is
  12 # furnished to do so, subject to the following conditions:
  13 #
  14 # The above copyright notice and this permission notice shall be included in
  15 # all copies or substantial portions of the Software.
  16 #
  17 # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23 # SOFTWARE.
  24 
  25 
  26 # clamor
  27 # Command-Line Augmentation Module, Optional Refinements
  28 #
  29 # A few extras beyond what `clam` offers to interactive shell commands,
  30 # specifically commands which use my apps/scripts, unlike `clam`, which
  31 # depends only on commonly pre-installed tools.
  32 #
  33 # You're supposed to `source` this script, so its definitions stay for
  34 # your whole shell session: for that, you can run `source clamor` or
  35 # `. clamor` (no quotes either way), either directly or at shell startup.
  36 #
  37 #
  38 # Partial list of funcs/commands added
  39 #
  40 # can       CAlculate with Nice numbers, using my scripts `ca` and `nn`
  41 # cu        Change Units, using my scripts `bu` and `nn`
  42 # fomo2cad  FOreign MOney to CAnadian Dollars; uses `cancur` from `clam`
  43 # lab       Like A Book, shows lines the way books do; uses my script `book`
  44 # nfs       Nice File Sizes, using my scripts `nn` and `cext`
  45 # ns        Nice Size, using my script `nn`
  46 # picktsv   run my script `pick`, using TSV-input settings
  47 # slp       Show Latest Podcasts, using my scripts `podfeed` and `si`
  48 # tsv2ssv   run my script `realign`, using TSV-input settings
  49 # wcp       Word-Count Plus runs `wc`, enriching its output using my tools
  50 #
  51 # blue
  52 # bold
  53 # gray
  54 # green
  55 # highlight
  56 # hilite
  57 # magenta
  58 # orange
  59 # red
  60 # underline
  61 
  62 
  63 # handle help options
  64 case "$1" in
  65     -h|--h|-help|--help)
  66         # show help message, extracting the info-comment at the start
  67         # of this file, and quit
  68         awk '/^# +clamor/, /^$/ { gsub(/^# ?/, ""); print }' "$0"
  69         exit 0
  70     ;;
  71 esac
  72 
  73 
  74 # use a simple shell prompt
  75 # PS1="\$ "
  76 # PS2="> "
  77 
  78 # use a simple shell prompt, showing the current folder in the title
  79 # PS1="\[\e]0;\w\a\]\$ "
  80 # PS2="> "
  81 
  82 # prevent `less` from saving commands
  83 # LESSHISTFILE="-"
  84 # LESSSECURE=1
  85 
  86 # prevent the shell from saving commands
  87 # unset HISTFILE
  88 
  89 
  90 # aliases for external scripts
  91 alias uncsv='decsv'
  92 
  93 
  94 # dashed aliases of multi-word commands defined later
  95 # alias pick-tsv='picktsv'
  96 
  97 
  98 # line-styling shortcuts, using my script `style`
  99 blue() { style blue "$@"; }
 100 bold() { style bold "$@"; }
 101 gray() { style gray "$@"; }
 102 green() { style green "$@"; }
 103 highlight() { style highlight "$@"; }
 104 hilite() { style hilite "$@"; }
 105 magenta() { style magenta "$@"; }
 106 orange() { style orange "$@"; }
 107 red() { style red "$@"; }
 108 underline() { style underline "$@"; }
 109 
 110 
 111 # shortcuts for my script `ca`, using various decimal precisions
 112 ca10() { ca "scale=10; $*"; }
 113 ca20() { ca "scale=20; $*"; }
 114 ca30() { ca "scale=30; $*"; }
 115 ca40() { ca "scale=40; $*"; }
 116 ca50() { ca "scale=50; $*"; }
 117 ca60() { ca "scale=60; $*"; }
 118 ca70() { ca "scale=70; $*"; }
 119 ca80() { ca "scale=80; $*"; }
 120 ca90() { ca "scale=90; $*"; }
 121 
 122 # CAlculator with Nice numbers runs my script `ca` and colors results with
 123 # my script `nn`, alternating styles to make long numbers easier to read
 124 can() {
 125     ca "$@" | nn
 126 }
 127 
 128 # Change Units turns common US units into international ones; uses my
 129 # scripts `bu` (Better Units) and `nn` (Nice Numbers)
 130 cu() {
 131     bu "$@" | awk '
 132         NF == 5 { print $(NF-1), $NF }
 133         NF == 4 && $NF == "s" { print $(NF-1), $NF }
 134         NF == 4 && $NF != "s" { print $NF }
 135     ' | nn
 136 }
 137 
 138 # FOreign MOney to CAnadian Dollars: uses `cancur` from `clam` to fetch
 139 # data from the Bank of Canada, filtering columns to only show exchange
 140 # rates from a few select currencies
 141 fomo2cad() {
 142     cancur |
 143     awk -F "\t" -v x="${1:-1}" 'END {
 144         printf "%12s%18sCAD\n", $1, ""
 145         printf "%12.2f  USD =  %12.2f\n", x, x * $26
 146         printf "%12.2f  EUR =  %12.2f\n", x, x * $5
 147         printf "%12.2f  MXN =  %12.2f\n", x, x * $11
 148         # printf "%12.2f  GBP =  %12.2f\n", x, x * $25
 149         # printf "%12.2f  INR =  %12.2f\n", x, x * $7
 150         # printf "%12.2f  BRL =  %12.2f\n", x, x * $3
 151         # printf "%12.2f  JPY =  %12.2f\n", x, x * $9
 152         # printf "%12.2f  KRW =  %12.2f\n", x, x * $19
 153         # printf "%12.2f  AUD =  %12.2f\n", x, x * $2
 154     }'
 155 }
 156 
 157 # Like A Book groups lines as 2 side-by-side pages, the same way books
 158 # do it; uses my script `book`
 159 lab() {
 160     book "$(($(tput lines) - 1))" "$@" | less -KiCRS
 161 }
 162 
 163 # Nice File Sizes, using my scripts `nn` and `cext`
 164 nfs() {
 165     # turn arg-list into single-item lines
 166     awk 'BEGIN { for (i = 1; i < ARGC; i++) print ARGV[i]; exit }' "$@" |
 167     # calculate file-sizes, and reverse-sort results
 168     xargs -d '\n' wc -c | sort -rn |
 169     # start output with a header-like line, and add a MiB field
 170     awk 'BEGIN { printf "%5s  %9s  %8s  name\n", "n", "bytes", "MiB" }
 171     { printf "%6d  %9d  %8.2f  %s\n", NR - 1, $1, $1 / 1048576, $2 }' |
 172     # make zeros in the MiB field stand out with a special color
 173     awk '{ gsub(/ 0.00 /, "\x1b[38;5;103m 0.00 \x1b[0m"); print }' |
 174     # make numbers nice, alternating styles along 3-digit groups
 175     nn |
 176     # color-code file extensions
 177     cext |
 178     # make table breathe with empty lines, so tall outputs are readable
 179     awk '(NR - 2) % 5 == 1 && NR > 1 { print "" } 1'
 180 }
 181 
 182 # Nice Size, using my script `nn`
 183 ns() {
 184     wc -c "$@" | nn
 185 }
 186 
 187 # run my script `pick` using tab as the only field-separator,
 188 # which means the resulting TSV items can have spaces in them
 189 # picktsv() {
 190 #     pick --tsv "$@"
 191 # }
 192 
 193 # Styled LEAK, runs my script `leak`
 194 sleak() {
 195     leak "$@"
 196 }
 197 
 198 # Show Latest Podcasts, using my scripts `podfeed` and `si`
 199 slp() {
 200     podfeed -title "Latest Podcast Episodes as of $(date +'%F %T')" "$@" | si
 201 }
 202 
 203 # run my script `realign` using tab as the only field-separator,
 204 # which means the resulting TSV items can have spaces in them
 205 tsv2ssv() {
 206     realign --tsv "$@"
 207 }
 208 
 209 # Word-Count Plus runs `wc` and enriches its output; uses my scripts `nn`,
 210 # and `cext`
 211 wcp() {
 212     wc "$@" | sort -rn | nn | cext | awk '{ printf "%6d  %s\n", NR - 1, $0 }'
 213 }