X-Git-Url: https://iankelling.org/git/?p=distro-setup;a=blobdiff_plain;f=brc;h=08ad4067ce22bdb7d4742cbeb8aa0e8d7ba1d8c7;hp=2a81b25fa369f557d373f431d3c56400f61e9707;hb=HEAD;hpb=9a0f77b0495e6f2643d5646c54b4c99cf3118c67 diff --git a/brc b/brc index 2a81b25..7731b9c 100644 --- a/brc +++ b/brc @@ -1,6 +1,25 @@ #!/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 @@ -229,30 +248,12 @@ if [[ $- == *i* ]]; then TERM=xterm-256color fi - if [[ $TERM == alacritty && ! -e /usr/share/terminfo/a/alacritty ]]; then - # todo: we should try installing the alacritty terminfo if it is not found - # https://github.com/alacritty/alacritty/issues/2838 - TERM=xterm-256color - fi - - # copying from the alacritty example above, - if [[ $TERM == xterm-kitty ]]; then - if [[ ! -e /usr/share/terminfo/x/xterm-kitty ]]; then - TERM=xterm-256color - else - if [[ -e /a/opt/kitty/shell-integration/bash/kitty.bash ]]; then - KITTY_SHELL_INTEGRATION=t - source /a/opt/kitty/shell-integration/bash/kitty.bash - fi - fi - fi - # todo: not sure this works in sakura #stty werase undef #bind "\C-w": kill-region # sakura == xterm-256color # konsole == xterm - if [[ $TERM != xterm-kitty && $TERM == xterm* ]]; then + if [[ $TERM == xterm* ]]; then # control + arrow keys. for other terminals, see http://unix.stackexchange.com/questions/10806/how-to-change-previous-next-word-shortcut-in-bash bind '"\e[1;5C": shell-forward-word' 2>/dev/null bind '"\e[1;5D": shell-backward-word' 2>/dev/null @@ -272,15 +273,6 @@ if [[ $- == *i* ]]; then fi -case $TERM in - # fixup broken backspace in chroots - xterm-kitty|alacritty) - chroot() { - TERM=xterm-256color command chroot "$@" - } - ;; -esac - export BC_LINE_LENGTH=0 # ansible option @@ -296,6 +288,7 @@ export PROFILE_TASKS_TASK_OUTPUT_LIMIT=100 export LESS=RXij12 export SYSTEMD_LESS=$LESS + export NNN_COLORS=2136 export SL_FILES_DIR=/b/ds/sl/.iank @@ -347,6 +340,9 @@ if [[ $SOE ]]; then fi fi +# go exists here +path-add --ifexists /usr/local/go/bin + mysrc() { local path dir file @@ -856,23 +852,35 @@ _khfix-common() { 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} @@ -1382,6 +1390,7 @@ fa() { done < <(find "$@" -print0); } +# shellcheck disable=SC2120 faf() { # find all files. use -L to follow symlinks find "$@" -not \( -name .svn -prune -o -name .git -prune \ -o -name .hg -prune -o -name .editor-backups -prune \ @@ -1609,8 +1618,9 @@ gl() { "$@" &> /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 $("$@") } @@ -1720,7 +1730,7 @@ go-github-install() { 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=(./*) @@ -2103,7 +2113,7 @@ pkx() { # package extract 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 @@ -2427,18 +2437,24 @@ sgu() { systemctl list-unit-files | rg "$@" } +# check whether we generally want to do sk on the file +sk-p() { + [[ ! -L $f ]] && istext "$1" && [[ $(head -n1 "$1" 2>/dev/null) == '#!/bin/bash'* ]] +} 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 $? + others=2029,2032,2033,2054,2164 + shellcheck -x -W 999 -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. skq() { @@ -2447,15 +2463,41 @@ skq() { shellcheck -W 999 -x -e $others "$@" || return $? } -skgit() { +# sk on all modified files in current git repo +skmodified() { local f for f in $(i s | awk '$1 == "modified:" {print $2}'); do - if istext "$f" && [[ $(head -n1 "$f" 2>/dev/null) == '#!/bin/bash'* ]]; then + if sk-p "$f"; then sk $f ||: fi done } + +# sk on all the files in current git repo +skgit() { + local f toplevel orig_dir tmp + local -a ls_files sk_files + toplevel=$(git rev-parse --show-toplevel) + if [[ $PWD != "$toplevel" ]]; then + orig_dir=$PWD + cd $toplevel + fi + # tracked & untracked files + tmp=$(git ls-files && git ls-files --others --exclude-standard) + mapfile -t ls_files <<<"$tmp" + for f in "${ls_files[@]}"; do + if sk-p "$f"; then + sk_files+=("$f") + fi + done + sk "${sk_files[@]}" + if [[ $orig_dir ]]; then + cd $orig_dir + fi +} + + # sl: ssh, but firsh rsync our bashrc and related files to a special # directory on the remote host if needed. @@ -2700,11 +2742,7 @@ ssk() { ccomp ssh sl slr sss ssk # plain ssh ssh() { - if [[ $TERM == alacritty || $TERM == xterm-kitty ]]; then - TERM=xterm-256color LC_USEBASHRC=t command ssh "$@" - else - LC_USEBASHRC=t command ssh "$@" - fi + LC_USEBASHRC=t command ssh "$@" } @@ -2823,7 +2861,7 @@ psoff() { pson() { PROMPT_COMMAND=(prompt-command) if [[ $TERM == *(screen*|xterm*|rxvt*) ]]; then - trap 'settitle "$BASH_COMMAND"' DEBUG + trap 'auto-window-title "$BASH_COMMAND"' DEBUG fi } @@ -2863,6 +2901,7 @@ nonet() { } m() { printf "%s\n" "$*"; "$@"; } +m2() { printf "%s\n" "$*" >&2; "$@"; } # update file. note: duplicated in mail-setup. # updates $ur u result to true or false @@ -3080,8 +3119,9 @@ n() { } catnew() { - local dir file + local dir file _ dir="$1" + # shellcheck disable=SC2030 inotifywait -m "$dir" -e create -e moved_to | while read -r _ _ file; do hr cat "$dir/$file" @@ -3125,6 +3165,12 @@ EOF 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 $? @@ -3139,9 +3185,13 @@ if $use_color && type -p tput &>/dev/null; then # 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)" @@ -3195,6 +3245,16 @@ if [[ $- == *i* ]]; then # 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 @@ -3202,22 +3262,21 @@ if [[ $- == *i* ]]; then 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)" @@ -3284,7 +3343,7 @@ if [[ $- == *i* ]]; then 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 @@ -3309,7 +3368,7 @@ if [[ $- == *i* ]]; then # 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