X-Git-Url: https://iankelling.org/git/?p=distro-setup;a=blobdiff_plain;f=brc;h=37e09a0c13399224b748366482fc84b22f7a96ed;hp=e740a8da51db5889095452dcd71db179e710ab0c;hb=79b274fcd8bfa556133ab13270e84b40aebe8468;hpb=93db0c16393fe75efef3167c1d2b332f50387c23 diff --git a/brc b/brc index e740a8d..37e09a0 100644 --- a/brc +++ b/brc @@ -1,4 +1,6 @@ #!/bin/bash +# Copyright (C) 2019 Ian Kelling +# SPDX-License-Identifier: AGPL-3.0-or-later # this gets sourced. shebang is just for file mode detection # note, to catch errors in functions but not outside, do: @@ -26,29 +28,19 @@ unalias -a shopt -s extglob # include .files when globbing, but ignore files name . and .. # setting this also sets dotglob. -# Note, this doesnt work in bash 4.4 anymore, for paths with -# more than 1 directory, like a/b/.foo, since * is fixed to not match / -export GLOBIGNORE=*/.:*/.. +export GLOBIGNORE="*/.:*/.." # broken with bash_completion package. Saw a bug for this once. dont anymore. # still broken in wheezy # still buggered in latest stable from the web, version 2.1 # perhaps its fixed in newer git version, which fails to make for me # this note is from 6-2014. -# Also, enabling this before sourcing .bashrc makes PATH be empty. +# still broken in flidas. #shopt -s nullglob # make tab on an empty line do nothing shopt -s no_empty_cmd_completion -# advanced completion -# http://bash-completion.alioth.debian.org/ -# might be sourced by the system already, but ive noticed it not being sourced before -if ! type _init_completion &> /dev/null && [[ -r "/usr/share/bash-completion/bash_completion" ]]; then - . /usr/share/bash-completion/bash_completion -fi - - # fix spelling errors for cd, only in interactive shell shopt -s cdspell # append history instead of overwritting it @@ -61,7 +53,7 @@ shopt -s cmdhist shopt -s globstar -# inside emcas fixes +# inside emacs fixes if [[ $RLC_INSIDE_EMACS ]]; then # EMACS is used by bash on startup, but we dont need it anymore. # plus I hit a bug in a makefile which inherited it @@ -96,6 +88,19 @@ if [[ $RLC_INSIDE_EMACS ]]; then fi +# emacs has a different default search path than the info command. This +# adds the info defaults to emacs, but not the reverse, because I dun +# care much about the cli. The search path is only on the cli if you run +# "info xxx", or in emacs if you run '(info xxx)', so not that +# important, but might as well fix it. + +# info info says this path is what was compiled, and its not documented +# anywhere. Through source grepping, i found it in filesys.h of the info +# source in trisquel flidas. +# +# Traling : means for emacs to add its own stuff on to the end. + +export INFOPATH=$PATH:/usr/local/info:/usr/info:/usr/local/lib/info:/usr/lib/info:/usr/local/gnu/info:/usr/local/gnu/lib/info:/usr/gnu/info:/usr/gnu/lib/info:/opt/gnu/info:/usr/share/info:/usr/share/lib/info:/usr/local/share/info:/usr/local/share/lib/info:/usr/gnu/lib/emacs/info:/usr/local/gnu/lib/emacs/info:/usr/local/lib/emacs/info:/usr/local/emacs/info:.: if [[ $- == *i* ]]; then # for readline-complete.el @@ -107,12 +112,16 @@ if [[ $- == *i* ]]; then bind '"\C-i": self-insert' else + if [[ $KONSOLE_PROFILE_NAME ]]; then + TERM=xterm-256color + fi + # todo: not sure this works in sakura #stty werase undef #bind "\C-w": kill-region # sakura == xterm-256color # konsole == xterm - if [[ $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 @@ -140,10 +149,7 @@ PS4='$LINENO+ ' # default HISTFILESIZE is 500 and could clobber our history HISTFILESIZE= # max commands 1 session can append/read from history -HISTSIZE=100000 -# my own history size limit based on lines -HISTFILELINES=1000000 -HISTFILE=$HOME/.bh +HISTSIZE=1000000 # the time format display when doing the history command # also, setting this makes the history file record time # of each command as seconds from the epoch @@ -153,79 +159,51 @@ HISTCONTROL=ignoredups # works in addition to HISTCONTROL to do more flexible things # it could also do the same things as HISTCONTROL and thus replace it, # but meh. dunno why, but just " *" does glob expansion, so use [ ] to avoid it. -HISTIGNORE='pass *:[ ]*:lom*:gram*' +HISTIGNORE='pass *:[ ]*:otp *:oathtool *' export BC_LINE_LENGTH=0 +export PROFILE_TASKS_TASK_OUTPUT_LIMIT=100 # note, if I use a machine I dont want files readable by all users, set # umask 077 # If fewer than 4 digits are entered, leading zeros are assumed -C_DEFAULT_DIR=/a - # i for insensitive. the rest from -# https://superuser.com/questions/366930/how-do-i-get-the-git-pager-to-clean-up-screen-output-after-exit -# and reading the man +# X means dont remove the current screenworth of output upon exit +# R means to show colors n things export LESS=RXi export SYSTEMD_LESS=$LESS -# * include files -for _x in /a/bin/distro-functions/src/* /a/bin/!(githtml)/*-function?(s); do - source "$_x" -done -unset _x -# so I can share my bashrc -for x in /a/bin/bash_unpublished/source-!(.#*); do source $x; done -source $(dirname $(readlink -f $BASH_SOURCE))/path_add-function -source /a/bin/log-quiet/logq-function -if [[ -e /a/bin/errhandle/err ]]; then - source /a/bin/errhandle/err - err-allow -fi -# if someone exported $SOE (stop on error), catch errors -if [[ $SOE ]]; then - err-catch -fi - -path_add /a/exe -# end just because it seems safer -path_add --end node_modules/.bin -# pip3 --user things go here: -path_add --end ~/.local/bin -path_add --ifexists --end /a/work/libremanage -path_add --ifexists --end /a/opt/adt-bundle*/tools /a/opt/adt-bundle*/platform-tools -path_add --ifexists --end /a/opt/scancode-toolkit-2.9.2 -export WCDHOME=/a -# based on readme.debian. dunno if this will break on other distros. -_x=/usr/share/wcd/wcd-include.sh -if [[ -e $_x ]]; then source $_x; fi +# * include files -# * aliases -# very few aliases, functions are always preferred. -# ancient stuff. -if [[ $OS == Windows_NT ]]; then - alias ffs='cygstart "/c/Program Files (x86)/Mozilla Firefox/firefox.exe" -P scratch' - export DISPLAY=nt - alias j='command cygpath' - alias t='command cygstart' - alias cygstart='echo be quick, use the alias "t" instead :\)' - alias cygpath='echo be quick, use the alias "j" instead :\)' +# if someone exported $SOE (stop on error), catch errors. +# +# Note, on debian this results in the following warning when in ssh, +# hich I haven't figured out how to fix. It doesn't happen if we source +# after the shell has started +# +# bash: /usr/share/bashdb/bashdb-main.inc: No such file or directory +# bash: warning: cannot start debugger; debugging mode disabled +if [[ $SOE ]]; then + if [[ -e /a/bin/errhandle/err ]]; then + source /a/bin/errhandle/err + fi fi +# based on readme.debian. dunno if this will break on other distros. +if [[ -s /usr/share/wcd/wcd-include.sh ]]; then + source /usr/share/wcd/wcd-include.sh +fi - -# keep this in mind? good for safety. -# alias cp='cp -i' -# alias mv='mv -i' - - -# remove any default aliases for these -unalias ls ll grep &>/dev/null ||: - - +if [[ -s /a/bin/small-misc-bash/ll-function ]]; then + # shellcheck source=/a/bin/small-misc-bash/ll-function + source /a/bin/small-misc-bash/ll-function +elif [[ -s ~/.iank/ll-function ]]; then + source ~/.iank/ll-function +fi # * functions @@ -236,12 +214,11 @@ unalias ls ll grep &>/dev/null ||: .....() { c ../../../..; } ......() { c ../../../../..; } - # file cut copy and paste, like the text buffers :) # I havnt tested these. -_fbufferinit() { # internal use by +_fbufferinit() { # internal use ! [[ $my_f_tempdir ]] && my_f_tempdir=$(mktemp -d) - rm -rf "$my_f_tempdir"/* + rm -rf "${my_f_tempdir:?}"/* } fcp() { # file cp _fbufferinit @@ -257,32 +234,6 @@ fpst() { # file paste cp "$my_f_tempdir"/* "$target" } - -# todo, update this -complete -F _longopt la lower low rlt rld rl lld ts ll dircp ex fcp fct fpst gr - - -_cdiff-prep() { - # join options which are continued to multiples lines onto one line - local first=true - grep -vE '^([ \t]*#|^[ \t]*$)' "$1" | while IFS= read -r line; do - # remove leading spaces/tabs. assumes extglob - if [[ $line == "[ ]*" ]]; then - line="${line##+( )}" - fi - if $first; then - pastline="$line" - first=false - elif [[ $line == *=* ]]; then - echo "$pastline" >> "$2" - pastline="$line" - else - pastline="$pastline $line" - fi - done - echo "$pastline" >> "$2" -} - _khfix_common() { local host=${1##*@} local ip port @@ -312,7 +263,8 @@ khcopy() { } a() { - local x=$(readlink -nf "$@") + 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 @@ -320,92 +272,30 @@ a() { ack() { ack-grep "$@"; } -anki() { - if which anki &>/dev/null; then - command anki - else - schroot -c anki -- anki - fi -} - -astudio() { - # googling android emulator libGL error: failed to load driver: r600 - # lead to http://stackoverflow.com/a/36625175/14456 - export ANDROID_EMULATOR_USE_SYSTEM_LIBS=1 - /a/opt/android-studio/bin/studio.sh "$@" &r; -} - b() { # backwards c - } -bbk() { - c / - # run latest - install-my-scripts - btrbk-run "$@" -} - -bfg() { java -jar /a/opt/bfg-1.12.14.jar "$@"; } - -bigclock() { - xclock -digital -update 1 -face 'arial black-80:bold' -} - -bpull() { - c / - # run latest - install-my-scripts - switch-mail-host $1 $HOSTNAMEs -} - -btc() { - local f=/etc/bitcoin/bitcoin.conf - # importprivkey will timeout if using the default of 15 mins. - # upped it to 1 hour. - bitcoin-cli -rpcclienttimeout=60000 -$(s grep rpcuser= $f) -$(s grep rpcpassword= $f) "$@" -} - -btcusd() { # $1 btc in usd - local price - price="$(curl -s https://api.coinbase.com/v2/prices/BTC-USD/spot | jq -r .data.amount)" - printf "$%s\n" "$price" - if [[ $1 ]]; then - printf "$%.2f\n" "$(echo "scale=4; $price * $1"| bc -l)" - fi -} -usdbtc() { # $1 usd in btc - local price - price="$(curl -s https://api.coinbase.com/v2/prices/BTC-USD/spot | jq -r .data.amount)" - printf "$%s\n" "$price" - if [[ $1 ]]; then - # 100 mil satoshi / btc. 8 digits after the 1. - printf "%.8f btc\n" "$(echo "scale=10; $1 / $price "| bc -l)" - fi -} -satoshi() { # $1 satoshi in usd - local price - price="$(curl -s https://api.coinbase.com/v2/prices/BTC-USD/spot | jq -r .data.amount)" - price=$(echo "scale=10; $price * 0.00000001"| bc -l) - printf "$%f\n" "$price" - if [[ $1 ]]; then - printf "$%.2f\n" "$(echo "scale=10; $price * $1"| bc -l)" - fi -} - # c. better cd -if [[ $RLC_INSIDE_EMACS ]]; then - c() { wcd -c -z 50 -o "$@"; } +if type -p wcd &>/dev/null; then + if [[ $RLC_INSIDE_EMACS ]]; then + c() { wcd -c -z 50 -o "$@"; } + else + # lets see what the fancy terminal does from time to time + c() { wcd -c -z 50 "$@"; } + fi else - # lets see what the fancy terminal does from time to time - c() { wcd -c -z 50 "$@"; } + c() { cd "$@"; } fi +c4() { c /var/log/exim4; } + caa() { git commit --amend --no-edit -a; } caf() { + # shellcheck disable=SC2033 find -L $1 -type f -not \( -name .svn -prune -o -name .git -prune \ -o -name .hg -prune -o -name .editor-backups -prune \ -o -name .undo-tree-history -prune \) \ @@ -425,21 +315,42 @@ cam() { git commit -am "$*" } -cbfstool () { /a/opt/coreboot/build/cbfstool "$@"; } ccat () { # config cat. see a config without extra lines. grep '^\s*[^;[:space:]#]' "$@" } + +_cdiff-prep() { + # join options which are continued to multiples lines onto one line + local first=true + while IFS= read -r line; do + # remove leading spaces/tabs. assumes extglob + if [[ $line == "[ ]*" ]]; then + line="${line##+( )}" + fi + if $first; then + pastline="$line" + first=false + elif [[ $line == *=* ]]; then + echo "$pastline" >> "$2" + pastline="$line" + else + pastline="$pastline $line" + fi + done < <(grep -vE '^([ \t]*#|^[ \t]*$)' "$1") + echo "$pastline" >> "$2" +} + cdiff() { # diff config files, # setup for format of postfix, eg: # option = stuff[,] # [more stuff] - local pastline - local unified="$(mktemp)" - local f1="$(mktemp)" - local f2="$(mktemp)" + local pastline unified f1 f2 + unified="$(mktemp)" + f1="$(mktemp)" + f2="$(mktemp)" _cdiff-prep "$1" "$f1" _cdiff-prep "$2" "$f2" cat "$f1" "$f2" | grep -Po '^[^=]+=' | sort | uniq > "$unified" @@ -449,29 +360,13 @@ cdiff() { done < "$unified" } -cgpl() -{ - if (($#)); then - cp /a/bin/data/COPYING "$@" - else - cp /a/bin/data/COPYING . - fi -} - -capache() -{ - if (($#)); then - cp /a/bin/data/LICENSE "$@" - else - cp /a/bin/data/LICENSE . - fi -} cat-new-files() { local start=$SECONDS local dir="$1" inotifywait -m "$dir" -e create -e moved_to | - while read filedir _ file; do + # shellcheck disable=SC2030 + while read -r filedir _ file; do cat "$filedir$file" hr calc $((SECONDS - start)) / 60 @@ -480,6 +375,7 @@ cat-new-files() { } +# shellcheck disable=SC2032 chown() { # makes it so chown -R symlink affects the symlink and its target. if [[ $1 == -R ]]; then @@ -500,53 +396,14 @@ cl() { c = } -chrome() { - if type -p chromium &>/dev/null; then - cmd=chromium - else - cd - cmd="schroot -c stretch chromium" - CHROMIUM_FLAGS='--enable-remote-extensions' $cmd &r - fi -} - d() { builtin bg; } complete -A stopped -P '"%' -S '"' d -dat() { # do all tee, for more complex scripts - tee >(ssh frodo bash -l) >(bash -l) >(ssh x2 bash -l) >(ssh tp bash -l) -} -da() { # do all - local host - "$@" - for host in x2 tp kd; do - ssh $host "$@" - done -} dc() { diff --strip-trailing-cr -w "$@" # diff content } -debian_pick_mirror () { - # netselect-apt finds a fast mirror. - # but we need to replace the mirrors ourselves, - # because it doesnt do that. best it can do is - # output a basic sources file - # here we get the server it found, get the main server we use - # then substitute all instances of one for the other in the sources file - # and backup original to /etc/apt/sources.list-original. - # this is idempotent. the only way to identify debian sources is to - # note the original server, so we put it in a comment so we can - # identify it later. - local file=$(mktemp -d)/f # safe way to get file name without creating one - sudo netselect-apt -o "$file" || return 1 - url=$(grep ^\\w $file | head -n1 | awk '{print $2}') - sudo cp -f /etc/apt/sources.list /etc/apt/sources.list-original - sudo sed -ri "/http.us.debian.org/ s@( *[^ #]+ +)[^ ]+([^#]+).*@\1$url\2# http.us.debian.org@" /etc/apt/sources.list - sudo apt-get update -} - despace() { local x y for x in "$@"; do @@ -555,6 +412,39 @@ despace() { done } +dig() { + command dig +nostats +nocmd "$@" +} +# Output with sections sorted, and removal of query id, so 2 dig outputs can be diffed. +digsort() { + local sec + sec= + dig +nordflag "$@" | sed -r 's/^(;; ->>HEADER<<-.*), id: .*/\1/' | while read -r l; do + if [[ $l == [^\;]* ]]; then + sec+="$l"$'\n' + else + if [[ $sec ]]; then + printf "%s" "$sec" | sort + sec= + fi + printf "%s\n" "$l" + fi + done +} +# compare digs to the 2 servers +# usage: digdiff @server1 @server2 DIG_ARGS +# note: only the soa master nameserver will respond with +# ra "recursive answer" flag. That difference is meaningless afaik. +digdiff() { + local s1 s2 + s1=$1 + shift + s2=$1 + shift + digsort $s1 "$@" | tee /tmp/digdiff + diff -u /tmp/digdiff <(digsort $s2 "$@") +} + dt() { date "+%A, %B %d, %r" "$@" } @@ -567,27 +457,49 @@ dus() { # du, sorted, default arg of e() { echo "$@"; } +# echo args +ea() { + if (( ! $# )); then + echo no args + fi + for arg; do + printf "%qEOL\n" "${arg}" + printf "%s" "${arg}" |& hexdump -C + done +} +# echo vars. print var including escapes, etc +ev() { + if (( ! $# )); then + echo no args + fi + for arg; do + printf "%qEOL\n" "${!arg}" + printf "%s" "${!arg}" |& hexdump -C + done +} + ediff() { [[ ${#@} == 2 ]] || { echo "error: ediff requires 2 arguments"; return 1; } emacs --eval "(ediff-files \"$1\" \"$2\")" } - -envload() { # load environment from a previous: export > file - local file=${1:-$HOME/.${USER}_env} - eval "$(export | sed 's/^declare -x/export -n/')" - while IFS= read -r line; do - # declare -x makes variables local to a function - eval ${line/#declare -x/export} - done < "$file" -} - # mail related etail() { - sudo tail -f /var/log/exim4/mainlog + tail -F /var/log/exim4/mainlog -n 200 +} +eless() { + less /var/log/exim4/mainlog +} +eqcat() { + exiqgrep -i | while read i; do + exim -Mvh $i; hr; exim -Mvb $i; hr; + exigrep $i /var/log/exim4/mainlog; hr + done } + +# shellcheck disable=SC2032 f() { # cd forward c + @@ -602,211 +514,10 @@ fa() { done < <(find "$@" -print0); } -faf() { # find all files - find -L $1 -not \( -name .svn -prune -o -name .git -prune \ +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 \ - -o -name .undo-tree-history -prune \) 2>/dev/null -} - -# one that comes with distros is too old for newer devices -fastboot() { - /a/opt/android-platform-tools/fastboot "$@"; -} - -kdecd() { /usr/lib/x86_64-linux-gnu/libexec/kdeconnectd; } - -# List of apps to install/update -# Create from existing manually installed apps by doing -# fdroidcl update -# fdroidcl search -i, then manually removing -# automatically installed/preinstalled apps - -# -# # my attempt at recovering from boot loop: -# # in that case, boot to recovery (volume up, home button, power, let go of power after samsun logo) -# # then -# mount /dev/block/mmcblk0p12 /data -# cd /data -# find -iname '*appname*' -# rm -rf FOUND_DIRS -# usually good enough to just rm -rf /data/app/APPNAME -# -# currently broken: -# # causes replicant to crash -# org.quantumbadger.redreader -# org.kde.kdeconnect_tp - -# not broke, but wont work without gps -#com.zoffcc.applications.zanavi -# not broke, but not using atm -#com.nutomic.syncthingandroid -# # doesn\'t work on replicant -#net.sourceforge.opencamera -# -fdroid_pkgs=( - de.marmaro.krt.ffupdater - me.ccrama.redditslide - org.fedorahosted.freeotp - at.bitfire.davdroid - com.alaskalinuxuser.justnotes - com.artifex.mupdf.viewer.app - com.danielkim.soundrecorder - com.fsck.k9 - com.ghostsq.commander - com.ichi2.anki - com.jmstudios.redmoon - com.jmstudios.chibe - org.kde.kdeconnect_tp - com.notecryptpro - com.termux - cz.martykan.forecastie - de.danoeh.antennapod - de.blinkt.openvpn - de.marmaro.krt.ffupdater - eu.siacs.conversations - free.rm.skytube.oss - im.vector.alpha # riot - info.papdt.blackblub - me.tripsit.tripmobile - net.gaast.giggity - net.minetest.minetest - net.osmand.plus - org.isoron.uhabits - org.linphone - org.gnu.icecat - org.smssecure.smssecure - org.yaaic - sh.ftp.rocketninelabs.meditationassistant.opensource -) -# https://forum.xda-developers.com/android/software-hacking/wip-selinux-capable-superuser-t3216394 -# for maru, -#me.phh.superuser - -fdup() { - local -A installed updated - local p - fdroidcl update - if fdroidcl search -u | grep ^org.fdroid.fdroid; then - fdroidcl upgrade org.fdroid.fdroid - sleep 5 - fdroidcl update - fi - for p in $(fdroidcl search -i| grep -o "^\S\+"); do - installed[$p]=true - done - for p in $(fdroidcl search -u| grep -o "^\S\+"); do - updated[$p]=false - done - for p in ${fdroid_pkgs[@]}; do - if ! ${installed[$p]:-false}; then - fdroidcl install $p - # sleeps are just me being paranoid since replicant has a history of crashing when certain apps are installed - sleep 5 - fi - done - for p in ${!installed[@]}; do - if ! ${updated[$p]:-true}; then - fdroidcl upgrade $p - sleep 5 - fi - done -} - -firefox-default-profile() { - key=Default value=1 section=$1 - file=/p/c/subdir_files/.mozilla/firefox/profiles.ini - sed -ri "/^ *$key/d" "$file" - sed -ri "/ *\[$section\]/,/^ *\[[^]]+\]/{/^\s*$key[[:space:]=]/d};/ *\[$section\]/a $key=$value" "$file" -} -fdhome() { #firefox default home profile - firefox-default-profile Profile0 -} - -fdwork() { - firefox-default-profile Profile4 -} - -ff() { - if type -P firefox &>/dev/null; then - firefox "$@" - else - iceweasel "$@" - fi -} - - - -fn() { - firefox -P alt "$@" >/dev/null 2>&1 -} - - -fsdiff () { - local missing=false - local dname="${PWD##*/}" - local m="/a/tmp/$dname-missing" - local d="/a/tmp/$dname-diff" - [[ -e $d ]] && rm "$d" - [[ -e $m ]] && rm "$m" - local msize=0 - local fsfile - while read -r line; do - fsfile="$1${line#.}" - if [[ -e "$fsfile" ]]; then - md5diff "$line" "$fsfile" && tee -a "/a/tmp/$dname-diff" <<< "$fsfile $line" - else - missing=true - echo "$line" >> "$m" - msize=$((msize + 1)) - fi - done < <(find -type f ) - if $missing; then - echo "$m" - (( msize <= 100 )) && cat $m - fi -} -fsdiff-test() { - # expected output, with different tmp dirs - # /tmp/tmp.HDPbwMqdC9/c/d ./c/d - # /a/tmp/tmp.qLDkYxBYPM-missing - # ./b - cd $(mktemp -d) - echo ok > a - echo nok > b - mkdir c - echo ok > c/d - local x=$(mktemp -d) - mkdir $x/c - echo different > $x/c/d - echo ok > $x/a - fsdiff $x -} -rename-test() { - # test whether missing files were renamed, generally for use with fsdiff - # $1 = fsdiff output file, $2 = directory to compare to. pwd = fsdiff dir - # echos non-renamed files - local x y found - unset sums - for x in "$2"/*; do - { sums+=( "$(md5sum < "$x")" ) ; } 2>/dev/null - done - while read -r line; do - { missing_sum=$(md5sum < "$line") ; } 2>/dev/null - renamed=false - for x in "${sums[@]}"; do - if [[ $missing_sum == "$x" ]]; then - renamed=true - break - fi - done - $renamed || echo "$line" - done < "$1" - return 0 -} - -feh() { - # F = fullscren, z = random, Z = auto zoom - command feh -FzZ "$@" + -o -name .undo-tree-history -prune \) -type f 2>/dev/null } # mail related @@ -842,11 +553,6 @@ trap ERR return' ERR } - -fw() { - firefox -P default "$@" >/dev/null 2>&1 -} - getdir () { local help="Usage: getdir [--help] PATH Output the directory of PATH, or just PATH if it is a directory." @@ -861,7 +567,8 @@ Output the directory of PATH, or just PATH if it is a directory." if [[ -d $1 ]]; then echo "$1" else - local dir="$(dirname "$1")" + local dir + dir="$(dirname "$1")" if [[ -d $dir ]]; then echo "$dir" else @@ -873,14 +580,15 @@ Output the directory of PATH, or just PATH if it is a directory." git_empty_branch() { # start an empty git branch. carefull, it deletes untracked files. [[ $# == 1 ]] || { echo 'need a branch name!'; return 1;} - local gitroot - gitroot || return 1 # function to set gitroot - builtin cd "$gitroot" + local root + root=$(gitroot) || return 1 # function to set gitroot + builtin cd "$root" git symbolic-ref HEAD refs/heads/$1 rm .git/index git clean -fdx } +# shellcheck disable=SC2120 gitroot() { local help="Usage: gitroot [--help] Print the full path to the root of the current git repo @@ -891,19 +599,16 @@ and works in older versions of git which did not have that." echo "$help" return fi - local p=$(git rev-parse --git-dir) || { echo "error: not in a git repo" ; return 1; } + local p + p=$(git rev-parse --git-dir) || { echo "error: not in a git repo" ; return 1; } [[ $p != /* ]] && p=$PWD echo "${p%%/.git}" } -gitian() { - git config user.email ian@iankelling.org -} - gh() { # i got an error, gh not found when doing a pull request, it seems like it wants itself in it\'s path. local _oldpath="$PATH" - PATH="$PATH:~/node_modules/.bin" + PATH="$PATH:$HOME/node_modules/.bin" command gh "$@" PATH="$_oldpath" } @@ -918,16 +623,6 @@ gdkill() { pk1 emacs --daemon } -# at least in flidas, things rely on gpg being gpg1 -gpg() { - command gpg2 "$@" -} - -gse() { - git send-email --notes '--envelope-sender=' \ - --suppress-cc=self "$@" -} - gr() { grep -iIP --color=auto "$@" } @@ -939,44 +634,8 @@ grr() { # grep recursive grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -RiIP --color=auto "$@" fi } - -hstatus() { - # do git status on published repos - cd /a/bin/githtml - do_hr=false - for x in *; do - cd `readlink -f $x`/.. - status=$(i status -s) || pwd - if [[ $status ]]; then - hr - echo $x - printf "%s\n" "$status" - fi - cd /a/bin/githtml - done -} - -hl() { # history limit. Write extra history to archive file. - # todo: this is not working or not used currently - local max_lines linecount tempfile prune_lines x - local harchive="${HISTFILE}_archive" - for x in "$HISTFILE" "$harchive"; do - [[ -e $x ]] || { touch "$x" && echo "notice from hl(): creating $x"; } - if [[ ! $x || ! -e $x || ! -w $x || $(stat -c "%u" "$x") != $EUID ]]; then - echo "error in hl: history file \$x:$x no good" - return 1 - fi - done - history -a # save history - max_lines=$HISTFILELINES - [[ $max_lines =~ ^[0-9]+$ ]] || { echo "error in hl: failed to get max line count"; return 1; } - linecount=$(wc -l < $HISTFILE) # pipe so it doesnt output a filename - [[ $linecount =~ ^[0-9]+$ ]] || { echo "error in hl: wc failed"; return 1; } - if (($linecount > $max_lines)); then - prune_lines=$(($linecount - $max_lines)) - head -n $prune_lines "$HISTFILE" >> "$harchive" \ - && sed --follow-symlinks -ie "1,${prune_lines}d" $HISTFILE - fi +rg() { + command rg -i -M 200 "$@" } hr() { # horizontal row. used to break up output @@ -1032,15 +691,14 @@ if ! type service &>/dev/null; then } fi + + ic() { # fast commit all git commit -am "$*" } -idea() { - /a/opt/idea-IC-163.7743.44/bin/idea.sh "$@" &r -} ifn() { # insensitive find @@ -1049,32 +707,6 @@ ifn() { -o -name .undo-tree-history -prune \) -iname "*$**" 2>/dev/null } - -if [[ $OS == Windows_NT ]]; then - # cygstart wrapper - cs() { - cygstart "$@" & - } - xp() { - explorer.exe . - } - # launch - o() { - local x=(*$1*) - (( ${#x[#]} > 1 )) && { echo "warning ${#x[#]} matches found"; sleep 1; } - cygstart *$1* & - } -else - o() { - if type gvfs-open &> /dev/null ; then - gvfs-open "$@" - else - xdg-open "$@" - fi - # another alternative is run-mailcap - } -fi - ipdrop() { s iptables -A INPUT -s $1 -j DROP } @@ -1084,21 +716,11 @@ istext() { grep -Il "" "$@" &>/dev/null } -jfilter() { - grep -Evi -e "^(\S+\s+){4}(sudo|sshd|cron)\[\S*:" \ - -e "^(\S+\s+){4}systemd\[\S*: (starting|started) (btrfsmaintstop|dynamicipupdate|spamd dns bug fix cronjob|rss2email)\.*$" -} jtail() { - journalctl -n 10000 -f "$@" | jfilter -} -jr() { journalctl "$@" | jfilter | less ; } -jrf() { journalctl -f "$@" | jfilter; } - -kff() { # keyboardio firmware flash - pushd /a/bin/distro-setup/Arduino/Model01-Firmware - yes $'\n' | make flash - popd + journalctl -n 10000 -f "$@" } +jr() { journalctl "$@" ; } +jrf() { journalctl -f "$@" ; } l() { if [[ $PWD == /[iap] ]]; then @@ -1117,31 +739,6 @@ lt() { ll -tr "$@"; } lld() { ll -d "$@"; } -lom() { - local l base - if [[ $1 == /* ]]; then - base=${1##*/} - if mountpoint /mnt/$base; then - return 0 - fi - l=$(sudo losetup -f) - sudo losetup $l $1 - if ! sudo cryptsetup luksOpen $l $base; then - sudo losetup -d $l - return 1 - fi - sudo mkdir -p /mnt/$base - sudo mount /dev/mapper/$base /mnt/$base - sudo chown $USER:$USER /mnt/$base - else - base=$1 - sudo umount /mnt/$base - l=$(sudo cryptsetup status /dev/mapper/$base|sed -rn 's/^\s*device:\s*(.*)/\1/p') - sudo cryptsetup luksClose /dev/mapper/$base || return 1 - sudo losetup -d $l - fi -} - low() { # make filenames lowercase, remove bad chars local f new for f in "$@"; do @@ -1160,7 +757,7 @@ lower() { # make first letter of filenames lowercase. local x for x in "$@"; do if [[ ${x::1} == [A-Z] ]]; then - y=$(tr "[A-Z]" "[a-z]" <<<"${x::1}")"${x:1}" + y=$(tr '[:upper:]' '[:lower:]' <<<"${x::1}")"${x:1}" safe_rename "$x" "$y" || return 1 fi done @@ -1181,43 +778,13 @@ make-targets() { make -qp | awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}' } -mbenable() { - mb=$1 - dst=/m/4e/$1 - src=/m/md/$1 - set -x - [[ -e $src ]] || { set +x; return 1; } - mv -T $src $dst || { set +x; return 1; } - ln -s -T $dst $src - /a/exe/lnf /p/.mu ~ - mu index --maildir=/m/4e - set +x -} -mbdisable() { - mb=$1 - dst=/m/md/$1 - src=/m/4e/$1 - set -x - [[ -e $src ]] || { set +x; return 1; } - if [[ -L $dst ]]; then rm $dst; fi - mv -T $src $dst - set +x -} - - -mdt() { - markdown "$1" >/tmp/mdtest.html - firefox /tmp/mdtest.html -} - - mkc() { mkdir "$1" c "$1" } mkct() { - mkc `mktemp -d` + mkc $(mktemp -d) } mkt() { # mkdir and touch file @@ -1226,51 +793,44 @@ mkt() { # mkdir and touch file touch "$path" } +# shellcheck disable=SC2032 mkdir() { command mkdir -p "$@"; } -mo() { xset dpms force off; } # monitor off - -net-dev-info() { - e "lspci -nnk|gr -iA2 net" - lspci -nnk|gr -iA2 net - hr - e "s lshw -C network" - hr - s lshw -C network - -} - nopanic() { + # shellcheck disable=SC2024 sudo tee -a /var/log/exim4/paniclog-archive /dev/null) + if [[ $cached ]]; then + cp $cached . + else + aptitude download $pkg || return 1 + fi + tmp=(*); f=${tmp[0]} # only 1 expected + ex $f + rm -f $f } +# pgrep and kill pk1() { local pid pid=($(pgrep -f "$*")) case ${#pid[@]} in 1) - ps -F $pid - m kill $pid + # shellcheck disable=SC2128 + { + ps -F $pid + m kill $pid + } ;; 0) echo "no pid found" ;; *) @@ -1279,58 +839,10 @@ pk1() { esac } -pick-trash() { - # trash-restore lists everything that has been trashed at or below CWD - # This picks out files just in CWD, not subdirectories, - # which also match grep $1, usually use $1 for a time string - # which you get from running restore-trash once first - local name x ask - local nth=1 - # last condition is to not ask again for ones we skipped - while name="$( echo | restore-trash | gr "$PWD/[^/]\+$" | gr "$1" )" \ - && [[ $name ]] && (( $(wc -l <<<"$name") >= nth )); do - name="$(echo "$name" | head -n $nth | tail -n 1 )" - read -p "$name [Y/n] " ask - if [[ ! $ask || $ask == [Yy] ]]; then - x=$( echo "$name" | gr -o "^\s*[0-9]*" ) - echo $x | restore-trash > /dev/null - elif [[ $ask == [Nn] ]]; then - nth=$((nth+1)) - else - return - fi - done -} - - -pub() { - rld /a/h/_site/ li:/var/www/iankelling.org/html -} - pubip() { curl -4s https://icanhazip.com; } pubip6() { curl -6s https://icanhazip.com; } whatismyip() { pubip; } -pumpa() { - # fixes the menu bar in xmonad. this won\'t be needed when xmonad - # packages catches up on some changes in future (this is written in - # 4/2017) - # - # geekosaur: so youll want to upgrade to xmonad 0.13 or else use a - # locally modified XMonad.Hooks.ManageDocks that doesnt set the - # work area; turns out it\'s impossible to set correctly if you are - # not a fully EWMH compliant desktop environment - # - # geekosaur: chrome shows one failure mode, qt/kde another, other - # gtk apps a third, ... I came up with a setting that works for me - # locally but apparently doesnt work for others, so we joined the - # other tiling window managers in giving up on setting it at all - # - xprop -root -remove _NET_WORKAREA - command pumpa &r -} - - pwgen() { # -m = min length # -x = max length @@ -1354,13 +866,14 @@ q() { # start / launch a program in the backround and redir output to null "$@" &> /dev/null & } +# shellcheck disable=SC2120 r() { - exit "$@" 2>/dev/null + history -a # save history + exit ${1:0} + # i had this redir, not sure why + # exit "$@" 2>/dev/null } -rbpipe() { rbt post -o --diff-filename=- "$@"; } -rbp() { rbt post -o "$@"; } - rl() { # rsync, root is required to keep permissions right. # rsync --archive --human-readable --verbose --itemize-changes --checksum \(-ahvic\) \ @@ -1383,11 +896,9 @@ rlt() { rlu() { # [OPTS] HOST PATH # eg. rlu -opts frodo /testpath # relative paths will expanded with readlink -f. - # useful for selectively sending dirs which have been synced with unison, - # where the path is the same on both hosts. opts=("${@:1:$#-2}") # 1 to last -2 - path="${@:$#}" # last - host="${@:$#-1:1}" # last -1 + path="${*:$#}" # last + host="${*:$#-1:1}" # last -1 if [[ $path == .* ]]; then path=$(readlink -f $path) fi @@ -1397,40 +908,6 @@ rlu() { # [OPTS] HOST PATH s rsync -rlpchviog --relative "${opts[@]}" "$path" "root@$host:/"; } -# only run on MAIL_HOST. simpler to keep this on one system. -r2eadd() { # usage: name url - # initial setup of rss2email: - # r2e new r2e@iankelling.org - # that initializes files, and sets default email. - # symlink to the config doesnt work, so I copied it to /p/c - # and then use cli option to specify explicit path. - # Only option changed from default config is to set - # force-from = True - # - # or else for a few feeds, the from address is set by the feed, and - # if I fail delivery, then I send a bounce message to that from - # address, which makes me be a spammer. - - r2e add $1 "$2" $1@r2e.iankelling.org - # get up to date and dont send old entries now: - r2e run --no-send $1 -} -r2e() { command r2e -d /p/c/rss2email.json -c /p/c/rss2email.cfg "$@"; } - -rspicy() { # usage: HOST DOMAIN - # connect to spice vm remote host. use vspicy for local host - local port=$(ssh $1<$tmp/timing - # todo, the current sleep seems pretty good, but it - # would be nice to have an empirical measurement, or - # some better wait to sync up. - # - # note: --loop-file=no prevents it from hanging if you have that - # set to inf the mpv config. - # --loop=no prevents it from exit code 3 due to stdin if you - # had it set to inf in mpv config. - # - # args go to mpv, for example --volume=80, 50% - cat >$out </dev/null; then - # skip args that dont exist, or else trash-put will have an error - for x in "$@"; do - if [[ -e $x || -L $x ]]; then - args+=("$x") - fi - done - [[ ! ${args[@]} ]] || trash-put "${args[@]}" - else - rm -rf "$@" - fi -} - - -tclock() { clear date +%l:%_M len=60 @@ -1718,98 +1116,6 @@ te() { return $ret } -# mail related -testmail() { - declare -gi _seq; _seq+=1 - echo "test body" | m mail -s "test mail from $HOSTNAME, $_seq" "${@:-root@localhost}" - # for testing to send from an external address, you can do for example - # -fian@iank.bid -aFrom:ian@iank.bid web-6fnbs@mail-tester.com - # note in exim, you can retry a deferred message - # s exim -M MSG_ID - # MSG_ID is in /var/log/exim4/mainlog, looks like 1ccdnD-0001nh-EN -} - -# to test sieve, use below command. for fsf mail, see fsf-get-mail script. -# make modifications, then copy to live file, use -eW to actually modify mailbox -# cp /p/c/subdir_files/sieve/personal{test,}.sieve; testsievelist -eW INBOX -# -# Another option is to use sieve-test SCRIPT MAIL_FILE. note, -# sieve-test doesnt know about envelopes, Im not sure if sieve-filter does. - -# sieve with output filter. arg is mailbox, like INBOX. -# This depends on dovecot conf, notably mail_location in /etc/dovecot/conf.d/10-mail.conf - -testsievelist() { - sieve-filter ~/sieve/maintest.sieve "$@" >/tmp/testsieve.log 2> >(tail) && sed -rn '/^Performed actions:/{n;n;p}' /tmp/testsieve.log | sort -u -} - - -# mail related -# plain sieve -testsieve() { - sieve-filter ~/sieve/main.sieve "$@" -} - -# mail related -testexim() { - # testmail above calls sendmail, which is a link to exim/postfix. - # its docs dont say a way of adding an argument - # to sendmail to turn on debug output. We could make a wrapper, but - # that is a pain. Exim debug args are documented here: - # http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html - # - # http://www.exim.org/exim-html-current/doc/html/spec_html/ch-building_and_installing_exim.html - # note, for exim daemon, you can turn on debug options by - # adding -d, etc to COMMONOPTIONS in - # /etc/default/exim4 - exim -d -t <<'EOF' -From: ian@iankelling.org -To: root@lists0p.fsf.org -Subject: Testing Exim - -This is a test message. -EOF -} - -# toggle keyboard -tk() { - # based on - # https://askubuntu.com/questions/160945/is-there-a-way-to-disable-a-laptops-internal-keyboard - id=$(xinput --list --id-only 'AT Translated Set 2 keyboard') - if xinput list | grep -F '∼ AT Translated Set 2 keyboard' &>/dev/null; then - echo enabling keyboard - # find the first slave keyboard number, they are all the same in my output. - # if they werent, worst case we would need to save the slave number somewhere - # when it got disabled. - slave=$(xinput list | sed -n 's/.*slave \+keyboard (\([0-9]*\)).*/\1/p' | head -n1) - xinput reattach $id $slave - else - xinput float $id - fi -} - -tm() { - # timer in minutes - # --no-config - (sleep $(calc "$@ * 60") && mpv --no-config --volume 50 /a/bin/data/alarm.mp3) > /dev/null 2>&1 & -} - -trg() { transmission-remote-gtk&r; } -trc() { - # example, set global upload limit to 100 kilobytes: - # trc -u 100 - TR_AUTH=":$(jq -r .profiles[0].password ~/.config/transmission-remote-gtk/config.json)" transmission-remote transmission.lan -ne "$@" -} - - -tu() { - local s; - local dir="$(dirname "$1")" - if [[ -e $1 && ! -w $1 || ! -w $(dirname "$1") ]]; then - s=s; - fi - $s teeu "$@" -} tx() { # toggle set -x, and the prompt so it doesnt spam if [[ $- == *x* ]]; then @@ -1840,7 +1146,7 @@ psnetns() { netns=$1 ps -w | head -n 1 s find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/$netns | cut -d/ -f5 | \ - while read l; do + while read -r l; do x=$(ps -w --no-headers -p $l); if [[ $x ]]; then echo "$x"; else echo $l; fi; done @@ -1849,28 +1155,13 @@ psnetns() { m() { printf "%s\n" "$*"; "$@"; } -vpncmd() { - #m s nsenter -t $(pgrep -f "/usr/sbin/openvpn .* --config /etc/openvpn/.*pia.conf") -n -m "$@" - m s nsenter -t $(pgrep -f "/usr/sbin/openvpn .* --config /etc/openvpn/.*client.conf") -n -m "$@" -} -vpnf() { - vpncmd gksudo -u iank "firefox -no-remote -P vpn" &r -} -vpni() { - vpncmd gksudo -u iank "$*" -} -vpnbash() { - vpncmd bash -} - - - virshrm() { for x in "$@"; do virsh destroy "$x"; virsh undefine "$x"; done } vm-set-listen(){ - local t=$(mktemp) + local t + t=$(mktemp) local vm=$1 local ip=$2 s virsh dumpxml $vm | sed -r "s/(/dev/null - fi - mate-screensaver-command --exit &>/dev/null - if ! pidof xscreensaver; then - pushd / - xscreensaver & - popd - # 1 was not long enough - sleep 3 - fi - xscreensaver-command -activate -} - # * misc stuff -# from curl cheat.sh/:bash_completion -_cheatsh_complete_curl() -{ - local cur prev opts - _get_comp_words_by_ref -n : cur - - COMPREPLY=() - #cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="$(curl -s cheat.sh/:list | sed s@^@cheat.sh/@)" - - if [[ ${cur} == cheat.sh/* ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) - __ltrim_colon_completions "$cur" - return 0 - fi -} -complete -F _cheatsh_complete_curl curl - - -if [[ $- == *i* ]]; then - # commands to run when bash exits normally - trap "hl" EXIT -fi - # temporary variables to test colorization # some copied from gentoo /etc/bash/bashrc, @@ -2002,69 +1202,26 @@ match_lhs="" if ${use_color} && [[ $- == *i* ]]; then - if [[ $XTERM_VERSION == Cygwin* ]]; then - get_term_color() { - for x in "$@"; do - case $x in - underl) echo -n $'\E[4m' ;; - bold) echo -n $'\E[1m' ;; - red) echo -n $'\E[31m' ;; - green) echo -n $'\E[32m' ;; - blue) echo -n $'\E[34m' ;; - cyan) echo -n $'\E[36m' ;; - yellow) echo -n $'\E[33m' ;; - purple) echo -n $'\E[35m' ;; - nocolor) echo -n $'\E(B\E[m' ;; - esac - done - } + term_bold="$(tput bold)" + term_red="$(tput setaf 1)" + term_green="$(tput setaf 2)" + term_yellow="$(tput setaf 3)" + term_purple="$(tput setaf 5)" + term_nocolor="$(tput sgr0)" # no font attributes + + # unused so far. commented for shellcheck + # term_underl="$(tput smul)" + # term_blue="$(tput setaf 4)" + # term_cyan="$(tput setaf 6)" - else - get_term_color() { - for x in "$@"; do - case $x in - underl) echo -n $(tput smul) ;; - bold) echo -n $(tput bold) ;; - red) echo -n $(tput setaf 1) ;; - green) echo -n $(tput setaf 2) ;; - blue) echo -n $(tput setaf 4) ;; - cyan) echo -n $(tput setaf 6) ;; - yellow) echo -n $(tput setaf 3) ;; - purple) echo -n $(tput setaf 5) ;; - nocolor) echo -n $(tput sgr0) ;; # no font attributes - esac - done - } - fi -else - get_term_color() { - : - } fi # Try to keep environment pollution down, EPA loves us. unset safe_term match_lhs use_color - - # * prompt if [[ $- == *i* ]]; then - # git branch/status prompt function - if [[ $OS != Windows_NT ]]; then - GIT_PS1_SHOWDIRTYSTATE=true - fi - # arch source lopip show -fcation - [[ -r /usr/share/git/git-prompt.sh ]] && source /usr/share/git/git-prompt.sh - # fedora/debian source - [[ -r /usr/share/git-core/contrib/completion/git-prompt.sh ]] && source /usr/share/git-core/contrib/completion/git-prompt.sh - - # in case we didnt source git-prompt.sh - if ! declare -f __git_ps1 > /dev/null; then - __git_ps1() { - : - } - fi # this needs to come before next ps1 stuff # this stuff needs bash 4, feb 2009, @@ -2078,47 +1235,45 @@ if [[ $- == *i* ]]; then bind -m vi-command W:shell-forward-word fi - if [[ $SSH_CLIENT ]]; then + if [[ $SSH_CLIENT || $SUDO_USER ]]; then PS1="\h $PS1" fi - - - + # emacs terminal has problems if this runs slowly, + # so I've thrown a bunch of things at the wall to speed it up. prompt-command() { local return=$? # this MUST COME FIRST - local psc pst ps_char ps_color stale_subvol + local ps_char ps_color unset IFS history -a # save history - - case $return in - 0) ps_color="$(get_term_color blue)" + 0) ps_color="$term_purple" ps_char='\$' ;; - 1) ps_color="$(get_term_color green)" + 1) ps_color="$term_green" ps_char="$return \\$" ;; - *) ps_color="$(get_term_color yellow)" + *) ps_color="$term_yellow" ps_char="$return \\$" ;; esac if [[ ! -O . ]]; then # not owner if [[ -w . ]]; then # writable - ps_color="$(get_term_color bold red)" + ps_color="$term_bold$term_red" else - ps_color="$(get_term_color bold green)" + ps_color="$term_bold$term_green" fi fi - # I would set nullglob, but bash has had bugs where that - # doesnt work if not in top level. - if [[ -e /nocow/btrfs-stale ]] && ((`command ls -AUq /nocow/btrfs-stale|wc -l`)); then - ps_char="! $ps_char" + + # faster than sourceing the file im guessing + if [[ -e /dev/shm/iank-status ]]; then + eval $(< /dev/shm/iank-status) fi - PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$(get_term_color nocolor)\] " - # emacs completion doesnt like the git prompt atm, so disabling it. - #PS1="${PS1%"${PS1#*[wW]}"}$(__git_ps1 ' (%s)') \[$ps_color\]$ps_char\[$(get_term_color nocolor)\] " + if [[ ! $SSH_CLIENT && $MAIL_HOST != "$HOSTNAME" ]]; then + ps_char="@ $ps_char" + fi + PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$term_nocolor\] " } PROMPT_COMMAND=prompt-command @@ -2128,7 +1283,7 @@ if [[ $- == *i* ]]; then else local title_escape="\033]0;" fi - if [[ $* != prompt-command ]]; then + if [[ $0 != prompt-command ]]; then echo -ne "$title_escape$USER@$HOSTNAME ${PWD/#$HOME/~} " printf "%s" "$*" echo -ne "\007" @@ -2147,107 +1302,15 @@ if [[ $- == *i* ]]; then fi -reset-konsole() { - # we also have a file in /a/c/...konsole... - local f=$HOME/.config/konsolerc - setini DefaultProfile profileian.profile "Desktop Entry" $f - setini Favorites profileian.profile "Favorite Profiles" $f - setini ShowMenuBarByDefault false KonsoleWindow $f - setini TabBarPosition Top TabBar $f -} - -reset-sakura() { - while read k v; do - setini $k $v sakura /a/c/subdir_files/.config/sakura/sakura.conf - done <<'EOF' -colorset1_back rgb(33,37,39 -less_questions true -audible_bell No -visible_bell No -disable_numbered_tabswitch true -scroll_lines 10000000 -scrollbar true -EOF -} - -reset-xscreensaver() { - # except for spash, i set these by setting gui options in - # xscreensaver-command -demo - # then finding the corresponding option in .xscreensaver - # spash, i happened to notice in .xscreensaver - # - # dpmsOff, monitor doesnt come back on using old free software supported nvidia card - cat > /home/iank/.xscreensaver <<'EOF' -mode: blank -dpmsEnabled: True -dpmsStandby: 0:02:00 -dpmsSuspend: 0:03:00 -dpmsOff: 0:00:00 -timeout: 0:02:00 -lock: True -lockTimeout: 0:03:00 -splash: False -EOF - -} - - # * stuff that makes sense to be at the end -if [[ "$SUDOD" ]]; then - cd "$SUDOD" - unset SUDOD -elif [[ -d /a ]] && [[ $PWD == $HOME ]] && [[ $- == *i* ]]; then - cd /a -fi # best practice unset IFS - -# for mitmproxy to get a newer python. -# commented until i want to use it because it -# noticably slows bash startup -# -#if [[ $EUID != 0 && -e ~/.pyenv/bin ]]; then -# export PATH="~/.pyenv/bin:$PATH" -# eval "$(pyenv init -)" -# eval "$(pyenv virtualenv-init -)" -#fi - - - -export GOPATH=$HOME/go -path_add $GOPATH/bin -path_add /usr/local/go/bin - -export ARDUINO_PATH=/a/opt/Arduino/build/linux/work - -path_add --end ~/.npm-global - -# taken from default changes to bashrc and bash_profile -path_add --end $HOME/.rvm/bin +# shellcheck disable=SC1090 [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function* -export BASEFILE_DIR=/a/bin/fai-basefiles - -export ANDROID_HOME=/opt/android - -# didnt get drush working, if I did, this seems like the -# only good thing to include for it. -# Include Drush completion. -# if [ -f "/home/ian/.drush/drush.complete.sh" ] ; then -# source /home/ian/.drush/drush.complete.sh -# fi - - -# https://wiki.archlinux.org/index.php/Xinitrc#Autostart_X_at_login -# i added an extra condition as gentoo xorg guide says depending on -# $DISPLAY is fragile. -if [[ ! $DISPLAY && $XDG_VTNR == 1 ]] && shopt -q login_shell && isarch; then - exec startx -fi - # ensure no bad programs appending to this file will have an affect return 0