diff --git a/compiler b/compiler new file mode 100755 index 0000000..67992be --- /dev/null +++ b/compiler @@ -0,0 +1,57 @@ +#!/bin/sh + +# This script will compile or run another finishing operation on a document. I +# have this script run via vim. +# +# Compiles .tex. groff (.mom, .ms), .rmd, .md, .org. Opens .sent files as sent +# presentations. Runs scripts based on extension or shebang. +# +# Note that .tex files which you wish to compile with XeLaTeX should have the +# string "xelatex" somewhere in a comment/command in the first 5 lines. + +file=$(readlink -f "$1") +dir=${file%/*} +base="${file%.*}" +ext="${file##*.}" + +cd "$dir" || exit 1 + +textype() { \ + command="pdflatex" + ( head -n5 "$file" | grep -qi 'xelatex' ) && command="xelatex" + $command --output-directory="$dir" "$base" && + grep -qi addbibresource "$file" && + biber --input-directory "$dir" "$base" && + $command --output-directory="$dir" "$base" && + $command --output-directory="$dir" "$base" +} + +case "$ext" in + # Try to keep these cases in alphabetical order. + [0-9]) preconv "$file" | refer -PS -e | groff -mandoc -T pdf > "$base".pdf ;; + c) cc "$file" -o "$base" && "$base" ;; + cpp) g++ "$file" -o "$base" && "$base" ;; + cs) mcs "$file" && mono "$base".exe ;; + go) go run "$file" ;; + h) sudo make install ;; + java) javac -d classes "$file" && java -cp classes "${1%.*}" ;; + m) octave "$file" ;; + md) if [ -x "$(command -v lowdown)" ]; then + lowdown --parse-no-intraemph "$file" -Tms | groff -mpdfmark -ms -kept > "$base".pdf + elif [ -x "$(command -v groffdown)" ]; then + groffdown -i "$file" | groff > "$base.pdf" + else + pandoc -t ms --highlight-style=kate -s -o "$base".pdf "$file" + fi ; ;; + mom) preconv "$file" | refer -PS -e | groff -mom -kept -T pdf > "$base".pdf ;; + ms) preconv "$file" | refer -PS -e | groff -me -ms -kept -T pdf > "$base".pdf ;; + org) emacs "$file" --batch -u "$USER" -f org-latex-export-to-pdf ;; + py) python "$file" ;; + [rR]md) Rscript -e "rmarkdown::render('$file', quiet=TRUE)" ;; + rs) cargo build ;; + sass) sassc -a "$file" "$base.css" ;; + scad) openscad -o "$base".stl "$file" ;; + sent) setsid -f sent "$file" 2>/dev/null ;; + tex) textype "$file" ;; + *) sed -n '/^#!/s/^#!//p; q' "$file" | xargs -r -I % "$file" ;; +esac diff --git a/displayselect b/displayselect new file mode 100755 index 0000000..f9e8062 --- /dev/null +++ b/displayselect @@ -0,0 +1,83 @@ +#!/bin/sh + +# A UI for detecting and selecting all displays. Probes xrandr for connected +# displays and lets user select one to use. User may also select "manual +# selection" which opens arandr. + +twoscreen() { # If multi-monitor is selected and there are two screens. + + mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?") + # Mirror displays using native resolution of external display and a scaled + # version for the internal display + if [ "$mirror" = "yes" ]; then + external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:") + internal=$(echo "$screens" | grep -v "$external") + + res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \ + tail -n 1 | awk '{print $1}') + + res_ext_x=$(echo "$res_external" | sed 's/x.*//') + res_ext_y=$(echo "$res_external" | sed 's/.*x//') + res_int_x=$(echo "$res_internal" | sed 's/x.*//') + res_int_y=$(echo "$res_internal" | sed 's/.*x//') + + scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l) + scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l) + + xrandr --output "$external" --auto --scale 1.0x1.0 \ + --output "$internal" --auto --same-as "$external" \ + --scale "$scale_x"x"$scale_y" + else + + primary=$(echo "$screens" | dmenu -i -p "Select primary display:") + secondary=$(echo "$screens" | grep -v "$primary") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0 + fi + } + +morescreen() { # If multi-monitor is selected and there are more than two screens. + primary=$(echo "$screens" | dmenu -i -p "Select primary display:") + secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:") + direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?") + tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:") + xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto + } + +multimon() { # Multi-monitor handler. + case "$(echo "$screens" | wc -l)" in + 2) twoscreen ;; + *) morescreen ;; + esac ;} + +onescreen() { # If only one output available or chosen. + xrandr --output "$1" --auto --scale 1.0x1.0 $(echo "$allposs" | grep -v "\b$1" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -) + } + +postrun() { # Stuff to run to clean up. + setbg # Fix background if screen size/arangement has changed. + remaps # Re-remap keys if keyboard added (for laptop bases) + { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen + } + +# Get all possible displays +allposs=$(xrandr -q | grep "connected") + +# Get all connected screens. +screens=$(echo "$allposs" | awk '/ connected/ {print $1}') + +# If there's only one screen +[ "$(echo "$screens" | wc -l)" -lt 2 ] && + { onescreen "$screens"; postrun; notify-send "💻 Only one screen detected." "Using it in its optimal settings..."; exit ;} + +# Get user choice including multi-monitor and manual selection: +chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") && +case "$chosen" in + "manual selection") arandr ; exit ;; + "multi-monitor") multimon ;; + *) onescreen "$chosen" ;; +esac + +postrun diff --git a/dmenumount b/dmenumount new file mode 100755 index 0000000..abeb0ce --- /dev/null +++ b/dmenumount @@ -0,0 +1,67 @@ +#!/bin/sh + +# Gives a dmenu prompt to mount unmounted drives and Android phones. If +# they're in /etc/fstab, they'll be mounted automatically. Otherwise, you'll +# be prompted to give a mountpoint from already existsing directories. If you +# input a novel directory, it will prompt you to create that directory. + +getmount() { \ + [ -z "$chosen" ] && exit 1 + # shellcheck disable=SC2086 + mp="$(find $1 2>/dev/null | dmenu -i -p "Type in mount point.")" || exit 1 + test -z "$mp" && exit 1 + if [ ! -d "$mp" ]; then + mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") || exit 1 + [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp") + fi + } + +mountusb() { \ + chosen="$(echo "$usbdrives" | dmenu -i -p "Mount which drive?")" || exit 1 + chosen="$(echo "$chosen" | awk '{print $1}')" + sudo -A mount "$chosen" 2>/dev/null && notify-send "💻 USB mounting" "$chosen mounted." && exit 0 + alreadymounted=$(lsblk -nrpo "name,type,mountpoint" | awk '$3!~/\/boot|\/home$|SWAP/&&length($3)>1{printf "-not ( -path *%s -prune ) ",$3}') + getmount "/mnt /media /mount /home -maxdepth 5 -type d $alreadymounted" + partitiontype="$(lsblk -no "fstype" "$chosen")" + case "$partitiontype" in + "vfat") sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000;; + "exfat") sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)";; + *) sudo -A mount "$chosen" "$mp"; user="$(whoami)"; ug="$(groups | awk '{print $1}')"; sudo -A chown "$user":"$ug" "$mp";; + esac + notify-send "💻 USB mounting" "$chosen mounted to $mp." + } + +mountandroid() { \ + chosen="$(echo "$anddrives" | dmenu -i -p "Which Android device?")" || exit 1 + chosen="$(echo "$chosen" | cut -d : -f 1)" + getmount "$HOME -maxdepth 3 -type d" + simple-mtpfs --device "$chosen" "$mp" + echo "OK" | dmenu -i -p "Tap Allow on your phone if it asks for permission and then press enter" || exit 1 + simple-mtpfs --device "$chosen" "$mp" + notify-send "🤖 Android Mounting" "Android device mounted to $mp." + } + +asktype() { \ + choice="$(printf "USB\\nAndroid" | dmenu -i -p "Mount a USB drive or Android device?")" || exit 1 + case $choice in + USB) mountusb ;; + Android) mountandroid ;; + esac + } + +anddrives=$(simple-mtpfs -l 2>/dev/null) +usbdrives="$(lsblk -rpo "name,type,size,label,mountpoint,fstype" | grep -v crypto_LUKS | grep 'part\|rom' | sed 's/ /:/g' | awk -F':' '$5==""{printf "%s (%s) %s\n",$1,$3,$4}')" + +if [ -z "$usbdrives" ]; then + [ -z "$anddrives" ] && echo "No USB drive or Android device detected" && exit + echo "Android device(s) detected." + mountandroid +else + if [ -z "$anddrives" ]; then + echo "USB drive(s) detected." + mountusb + else + echo "Mountable USB drive(s) and Android device(s) detected." + asktype + fi +fi diff --git a/dmenumountcifs b/dmenumountcifs new file mode 100755 index 0000000..46c2b57 --- /dev/null +++ b/dmenumountcifs @@ -0,0 +1,19 @@ +#!/bin/sh +# Gives a dmenu prompt to mount unmounted local NAS shares for read/write. +# Requirements - "%wheel ALL=(ALL) NOPASSWD: ALL" +# +# Browse for mDNS/DNS-SD services using the Avahi daemon... +srvname=$(avahi-browse _smb._tcp -t | awk '{print $4}' | dmenu -i -p "Which NAS?") || exit 1 +notify-send "Searching for network shares..." "Please wait..." +# Choose share disk... +share=$(smbclient -L "$srvname" -N | grep Disk | awk '{print $1}' | dmenu -i -p "Mount which share?") || exit 1 +# Format URL... +share2mnt=//"$srvname".local/"$share" + +sharemount() { + mounted=$(mount -v | grep "$share2mnt") || ([ ! -d /mnt/"$share" ] && sudo mkdir /mnt/"$share") + [ -z "$mounted" ] && sudo mount -t cifs "$share2mnt" -o user=nobody,password="",noperm /mnt/"$share" && notify-send "Netshare $share mounted" && exit 0 + notify-send "Netshare $share already mounted"; exit 1 +} + +sharemount diff --git a/dmenuumount b/dmenuumount new file mode 100755 index 0000000..946d12c --- /dev/null +++ b/dmenuumount @@ -0,0 +1,44 @@ +#!/bin/sh + +# A dmenu prompt to unmount drives. +# Provides you with mounted partitions, select one to unmount. +# Drives mounted at /, /boot and /home will not be options to unmount. + +unmountusb() { + [ -z "$drives" ] && exit + chosen="$(echo "$drives" | dmenu -i -p "Unmount which drive?")" || exit 1 + chosen="$(echo "$chosen" | awk '{print $1}')" + [ -z "$chosen" ] && exit + sudo -A umount "$chosen" && notify-send "💻 USB unmounting" "$chosen unmounted." + } + +unmountandroid() { \ + chosen="$(awk '/simple-mtpfs/ {print $2}' /etc/mtab | dmenu -i -p "Unmount which device?")" || exit 1 + [ -z "$chosen" ] && exit + sudo -A umount -l "$chosen" && notify-send "🤖 Android unmounting" "$chosen unmounted." + } + +asktype() { \ + choice="$(printf "USB\\nAndroid" | dmenu -i -p "Unmount a USB drive or Android device?")" || exit 1 + case "$choice" in + USB) unmountusb ;; + Android) unmountandroid ;; + esac + } + +drives=$(lsblk -nrpo "name,type,size,mountpoint,label" | awk -F':' '{gsub(/ /,":")}$4!~/\/boot|\/efi|\/home$|SWAP/&&length($4)>1{printf "%s (%s) %s\n",$4,$3,$5}') + +if ! grep simple-mtpfs /etc/mtab; then + [ -z "$drives" ] && echo "No drives to unmount." && exit + echo "Unmountable USB drive detected." + unmountusb +else + if [ -z "$drives" ] + then + echo "Unmountable Android device detected." + unmountandroid + else + echo "Unmountable USB drive(s) and Android device(s) detected." + asktype + fi +fi diff --git a/install.sh b/install.sh index e957282..46591d7 100755 --- a/install.sh +++ b/install.sh @@ -1,3 +1,3 @@ #!/bin/bash -cp scripts/* $HOME/.local/bin +cp scripts/* $HOME/.local/bin -r diff --git a/lfub b/lfub new file mode 100755 index 0000000..9012f50 --- /dev/null +++ b/lfub @@ -0,0 +1,24 @@ +#!/bin/sh + +# This is a wrapper script for lb that allows it to create image previews with +# ueberzug. This works in concert with the lf configuration file and the +# lf-cleaner script. + +set -e + +cleanup() { + exec 3>&- + rm "$FIFO_UEBERZUG" +} + +if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then + lf "$@" +else + [ ! -d "$HOME/.cache/lf" ] && mkdir -p "$HOME/.cache/lf" + export FIFO_UEBERZUG="$HOME/.cache/lf/ueberzug-$$" + mkfifo "$FIFO_UEBERZUG" + ueberzug layer -s <"$FIFO_UEBERZUG" -p json & + exec 3>"$FIFO_UEBERZUG" + trap cleanup HUP INT QUIT TERM PWR EXIT + lf "$@" 3>&- +fi diff --git a/maimpick b/maimpick new file mode 100755 index 0000000..8ea9f5e --- /dev/null +++ b/maimpick @@ -0,0 +1,18 @@ +#!/bin/sh + +# This is bound to Shift+PrintScreen by default, requires maim. It lets you +# choose the kind of screenshot to take, including copying the image or even +# highlighting an area to copy. scrotcucks on suicidewatch right now. + +# variables +output="$(date '+%y%m%d-%H%M-%S').png" +xclip_cmd="xclip -sel clip -t image/png" + +case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in + "a selected area") maim -s pic-selected-"${output}" ;; + "current window") maim -q -d 0.2 -i "$(xdotool getactivewindow)" pic-window-"${output}" ;; + "full screen") maim -q -d 0.2 pic-full-"${output}" ;; + "a selected area (copy)") maim -s | ${xclip_cmd} ;; + "current window (copy)") maim -q -d 0.2 -i "$(xdotool getactivewindow)" | ${xclip_cmd} ;; + "full screen (copy)") maim -q -d 0.2 | ${xclip_cmd} ;; +esac diff --git a/nohup.out b/nohup.out new file mode 100644 index 0000000..2178638 --- /dev/null +++ b/nohup.out @@ -0,0 +1,487 @@ +/home/solomon/.config/shell/profile: line 9: $PATH:${$(find ~/.local/bin -type d -printf %p:)%%:}: bad substitution +keycode 8 = +keycode 9 = Escape NoSymbol Escape +keycode 10 = 1 exclam 1 exclam +keycode 11 = 2 at 2 at +keycode 12 = 3 numbersign 3 numbersign +keycode 13 = 4 dollar 4 dollar +keycode 14 = 5 percent 5 percent +keycode 15 = 6 asciicircum 6 asciicircum dead_circumflex dead_circumflex dead_circumflex +keycode 16 = 7 ampersand 7 ampersand +keycode 17 = 8 asterisk 8 asterisk +keycode 18 = 9 parenleft 9 parenleft dead_grave dead_breve dead_grave +keycode 19 = 0 parenright 0 parenright +keycode 20 = bracketleft braceleft bracketleft braceleft +keycode 21 = bracketright braceright bracketright braceright dead_tilde NoSymbol dead_tilde +keycode 22 = BackSpace BackSpace BackSpace BackSpace +keycode 23 = Tab ISO_Left_Tab Tab ISO_Left_Tab +keycode 24 = apostrophe quotedbl apostrophe quotedbl dead_acute dead_diaeresis dead_acute +keycode 25 = comma less comma less dead_cedilla dead_caron dead_cedilla +keycode 26 = period greater period greater dead_abovedot periodcentered dead_abovedot +keycode 27 = p P p P +keycode 28 = y Y y Y +keycode 29 = f F f F +keycode 30 = g G g G +keycode 31 = c C c C +keycode 32 = r R r R +keycode 33 = l L l L +keycode 34 = slash question slash question +keycode 35 = equal plus equal plus +keycode 36 = Return NoSymbol Return +keycode 37 = Control_L NoSymbol Control_L +keycode 38 = a A a A +keycode 39 = o O o O +keycode 40 = e E e E +keycode 41 = u U u U +keycode 42 = i I i I +keycode 43 = d D d D +keycode 44 = h H h H +keycode 45 = t T t T +keycode 46 = n N n N +keycode 47 = s S s S +keycode 48 = minus underscore minus underscore +keycode 49 = grave asciitilde grave asciitilde dead_grave dead_tilde dead_grave +keycode 50 = Shift_L NoSymbol Shift_L +keycode 51 = backslash bar backslash bar +keycode 52 = semicolon colon semicolon colon dead_ogonek dead_doubleacute dead_ogonek +keycode 53 = q Q q Q +keycode 54 = j J j J +keycode 55 = k K k K +keycode 56 = x X x X +keycode 57 = b B b B +keycode 58 = m M m M +keycode 59 = w W w W +keycode 60 = v V v V +keycode 61 = z Z z Z +keycode 62 = Shift_R NoSymbol Shift_R +keycode 63 = KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply XF86ClearGrab +keycode 64 = Alt_L Meta_L Alt_L Meta_L +keycode 65 = space NoSymbol space +keycode 66 = Caps_Lock NoSymbol Caps_Lock +keycode 67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1 +keycode 68 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2 +keycode 69 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3 +keycode 70 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4 +keycode 71 = F5 F5 F5 F5 F5 F5 XF86Switch_VT_5 +keycode 72 = F6 F6 F6 F6 F6 F6 XF86Switch_VT_6 +keycode 73 = F7 F7 F7 F7 F7 F7 XF86Switch_VT_7 +keycode 74 = F8 F8 F8 F8 F8 F8 XF86Switch_VT_8 +keycode 75 = F9 F9 F9 F9 F9 F9 XF86Switch_VT_9 +keycode 76 = F10 F10 F10 F10 F10 F10 XF86Switch_VT_10 +keycode 77 = Num_Lock NoSymbol Num_Lock +keycode 78 = Scroll_Lock NoSymbol Scroll_Lock +keycode 79 = KP_Home KP_7 KP_Home KP_7 +keycode 80 = KP_Up KP_8 KP_Up KP_8 +keycode 81 = KP_Prior KP_9 KP_Prior KP_9 +keycode 82 = KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract XF86Prev_VMode +keycode 83 = KP_Left KP_4 KP_Left KP_4 +keycode 84 = KP_Begin KP_5 KP_Begin KP_5 +keycode 85 = KP_Right KP_6 KP_Right KP_6 +keycode 86 = KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add XF86Next_VMode +keycode 87 = KP_End KP_1 KP_End KP_1 +keycode 88 = KP_Down KP_2 KP_Down KP_2 +keycode 89 = KP_Next KP_3 KP_Next KP_3 +keycode 90 = KP_Insert KP_0 KP_Insert KP_0 +keycode 91 = KP_Delete KP_Decimal KP_Delete KP_Decimal +keycode 92 = ISO_Level3_Shift NoSymbol ISO_Level3_Shift +keycode 93 = +keycode 94 = less greater less greater bar brokenbar bar +keycode 95 = F11 F11 F11 F11 F11 F11 XF86Switch_VT_11 +keycode 96 = F12 F12 F12 F12 F12 F12 XF86Switch_VT_12 +keycode 97 = +keycode 98 = Katakana NoSymbol Katakana +keycode 99 = Hiragana NoSymbol Hiragana +keycode 100 = Henkan_Mode NoSymbol Henkan_Mode +keycode 101 = Hiragana_Katakana NoSymbol Hiragana_Katakana +keycode 102 = Muhenkan NoSymbol Muhenkan +keycode 103 = +keycode 104 = KP_Enter NoSymbol KP_Enter +keycode 105 = Control_R NoSymbol Control_R +keycode 106 = KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide XF86Ungrab +keycode 107 = Print Sys_Req Print Sys_Req +keycode 108 = Alt_R Meta_R Alt_R Meta_R +keycode 109 = Linefeed NoSymbol Linefeed +keycode 110 = Home NoSymbol Home +keycode 111 = Up NoSymbol Up +keycode 112 = Prior NoSymbol Prior +keycode 113 = Left NoSymbol Left +keycode 114 = Right NoSymbol Right +keycode 115 = End NoSymbol End +keycode 116 = Down NoSymbol Down +keycode 117 = Next NoSymbol Next +keycode 118 = Insert NoSymbol Insert +keycode 119 = Delete NoSymbol Delete +keycode 120 = +keycode 121 = XF86AudioMute NoSymbol XF86AudioMute +keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume +keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume +keycode 124 = XF86PowerOff NoSymbol XF86PowerOff +keycode 125 = KP_Equal NoSymbol KP_Equal +keycode 126 = plusminus NoSymbol plusminus +keycode 127 = Pause Break Pause Break +keycode 128 = XF86LaunchA NoSymbol XF86LaunchA +keycode 129 = KP_Decimal KP_Decimal KP_Decimal KP_Decimal +keycode 130 = Hangul NoSymbol Hangul +keycode 131 = Hangul_Hanja NoSymbol Hangul_Hanja +keycode 132 = +keycode 133 = Super_L NoSymbol Super_L +keycode 134 = Super_R NoSymbol Super_R +keycode 135 = Menu NoSymbol Menu +keycode 136 = Cancel NoSymbol Cancel +keycode 137 = Redo NoSymbol Redo +keycode 138 = SunProps NoSymbol SunProps +keycode 139 = Undo NoSymbol Undo +keycode 140 = SunFront NoSymbol SunFront +keycode 141 = XF86Copy NoSymbol XF86Copy +keycode 142 = XF86Open NoSymbol XF86Open +keycode 143 = XF86Paste NoSymbol XF86Paste +keycode 144 = Find NoSymbol Find +keycode 145 = XF86Cut NoSymbol XF86Cut +keycode 146 = Help NoSymbol Help +keycode 147 = XF86MenuKB NoSymbol XF86MenuKB +keycode 148 = XF86Calculator NoSymbol XF86Calculator +keycode 149 = +keycode 150 = XF86Sleep NoSymbol XF86Sleep +keycode 151 = XF86WakeUp NoSymbol XF86WakeUp +keycode 152 = XF86Explorer NoSymbol XF86Explorer +keycode 153 = XF86Send NoSymbol XF86Send +keycode 154 = +keycode 155 = XF86Xfer NoSymbol XF86Xfer +keycode 156 = XF86Launch1 NoSymbol XF86Launch1 +keycode 157 = XF86Launch2 NoSymbol XF86Launch2 +keycode 158 = XF86WWW NoSymbol XF86WWW +keycode 159 = XF86DOS NoSymbol XF86DOS +keycode 160 = XF86ScreenSaver NoSymbol XF86ScreenSaver +keycode 161 = XF86RotateWindows NoSymbol XF86RotateWindows +keycode 162 = XF86TaskPane NoSymbol XF86TaskPane +keycode 163 = XF86Mail NoSymbol XF86Mail +keycode 164 = XF86Favorites NoSymbol XF86Favorites +keycode 165 = XF86MyComputer NoSymbol XF86MyComputer +keycode 166 = XF86Back NoSymbol XF86Back +keycode 167 = XF86Forward NoSymbol XF86Forward +keycode 168 = +keycode 169 = XF86Eject NoSymbol XF86Eject +keycode 170 = XF86Eject NoSymbol XF86Eject +keycode 171 = XF86AudioNext NoSymbol XF86AudioNext +keycode 172 = XF86AudioPlay XF86AudioPause XF86AudioPlay XF86AudioPause +keycode 173 = XF86AudioPrev NoSymbol XF86AudioPrev +keycode 174 = XF86AudioStop XF86Eject XF86AudioStop XF86Eject +keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord +keycode 176 = XF86AudioRewind NoSymbol XF86AudioRewind +keycode 177 = XF86Phone NoSymbol XF86Phone +keycode 178 = +keycode 179 = XF86Tools NoSymbol XF86Tools +keycode 180 = XF86HomePage NoSymbol XF86HomePage +keycode 181 = XF86Reload NoSymbol XF86Reload +keycode 182 = XF86Close NoSymbol XF86Close +keycode 183 = +keycode 184 = +keycode 185 = XF86ScrollUp NoSymbol XF86ScrollUp +keycode 186 = XF86ScrollDown NoSymbol XF86ScrollDown +keycode 187 = parenleft NoSymbol parenleft +keycode 188 = parenright NoSymbol parenright +keycode 189 = XF86New NoSymbol XF86New +keycode 190 = Redo NoSymbol Redo +keycode 191 = XF86Tools NoSymbol XF86Tools +keycode 192 = XF86Launch5 NoSymbol XF86Launch5 +keycode 193 = XF86Launch6 NoSymbol XF86Launch6 +keycode 194 = XF86Launch7 NoSymbol XF86Launch7 +keycode 195 = XF86Launch8 NoSymbol XF86Launch8 +keycode 196 = XF86Launch9 NoSymbol XF86Launch9 +keycode 197 = +keycode 198 = XF86AudioMicMute NoSymbol XF86AudioMicMute +keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle +keycode 200 = XF86TouchpadOn NoSymbol XF86TouchpadOn +keycode 201 = XF86TouchpadOff NoSymbol XF86TouchpadOff +keycode 202 = +keycode 203 = Mode_switch NoSymbol Mode_switch +keycode 204 = NoSymbol Alt_L NoSymbol Alt_L +keycode 205 = NoSymbol Meta_L NoSymbol Meta_L +keycode 206 = NoSymbol Super_L NoSymbol Super_L +keycode 207 = NoSymbol Hyper_L NoSymbol Hyper_L +keycode 208 = XF86AudioPlay NoSymbol XF86AudioPlay +keycode 209 = XF86AudioPause NoSymbol XF86AudioPause +keycode 210 = XF86Launch3 NoSymbol XF86Launch3 +keycode 211 = XF86Launch4 NoSymbol XF86Launch4 +keycode 212 = XF86LaunchB NoSymbol XF86LaunchB +keycode 213 = XF86Suspend NoSymbol XF86Suspend +keycode 214 = XF86Close NoSymbol XF86Close +keycode 215 = XF86AudioPlay NoSymbol XF86AudioPlay +keycode 216 = XF86AudioForward NoSymbol XF86AudioForward +keycode 217 = +keycode 218 = Print NoSymbol Print +keycode 219 = +keycode 220 = XF86WebCam NoSymbol XF86WebCam +keycode 221 = XF86AudioPreset NoSymbol XF86AudioPreset +keycode 222 = +keycode 223 = XF86Mail NoSymbol XF86Mail +keycode 224 = XF86Messenger NoSymbol XF86Messenger +keycode 225 = XF86Search NoSymbol XF86Search +keycode 226 = XF86Go NoSymbol XF86Go +keycode 227 = XF86Finance NoSymbol XF86Finance +keycode 228 = XF86Game NoSymbol XF86Game +keycode 229 = XF86Shop NoSymbol XF86Shop +keycode 230 = +keycode 231 = Cancel NoSymbol Cancel +keycode 232 = XF86MonBrightnessDown NoSymbol XF86MonBrightnessDown +keycode 233 = XF86MonBrightnessUp NoSymbol XF86MonBrightnessUp +keycode 234 = XF86AudioMedia NoSymbol XF86AudioMedia +keycode 235 = XF86Display NoSymbol XF86Display +keycode 236 = XF86KbdLightOnOff NoSymbol XF86KbdLightOnOff +keycode 237 = XF86KbdBrightnessDown NoSymbol XF86KbdBrightnessDown +keycode 238 = XF86KbdBrightnessUp NoSymbol XF86KbdBrightnessUp +keycode 239 = XF86Send NoSymbol XF86Send +keycode 240 = XF86Reply NoSymbol XF86Reply +keycode 241 = XF86MailForward NoSymbol XF86MailForward +keycode 242 = XF86Save NoSymbol XF86Save +keycode 243 = XF86Documents NoSymbol XF86Documents +keycode 244 = XF86Battery NoSymbol XF86Battery +keycode 245 = XF86Bluetooth NoSymbol XF86Bluetooth +keycode 246 = XF86WLAN NoSymbol XF86WLAN +keycode 247 = XF86UWB NoSymbol XF86UWB +keycode 248 = +keycode 249 = XF86Next_VMode NoSymbol XF86Next_VMode +keycode 250 = XF86Prev_VMode NoSymbol XF86Prev_VMode +keycode 251 = XF86MonBrightnessCycle NoSymbol XF86MonBrightnessCycle +keycode 252 = XF86BrightnessAuto NoSymbol XF86BrightnessAuto +keycode 253 = XF86DisplayOff NoSymbol XF86DisplayOff +keycode 254 = XF86WWAN NoSymbol XF86WWAN +keycode 255 = XF86RFKill NoSymbol XF86RFKill +[ 06/22/2022 15:35:34.813 session_init FATAL ERROR ] Another composite manager is already running +Bad _NET_DESKTOP with data[0]=-1 +Bad _NET_DESKTOP with data[0]=-1 +Bad _NET_DESKTOP with data[0]=-1 +blueman-applet 15.35.35 WARNING PluginManager:147 __load_plugin: Not loading PPPSupport because its conflict has higher priority +WARNING: No icon found in path: 'nm-device-wired' +WARNING: No icon found in path: 'nm-signal-75' +blueman-applet 15.35.35 WARNING PluginManager:147 __load_plugin: Not loading DhcpClient because its conflict has higher priority +blueman-applet 15.35.35 WARNING TransferService:213 _make_share_path: Failed to get Download dir from XDG +Initializing local storage instance +(electron) Sending uncompressed crash reports is deprecated and will be removed in a future version of Electron. Set { compress: true } to opt-in to the new behavior. Crash reports will be uploaded gzipped, which most crash reporting servers support. + +(blueman-tray:1763): Gdk-CRITICAL **: 15:35:36.177: gdk_window_thaw_toplevel_updates: assertion 'window->update_and_descendants_freeze_count > 0' failed +WARNING: No icon found in path: 'kdeconnect' +/home/solomon/.config/Element exists: yes +/home/solomon/.config/Riot exists: no +[06/22/22, 15:35:36:543] info: +╔═════════════════════════════════════════════════════╗ +║ Slack 4.26.1, linux 5.18.5-arch1-1 on x64 ║ +╚═════════════════════════════════════════════════════╝ +[06/22/22, 15:35:36:544] info: Configured logger via +{ + "enableConsoleTransport": true, + "identifierOverride": "webapp-service-worker-console", + "shouldUseNewBackend": false, + "loggerInstanceCount": 2 +} +[06/22/22, 15:35:36:544] info: Predefined values for process +{ + "NODE_ENV": "production", + "platform": "linux", + "type": "browser", + "timeZone": "Australia/Adelaide", + "PACKAGE_MANIFEST.productName": "Slack", + "PACKAGE_MANIFEST.version": "4.26.1", + "PACKAGE_MANIFEST.commit": "76f5abf", + "PACKAGE_MANIFEST.branch": "HEAD" +} +No update_base_url is defined: auto update is disabled +[1561:0622/153536.611598:ERROR:browser_main_loop.cc(269)] Gtk: gtk_widget_add_accelerator: assertion 'GTK_IS_ACCEL_GROUP (accel_group)' failed +Fetching translation json for locale: en_EN +Changing application language to en-us +Fetching translation json for locale: en-us +Resetting the UI components after locale change +Resetting the UI components after locale change +[1561:0622/153536.817038:ERROR:browser_main_loop.cc(269)] Gdk: gdk_window_thaw_toplevel_updates: assertion 'window->update_and_descendants_freeze_count > 0' failed +[1563:0622/153536.822165:ERROR:browser_main_loop.cc(267)] Gdk: gdk_window_thaw_toplevel_updates: assertion 'window->update_and_descendants_freeze_count > 0' failed +Changing application language to en-us +Fetching translation json for locale: en-us +Resetting the UI components after locale change +[06/22/22, 15:35:37:879] info: +╔═════════════════════════════════════════════════════╗ +║ Slack 4.26.1, linux 5.18.5-arch1-1 on x64 ║ +╚═════════════════════════════════════════════════════╝ +[06/22/22, 15:35:37:880] info: Configured logger via +{ + "enableConsoleTransport": true, + "identifierOverride": "webapp-console", + "shouldUseNewBackend": false, + "loggerInstanceCount": 3 +} +[06/22/22, 15:35:37:880] info: Predefined values for process +{ + "NODE_ENV": "production", + "platform": "linux", + "type": "browser", + "timeZone": "Australia/Adelaide", + "PACKAGE_MANIFEST.productName": "Slack", + "PACKAGE_MANIFEST.version": "4.26.1", + "PACKAGE_MANIFEST.commit": "76f5abf", + "PACKAGE_MANIFEST.branch": "HEAD" +} +[06/22/22, 15:35:37:880] info: Starting Sentry (Renderer) +[06/22/22, 15:35:37:881] info: getSentryDSN: Setting sentry URL to slack.com +[06/22/22, 15:35:37:881] info: Creating desktop interface object +[06/22/22, 15:35:37:881] info: Exposing context bridge +[06/22/22, 15:35:37:881] info: Store: WINDOW_CREATED { + "type": "main", + "id": 1, + "frame": { + "isHtmlFullScreen": false, + "isFullScreen": false, + "isMinimized": false, + "isMaximized": false, + "isVisible": false, + "isFocused": false, + "bounds": { + "x": 4243, + "y": 221, + "width": 1674, + "height": 1021 + } + } +} +[06/22/22, 15:35:37:881] info: Store: RECORD_PERFORMANCE_TIMING { + "phase": 1, + "interval": 330 +} +[06/22/22, 15:35:37:881] info: Store: UPSERT_WEB_CONTENTS { + "id": 1, + "state": "unloaded" +} +[06/22/22, 15:35:37:881] info: [TRACER] Tracing is not sampled by default for this session. +[06/22/22, 15:35:37:881] warn: TELEMETRY You tried to get a team-specific telemeter but didn’t provide enough context and are getting the generic telemeter instead which is likely not what you want. +[06/22/22, 15:35:37:881] info: Store: UPSERT_WEB_CONTENTS { + "id": 1, + "state": "loaded" +} +[06/22/22, 15:35:37:882] info: Store: RECORD_PERFORMANCE_TIMING { + "phase": 2, + "interval": 1137 +} +[06/22/22, 15:35:37:882] info: Store: MAIN_WINDOW_SHOWN +[06/22/22, 15:35:37:882] info: Store: UPDATE_SETTINGS { + "mainWindowSettings": { + "fullScreen": false, + "maximized": false, + "bounds": { + "x": 4243, + "y": 390, + "width": 1674, + "height": 1021 + } + } +} +[06/22/22, 15:35:37:882] info: Store: CLEAR_NOTIFICATIONS +[06/22/22, 15:35:37:885] info: Store: UPSERT_WEB_CONTENTS { + "id": 1, + "type": "app", + "history": "[REDACTED]" +} +[06/22/22, 15:35:38:275] info: Breadcrumb: fetch: undefined { + "method": "GET", + "url": "https://slack.com/api/api.test?error=", + "status_code": 200 +} +[06/22/22, 15:35:38:278] info: Network status check { + "elapsed_time_ms": 407, + "navigator_online": true, + "api_test": "online" +} +[06/22/22, 15:35:38:280] info: Store: SET_NETWORK_STATUS online +[06/22/22, 15:35:38:925] info: Store: UPDATE_SETTINGS { + "mainWindowSettings": { + "fullScreen": false, + "maximized": false, + "bounds": { + "x": 1683, + "y": 26, + "width": 2554, + "height": 1411 + } + } +} +[06/22/22, 15:35:41:745] info: Breadcrumb: ui.click: body > div#page_contents +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +[06/22/22, 15:35:47:843] info: Breadcrumb: ui.click: body > div#page_contents +[06/22/22, 15:35:48:732] info: Store: QUIT_APP +[06/22/22, 15:35:48:772] info: Store: DOWNLOADS_CLEANED_UP +[06/22/22, 15:35:48:786] info: Store: UPSERT_WEB_CONTENTS { + "id": 1, + "state": "page-closed" +} +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +[GFX1-]: More than 1 GPU from same vendor detected via PCI, cannot deduce device +Missing chrome or resource URL: resource://gre/modules/UpdateListener.jsm +https://launchermeta.mojang.com/v1/products/launcher/6f083b80d5e6fabbc4236f81d0d8f8a350c665a9/linux.json +[2022-06-22T06:06:20Z ERROR mp4parse] Found 2 nul bytes in "\0\0" +[2022-06-22T06:06:20Z ERROR mp4parse] Found 2 nul bytes in "\0\0" +[2022-06-22T06:06:20Z ERROR mp4parse] Found 2 nul bytes in "\0\0" +[2022-06-22T06:06:20Z ERROR mp4parse] Found 2 nul bytes in "\0\0" +[0622/153625.348211:INFO:main_context.cpp(130)] CEF initialized successfully. +[0622/153625.348770:INFO:main_context.cpp(132)] CEF version: 99.2.14+g3f796b8+chromium-99.0.4844.84 +sh: line 1: orca: command not found +Created browser window for reuse: 0xc00003 +[0622/153625.501373:ERROR:browser_main_loop.cc(268)] Gdk: _gdk_frame_clock_freeze: assertion 'GDK_IS_FRAME_CLOCK (clock)' failed +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'kdeconnect' +WARNING: No icon found in path: 'kdeconnect' +[0622/153822.926398:ERROR:browser_main_loop.cc(268)] Gdk: _gdk_frame_clock_thaw: assertion 'GDK_IS_FRAME_CLOCK (clock)' failed +[0622/153822.943614:ERROR:gl_surface_egl.cc(808)] EGL Driver message (Critical) eglMakeCurrent: Failed to make the GLX context current +[0622/153822.943860:ERROR:skia_output_surface_impl_on_gpu.cc(1722)] Failed to make current. +[0622/153822.944109:ERROR:skia_output_surface_impl_on_gpu.cc(1722)] Failed to make current. +[0622/153822.946796:WARNING:connection.cc(61)] X error received. Request: DestroyWindowRequest, Error: WindowError{.sequence = 892, .bad_value = 12582916, .minor_opcode = 0, .major_opcode = 4} +[0622/153822.975142:ERROR:gl_surface_egl.cc(808)] EGL Driver message (Critical) eglMakeCurrent: Failed to make the GLX context current +[0622/153822.975742:ERROR:gl_surface_egl.cc(808)] EGL Driver message (Critical) eglDestroyContext: Failed to make the GLX context current +[0622/153822.975808:ERROR:gl_context_egl.cc(367)] eglDestroyContext failed with error EGL_CONTEXT_LOST +[0622/153822.976394:ERROR:shared_image_stub.cc(519)] SharedImageStub: context already lost +WARNING: No icon found in path: 'kdeconnect' +WARNING: No icon found in path: 'kdeconnect' +WARNING: No icon found in path: 'kdeconnect' +WARNING: No icon found in path: 'call-start' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'call-start' +Bad _NET_DESKTOP with data[0]=-1 +user error (Error in function getWindowAttributes) +user error (Error in function getWindowAttributes) +user error (Error in function getWindowAttributes) +Bad _NET_DESKTOP with data[0]=-1 +user error (Error in function getWindowAttributes) +WARNING: No icon found in path: 'kdeconnect' +WARNING: No icon found in path: 'kdeconnect' +WARNING: No icon found in path: 'kdeconnect' +WARNING: No icon found in path: 'kdeconnect' +user error (Error in function getWindowAttributes) +Bad _NET_DESKTOP with data[0]=-1 +user error (Error in function getWindowAttributes) +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'call-start' +WARNING: No icon found in path: 'call-start' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +WARNING: No icon found in path: 'Nextcloud' +user error (Error in function getWindowAttributes) +WARNING: No icon found in path: 'dialog-information' +user error (Error in function getWindowAttributes) +WARNING: No icon found in path: 'dialog-information' +xmoxmobar: Caughbt sairg:na lC xa1u5g;h te xsiitginnagl.m .o1.b5 +X connection to :0 broken (explicit kill or server shutdown). +a;r :e xCiatuignhgt. .s.i +gnal 15; exiting... +[1563:0622/184521.356164:ERROR:zygote_communication_linux.cc(276)] Failed to send GetTerminationStatus message to zygote +X connection to :0 broken (explicit kill or server shutdown). diff --git a/opout b/opout new file mode 100755 index 0000000..faf6575 --- /dev/null +++ b/opout @@ -0,0 +1,13 @@ +#!/bin/sh + +# opout: "open output": A general handler for opening a file's intended output, +# usually the pdf of a compiled document. I find this useful especially +# running from vim. + +basename="${1%.*}" + +case "${*}" in + *.tex|*.m[dse]|*.[rR]md|*.mom|*.[0-9]) setsid -f xdg-open "$basename".pdf >/dev/null 2>&1 ;; + *.html) setsid -f "$BROWSER" "$basename".html >/dev/null 2>&1 ;; + *.sent) setsid -f sent "$1" >/dev/null 2>&1 ;; +esac diff --git a/rotdir b/rotdir new file mode 100755 index 0000000..86da6db --- /dev/null +++ b/rotdir @@ -0,0 +1,12 @@ +#!/bin/sh + +# When I open an image from the file manager in sxiv (the image viewer), I want +# to be able to press the next/previous keys to key through the rest of the +# images in the same directory. This script "rotates" the content of a +# directory based on the first chosen file, so that if I open the 15th image, +# if I press next, it will go to the 16th etc. Autistic, I know, but this is +# one of the reasons that sxiv is great for being able to read standard input. + +[ -z "$1" ] && echo "usage: rotdir regex 2>&1" && exit 1 +base="$(basename "$1")" +ls "$PWD" | awk -v BASE="$base" 'BEGIN { lines = ""; m = 0; } { if ($0 == BASE) { m = 1; } } { if (!m) { if (lines) { lines = lines"\n"; } lines = lines""$0; } else { print $0; } } END { print lines; }' diff --git a/rssadd b/rssadd new file mode 100755 index 0000000..910fca3 --- /dev/null +++ b/rssadd @@ -0,0 +1,18 @@ +#!/bin/sh + +if echo "$1" | grep -q "https*://\S\+\.[A-Za-z]\+\S*" ; then + url="$1" +else + url="$(grep -Eom1 '<[^>]+(rel="self"|application/[a-z]+\+xml)[^>]+>' "$1" | + grep -o "https?://[^\" ]")" + + echo "$url" | grep -q "https*://\S\+\.[A-Za-z]\+\S*" || + notify-send "That doesn't look like a full URL." && exit 1 +fi + +RSSFILE="${XDG_CONFIG_HOME:-$HOME/.config}/newsboat/urls" +if awk '{print $1}' "$RSSFILE" | grep "^$url$" >/dev/null; then + notify-send "You already have this RSS feed." +else + echo "$url" >> "$RSSFILE" && notify-send "RSS feed added." +fi diff --git a/scripts/cron/README.md b/scripts/cron/README.md new file mode 100644 index 0000000..fa0c354 --- /dev/null +++ b/scripts/cron/README.md @@ -0,0 +1,11 @@ +# Important Note + +These cronjobs have components that require information about your current display to display notifications correctly. + +When you add them as cronjobs, I recommend you precede the command with commands as those below: + +``` +export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u $USER)/bus; export DISPLAY=:0; . $HOME/.zprofile; then_command_goes_here +``` + +This ensures that notifications will display, xdotool commands will function and environmental variables will work as well. diff --git a/scripts/cron/checkup b/scripts/cron/checkup new file mode 100644 index 0000000..bd3c634 --- /dev/null +++ b/scripts/cron/checkup @@ -0,0 +1,17 @@ +#!/bin/sh + +# Syncs repositories and downloads updates, meant to be run as a cronjob. + +notify-send "📦 Repository Sync" "Checking for package updates..." + +sudo pacman -Syyuw --noconfirm || notify-send "Error downloading updates. + +Check your internet connection, if pacman is already running, or run update manually to see errors." +pkill -RTMIN+8 "${STATUSBAR:-dwmblocks}" + +if pacman -Qu | grep -v "\[ignored\]" +then + notify-send "🎁 Repository Sync" "Updates available. Click statusbar icon (📦) for update." +else + notify-send "📦 Repository Sync" "Sync complete. No new packages for update." +fi diff --git a/scripts/cron/crontog b/scripts/cron/crontog new file mode 100644 index 0000000..5aba5e6 --- /dev/null +++ b/scripts/cron/crontog @@ -0,0 +1,6 @@ +#!/bin/sh + +# Toggles all cronjobs off/on. +# Stores disabled crontabs in ~/.consaved until restored. + +([ -f "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved ] && crontab - < "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && rm "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && notify-send "🕓 Cronjobs re-enabled.") || ( crontab -l > "${XDG_CONFIG_HOME:-$HOME/.config}"/cronsaved && crontab -r && notify-send "🕓 Cronjobs saved and disabled.") diff --git a/update-voidrice.sh b/update-voidrice.sh new file mode 100755 index 0000000..f00adb5 --- /dev/null +++ b/update-voidrice.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# This script assumes that you are running it in a sibling directory to Luke Smith's voidrice. +# I use some of his scripts and although they don't often update, they are known to. +# The output is going to include a bunch of copy errors as I'm just copying each file in this directory from his .local/bin back to here, obviously my custom scripts won't exist so they'll fail. + +scripts=$(ls scripts) +crons=$(ls scripts/cron) + +for script in $scripts; do + cp ../voidrice/.local/bin/$script . -v +done + + +for cron in $crons; do + cp ../voidrice/.local/bin/cron/$cron ./scripts/cron/ -v +done