#!/bin/bash
-# Copyright (C) 2019 Ian Kelling
-# SPDX-License-Identifier: AGPL-3.0-or-later
+# I, Ian Kelling, follow the GNU license recommendations at
+# https://www.gnu.org/licenses/license-recommendations.en.html. They
+# recommend that small programs, < 300 lines, be licensed under the
+# Apache License 2.0. This file contains or is part of one or more small
+# programs. If a small program grows beyond 300 lines, I plan to switch
+# its license to GPL.
+
+# Copyright 2024 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
# this gets sourced. shebang is just for file mode detection
# Use source ~/.bashrc instead of doing bash -l when running a script
export LESS=RXij12
export SYSTEMD_LESS=$LESS
+
export NNN_COLORS=2136
export SL_FILES_DIR=/b/ds/sl/.iank
fi
fi
+# go exists here
+path-add --ifexists /usr/local/go/bin
+
mysrc() {
local path dir file
fi
ll ~/.ssh/known_hosts
}
-khfix-r() { # known hosts fix + root
+khfix-r() { # known hosts fix without syncing to root user
_khfix-common "$@" || return 1
ssh $1 :
- rootsshsync
}
khfix() {
_khfix-common "$@" || return 1
ssh $1 :
+ rootsshsync
}
# copy path into clipboard
a() {
local x
x=$(readlink -nf "${1:-$PWD}")
- # yes, its kinda dumb that xclip/xsel cant do this in one invocation
- echo -n "$x" | xclip -selection clipboard
- echo -n "$x" | xclip
+ # yes, its kinda dumb that xclip/xsel cant do this in one invocation.
+ # And, summarizing this:
+ # https://askubuntu.com/questions/705620/xclip-vs-xsel
+ # xclip has a few more options. xclip has a bug in tmux / forwarded x sessions.
+ cbs "$x"
+}
+
+# clipboard a string (into selection & clipboard buffer)
+cbs() {
+ # yes, its kinda dumb that xclip/xsel cant do this in one invocation.
+ # And, summarizing this:
+ # https://askubuntu.com/questions/705620/xclip-vs-xsel
+ # xclip has a few more options. xclip has a bug in tmux / forwarded x sessions.
+ printf "%s" "$*" | xclip -selection clipboard
+ printf "%s" "$*" | xclip
}
# a1 = awk {print $1}
"$@" &> /a/tmp/gtmp
g /a/tmp/gtmp
}
-# g command substitution
+# g command substitution.
gc() {
+ # shellcheck disable=SC2046 # i want word splitting for this hackery
g $("$@")
}
# Don't return 1 on nonmatch because this is meant to be
# interactive, not in a conditional.
if [[ ${#@} == 1 ]]; then
- grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -riIP --color=auto "$@" . || [[ $? == 1 ]]
+ grep -E --exclude-dir='*.emacs.d' --exclude-dir='*.git' -riIP --color=auto "$@" . || [[ $? == 1 ]]
else
- grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -riIP --color=auto "$@" || [[ $? == 1 ]]
+ grep -E --exclude-dir='*.emacs.d' --exclude-dir='*.git' -riIP --color=auto "$@" || [[ $? == 1 ]]
fi
}
ccomp grep gr grr
file_prefix=$2
file_suffix=$3
tmp="${file_prefix##*[[:alnum:]]}"
- targetf="${file_prefix%$tmp}"
+ targetf="${file_prefix%"$tmp"}"
echo targetf: $targetf
github-release-dl "$@"
files=(./*)
c "$(mktemp -d)"
pkg=$1
# shellcheck disable=SC2012
- cached=$(ls -t /var/cache/apt/archives/${pkg}_* | tail -n1 2>/dev/null) ||:
+ cached=$(ls -t /var/cache/apt/archives/${pkg}_* 2>/dev/null | tail -n1 2>/dev/null) ||:
if [[ $cached ]]; then
m cp $cached .
else
sk() {
- # disable a warning with:
- # shellcheck disable=SC2206 # reasoning
-
- # see bash-template/style-guide.md for justifications
-
- local quotes others
+ # see https://savannah.gnu.org/maintenance/fsf/bash-style-guide/ for justifications
+ local quotes others ret
quotes=2048,2068,2086,2206,2254
others=2029,2032,2033,2054,2164,
- shellcheck -W 999 -x -e $quotes,$others "$@" || return $?
+ shellcheck -W 999 -x -e $quotes,$others "$@" || ret=$?
+ if (( ret >= 1 )); then
+ echo "A template comment to disable is now in clipboard. eg: # shellcheck disable=SC2206 # reason"
+ cbs "# shellcheck disable=SC"
+ return $ret
+ fi
}
# sk with quotes. For checking scripts that we expect to take untrusted
# input in order to verify we quoted vars.
pson() {
PROMPT_COMMAND=(prompt-command)
if [[ $TERM == *(screen*|xterm*|rxvt*) ]]; then
- trap 'settitle "$BASH_COMMAND"' DEBUG
+ trap 'auto-window-title "$BASH_COMMAND"' DEBUG
fi
}
}
m() { printf "%s\n" "$*"; "$@"; }
+m2() { printf "%s\n" "$*" >&2; "$@"; }
# update file. note: duplicated in mail-setup.
# updates $ur u result to true or false
done
}
+# note, there is also the tool gron which is meant for this, but
+# this is good enough to not bother installing another tool
+jq-lines() {
+ # https://stackoverflow.com/questions/59700329/how-to-print-path-and-key-values-of-json-file-using-jq
+ jq --stream -r 'select(.[1]|scalars!=null) | "\(.[0]|join(".")): \(.[1]|tojson)"' "$@"
+}
tsr() { # ts run
"$@" |& ts || return $?
# https://github.com/trapd00r/LS_COLORS
# I would like if there was something similar for light.
+ # https://www.bigsoft.co.uk/blog/2008/04/11/configuring-ls_colors
+ # change the hard to read turqouise.
+ # defaults dircolors --print-database.
+
# the default bold green is too light.
# this explains the codes: https://gist.github.com/thomd/7667642
- export LS_COLORS=ex=1
+ export LS_COLORS="ex=1:ln=00;31"
term_bold="$(tput bold)"
term_red="$(tput setaf 1)"
# so I've thrown a bunch of things at the wall to speed it up.
prompt-command() {
local return=$? # this MUST COME FIRST
+
+ # all usable colors:
+ # black
+ # green nonzero exit (pri 1)
+ # purple default
+ # purple bold
+ # red pwd different owner & group & not writable (pri 2)
+ # red bold pwd different owner & group & writable (pri 2)
+ # yellow
+
local ps_char ps_color
unset IFS
history -a # save history
fi
- case $return in
- 0) ps_color="$term_purple"
- ps_char='\$'
- ;;
- *) ps_color="$term_green"
- ps_char="$return \\$"
- ;;
- esac
+ ps_color="$term_purple"
+ ps_char='\$'
if [[ ! -O . ]]; then # not owner
if [[ -w . ]]; then # writable
ps_color="$term_bold$term_red"
else
- ps_color="$term_bold$term_green"
+ ps_color="$term_red"
fi
fi
+ if [[ $return != 0 ]]; then
+ ps_color="$term_green"
+ ps_char="$return \\$"
+ fi
+
# faster than sourceing the file im guessing
if [[ -e /dev/shm/iank-status && ! -e /tmp/quiet-status ]]; then
eval "$(< /dev/shm/iank-status)"
fi
# make the titlebar be the last command and the current directory.
- settitle () {
+ auto-window-title () {
# These are some checks to help ensure we dont set the title at
# condition from the screen man page i think.
# note: duplicated in tx()
if [[ $TERM == *(screen*|xterm*|rxvt*) ]]; then
- trap 'settitle "$BASH_COMMAND"' DEBUG
+ trap 'auto-window-title "$BASH_COMMAND"' DEBUG
else
trap DEBUG
fi