diff options
| -rw-r--r-- | .config/firefox/larbs.js | 47 | ||||
| -rw-r--r-- | .config/lf/icons | 1 | ||||
| -rw-r--r-- | .config/lf/lfrc | 10 | ||||
| -rwxr-xr-x | .config/lf/scope | 2 | ||||
| -rw-r--r-- | .config/nvim/init.vim | 1 | ||||
| -rw-r--r-- | .config/shell/profile | 48 | ||||
| -rwxr-xr-x | .config/sxiv/exec/key-handler | 2 | ||||
| -rw-r--r-- | .config/wal/templates/zathurarc | 1 | ||||
| -rw-r--r-- | .config/zsh/.zshrc | 2 | ||||
| -rwxr-xr-x | .local/bin/arkenfox-auto-update | 20 | ||||
| -rwxr-xr-x | .local/bin/compiler | 6 | ||||
| -rwxr-xr-x | .local/bin/dmenumount | 10 | ||||
| -rwxr-xr-x | .local/bin/dmenurecord | 24 | ||||
| -rwxr-xr-x | .local/bin/dmenuumount | 49 | ||||
| -rwxr-xr-x | .local/bin/getbib | 2 | ||||
| -rwxr-xr-x | .local/bin/linkhandler | 2 | ||||
| -rwxr-xr-x | .local/bin/mounter | 93 | ||||
| -rwxr-xr-x | .local/bin/sd | 23 | ||||
| -rwxr-xr-x | .local/bin/statusbar/sb-doppler | 2 | ||||
| -rwxr-xr-x | .local/bin/statusbar/sb-kbselect | 1 | ||||
| -rwxr-xr-x | .local/bin/statusbar/sb-music | 2 | ||||
| -rwxr-xr-x | .local/bin/statusbar/sb-volume | 11 | ||||
| -rwxr-xr-x | .local/bin/unmounter | 28 | ||||
| -rw-r--r-- | README.md | 2 |
24 files changed, 283 insertions, 106 deletions
diff --git a/.config/firefox/larbs.js b/.config/firefox/larbs.js new file mode 100644 index 0000000..8328357 --- /dev/null +++ b/.config/firefox/larbs.js @@ -0,0 +1,47 @@ +// These are changes made on top of the Arkenfox JS file to tweak it as +// desired. Any of these settings can be overridden by the user. + +// Disable the Twitter/R*ddit/Faceberg ads in the URL bar: +user_pref("browser.urlbar.quicksuggest.enabled", false); +user_pref("browser.urlbar.suggest.topsites", false); // [FF78+] + +// Do not suggest web history in the URL bar: +user_pref("browser.urlbar.suggest.history", false); + +// Do not prefil forms: +user_pref("signon.prefillForms", false); + +// Do not autocomplete in the URL bar: +user_pref("browser.urlbar.autoFill", false); + +// Enable the addition of search keywords: +user_pref("keyword.enabled", true); + +// Allow access to http (i.e. not https) sites: +user_pref("dom.security.https_only_mode", false); + +// Keep cookies until expiration or user deletion: +user_pref("network.cookie.lifetimePolicy", 0); + +user_pref("dom.webnotifications.serviceworker.enabled", false); + +// Disable push notifications: +user_pref("dom.push.enabled", false); + +// Disable the pocket antifeature: +user_pref("extensions.pocket.enabled", false); + +// Don't autodelete cookies on shutdown: +user_pref("privacy.clearOnShutdown.cookies", false); + +// Enable custom userChrome.js: +user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); + +// This could otherwise cause some issues on bank logins and other annoying sites: +user_pref("network.http.referer.XOriginPolicy", 0); + +// Disable Firefox sync and its menu entries +user_pref("identity.fxaccounts.enabled", false); + +// Fix the issue where right mouse button instantly clicks +user_pref("ui.context_menus.after_mouseup", true); diff --git a/.config/lf/icons b/.config/lf/icons index ac8f641..aad068c 100644 --- a/.config/lf/icons +++ b/.config/lf/icons @@ -9,6 +9,7 @@ ex π― *.mom β *.me β *.ms β +*.avif πΌ *.png πΌ *.webp πΌ *.ico πΌ diff --git a/.config/lf/lfrc b/.config/lf/lfrc index 0d53456..c0c4766 100644 --- a/.config/lf/lfrc +++ b/.config/lf/lfrc @@ -31,7 +31,7 @@ cmd open ${{ case $(file --mime-type "$(readlink -f $f)" -b) in application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) localc $fx ;; image/vnd.djvu|application/pdf|application/octet-stream|application/postscript) setsid -f zathura $fx >/dev/null 2>&1 ;; - text/*|application/json|inode/x-empty) $EDITOR $fx;; + text/*|application/json|inode/x-empty|application/x-subrip) $EDITOR $fx;; image/x-xcf) setsid -f gimp $f >/dev/null 2>&1 ;; image/svg+xml) display -- $f ;; image/*) rotdir $f | grep -i "\.\(png\|jpg\|jpeg\|gif\|webp\|tif\|ico\)\(_large\)*$" | @@ -41,9 +41,9 @@ cmd open ${{ lf -remote "send toggle" done & ;; - audio/*) mpv --audio-display=no $f ;; + audio/*|video/x-ms-asf) mpv --audio-display=no $f ;; video/*) setsid -f mpv $f -quiet >/dev/null 2>&1 ;; - application/pdf|application/vnd*|application/epub*) setsid -f zathura $fx >/dev/null 2>&1 ;; + application/pdf|application/vnd.djvu|application/epub*) setsid -f zathura $fx >/dev/null 2>&1 ;; application/pgp-encrypted) $EDITOR $fx ;; application/vnd.openxmlformats-officedocument.wordprocessingml.document|application/vnd.oasis.opendocument.text) setsid -f lowriter $fx >/dev/null 2>&1 ;; application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|application/octet-stream|application/vnd.oasis.opendocument.spreadsheet|application/vnd.oasis.opendocument.spreadsheet-template) setsid -f localc $fx >/dev/null 2>&1 ;; @@ -115,8 +115,8 @@ map <c-s> set hidden! map <enter> shell map x $$f map X !$f -map o &mimeopen $f -map O $mimeopen --ask $f +map o &mimeopen "$f" +map O $mimeopen --ask "$f" map A rename # at the very end map c push A<c-u> # new rename diff --git a/.config/lf/scope b/.config/lf/scope index f91fd84..1d83527 100755 --- a/.config/lf/scope +++ b/.config/lf/scope @@ -26,7 +26,6 @@ case "$(file --dereference --brief --mime-type -- "$1")" in text/html) lynx -width="$4" -display_charset=utf-8 -dump "$1" ;; text/troff) man ./ "$1" | col -b ;; text/* | */xml | application/json) bat --terminal-width "$(($4-2))" -f "$1" ;; - application/zip) atool --list -- "$1" ;; audio/* | application/octet-stream) mediainfo "$1" || exit 1 ;; video/* ) CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" @@ -43,6 +42,7 @@ case "$(file --dereference --brief --mime-type -- "$1")" in [ ! -f "$CACHE.jpg" ] && gnome-epub-thumbnailer "$1" "$CACHE.jpg" image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;; + application/*zip) atool --list -- "$1" ;; *opendocument*) odt2txt "$1" ;; application/pgp-encrypted) gpg -d -- "$1" ;; esac diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim index d8aaf5e..5c397f0 100644 --- a/.config/nvim/init.vim +++ b/.config/nvim/init.vim @@ -117,7 +117,6 @@ set noshowcmd autocmd BufWritePre * let currPos = getpos(".") autocmd BufWritePre * %s/\s\+$//e autocmd BufWritePre * %s/\n\+\%$//e - autocmd BufWritePre *.[ch] %s/\%$/\r/e autocmd BufWritePre * cal cursor(currPos[1], currPos[2]) " When shortcut files are updated, renew bash and ranger configs with new material: diff --git a/.config/shell/profile b/.config/shell/profile index 1b84213..7c7a613 100644 --- a/.config/shell/profile +++ b/.config/shell/profile @@ -13,35 +13,33 @@ unsetopt PROMPT_SP # Default programs: export EDITOR="nvim" export TERMINAL="st" +export TERMINAL_PROG="st" export BROWSER="librewolf" # ~/ Clean-up: export XDG_CONFIG_HOME="$HOME/.config" export XDG_DATA_HOME="$HOME/.local/share" export XDG_CACHE_HOME="$HOME/.cache" -export XINITRC="${XDG_CONFIG_HOME:-$HOME/.config}/x11/xinitrc" +export XINITRC="$XDG_CONFIG_HOME/x11/xinitrc" #export XAUTHORITY="$XDG_RUNTIME_DIR/Xauthority" # This line will break some DMs. -export NOTMUCH_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/notmuch-config" -export GTK2_RC_FILES="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-2.0/gtkrc-2.0" -export LESSHISTFILE="-" -export WGETRC="${XDG_CONFIG_HOME:-$HOME/.config}/wget/wgetrc" -export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/shell/inputrc" -export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh" -#export ALSA_CONFIG_PATH="$XDG_CONFIG_HOME/alsa/asoundrc" -#export GNUPGHOME="${XDG_DATA_HOME:-$HOME/.local/share}/gnupg" -export WINEPREFIX="${XDG_DATA_HOME:-$HOME/.local/share}/wineprefixes/default" -export KODI_DATA="${XDG_DATA_HOME:-$HOME/.local/share}/kodi" -export PASSWORD_STORE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/password-store" +export NOTMUCH_CONFIG="$XDG_CONFIG_HOME/notmuch-config" +export GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc-2.0" +export WGETRC="$XDG_CONFIG_HOME/wget/wgetrc" +export INPUTRC="$XDG_CONFIG_HOME/shell/inputrc" +export ZDOTDIR="$XDG_CONFIG_HOME/zsh" +#export GNUPGHOME="$XDG_DATA_HOME/gnupg" +export WINEPREFIX="$XDG_DATA_HOME/wineprefixes/default" +export KODI_DATA="$XDG_DATA_HOME/kodi" +export PASSWORD_STORE_DIR="$XDG_DATA_HOME/password-store" export TMUX_TMPDIR="$XDG_RUNTIME_DIR" -export ANDROID_SDK_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/android" -export CARGO_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/cargo" -export GOPATH="${XDG_DATA_HOME:-$HOME/.local/share}/go" -export ANSIBLE_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/ansible/ansible.cfg" -export UNISON="${XDG_DATA_HOME:-$HOME/.local/share}/unison" -export HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/history" -export WEECHAT_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/weechat" -export MBSYNCRC="${XDG_CONFIG_HOME:-$HOME/.config}/mbsync/config" -export ELECTRUMDIR="${XDG_DATA_HOME:-$HOME/.local/share}/electrum" +export ANDROID_SDK_HOME="$XDG_CONFIG_HOME/android" +export CARGO_HOME="$XDG_DATA_HOME/cargo" +export GOPATH="$XDG_DATA_HOME/go" +export ANSIBLE_CONFIG="$XDG_CONFIG_HOME/ansible/ansible.cfg" +export UNISON="$XDG_DATA_HOME/unison" +export HISTFILE="$XDG_DATA_HOME/history" +export MBSYNCRC="$XDG_CONFIG_HOME/mbsync/config" +export ELECTRUMDIR="$XDG_DATA_HOME/electrum" # Other program settings: export DICS="/usr/share/stardict/dic/" @@ -56,10 +54,10 @@ export LESS_TERMCAP_se="$(printf '%b' '[0m')" export LESS_TERMCAP_us="$(printf '%b' '[1;32m')" export LESS_TERMCAP_ue="$(printf '%b' '[0m')" export LESSOPEN="| /usr/bin/highlight -O ansi %s 2>/dev/null" -export QT_QPA_PLATFORMTHEME="gtk2" # Have QT use gtk2 theme. -export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads. -export AWT_TOOLKIT="MToolkit wmname LG3D" #May have to install wmname -export _JAVA_AWT_WM_NONREPARENTING=1 # Fix for Java applications in dwm +export QT_QPA_PLATFORMTHEME="gtk2" # Have QT use gtk2 theme. +export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads. +export AWT_TOOLKIT="MToolkit wmname LG3D" # May have to install wmname +export _JAVA_AWT_WM_NONREPARENTING=1 # Fix for Java applications in dwm [ ! -f ${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc ] && setsid shortcuts >/dev/null 2>&1 diff --git a/.config/sxiv/exec/key-handler b/.config/sxiv/exec/key-handler index 4a4f10a..4c78f18 100755 --- a/.config/sxiv/exec/key-handler +++ b/.config/sxiv/exec/key-handler @@ -28,6 +28,6 @@ do "d") [ "$(printf "No\\nYes" | dmenu -i -p "Really delete $file?")" = "Yes" ] && rm "$file" && notify-send "$file deleted." ;; "g") ifinstalled gimp && setsid -f gimp "$file" ;; - "i") notify-send "File information" "$(mediainfo "$file")" ;; + "i") notify-send "File information" "$(mediainfo "$file" | sed "s/[ ]\+:/:/g;s/: /: <b>/;s/$/<\/b>/" | grep "<b>")" ;; esac done diff --git a/.config/wal/templates/zathurarc b/.config/wal/templates/zathurarc index a12bbd3..8f0b16f 100644 --- a/.config/wal/templates/zathurarc +++ b/.config/wal/templates/zathurarc @@ -12,6 +12,7 @@ map K zoom in map J zoom out map i recolor map p print +map g goto top set default-bg "{background}" set default-fg "{foreground}" diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 7e96734..c46f51d 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -54,7 +54,7 @@ preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt. # Use lf to switch directories and bind it to ctrl-o lfcd () { tmp="$(mktemp -uq)" - trap 'rm -f $tmp >/dev/null 2>&1' HUP INT QUIT TERM PWR EXIT + trap 'rm -f $tmp >/dev/null 2>&1 && trap - HUP INT QUIT TERM PWR EXIT' HUP INT QUIT TERM PWR EXIT lf -last-dir-path="$tmp" "$@" if [ -f "$tmp" ]; then dir="$(cat "$tmp")" diff --git a/.local/bin/arkenfox-auto-update b/.local/bin/arkenfox-auto-update new file mode 100755 index 0000000..05f4ca7 --- /dev/null +++ b/.local/bin/arkenfox-auto-update @@ -0,0 +1,20 @@ +#!/bin/sh + +# A wrapper for the arkenfox-updater that runs it on all pre-existing Arkenfox +# user.js files on the machine. + +# On installation of LARBS, this file is copied to /usr/local/lib/ where it is +# run by a pacman hook set up. The user should not have to run this manually. + +# Search for all Firefox and Librewolf profiles using Arkenfox. +profiles="$(grep -sH "arkenfox user.js" \ + /home/*/.librewolf/*.default-release/user.js \ + /home/*/.mozilla/firefox/*.default-release/user.js)" + +IFS=' +' + +# Update each found profile. +for profile in $profiles; do + arkenfox-updater -p "${profile%%/user.js*}" -s +done diff --git a/.local/bin/compiler b/.local/bin/compiler index 6e28cd0..8420e25 100755 --- a/.local/bin/compiler +++ b/.local/bin/compiler @@ -39,9 +39,9 @@ case "$ext" in 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 + lowdown --parse-no-intraemph "$file" -Tms | groff -mpdfmark -ms -kept -T pdf > "$base".pdf elif [ -x "$(command -v groffdown)" ]; then - groffdown -i "$file" | groff > "$base.pdf" + groffdown -i "$file" | groff -T pdf > "$base".pdf else pandoc -t ms --highlight-style=kate -s -o "$base".pdf "$file" fi ; ;; @@ -51,7 +51,7 @@ case "$ext" in py) python "$file" ;; [rR]md) Rscript -e "rmarkdown::render('$file', quiet=TRUE)" ;; rs) cargo build ;; - sass) sassc -a "$file" "$base.css" ;; + sass) sassc -a "$file" "$base".css ;; scad) openscad -o "$base".stl "$file" ;; sent) setsid -f sent "$file" 2>/dev/null ;; tex) textype "$file" ;; diff --git a/.local/bin/dmenumount b/.local/bin/dmenumount index abeb0ce..8cf4a6b 100755 --- a/.local/bin/dmenumount +++ b/.local/bin/dmenumount @@ -27,18 +27,18 @@ mountusb() { \ "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." + esac && notify-send "π» USB mounting" "$chosen mounted to $mp." || + notify-send "π» Drive failed to mount." "Probably a permissions issue or drive is already mounted." } 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." + simple-mtpfs --device "$chosen" "$mp" && + notify-send "π€ Android Mounting" "Android device mounted to $mp." || + notify-send "π€ Android failed mounting." "Probably a permissions issue or phone is already mounted." } asktype() { \ diff --git a/.local/bin/dmenurecord b/.local/bin/dmenurecord index b83a7c5..990b7b3 100755 --- a/.local/bin/dmenurecord +++ b/.local/bin/dmenurecord @@ -9,6 +9,8 @@ # # If there is already a running instance, user will be prompted to end it. +getdim() { xrandr | sed -n "s/\s*\([0-9]\+x[0-9]\+\).*\*.*/\1/p" ;} + updateicon() { \ echo "$1" > /tmp/recordingicon pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" @@ -16,26 +18,23 @@ updateicon() { \ killrecording() { recpid="$(cat /tmp/recordingpid)" - # kill with SIGTERM, allowing finishing touches. kill -15 "$recpid" rm -f /tmp/recordingpid updateicon "" pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" - # even after SIGTERM, ffmpeg may still run, so SIGKILL it. - sleep 3 - kill -9 "$recpid" - exit } screencast() { \ ffmpeg -y \ -f x11grab \ - -framerate 60 \ - -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \ + -framerate 30 \ + -s "$(getdim)" \ -i "$DISPLAY" \ - -f alsa -i default \ - -r 30 \ - -c:v h264 -crf 0 -preset ultrafast -c:a aac \ + -r 24 \ + -use_wallclock_as_timestamps 1 \ + -f alsa -thread_queue_size 1024 -i default \ + -c:v h264 \ + -crf 0 -preset ultrafast -c:a aac \ "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" & echo $! > /tmp/recordingpid updateicon "βΊοΈποΈ" @@ -43,7 +42,8 @@ screencast() { \ video() { ffmpeg \ -f x11grab \ - -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \ + -framerate 30 \ + -s "$(getdim)" \ -i "$DISPLAY" \ -c:v libx264 -qp 0 -r 30 \ "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" & @@ -104,7 +104,7 @@ videoselected() ffmpeg \ -f x11grab \ - -framerate 60 \ + -framerate 30 \ -video_size "$W"x"$H" \ -i :0.0+"$X,$Y" \ -c:v libx264 -qp 0 -r 30 \ diff --git a/.local/bin/dmenuumount b/.local/bin/dmenuumount index 946d12c..656d1f1 100755 --- a/.local/bin/dmenuumount +++ b/.local/bin/dmenuumount @@ -4,41 +4,18 @@ # 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." - } +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}'; awk '/simple-mtpfs/ { print "π±", $2; }' /etc/mtab)" -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." - } +chosen="$(echo "$drives" | dmenu -i -p "Unmount which drive?")" || exit 1 -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 +case "$chosen" in + π±*) + chosen="${chosen#π± }" + sudo -A umount -l "$chosen" + ;; + *) + chosen="${chosen% (*}" + sudo -A umount -l "$chosen" + ;; +esac && notify-send "π₯οΈ Drive unmounted." "$chosen successfully unmounted." || + notify-send "π₯οΈ Drive failed to unmount." "Possibly a permissions or I/O issue." diff --git a/.local/bin/getbib b/.local/bin/getbib index bedc256..121dd6e 100755 --- a/.local/bin/getbib +++ b/.local/bin/getbib @@ -4,7 +4,7 @@ if [ -f "$1" ]; then # Try to get DOI from pdfinfo or pdftotext output. doi=$(pdfinfo "$1" | grep -io "doi:.*") || - doi=$(pdftotext "$1" 2>/dev/null - | grep -io "doi:\s*\S\+[[:alnum:]]" -m 1) || + doi=$(pdftotext "$1" 2>/dev/null - | sed -n '/[dD][oO][iI]:/{s/.*[dD][oO][iI]:\s*\(\S\+[[:alnum:]]\).*/\1/p;q}') || exit 1 else doi="$1" diff --git a/.local/bin/linkhandler b/.local/bin/linkhandler index cc971fc..f62b581 100755 --- a/.local/bin/linkhandler +++ b/.local/bin/linkhandler @@ -13,7 +13,7 @@ else fi case "$url" in - *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*|*odysee.com*) + *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtube.com/shorts*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*|*odysee.com*) setsid -f mpv -quiet "$url" >/dev/null 2>&1 ;; *png|*jpg|*jpe|*jpeg|*gif) curl -sL "$url" > "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; diff --git a/.local/bin/mounter b/.local/bin/mounter new file mode 100755 index 0000000..38da0df --- /dev/null +++ b/.local/bin/mounter @@ -0,0 +1,93 @@ +#!/bin/bash + +# Mounts Android Phones and USB drives (encrypted or not). This script will +# replace the older `dmenumount` which had extra steps and couldn't handle +# encrypted drives. +# TODO: Remove already mounted Android phones from prompt. +# TODO: Try mount first for drives if in fstab to avoid directory prompt? +# TODO: Add some support for connecting iPhones (although they are annoying). + +set -e + +# Check for phones. +phones="$(simple-mtpfs -l 2>/dev/null | sed "s/^/π±/")" +# Check for drives. +alldrives="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,fstype")" +# Get all LUKS drives +allluks="$(echo "$alldrives" | grep crypto_LUKS)" || true +# Get a list of the LUKS drive UUIDs already decrypted. +decrypted="$(find /dev/disk/by-id/dm-uuid-CRYPT-LUKS2-* | sed "s|.*LUKS2-||;s|-.*||")" +# Functioning for formatting drives correctly for dmenu: +filter() { sed "s/ /:/g" | awk -F':' '$7==""{printf "%s%s (%s) %s\n",$1,$3,$5,$6}' ; } + +# Get only LUKS drives that are not decrypted. +IFS=' +' +unopenedluks="$(for drive in $allluks; do + uuid="${drive%% *}" + uuid="${uuid//-}" # This is a bashism. + for open in $decrypted; do + [ "$uuid" = "$open" ] && break 1 + done && continue 1 + echo "π $drive" +done | filter)" + +# Get all normal, non-encrypted or decrypted partitions that are not mounted. +normalparts="$(echo "$alldrives"| grep -v crypto_LUKS | grep 'part\|rom\|crypt' | sed "s/^/πΎ /" | filter )" + +# Add all to one variable. If no mountable drives found, exit. +alldrives="$(echo "$phones +$unopenedluks +$normalparts" | sed "/^$/d;s/ *$//")" +test -n "$alldrives" + +# Feed all found drives to dmenu and get user choice. +chosen="$(echo "$alldrives" | dmenu -p "Mount which drive?" -i)" + +# Function for prompting user for a mountpoint. +getmount(){ + mp="$(find /mnt /media /mount /home -maxdepth 1 -type d 2>/dev/null | dmenu -i -p "Mount this drive where?")" + test -n "$mp" + if [ ! -d "$mp" ]; then + mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") + [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp") + fi +} + +case "$chosen" in + πΎ*) + chosen="${chosen%% *}" + chosen="${chosen:1}" # This is a bashism. + getmount + sudo mount "$chosen" "$mp" + notify-send "πΎDrive Mounted." "$chosen mounted to $mp." + ;; + + π*) + chosen="${chosen%% *}" + chosen="${chosen:1}" # This is a bashism. + # Number the drive. + while true; do + [ -f "/dev/mapper/usb$num" ] || break + num="$(printf "%02d" "$((num +1))")" + done + + # Decrypt in a terminal window + ${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$chosen" "usb$num" + # Check if now decrypted. + test -b "/dev/mapper/usb$num" + + getmount + sudo mount "/dev/mapper/usb$num" "$mp" + notify-send "πDecrypted drive Mounted." "$chosen decrypted and mounted to $mp." + ;; + + π±*) + getmount + echo "OK" | dmenu -i -p "Tap Allow on your phone if it asks for permission and then press enter" + chosen="${chosen%%:*}" + chosen="${chosen:1}" # This is a bashism. + simple-mtpfs --device "$chosen" "$mp" + notify-send "π€ Android Mounted." "Android device mounted to $mp." + ;; +esac diff --git a/.local/bin/sd b/.local/bin/sd index 7e09bf6..a0ff84c 100755 --- a/.local/bin/sd +++ b/.local/bin/sd @@ -2,10 +2,21 @@ # Open a terminal window in the same directory as the currently active window. -PID=$(xprop -id "$(xprop -root | xprop -root | sed -n "/_NET_ACTIVE_WINDOW/ s/^.*# // p")" | sed -n "/PID/ s/^.*= // p") -PID="$(pstree -lpA "$PID")" -PID="${PID##*"${SHELL##*/}"(}" -PID="${PID#*lf(}" -PID="${PID%%)*}" -cd "$(readlink /proc/"$PID"/cwd)" || return 1 +windowPID=$(xprop -id "$(xprop -root | sed -n "/_NET_ACTIVE_WINDOW/ s/^.*# // p")" | sed -n "/PID/ s/^.*= // p") +PIDlist=$(pstree -lpATna "$windowPID" | sed -En 's/.*,([0-9]+).*/\1/p' | tac) +for PID in $PIDlist; do + cmdline=$(ps -o args= -p "$PID") + process_group_leader=$(ps -o comm= -p "$(ps -o pgid= -p "$PID" | tr -d ' ')") + cwd=$(readlink /proc/"$PID"/cwd) + # zsh and lf won't be ignored even if it shows ~ or / + case "$cmdline" in + 'lf -server') continue ;; + "${SHELL##*/}"|'lf'|'lf '*) break ;; + esac + # git (and its sub-processes) will show the root of a repository instead of the actual cwd, so they're ignored + [ "$process_group_leader" = 'git' ] || [ ! -d "$cwd" ] && continue + # This is to ignore programs that show ~ or / instead of the actual working directory + [ "$cwd" != "$HOME" ] && [ "$cwd" != '/' ] && break +done +[ "$PWD" != "$cwd" ] && [ -d "$cwd" ] && { cd "$cwd" || exit 1; } "$TERMINAL" diff --git a/.local/bin/statusbar/sb-doppler b/.local/bin/statusbar/sb-doppler index 7573c98..f58b744 100755 --- a/.local/bin/statusbar/sb-doppler +++ b/.local/bin/statusbar/sb-doppler @@ -184,7 +184,7 @@ US: KVNX: Norman, OK US: KVBX: Vandenberg Afb: Orcutt, CA EU: Europe EU: GB: Great Brittain -EU: SCAN: Scandinavia +EU: SCAN: Scandinavia. Norway, Sweden And Denmark EU: ALPS: The Alps EU: NL: The Netherlands EU: DE: Germany diff --git a/.local/bin/statusbar/sb-kbselect b/.local/bin/statusbar/sb-kbselect index f0c923f..ab2140c 100755 --- a/.local/bin/statusbar/sb-kbselect +++ b/.local/bin/statusbar/sb-kbselect @@ -5,6 +5,7 @@ kb="$(setxkbmap -query | grep -oP 'layout:\s*\K\w+')" || exit 1 case $BLOCK_BUTTON in 1) kb_choice="$(awk '/! layout/{flag=1; next} /! variant/{flag=0} flag {print $2, "- " $1}' /usr/share/X11/xkb/rules/base.lst | dmenu -l 15)" + [ -z "$kb_choice" ] && exit 0 kb="$(echo "$kb_choice" | awk '{print $3}')" setxkbmap "$kb" pkill -RTMIN+30 "${STATUSBAR:-dwmblocks}";; diff --git a/.local/bin/statusbar/sb-music b/.local/bin/statusbar/sb-music index 7ea7032..d164b4b 100755 --- a/.local/bin/statusbar/sb-music +++ b/.local/bin/statusbar/sb-music @@ -1,6 +1,6 @@ #!/bin/sh -filter() { mpc | sed "/^volume:/d;s/\\&/&/g;s/\\[paused\\].*/βΈ/g;/\\[playing\\].*/d;/^ERROR/Q" | paste -sd ' ' -;} +filter() { sed "/^volume:/d;s/\\&/&/g;s/\\[paused\\].*/βΈ/g;/\\[playing\\].*/d;/^ERROR/Q" | paste -sd ' ' -;} pidof -x sb-mpdup >/dev/null 2>&1 || sb-mpdup >/dev/null 2>&1 & diff --git a/.local/bin/statusbar/sb-volume b/.local/bin/statusbar/sb-volume index d17ce66..acdf7a9 100755 --- a/.local/bin/statusbar/sb-volume +++ b/.local/bin/statusbar/sb-volume @@ -4,9 +4,9 @@ case $BLOCK_BUTTON in 1) setsid -f "$TERMINAL" -e pulsemixer ;; - 2) pamixer -t ;; - 4) pamixer --allow-boost -i 1 ;; - 5) pamixer --allow-boost -d 1 ;; + 2) wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle ;; + 4) wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%+ ;; + 5) wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%- ;; 3) notify-send "π’ Volume module" "\- Shows volume π, π if muted. - Middle click to mute. - Scroll to change." ;; @@ -19,14 +19,15 @@ vol="$(wpctl get-volume @DEFAULT_AUDIO_SINK@)" [ "$vol" != "${vol%\[MUTED\]}" ] && echo π && exit vol="${vol#Volume: }" + split() { # For ommiting the . without calling and external program. IFS=$2 set -- $1 printf '%s' "$@" } -vol="$(split "$vol" ".")" -vol="${vol##0}" + +vol="$(printf "%.0f" "$(split "$vol" ".")")" case 1 in $((vol >= 70)) ) icon="π" ;; diff --git a/.local/bin/unmounter b/.local/bin/unmounter new file mode 100755 index 0000000..7f1dbf5 --- /dev/null +++ b/.local/bin/unmounter @@ -0,0 +1,28 @@ +#!/bin/sh + +# Unmount USB drives or Android phones. Replaces the older `dmenuumount`. Fewer +# prompt and also de-decrypts LUKS drives that are unmounted. + +set -e + +mounteddroids="$(grep simple-mtpfs /etc/mtab | awk '{print "π±" $2}')" +lsblkoutput="$(lsblk -nrpo "name,type,size,mountpoint")" +mounteddrives="$(echo "$lsblkoutput" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "πΎ%s (%s)\n",$4,$3}')" + +allunmountable="$(echo "$mounteddroids +$mounteddrives" | sed "/^$/d;s/ *$//")" +test -n "$allunmountable" + +chosen="$(echo "$allunmountable" | dmenu -i -p "Unmount which drive?")" +chosen="${chosen%% *}" +test -n "$chosen" + +sudo -A umount -l "/${chosen#*/}" +notify-send "Device unmounted." "$chosen has been unmounted." + +# Close the chosen drive if decrypted. +cryptid="$(echo "$lsblkoutput" | grep "/${chosen#*/}$")" +cryptid="${cryptid%% *}" +test -b /dev/mapper/"${cryptid##*/}" +sudo -A cryptsetup close "$cryptid" +notify-send "πDevice dencryption closed." "Drive is now securely locked again." @@ -42,7 +42,7 @@ curl -LO larbs.xyz/larbs.sh ``` or clone the repo files directly to your home directory and install the -[dependencies](https://github.com/LukeSmithxyz/LARBS/blob/master/progs.csv). +[dependencies](https://github.com/LukeSmithxyz/LARBS/blob/master/static/progs.csv). ## Default Desktop Artwork |
