From 0d54946f38851753089324344e22e7cdad0ff030 Mon Sep 17 00:00:00 2001 From: Immanuel Date: Sun, 5 Jul 2020 18:31:11 -0400 Subject: [PATCH] :q --- backup | 68 ++++++++++ bar.sh | 63 +++++++++ ewrap | 10 ++ lsix | 349 ++++++++++++++++++++++++++++++++++++++++++++++++++ screenshot.sh | 7 + 5 files changed, 497 insertions(+) create mode 100755 backup create mode 100755 bar.sh create mode 100755 ewrap create mode 100755 lsix create mode 100755 screenshot.sh diff --git a/backup b/backup new file mode 100755 index 0000000..fbe9b2e --- /dev/null +++ b/backup @@ -0,0 +1,68 @@ +#!/bin/sh + +configs='cmus +ckb-next +compton +mpv +openbox +nnn +liferea +lutris +ranger +tmux +xkb +.bashrc +.profile +xfiles' + +paths="$HOME/Documents $HOME/Notes $HOME/Pictures $HOME/Projects $HOME/Source" + +BU="$HOME/Backups" + +conf() { + configs=$(echo $configs | tr '\n' ' ') + for dir in $configs + do + rsync -av --progress --exclude '*.git/' $HOME/.config/$dir $BU/config/ + done +} + +mac() { + macros="$HOME/Macros/*" + rsync -av --progress --exclude '*.git/ *.swp$ *.swo$' $macros $BU/macros +} + +global_vim() { + rcs=/etc/vim/* + packs=/usr/share/vim??/* + macros=$HOME/Macros/* + for dir in $macros + do + echo $dir + rsync -av --progress --exclude '*.git/' $HOME/.config/$dir $BU/config/global_vim/ + done +} + +notes() { + rcs=/etc/vim/* + packs=/usr/share/vim??/* + macros=$HOME/Macros/* + for dir in $macros + do + echo $dir + rsync -av --progress --exclude '*.git/' $HOME/.config/$dir $BU/config/global_vim/ + done +} + +archive() { + destination=$BU/archives/$(date +%F)-$(openssl rand -base64 6) + tar -g $BU/archives/tar.info -cvf $destination $paths +} + +case "$1" in + configs) conf;; + macros) mac;; + globalvim) global_vim;; + notes) notes;; + archive) archive;; +esac diff --git a/bar.sh b/bar.sh new file mode 100755 index 0000000..6d0e22f --- /dev/null +++ b/bar.sh @@ -0,0 +1,63 @@ +#!/bin/sh + +font=; + +clock() { + date '+%H:%M %d-%m-%y' +} + +# get the battery capacity and status +battery() { + BATC=/sys/class/power_supply/BAT0/capacity + BATS=/sys/class/power_supply/BAT0/status + + # prepend percentage with a '+' if charging, '-' otherwise + test "`cat $BATS`" = "Charging" && echo -n '+' || echo -n '-' + echo $BATC +} + +volume() { + # get master volume level from amixer + + # parse amixer output to get ONLY the level. Will output "84%" + # we need `uniq` because on some hardware, The master is listed twice in + # "Front Left" and Front Right" (because laptop speakers I guess) + amixer get Master | sed -n 's/^.*\[\([0-9]\+\)%.*$/\1/p'| uniq +} + +network() { + infs=$(ip link | sed -n 's/^[0-9]: \(.*\):.*$/\1/p') + lo=$(echo $infs | awk '{print $1}') + int1=$(echo $infs | awk '{print $2}') + int2=$(echo $infs | awk '{print $3}') + + #iwconfig returns an error code if the interface tested has no wireless extensions + if iwconfig $int1 >/dev/null 2>&1; then + wifi=$int1 + eth0=$int2 + else + wifi=$int2 + eth0=$int1 + fi + + ip link show $eth0 | grep 'state UP' >/dev/null && int=$eth0 || int=$wifi + printf $int + ping -c1 -s1 8.8.8.8 >/dev/null 2>&1 && echo "connected" || echo "disconnected" + +} + +# get cpu load (TODO- get this using iostat) + + +# get ram usage +memused() { + # store the total and free memory in two variables + t=$(grep -E 'MemTotal' /proc/meminfo |awk '{print $2}') + f=$(grep -E 'MemFree' /proc/meminfo |awk '{print $2}') + b=$(grep -E '^(Buffers)' /proc/meminfo |awk '{print $2}') + c=$(grep -E '^(Cached)' /proc/meminfo |awk '{print $2}') + + # then, calcultate the percentage of memory used + bc | "100($t -$f -$c -$b) / $t" +} + diff --git a/ewrap b/ewrap new file mode 100755 index 0000000..ffacc0b --- /dev/null +++ b/ewrap @@ -0,0 +1,10 @@ +#!/bin/sh + +if ! { [ "$TERM" = "tmux-256color" ] && [ -n "$TMUX" ]; } then +# Remove option --tab for new window + st -e vim "$*" +else + # tmux session running + tmux split-window -h "vim \"$*\"" +fi + diff --git a/lsix b/lsix new file mode 100755 index 0000000..fe83fd1 --- /dev/null +++ b/lsix @@ -0,0 +1,349 @@ +#!/usr/bin/env bash + +# lsix: like ls, but for images. +# Shows thumbnails of images with titles directly in terminal. + +# Requirements: just ImageMagick (and a Sixel terminal, of course) + +# Version 1.7.1 +# B9 April 2020 + +# See end of file for USAGE. + + +# The following defaults may be overridden if autodetection succeeds. +numcolors=16 # Default number of colors in the palette. +background=white # Default montage background. +foreground=black # Default text color. +width=800 # Default width of screen in pixels. + +# Feel free to edit these defaults to your liking. +tilesize=120 # Width and height of each tile in the montage. +tilewidth=$tilesize # (or specify separately, if you prefer) +tileheight=$tilesize + +# If you get questionmarks for Unicode filenames, try using a different font. +# You can list fonts available using `convert -list font`. +#fontfamily=Droid-Sans-Fallback # Great Asian font coverage +#fontfamily=Dejavu-Sans # Wide coverage, comes with GNU/Linux +#fontfamily=Mincho # Wide coverage, comes with MS Windows + +# Default font size is based on width of each tile in montage. +fontsize=$((tilewidth/10)) +#fontsize=16 # (or set the point size directly, if you prefer) + +timeout=0.25 # How long to wait for terminal to respond + # to a control sequence (in seconds). + +# Sanity checks and compatibility +if [[ ${BASH_VERSINFO[0]} -eq 3 ]]; then + if bash --version | head -1 | grep -q "version 3"; then + cat <<-EOF >&2 + Error: The version of Bash is extremely out of date. + (2007, the same year Steve Jobs announced the iPhone!) + + This is almost always due to Apple's MacOS being silly. + Please let Apple know that their users expect current UNIX tools. + + In the meantime, try using "brew install bash". + EOF + exit 1 + else + exec bash "$0" "$@" || echo "Exec failed" >&2 + exit 1 + fi +fi + +if ! command -v montage >/dev/null; then + echo "Please install ImageMagick" >&2 + exit 1 +fi + +if command -v gsed >/dev/null; then + alias sed=gsed # Use GNU sed for MacOS & BSD +fi + +cleanup() { + echo -n $'\e\\' # Escape sequence to stop SIXEL. + stty echo # Reset terminal to show characters. + exit 0 +} +trap cleanup SIGINT SIGHUP SIGABRT EXIT + +autodetect() { + # Various terminal automatic configuration routines. + + # Don't show escape sequences the terminal doesn't understand. + stty -echo # Hush-a Mandara Ni Pari + + # IS TERMINAL SIXEL CAPABLE? # Send Device Attributes + IFS=";" read -a REPLY -s -t 1 -d "c" -p $'\e[c' >&2 + for code in "${REPLY[@]}"; do + if [[ $code == "4" ]]; then + hassixel=yup + break + fi + done + + # YAFT is vt102 compatible, cannot respond to vt220 escape sequence. + if [[ "$TERM" == yaft* ]]; then hassixel=yeah; fi + + if [[ -z "$hassixel" ]]; then + cat <<-EOF >&2 + Error: Your terminal does not report having sixel graphics support. + + Please use a sixel capable terminal, such as xterm -ti vt340, or + ask your terminal manufacturer to add sixel support. + + You may test your terminal by viewing a single image, like so: + + convert foo.jpg -geometry 800x480 sixel:- + + If your terminal actually does support sixel, please file a bug + report at http://github.com/hackerb9/lsix/issues + EOF + read -s -t 1 -d "c" -p $'\e[c' >&2 + if [[ "$REPLY" ]]; then + echo + cat -v <<< "(Please mention device attribute codes: ${REPLY}c)" + fi + + exit 1 + fi + + # ENABLE SIXEL SCROLLING so image will appear right after cursor. + if [[ $TERM != "mlterm" ]]; then + echo -ne $'\e[?80h' + else + # Except... mlterm (as of 3.5.0) has a bug that reverses the sense + echo -ne $'\e[?80l' + fi + + # TERMINAL COLOR AUTODETECTION. + # Find out how many color registers the terminal has + IFS=";" read -a REPLY -s -t ${timeout} -d "S" -p $'\e[?1;1;0S' >&2 + [[ ${REPLY[1]} == "0" ]] && numcolors=${REPLY[2]} + + # Bug workaround: mlterm does not report number of colors. + if [[ $TERM =~ mlterm ]]; then numcolors=1024; fi + # YAFT is vt102 compatible, cannot respond to vt220 escape sequence. + if [[ "$TERM" == yaft* ]]; then numcolors=256; fi + + # Increase colors, if needed + if [[ $numcolors -lt 256 ]]; then + # Attempt to set the number of colors to 256. + # This will work for xterm, but fail on a real vt340. + IFS=";" read -a REPLY -s -t ${timeout} -d "S" -p $'\e[?1;3;256S' >&2 + [[ ${REPLY[1]} == "0" ]] && numcolors=${REPLY[2]} + fi + + # Query the terminal background and foreground colors. + IFS=";:/" read -a REPLY -r -s -t ${timeout} -d "\\" -p $'\e]11;?\e\\' >&2 + if [[ ${REPLY[1]} =~ ^rgb ]]; then + # Return value format: $'\e]11;rgb:ffff/0000/ffff\e\\'. + # ImageMagick wants colors formatted as #ffff0000ffff. + background='#'${REPLY[2]}${REPLY[3]}${REPLY[4]%%$'\e'*} + IFS=";:/" read -a REPLY -r -s -t ${timeout} -d "\\" -p $'\e]10;?\e\\' >&2 + if [[ ${REPLY[1]} =~ ^rgb ]]; then + foreground='#'${REPLY[2]}${REPLY[3]}${REPLY[4]%%$'\e'*} + # Check for "Reverse Video" (DECSCNM screen mode). + IFS=";?$" read -a REPLY -s -t ${timeout} -d "y" -p $'\e[?5$p' + if [[ ${REPLY[2]} == 1 || ${REPLY[2]} == 3 ]]; then + temp=$foreground + foreground=$background + background=$temp + fi + fi + fi + # YAFT is vt102 compatible, cannot respond to vt220 escape sequence. + if [[ "$TERM" == yaft* ]]; then background=black; foreground=white; fi + + # Send control sequence to query the sixel graphics geometry to + # find out how large of a sixel image can be shown. + IFS=";" read -a REPLY -s -t ${timeout} -d "S" -p $'\e[?2;1;0S' >&2 + if [[ ${REPLY[2]} -gt 0 ]]; then + width=${REPLY[2]} + else + # Nope. Fall back to dtterm WindowOps to approximate sixel geometry. + IFS=";" read -a REPLY -s -t ${timeout} -d "t" -p $'\e[14t' >&2 + if [[ $? == 0 && ${REPLY[2]} -gt 0 ]]; then + width=${REPLY[2]} + fi + fi + + # BUG WORKAROUND: XTerm cannot show images wider than 1000px. + # Remove this hack once XTerm gets fixed. Last checked: XTerm(327) + if [[ $TERM =~ xterm && $width -ge 1000 ]]; then width=1000; fi + + # Space on either side of each tile is less than 0.5% of total screen width + tilexspace=$((width/201)) + tileyspace=$((tilexspace/2)) + # Figure out how many tiles we can fit per row. ("+ 1" is for -shadow). + numtiles=$((width/(tilewidth + 2*tilexspace + 1))) +} + +main() { + # Discover and setup the terminal + autodetect + + if [[ $# == 0 ]]; then + # No command line args? Use a sorted list of image files in CWD. + shopt -s nullglob nocaseglob nocasematch + set -- *{jpg,jpeg,png,gif,tiff,tif,p?m,x[pb]m,bmp,ico,svg,eps} + [[ $# != 0 ]] || exit + readarray -t < <(printf "%s\n" "$@" | sort) + + # Only show first frame of animated GIFs if filename not specified. + for x in ${!MAPFILE[@]}; do + if [[ ${MAPFILE[$x]} =~ gif$ ]]; then + MAPFILE[$x]=":${MAPFILE[$x]}[0]" + fi + done + set -- "${MAPFILE[@]}" + else + # Command line args specified. Check for directories. + lsix=$(realpath "$0") + for arg; do + if [ -d "$arg" ]; then + echo Recursing on $arg + (cd "$arg"; $lsix) + else + nodirs+=($arg) + fi + done + set -- "${nodirs[@]}" + fi + + + # Resize on load: Save memory by appending this suffix to every filename. + resize="[${tilewidth}x${tileheight}]" + + imoptions="-tile ${numtiles}x1" # Each montage is 1 row x $numtiles columns + imoptions+=" -geometry ${tilewidth}x${tileheight}>+${tilexspace}+${tileyspace}" # Size of each tile and spacing + imoptions+=" -background $background -fill $foreground" # Use terminal's colors + imoptions+=" -auto-orient " # Properly rotate JPEGs from cameras + if [[ $numcolors -gt 16 ]]; then + imoptions+=" -shadow " # Just for fun :-) + fi + + # See top of this file to change fontfamily and fontsize. + [[ "$fontfamily" ]] && imoptions+=" -font $fontfamily " + [[ "$fontsize" ]] && imoptions+=" -pointsize $fontsize " + + # Create and display montages one row at a time. + while [ $# -gt 0 ]; do + # While we still have images to process... + onerow=() + goal=$(($# - numtiles)) # How many tiles left after this row + while [ $# -gt 0 -a $# -gt $goal ]; do + len=${#onerow[@]} + onerow[len++]="-label" + onerow[len++]=$(processlabel "$1") + onerow[len++]="$1" + shift + done + montage "${onerow[@]}" $imoptions gif:- \ + | convert - -colors $numcolors sixel:- + done +} + +processlabel() { + # This routine is all about appeasing ImageMagick. + # 1. Remove silly [0] suffix and : prefix. + # 2. Quote percent backslash, and at sign. + # 3. Replace control characters with question marks. + # 4. If a filename is too long, remove extension (.jpg). + # 5. Split long filenames with newlines (recursively) + span=15 # filenames longer than span will be split + echo -n "$1" | + sed 's|^:||; s|\[0]$||;' | tr '[:cntrl:]' '?' | + awk -v span=$span -v ORS="" ' + function halve(s, l,h) { # l and h are locals + l=length(s); h=int(l/2); + if (l <= span) { return s; } + return halve(substr(s, 1, h)) "\n" halve(substr(s, h+1)); + } + { + if ( length($0) > span ) gsub(/\..?.?.?.?$/, ""); + print halve($0); + } + ' | + sed 's|%|%%|g; s|\\|\\\\|g; s|@|\\@|g;' +} + +#### + +main "$@" + +# Send an escape sequence and wait for a response from the terminal +# so that the program won't quit until images have finished transferring. +read -s -t 60 -d "c" -p $'\e[c' >&2 + + +###################################################################### +# NOTES: + +# Usage: lsix [ FILES ... ] + +# * FILES can be any image file that ImageMagick can handle. +# +# * If no FILES are specified the most common file extensions are tried. +# (For now, lsix only searches the current working directory.) +# +# * Non-bitmap graphics often work fine (.svg, .eps, .pdf, .xcf). +# +# * Files containing multiple images (e.g., animated GIFs) will show +# all the images if the filename is specified at the command line. +# Only the first frame will be shown if "lsix" is called with no +# arguments. +# +# * Because this uses escape sequences, it works seamlessly through ssh. +# +# * If your terminal supports reporting the background and foreground +# color, lsix will use those for the montage background and text fill. +# +# * If your terminal supports changing the number of color registers +# to improve the picture quality, lsix will do so. + +# * Only software needed is ImageMagick (e.g., apt-get install imagemagick). + +# Your terminal must support SIXEL graphics. E.g., +# +# xterm -ti vt340 + +# * To make vt340 be the default xterm type, set this in .Xresources: +# +# ! Allow sixel graphics. (Try: "convert -colors 16 foo.jpg sixel:-"). +# xterm*decTerminalID : vt340 + +# * Xterm does not support reporting the screen size in pixels unless +# you add this to your .Xresources: +# +# ! Allow xterm to read the terminal window size (op #14) +# xterm*allowWindowOps : False +# xterm*disallowedWindowOps : 1,2,3,4,5,6,7,8,9,11,13,18,19,20,21,GetSelection,SetSelection,SetWinLines,SetXprop + +# * Be cautious using lsix on videos (lsix *.avi) as ImageMagick will +# try to make a montage of every single frame and likely exhaust +# your memory and/or your patience. + +# BUGS + +# * Sort order is a bit strange. +# * ImageMagick's Montage doesn't handle long filenames nicely. +# * Some transparent images (many .eps files) presume a white background +# and will not show up if your terminal's background is black. +# * This file is getting awfully long for a one line kludge. :-) + +# LICENSE INFORMATION +# (AKA, You know your kludge has gotten out of hand when...) + +# Dual license: +# * You have all the freedoms permitted to you under the +# GNU GPL >=3. (See the included LICENSE file). + +# * Additionally, this program can be used under the terms of whatever +# license 'xterm' is using (now or in the future). This is primarily +# so that, if the xterm maintainer (currently Thomas E. Dickey) so +# wishes, this program may be included with xterm as a Sixel test. +# However, anyone who wishes to take advantage of this is free to do so. diff --git a/screenshot.sh b/screenshot.sh new file mode 100755 index 0000000..8f38de5 --- /dev/null +++ b/screenshot.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +method=$(printf "clipboard\nfile\nboth" | dmenu -l 3) + +if test $method = "file"; then + scrot --note "-f 'LiterationSans Nerd Font Book/11' -x 10 -y 20 -c 255,0,0,255 -t 'Hi'" -s ~/Pictures/screenshots/screenshot-%Y-%m-%d_$wx$h.png +fi