new feature: fzf
[distro-setup] / brc
diff --git a/brc b/brc
index 470c143f87a160b931ec323aeaff1840fbcc705f..d17c1a132e70ee4b7bc0f3f01bc39210ccf7f6bb 100644 (file)
--- a/brc
+++ b/brc
@@ -224,6 +224,7 @@ export PROFILE_TASKS_TASK_OUTPUT_LIMIT=100
 # i for insensitive. the rest from
 # X means dont remove the current screenworth of output upon exit
 # R means to show colors n things
+# a useful flag is -F aka --quit-if-one-screen
 export LESS=RXij12
 export SYSTEMD_LESS=$LESS
 
@@ -260,6 +261,8 @@ if [[ $SOE ]]; then
 fi
 
 
+
+
 mysrc() {
   local path dir file
   path=$1
@@ -276,6 +279,15 @@ mysrc() {
 mysrc /a/bin/small-misc-bash/ll-function
 mysrc /a/bin/distro-functions/src/package-manager-abstractions
 
+# things to remember:
+# ALT-C - cd into the selected directory
+# CTRL-T - Paste the selected file path into the command line
+#
+# good guide to some of its basic features is the readme file
+# https://github.com/junegunn/fzf
+if [[ -s /usr/share/doc/fzf/examples/key-bindings.bash ]]; then
+  source /usr/share/doc/fzf/examples/key-bindings.bash
+fi
 
 # * functions
 
@@ -435,7 +447,7 @@ cl() {
   # we have ~33 buttons as of this writing, so lets
   # prune down the history every once in a while.
   if (( start > 500 )); then
-    tac ~/.cdirs | awk '!seen[$0]++' | head -n 200 | sponge ~/.cdirs
+    tac ~/.cdirs | awk '!seen[$0]++' | head -n 200 | tac | sponge ~/.cdirs || [[ $? == 141 ]]
   fi
 
   for (( j=$start; j >= 0; j-- )); do
@@ -458,7 +470,7 @@ cl() {
   fi
   read -r -N 1 input
   if [[ $input != $'\n' ]]; then
-    c ${buttondirs[$input]}
+    c "${buttondirs[$input]}"
   fi
 }
 # back list
@@ -703,7 +715,7 @@ bwm() {
 }
 
 
-# for running in a fai rescue
+# for running in a fai rescue. iank specific.
 kdrescue() {
   d=vgata-Samsung_SSD_850_EVO_2TB_S2RLNX0J502123D
   for f in $d vgata-Samsung_SSD_870_QVO_8TB_S5VUNG0N900656V; do
@@ -836,6 +848,10 @@ cat-new-files() {
 
 }
 
+chownme() {
+  s chown -R $USER:$USER "$@"
+}
+
 # shellcheck disable=SC2032
 chown() {
   # makes it so chown -R symlink affects the symlink and its target.
@@ -856,6 +872,12 @@ cim() {
 d() { builtin bg "$@"; }
 ccomp bg d
 
+# f would be more natural, but i already am using it for something
+z() { builtin fg "$@"; }
+ccomp fg z
+
+x() { builtin kill %%; }
+
 dc() {
   diff --strip-trailing-cr -w "$@"   # diff content
 }
@@ -869,6 +891,26 @@ despace() {
   done
 }
 
+# df progress
+# usage: dfp MOUNTPOINT [SECOND_INTERVAL]
+# SECOND_INTERVAL defaults to 90
+dfp() {
+  # mp = mountpoint
+  local a b mp interval
+  mp=$1
+  interval=${2:-90}
+  if [[ ! $mp ]]; then
+    echo "dfp: error, missing 1st arg" >&2
+    return 1
+  fi
+  while true; do
+    a=$(df --output=used $mp | tail -n1)
+    sleep $interval
+    b=$(df --output=used $mp | tail -n1)
+    printf "used mib: %'d  mib/min: %s\n" $(( b /1000 )) $(( (b-a) / (interval * 1000 / 60 ) ))
+  done
+}
+
 # get ipv4 ip from HOST. or if it is already a number, return that
 hostip() {
   local host="$1"
@@ -942,7 +984,8 @@ ea() {
     printf "%s" "${arg}" |& hexdump -C
   done
 }
-# echo vars. print var including escapes, etc
+
+# echo variables. print var including escapes, etc, like xxd for variable
 ev() {
   if (( ! $# )); then
     echo no args
@@ -977,6 +1020,9 @@ etail2() {
 ccomp tail etail etail2
 
 
+showkeys() {
+  ssh "$@" cat .ssh/authorized_keys{,2}
+}
 
 
 # print exim old pids
@@ -1081,6 +1127,20 @@ faf() { # find all files. use -L to follow symlinks
        -o -name .undo-tree-history -prune \) -type f 2>/dev/null
 }
 
+# usage ffconcat FILES_TO_CONCAT OUTPUT_FILE
+ffconcat() {
+  local tmpf
+  tmpf=$(mktemp)
+  printf "file '%s'\n" "$1" >$tmpf
+  while (( $# > 1 )); do
+    shift
+    printf "file '%s'\n" "$1" >>$tmpf
+  done
+  # https://trac.ffmpeg.org/wiki/Concatenate
+  ffmpeg -f concat -safe 0 -i $tmpf -c copy "$1"
+  rm $tmpf
+}
+
 # full path without resolving symlinks
 fp() {
   local dir base
@@ -2362,7 +2422,7 @@ s/^\Wcapability: (.*)/\1/;Ta;h;b
 # and changing directory, so we don't have any open
 # directories or files that could cause problems when
 # remounting.
-z() {
+zr() {
   local tmp
   tmp=$(type -p "$1")
   if [[ $tmp ]]; then
@@ -2522,6 +2582,10 @@ if [[ $- == *i* ]]; then
     if [[ $MAIL_HOST && $MAIL_HOST != "$HOSTNAME" ]]; then
       ps_char="@ $ps_char"
     fi
+    jobs_char=
+    if [[ $(jobs -p) ]]; then
+      jobs_char='\j '
+    fi
     # We could test if sudo is active with sudo -nv
     # but then we get an email and log of lots of failed sudo commands.
     # We could turn those off, but seems better not to.
@@ -2531,7 +2595,7 @@ if [[ $- == *i* ]]; then
     if [[ ! $HISTFILE ]]; then
       ps_char="NOHIST $ps_char"
     fi
-    PS1="${PS1%"${PS1#*[wW]}"} $psudo\[$ps_color\]$ps_char\[$term_nocolor\] "
+    PS1="${PS1%"${PS1#*[wW]}"} $jobs_char$psudo\[$ps_color\]$ps_char\[$term_nocolor\] "
 
     # set titlebar. instead, using more advanced
     # titelbar below
@@ -2547,18 +2611,22 @@ if [[ $- == *i* ]]; then
     _title_escape="\033]0;"
   fi
 
+  # make the titlebar be the last command and the current directory.
   settitle () {
-    # this makes it so we show the current command if
-    # one is running, otherwise, show nothing
 
-    if [[ $1 == prompt-command ]]; then
+
+    # These are some checks to help ensure we dont set the title at
+    # times that the debug trap is running other than the case we
+    # want. Some of them might not be needed.
+    if (( ${#FUNCNAME[@]} != 1 || ${#BASH_ARGC[@]} != 2 || $BASH_SUBSHELL != 0 )); then
       return 0
     fi
-    if (( ${#BASH_ARGC[@]} == 1 && BASH_SUBSHELL == 0 )); then
-      echo -ne "$_title_escape ${PWD/#$HOME/~} "
-      printf "%s" "$*"
-      echo -ne "\007"
+    if [[ $1 == prompt-command ]]; then
+      return 0
     fi
+    echo -ne "$_title_escape ${PWD/#$HOME/~} "
+    printf "%s" "$*"
+    echo -ne "\007"
   }
 
   # note, this wont work: