X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc;h=32a2c66212893c101c8e7c57670f5486a6f613c8;hb=refs%2Fheads%2Fmaster;hp=8e1b3276f0358ac96cd038e9764c700e811a497e;hpb=e6cd2e555df3af0cf23da016b833529a34ffc84c;p=distro-setup diff --git a/brc b/brc index 8e1b327..222e0f8 100644 --- a/brc +++ b/brc @@ -244,10 +244,6 @@ if [[ $- == *i* ]]; then use_color=true fi - if [[ $KONSOLE_PROFILE_NAME ]]; then - TERM=xterm-256color - fi - # todo: not sure this works in sakura #stty werase undef #bind "\C-w": kill-region @@ -319,9 +315,6 @@ export SL_INFO_DIR=/p/sshinfo if [[ -s $bashrc_dir/path-add-function ]]; then source $bashrc_dir/path-add-function if [[ $SSH_CLIENT ]]; then - if grep -qF /home/iank/.iank/e/e /etc/exports &>/dev/null; then - export EMACSDIR=/home/iank/.iank/e/e - fi path-add $bashrc_dir fi fi @@ -361,6 +354,7 @@ mysrc() { mysrc /a/bin/small-misc-bash/ll-function mysrc /a/bin/distro-functions/src/package-manager-abstractions +mysrc /a/bin/fai/fai/config/distro-install-common/bash-misc-funcs # things to remember: # ALT-C - cd into the selected directory @@ -1047,10 +1041,13 @@ caf() { -o -name .hg -prune -o -name .editor-backups -prune \ -o -name .undo-tree-history -prune \) -printf '%h\0%d\0%p\n' | sort -t '\0' -n \ | awk -F '\0' '{print $3}' 2>/dev/null | while read -r file; do - hr - printf "%s\n" "$file" - hr - cat "$file" + hr "$file" + v "$file" + # if the file is nonempty and the last char is nonempty, it is not + # newline terminated. + if [[ -s "$file" && "$(tail -c 1 "$file")" ]]; then + echo + fi done } ccomp cat cf caf @@ -1325,9 +1322,13 @@ etailm() { tail -F /var/log/exim4/mainlog -n 200 "$@" } etail2() { - tail -F /var/log/exim4/mymain -n 200 "$@" + tail -F /var/log/exim4/nondmain -n 200 "$@" } -ccomp tail etail etail2 +# shortcut for tail -F +ta() { + tail -F "$@" +} +ccomp tail etail etail2 ta # ran into this online, trying it out detach() { @@ -1619,53 +1620,6 @@ and works in older versions of git which did not have that." echo "${p%%/.git}" } -g() { - - local args gdb=false - - if [[ $EMACSDIR ]]; then - path-add "$EMACSDIR/lib-src" "$EMACSDIR/src" - fi - - if [[ $DISPLAY ]]; then - args=-n - fi - - if (( $# == 0 )); then - args+=" -c" - fi - # duplicate -c, but oh well - if ! pgrep -u $EUID emacsclient; then - if (( $# == 0 )) && type -p gdb &>/dev/null; then - gdb=true - else - args+=" -c" - fi - fi - if [[ $EMACSDIR ]]; then - - # todo: we don't have to alter HOME since emacs 29+, we can set - # user-emacs-directory with the flag --init-directory - - # Alter the path here, otherwise the nfs mount gets triggered on the - # first path lookup when emacs is not being used. - # shellcheck disable=SC2098 disable=SC2097 # false positive - PATH="$EMACSDIR/lib-src:$EMACSDIR/src:$PATH" EHOME=$HOME HOME=$EMACSDIR m emacsclient -a "" $args "$@" - else - if $gdb; then - # due to a bug, we cant debug from the start unless we get a new gdb - # https://sourceware.org/bugzilla/show_bug.cgi?id=24454 - # m gdb -ex="set follow-fork-mode child" -ex=r -ex=quit --args emacs --daemon - m emacsclient -a "" $args "$@" - sleep 1 - cd "/a/opt/emacs-$(distro-name)$(distro-num)" - s gdb -p "$(pgrep -f 'emacs --daemon')" -ex c - cd - - else - m emacsclient -a "" $args "$@" - fi - fi -} # g pipe. like: cmd | emacs. save cmd output to tmp file, then edit. gp() { @@ -1711,9 +1665,9 @@ grr() { # grep recursive # 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 --exclude-dir='*.emacs.d' --exclude-dir='*.git' -rniIP --color=auto "$@" . || [[ $? == 1 ]] else - grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -riIP --color=auto "$@" || [[ $? == 1 ]] + grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -rniIP --color=auto "$@" || [[ $? == 1 ]] fi } ccomp grep gr grr @@ -1733,10 +1687,21 @@ re() { # horizontal row. used to break up output hr() { - local blocks - # 180 is long enough. - blocks=██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ - printf "%s\n" "$(tput setaf 5 2>/dev/null ||:)${blocks:0:${COLUMNS:-180}}$(tput sgr0 2>/dev/null||:)" + local start end end_count arg + # 180 is long enough. 5 for start. + start=█████ end=█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ + end_count=$(( ${COLUMNS:-180} - 5 )) + arg="$*" + if [[ $arg ]]; then + end_count=$(( end_count - 2 - ${#arg} )) + start="$start $arg " + fi + if (( end_count >= 1 )); then + end=${end:0:$end_count} + else + end= + fi + printf "%s\n" "$(tput setaf 5 2>/dev/null ||:)$start$end$(tput sgr0 2>/dev/null||:)" } # highlight hl() { @@ -2049,6 +2014,8 @@ ksu() { # history search unique grep -P --binary-files=text "$@" ${HISTFILE:-~/.bash_history} | uniq || [[ $? == 1 ]]; } +# remove lines from history matching $1 +# # todo: id like to do maybe a daily or hourly cronjob to # check that my history file size is increasing. Ive had it # inexplicably truncated in the past. @@ -2220,7 +2187,7 @@ grep ps and output in a nice format" fi x=$(ps -eF) # final grep is because some commands tend to have a lot of trailing spaces - y=$(echo "$x" | grep -iP "$@" | grep -o '.*[^ ]') ||: + y=$(echo "$x" | sed -r 's,//[^[:space:]:@/]+:[^[:space:]:@/]+@,//REDACTED_URL_USER@PASS/,g' | grep -iP "$@" | grep -o '.*[^ ]') ||: if [[ $y ]]; then echo "$x" | head -n 1 || [[ $? == 141 ]] echo "$y" @@ -2541,10 +2508,10 @@ skq() { shellcheck -W 999 -x -e $others "$@" || return $? } -# sk on all modified files in current git repo +# sk on all modified & new files in current git repo. must git add for new files. skmodified() { local f - for f in $(i s | awk '$1 == "modified:" {print $2}'); do + for f in $(i s | awk '$1 == "modified:" {print $2}; $1 == "new" {print $3}'); do if sk-p "$f"; then sk $f ||: fi @@ -2940,9 +2907,19 @@ psoff() { # however, DEBUG is not inherited, so we need to run it outside a function. # And we want to run set -x afterwards to avoid spam, so we cram everything # in here, and then it will run after this function is done. - # # set as array to satisfy shellcheck, but it is equivalent to setting it as non-array - PROMPT_COMMAND=('trap DEBUG; unset PROMPT_COMMAND; PS1="\w \$ "') + # shellcheck disable=SC2178 # intentional + PROMPT_COMMAND='trap DEBUG; unset PROMPT_COMMAND; PS1=" \w \$ "' +} + +pskde() { + # shellcheck disable=SC2178 # intentional + PROMPT_COMMAND='trap DEBUG; unset PROMPT_COMMAND' + PS1='\[\e]133;L\a\]\[\e]133;D;$?\]\[\e]133;A\a\]\w \$ \[\e]133;B\a\]' ; + PS2='\[\e]133;A\a\]'$PS2'\[\e]133;B\a\]' ; + PS0='\[\e]133;C\a\]' + } + pson() { PROMPT_COMMAND=(prompt-command) if [[ $TERM == *(screen*|xterm*|rxvt*) ]]; then @@ -2988,33 +2965,6 @@ 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 -# updates $reload to true if file updated is in /etc/systemd/system -u() { - local tmp tmpdir dest="$1" - local base="${dest##*/}" - local dir="${dest%/*}" - if [[ $dir != "$base" ]]; then - # dest has a directory component - mkdir -p "$dir" - fi - # shellcheck disable=SC2034 # see comment at top of function - ur=false # u result - tmpdir="$(mktemp -d)" - cat >$tmpdir/"$base" - tmp=$(rsync -ic $tmpdir/"$base" "$dest") - if [[ $tmp ]]; then - printf "%s\n" "$tmp" - # shellcheck disable=SC2034 # see comment at top of function - ur=true - if [[ $dest == /etc/systemd/system/* ]]; then - # shellcheck disable=SC2034 # see comment at top of function - reload=true - fi - fi - rm -rf $tmpdir -} uptime() { @@ -3139,7 +3089,7 @@ spark() for n in $numbers do - _spark_echo -n ${ticks[$(( (((n-min)<<8)/f) ))]} + _spark_echo -n ${ticks[$(( ((n-min)<<8)/f ))]} done _spark_echo } @@ -3331,6 +3281,7 @@ if [[ $- == *i* ]]; then prompt-command() { local return=$? # this MUST COME FIRST + # all usable colors: # black # green nonzero exit (pri 1) @@ -3345,10 +3296,17 @@ if [[ $- == *i* ]]; then if [[ $HISTFILE ]]; then history -a # save history + if [[ -e $HOME/.iank-stream-on ]]; then + if [[ $HISTFILE == $HOME/.bh ]]; then + ps_char="HISTP " + fi + elif [[ $HISTFILE == /a/bin/data/stream_hist ]]; then + ps_char="HISTS " + fi fi ps_color="$term_purple" - ps_char='\$' + ps_char="$ps_char"'\$' if [[ ! -O . ]]; then # not owner if [[ -w . ]]; then # writable ps_color="$term_bold$term_red" @@ -3371,7 +3329,7 @@ if [[ $- == *i* ]]; then fi jobs_char= if [[ $(jobs -p) ]]; then - jobs_char='j\j ' + jobs_char="$(jobs -p)"'j\j ' fi @@ -3404,6 +3362,8 @@ if [[ $- == *i* ]]; then fi PS1="${PS1%"${PS1#*[wW]}"} $jobs_char$psudo\[$ps_color\]$ps_char\[$term_nocolor\] " + + # copy of what is automatically added by guix. # adds [env] to PS1 if GUIX_ENVIRONMENT is set and PS1 contains '$'; if [ -n "$GUIX_ENVIRONMENT" ]; then @@ -3416,6 +3376,16 @@ if [[ $- == *i* ]]; then # set titlebar. instead, using more advanced # titelbar below #echo -ne "$_title_escape $HOSTNAME ${PWD/#$HOME/~} \007" + + # version 211203 does not have this feature. + if [[ $KONSOLE_VERSION && $KONSOLE_VERSION == [3456789]* || $KONSOLE_VERSION == 2[2456789]* ]]; then + # from konsole, output via ctrl-alt-] + if [[ ! $PS1 =~ 133 ]] ; then + PS1='\[\e]133;L\a\]\[\e]133;D;$?\]\[\e]133;A\a\]'$PS1'\[\e]133;B\a\]' ; + PS2='\[\e]133;A\a\]'$PS2'\[\e]133;B\a\]' ; + PS0='\[\e]133;C\a\]' ; fi + fi + } PROMPT_COMMAND=(prompt-command) @@ -3471,6 +3441,7 @@ lp22viewers() { room=${rooms[i]} while read -r n; do v=$((v+n)) + # shellcheck disable=SC2004 # false positive roomv[$i]=$(( ${roomv[$i]} + n )) done < <(printf "%s\n" "$out" | grep -Po "$room.*?current[^0-9]*[0-9]*" | grep -o '[0-9]*$' ) done @@ -3493,6 +3464,44 @@ dsh() { command dsh -c "$@" } +# cat or bat with color if we have it +v() { + if type -t batcat >/dev/null; then + # note: another useful useful style is "header" + batcat --color always --style plain --theme Coldark-Cold -P "$@" + else + cat "$@" + fi +} + +# Combine files $@ into a single file with comments between them which +# allow splitting them back with fsplit. +# +# Assumes file names do not have newlines in them. +fcomb() { + local f comment out + # generated with cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c8 + comment='# jvvuyUsq ' + out=~/fcomb + rm -f $out + for f; do + echo "$comment$f" >>$out + cat "$f" >>$out + done +} +fsplit() { + local f fin line fin_lines + fin=~/fcomb + line=1 + fin_lines=$(wc -l "$fin" | awk '{print $1}') + comment='# jvvuyUsq ' + while (( line <= fin_lines )); do + f=$(sed -n "${line}s/^$comment//p" "$fin") + sed -n "$line,/^$comment/{/^$comment/d;p}" "$fin" >"$f" + line=$(( line + 1 + $(wc -l "$f" | awk '{print $1}') )) + done +} + # * stuff that makes sense to be at the end