(define-module (cobra homedir) #:use-module (guix gexp) #:export (%home:devspec %home:bashrc %home:prompt %home:bash-profile)) (define %home:devspec (plain-file "devspec" "\ #!/usr/bin/env bash if [[ $HOSTNAME == pp ]]; then PRIV=doas UPDATE=\"$PRIV sh -c 'apk update && apk upgrade -aiv && apk fix'\" COPY_COMMAND=\"wl-copy\" PASTE_COMMAND=\"wl-paste\" WIFI=wlan0 WM=\"bash\" elif [[ $HOSTNAME == Oganesson ]]; then : #export WLR_DRM_DEVICES=/dev/dri/card1:/dev/dri/card0 elif [[ $HOSTNAME == Neon ]]; then export WLR_NO_HARDWARE_CURSORS=1 else PRIV=sudo UPDATE=\"$PRIV sh -c 'apt update && apt upgrade && apt autoremove'\" COPY_COMMAND=\"xclip -i -selection clipboard\" PASTE_COMMAND=\"xclip -o -selection clipboard\" WIFI=wlp2s0 WM=\"bash\" fi")) (define %home:bash-profile (plain-file "bash_profile" "\ # Honor per-interactive-shell startup file if [ -f ~/.bashrc ]; then . ~/.bashrc; fi export PATH=\"~/.local/bin:$PATH\" export LESS_TERMCAP_mb='' export LESS_TERMCAP_md='' export LESS_TERMCAP_me='' export LESS_TERMCAP_se='' export LESS_TERMCAP_so='' export LESS_TERMCAP_ue='' export LESS_TERMCAP_us='' export LESS=-R export PATH=~/.guix-home/profile/bin:$PATH PATH=\"/home/cobra/perl5/bin${PATH:+:${PATH}}\"; export PATH; PERL5LIB=\"/home/cobra/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}\"; export PERL5LIB; PERL_LOCAL_LIB_ROOT=\"/home/cobra/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}\"; export PERL_LOCAL_LIB_ROOT; PERL_MB_OPT=\"--install_base \\\"/home/cobra/perl5\\\"\"; export PERL_MB_OPT; PERL_MM_OPT=\"INSTALL_BASE=/home/cobra/perl5\"; export PERL_MM_OPT; . ~/.devspec . ~/.guix-home/setup-environment if [[ $(tty) == /dev/tty2 ]]; then exec $WM fi")) (define %home:prompt (plain-file "prompt" "\ #!/bin/bash # shebang for syntax highlighting purposes # Colors _NON=\"\\[\\033[0m\\]\" _BLD=\"\\[\\033[1m\\]\" _BLK=\"\\[\\033[30m\\]\" _RED=\"\\[\\033[31m\\]\" _GRN=\"\\[\\033[32m\\]\" _YLW=\"\\[\\033[33m\\]\" _BLU=\"\\[\\033[34m\\]\" _PRP=\"\\[\\033[35m\\]\" _CYN=\"\\[\\033[36m\\]\" _WHT=\"\\[\\033[37m\\]\" __debug_trap() { # Set necessary pre-command variables (PROMPT_COMMAND is a # command so its excluded here) if [[ \"$BASH_COMMAND\" != \"$PROMPT_COMMAND\" && \"$LAST_BASH_COMMAND\" == \"$PROMPT_COMMAND\" ]]; then INC_TIME=1 LAST_RT=\"$EPOCHREALTIME\" # This should be the last thing done in this function fi LAST_BASH_COMMAND=\"$BASH_COMMAND\" } trap '__debug_trap' DEBUG __get_cmd_time() { # Set hours minutes seconds and remove preceding zeros local YEAR local DAYS local HOUR local MINS local SECS ((YEAR=10#$(($(TZ=UTC printf '%(%Y)T' \"$CMD_TIME\")))-1970)) ((DAYS=10#$(TZ=UTC printf '%(%j)T' \"$CMD_TIME\"))) ((HOUR=10#$(TZ=UTC printf '%(%H)T' \"$CMD_TIME\"))) ((MINS=10#$(TZ=UTC printf '%(%M)T' \"$CMD_TIME\"))) ((SECS=10#$(TZ=UTC printf '%(%S)T' \"$CMD_TIME\"))) # Choose whether or not to print hours minutes and seconds [[ $CMD_TIME -ge 31536000 ]] && printf '%sy ' \"${YEAR}\" [[ $CMD_TIME -ge 86400 ]] && printf '%sd ' \"${DAYS}\" [[ $CMD_TIME -ge 3600 ]] && printf '%sh ' \"${HOUR}\" [[ $CMD_TIME -ge 60 ]] && printf '%sm ' \"${MINS}\" [[ $CMD_TIME -ge 1 ]] && printf '%ss ' \"${SECS}\" # If you want to have a limit uncomment the next line and replace somenum with # the minimum microseconds # [[ $CMD_US -ge somenum ]] && printf '%sμs' \"${CMD_US:-0}\" } __sig() { # Giant switch case for getting the name of the signal (`kill -l`) local ITR=0 local RET for RET in \"$@\"; do if [[ $ITR != 0 ]]; then printf '%s|%s' \"$_WHT\" \"$_RED\" fi ((ITR++)) case $RET in 126): \"ACCES\" ;; 127): \"NOENT\" ;; 129): \"HUP\" ;; 130): \"INT\" ;; 131): \"QUIT\" ;; 132): \"ILL\" ;; 133): \"TRAP\" ;; 134): \"ABRT\" ;; 135): \"BUS\" ;; 136): \"FPE\" ;; 137): \"KILL\" ;; 138): \"USR\"1 ;; 139): \"SEGV\" ;; 140): \"USR\"2 ;; 141): \"PIPE\" ;; 142): \"ALRM\" ;; 143): \"TERM\" ;; 144): \"STKFLT\" ;; 145): \"CHLD\" ;; 146): \"CONT\" ;; 147): \"STOP\" ;; 148): \"TSTP\" ;; 149): \"TTIN\" ;; 150): \"TTOU\" ;; 151): \"URG\" ;; 152): \"XCPU\" ;; 153): \"XFSZ\" ;; 154): \"VTALRM\" ;; 155): \"PROF\" ;; 156): \"WINCH\" ;; 157): \"IO\" ;; 158): \"PWR\" ;; 159): \"SYS\" ;; 16[3-9]|1[7-8][0-9]|19[0-2]): \"RT$((RET-128))\" ;; # Savagery *): \"$RET\" ;; # Print exit code if not in list esac printf '%s' \"$_\" done } __ssh() { local CON=($SSH_CONNECTION) local SRV_IP=\"${CON[2]}\" [[ -z \"$SRV_IP\" ]] && return local SRV_PORT=\"${CON[3]}\" # 4 chars from startand 4 chars from end local SRV_IP_CUT=\"${_CYN}${SRV_IP}\" [[ ${#SRV_IP} -gt 8 ]] && local SRV_IP_CUT=\"${_CYN}${SRV_IP:0:4}${_WHT}*${_CYN}${SRV_IP: -4}\" printf '%s' \"${_GRN}${_BLU}[${SRV_IP_CUT}${_PRP}${_BLD}:${_NON}${_CYN}${SRV_PORT}${_BLU}]${_NON}\" } __guix_env() { local re='[\\(]?\\(\"([^\"]*)\"' if [[ \"$GUIX_ENVIRONMENT\" ]]; then local PACKAGES=($(while read -r line; do [[ \"$line\" =~ $re ]] && printf '%s ' \"${BASH_REMATCH[1]}\" done < $GUIX_ENVIRONMENT/manifest)) if [[ ${#PACKAGES[@]} -eq 2 ]]; then printf \"${_BLD}${_BLU}[${_NON}${_YLW}Guix${_NON}: ${_WHT}%s ${_NON}+ ${_PRP}%d ${_NON}pkg${_BLD}${_BLU}] \" \"${PACKAGES[0]}\" \"$((${#PACKAGES[@]}-1))\" elif [[ ${#PACKAGES[@]} -gt 2 ]]; then printf \"${_BLD}${_BLU}[${_NON}${_YLW}Guix${_NON}: ${_WHT}%s ${_NON}+ ${_PRP}%d ${_NON}pkgs${_BLD}${_BLU}] \" \"${PACKAGES[0]}\" \"$((${#PACKAGES[@]}-1))\" else printf \"${_BLD}${_BLU}[${_NON}${_YLW}Guix${_NON}: ${_WHT}%s${_BLD}${_BLU}] \" \"${PACKAGES[@]}\" fi fi } __prompt() { # Get exit code (must be first) local PLC=(\"${PIPESTATUS[@]}\") # Reset time when prompt was first displayed after command # this contributes to the ~40 microsecond difference in $CMD_US and the actual time it took if [[ \"$INC_TIME\" != 0 ]]; then PROMPT_RT=\"$EPOCHREALTIME\" INC_TIME=0 fi # *_RT may not be set LAST_RT=\"${LAST_RT:-$EPOCHREALTIME}\" PROMPT_RT=\"${PROMPT_RT:-$EPOCHREALTIME}\" # Get relative times # Remove decimal point, simulating multiplying by 1 million PROMPT_RT1M=\"${PROMPT_RT/.}\" PROMPT_RT1M=\"${PROMPT_RT1M/,}\" LAST_RT1M=\"${LAST_RT/.}\" LAST_RT1M=\"${LAST_RT1M/,}\" ((CMD_US=PROMPT_RT1M-LAST_RT1M)) CMD_TIME=0 # Divide by 1 million to get a more accurate difference ((CMD_TIME=CMD_US/1000000)) [[ ${#CMD_US} -lt 6 ]] || CMD_US=\"${CMD_US: -6}\" ((CMD_US=10#$CMD_US)) # Set prompt sections local SIG local COL local UHD local TIME local IND local GUIX # Text # ssh detection and indicator [[ \"$SSH_CONNECTION\" ]] && local SSH=\"$(__ssh) \" # [INT], [4], etc. local RET for RET in \"${PLC[@]}\"; do if [[ $RET -gt 0 ]]; then SIG=\"$(printf '%s[%s%s%s] ' \"$_BLU\" \"$_RED\" \"$(__sig \"${PLC[@]}\")\" \"$_BLU\")\" break fi done # Guix shell environment GUIX=\"$(__guix_env)\" # [user@homeserver:~] COL=\"$([[ $UID == 0 ]] && printf '%s' \"$_RED\" || printf '%s' \"$_YLW\")\" UHD=\"${_BLD}${_BLU}[${COL}\\u${_PRP}@${_CYN}\\h${_PRP}:${_GRN}\\w${_BLU}]\" # 2y 351d 12m 43s 382969μs TIME=\"${_YLW}$(__get_cmd_time)\" # Random colored $ or # _RAND256=\"\\[\\033[38;2;$((RANDOM%256));$((RANDOM%256));$((RANDOM%256))m\\]\" IND=\"${_RAND256}\\\\$\" # Set the prompt PS1=\"${_NON}${SSH}${GUIX}${SIG}${UHD} ${TIME} ${IND} ${_NON}\" } PROMPT_COMMAND=__prompt")) (define %home:bashrc (plain-file "bashrc" "\ # Source other files [ -r ~/.prompt ] && . ~/.prompt [ -r ~/.devspec ] && . ~/.devspec [ -r ~/.config/colorscheme ] && . ~/.config/colorscheme [ \"$TERM\" == \"screen.linux\" ] && export TERM=\"screen\" export EDITOR=\"vim\" export TERM=xterm-256color # History stuff export HISTCONTROL=ignoredups:erasedups export HISTFILESIZE=1000 export HISTSIZE=1000 export GPG_TTY=$(tty) export MANPATH=/run/current-system/profile/share/man:/home/cobra/.guix-profile/share/man:/run/current-system/profile/share/man:/home/cobra/.guix-home/profile/share/man clear() { printf '\\033c' # faster than ncurses clear by a lot } # Other aliases alias c='clear' alias ls='ls --color=auto -FAh' alias ll='ls -l' alias nf='hyfetch' alias ga='git add' alias gc='git commit -sS' alias gp='git push' alias mpv='mpv --no-audio-display' alias wv='swayhide mpv $($PASTE_COMMAND)' alias curl='curl -L' alias prof='profanity' alias gomuks=\"http_proxy='socks5://127.0.0.1:9050' gomuks\" alias tut=\"http_proxy='socks5://127.0.0.1:9050' tut\" alias dico=\"dico -d en-wiktionary\" # Random string (passwords) randstr() { tr -cd '[:graph:]' >($COPY_COMMAND) } # URL-encode stdin urlencode() { LC_COLLATE_OLD=$LC_COLLATE LC_COLLATE=C local TEXT=\"$( /dev/null \\;; } fixdh() { diffhome | while read -r _ SRC _ DEST _; do cp $SRC $DEST; done; } strlen() { N=$(wc -c <<< \"$*\") ((N--)) printf '%u\\n' \"$N\" } uppweb() { ssh vern.cc 'cd ~/public_html; git pull' } caption() { [ -z \"$3\" ] && { echo \"Usage: caption [input] [output] [text...]\" return 1 } local FILE=\"$1\" local OUT=\"$2\" shift 2 local TEXT=\"$*\" local WIDTH=\"$(identify -format \"%[w]\\n\" \"$FILE\" | head -n1)\" local HEIGHT=\"$(identify -format \"%[h]\\n\" \"$FILE\" | head -n1)\" local FONT_SIZE=\"$(((HEIGHT+WIDTH)/20))\" convert -gravity north \\( -size \"${WIDTH}x\" -pointsize \"$FONT_SIZE\" -font 'Liberation-Sans-Bold' caption:\"$TEXT\" -gravity Center -extent \"${WIDTH}x\" \\) \"$FILE\" -append \"$OUT\" } captionvid() { [ -z \"$3\" ] && { echo \"Usage: captionvid [input] [output] [text...]\" return 1 } rm /tmp/caption.*.png FPS=\"$(ffmpeg -i \"$1\" 2>&1 |grep fps | sed 's/.* \\([0-9]\\+\\) fps.*/\\1/')\" IN=\"$1\" OUT=\"$2\" shift 2 ffmpeg -i \"$IN\" \"/tmp/caption.%02d.png\" for i in /tmp/caption.*; do caption \"$i\" \"$i-new.png\" \"$*\" done ffmpeg -framerate $FPS -i \"/tmp/caption.%02d.png-new.png\" \"$OUT\" rm /tmp/caption.*.png } topbottom() { [ -z \"$3\" ] && { echo \"Usage: caption [input] [output] [text...]\" return 1 } local FILE=\"$1\" local OUT=\"$2\" shift 2 local WIDTH=\"$(identify -format \"%[w]\\n\" \"$FILE\" | head -n1)\" local HEIGHT=\"$(identify -format \"%[h]\\n\" \"$FILE\" | head -n1)\" local FONT_SIZE=\"$(((HEIGHT+WIDTH)/20))\" convert -size \"${WIDTH}x\" -stroke black -strokewidth 3 -fill white -pointsize \"$FONT_SIZE\" -font 'Liberation-Sans-Bold' -gravity Center -extent \"${WIDTH}x\" -gravity north \\( -annotate +0+0 \"$1\" \\) -gravity south \\( -annotate +0+0 \"$2\" \\) \"$FILE\" -append \"$OUT\" } topbottomvid() { [ -z \"$3\" ] && { echo \"Usage: captionvid [input] [output] [text...]\" return 1 } rm /tmp/caption.*.png FPS=\"$(ffmpeg -i \"$1\" 2>&1 |grep fps | sed 's/.* \\([0-9]\\+\\) fps.*/\\1/')\" IN=\"$1\" OUT=\"$2\" shift 2 ffmpeg -i \"$IN\" \"/tmp/caption.%02d.png\" for i in /tmp/caption.*; do topbottom \"$i\" \"$i-new.png\" \"$1\" \"$2\" done ffmpeg -framerate $FPS -i \"/tmp/caption.%02d.png-new.png\" \"$OUT\" rm /tmp/caption.*.png } subcipher() { local COLOR PERM L1 line grep word if [ $# -lt 3 ]; then if [ $# -lt 2 ] || [[ \"$1\" != \"0\" && \"$1\" != \"1\" ]]; then printf \"Usage: [0|1] subcipher file [string...]\\n\" return 1 fi fi COLOR=\"$1\" shift PERM=\"$1\" shift [ -z \"$*\" ] && set -- \"$( ${1:-$(date -u -I)}.svg } mnplot() { ssh mythos \"${1:-/opt/gnuplot/gnuplot.sh}; cat /opt/gnuplot/${1:-$(date -u -I)}.svg\" > ${1:-$(date -u -I)}.svg } vnplot() { ssh vern \"${1:-/opt/gnuplot/net/gnuplot.sh}; cat /opt/gnuplot/net/${1:-$(date -u -I)}.svg\" > ${1:-$(date -u -I)}.svg } vpplot() { ssh vern \"${1:-/opt/gnuplot/power/gnuplot.sh}; cat /opt/gnuplot/power/${1:-$(date -u -I)}.svg\" > ${1:-$(date -u -I)}.svg } inplot() { ssh iceberg \"${1:-~/gnuplot/gnuplot.sh}; cat ~/gnuplot/${1:-$(date -u -I)}.svg\" > ${1:-$(date -u -I)}.svg } cnplot() { ssh crescent \"${1:-/opt/gnuplot/net/gnuplot.sh}; cat /opt/gnuplot/net/${1:-$(date -u -I)}.svg\" > ${1:-$(date -u -I)}.svg } cpplot() { ssh crescent \"${1:-/opt/gnuplot/power/gnuplot.sh}; cat /opt/gnuplot/power/${1:-$(date -u -I)}.svg\" > ${1:-$(date -u -I)}.svg } reconf() { $PRIV guix system reconfigure /etc/guix-config/${HOSTNAME,,}.scm } hreconf() { guix home reconfigure $HOME/.config/guix/home.scm } geng() { < \"$1\" sed 's/\\s*;.*//' | grep -ve '^$' -e '^T' | awk '{print \"N\"NR\" \"$0}' > \"$2\" } mkmshex() { FILE=\"${1%.*}\" microscheme \"$1\" avr-gcc -B /run/current-system/profile/avr/lib/avr5 -mmcu=\"$2\" -g -Os \"$FILE\".s -o \"$FILE\".elf avr-objcopy -Oihex \"$FILE\".o \"$FILE\".hex } uploadhex() { avrdude -C/run/current-system/profile/etc/avrdude.conf -v -p\"$2\" -carduino -P${3:-/dev/ttyS0} -U\"flash:w:$1:i\" } gshpkg() { local re='[\\(]?\\(\"([^\"]*)\"' if [[ \"$GUIX_ENVIRONMENT\" ]]; then local PACKAGES=($(while read -r line; do [[ \"$line\" =~ $re ]] && printf '%s ' \"${BASH_REMATCH[1]}\" done < $GUIX_ENVIRONMENT/manifest)) echo ${PACKAGES[@]} fi }"))