From e3a2efdb438da9fa6cf63e7a42a402874191a5b4 Mon Sep 17 00:00:00 2001 From: Sam Hardeman Date: Sat, 13 Dec 2025 04:16:43 +0100 Subject: [PATCH] Minor fixes as well as clean-up surrounding internal functions. --- README.md | 67 +++++++++----- binbox | 10 +-- calm | 2 +- cdz | 4 +- daisy.source | 243 ++++++++++++++++++++++++++++++++------------------- editx | 2 +- filewait | 2 +- newday | 4 +- own | 6 +- shrc | 4 +- sw | 6 +- what | 2 +- 12 files changed, 218 insertions(+), 134 deletions(-) diff --git a/README.md b/README.md index 393d4b3..42d739f 100755 --- a/README.md +++ b/README.md @@ -57,11 +57,11 @@ These are the included binaries and utilities: - newday: A basic but powerful journaling system. Recommended to be set up via crontab. Can be used for everything - from diaries to general file storage to even BTRFS + from diaries to general file storage to even BTRFS snapshots. - own: - A simple utility. It's effectively an alias for - "sudo chown -R user:user" on the target dir/file. + A simple utility. It's effectively an alias for + "sudo chown -R user:user" on the target dir/file. Root permissions required! - shrc: This tool allows you to edit the RC file for your @@ -84,15 +84,15 @@ These are the included binaries and utilities: a copy with a .bak suffix. Unbak reverses the process by using sw and removes the backup. - lsa: - A simple alias for ls -lah. + A simple alias for `ls -lah`. - lsn: - A simple alias for ls -lah --sort=time --reverse. + A simple alias for `ls -lah --sort=time --reverse`. - lss: - A simple alias for ls -lah --sort=size --reverse. + A simple alias for `ls -lah --sort=size --reverse`. - editbin: - An alias for editx $\(which \). Saves on typing. + An alias for `editx $\(which \)`. Saves on typing. - editpeco: - This function uses peco+tree like 'cdp', but opens + This function uses peco+tree like `cdp`, but opens your editor on the selected file(s). After you exit your editor(s), you are returned to peco where you left off. @@ -103,37 +103,56 @@ These are the included binaries and utilities: - cdf: Use fzf to find a file and then cd to its location. - cdp: - Similar to 'cdf' but uses tree+peco for the query. + Similar to `cdf` but uses tree+peco for the query. - ldrc: Edits daisy.source and re-sources it, similarly to shrc. - - daisy_init: - Alias for directly sourcing this file from any - LACKADAISICAL binary. You may use this yourself. + - daisy_reload: + Re-sources daisy.source. Essentially `ldrc` without + editing. - grab: - Alias for "awk '{print $x}'", where x is a number. - E.g. "echo 'a b c' | grab 2" returns 'b'. + Alias for `awk '{print $x}'`, where x is a number. + E.g. `echo 'a b c' | grab 2` returns 'b'. - daisy_cbin: Contains the name of the current LACKADAISICAL binary being run. - daisy_enc: Converts a file/stdin to a base64 block that can be - decoded by passing the output(s) to daisy_dec. + decoded by passing the output(s) to `daisy_dec`. + The output of `daisy_enc` can be concatenated with the + output of another encoded file to create a multi-file + base64 archive similar to `daisy_enc_multi` - daisy_enc_multi: - A version of daisy_enc that encodes multiple - files and outputs daisy_base64_data blocks to a file - or stdout. + A version of `daisy_enc` that encodes multiple + files and outputs `daisy_base64_data` blocks to a file + or stdout. These outputs can be concatenated as well. - daisy_dec: - Converts daisy_base64_data blocks back to the form + Converts `daisy_base64_data` blocks back to the form it was in originally. - daisy_dec_multi: A version of daisy_dec that runs on multiple input blocks that are either stored in a file or stdin. - - daisy_alias/daisy_unalias: + - daisy_alias: This utility sets persistent user aliases stored in - .daisy_aliases in the lackadaisical config folder. - They will remain persistent until unaliased. - Call 'daisy_alias' without parameters to get a list. - Use 'daisy_unalias' to remove an alias. + "~/.config/lackadaisical/aliases.src". + They will remain persistent until unaliased with + daisy_unalias. + Call daisy_alias using '' instead of "". + E.g. `daisy_alias hello='echo "Hello!"' - instead of + `daisy_alias hello="echo \"Hello!\"". + This prevents an early invocation of possible nested + aliases. + Call this function without arguments to get a list of + registered aliases as well as indices for easy unaliasing + using `daisy_unalias`. + - daisy_unalias: + This utility removes an alias from those registered with + daisy_alias. It accepts either an alias name, or an index + given by calling `daisy_alias` without arguments. + In case of a mistake, a backup is made under the filename + "~/.config/lackadaisical/aliases.src.bak". + To restore this file, you can use these commands: + `unbak ~/.config/lackadaisical/aliases.src' + `daisy_reload` - daisy_list: List all available commands without description. --- END OF DAISY HELP --- diff --git a/binbox b/binbox index 02e7386..ec1e474 100755 --- a/binbox +++ b/binbox @@ -3,21 +3,21 @@ # Symlinking to the resulting binary with the name of one of the original scripts will trigger # said script. The idea is similar to `busybox`. -DAISY_INTERNAL=1 +LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source args=$@ function help() { - echo "$DAISY_BIN is a utility that allows you to generate busybox-style combined binaries." + echo "$LD_BIN is a utility that allows you to generate busybox-style combined binaries." echo "To access the original functionality of an input binary, you can either use a symlink or" echo "call the function like so: 'combi-bin input-bin ." echo "" echo "> Usage:" - echo "Creating boxed binary: $DAISY_BIN -o <-s source files> <-p include files verbatim> -i INPUT_BINS ..." - echo " Unpacking a boxed binary: $DAISY_BIN -e " - echo "View this screen: $DAISY_BIN " + echo "Creating boxed binary: $LD_BIN -o <-s source files> <-p include files verbatim> -i INPUT_BINS ..." + echo " Unpacking a boxed binary: $LD_BIN -e " + echo "View this screen: $LD_BIN " exit 0 } diff --git a/calm b/calm index 4f1be27..6e45689 100755 --- a/calm +++ b/calm @@ -8,7 +8,7 @@ # set's NICE value to 0 # need sudo -DAISY_INTERNAL=1 +LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source pids=$@ diff --git a/cdz b/cdz index ede5b6c..d39446b 100755 --- a/cdz +++ b/cdz @@ -1,8 +1,8 @@ #!/bin/sh -if [[ $DAISY_INTERNAL -ne 1 ]]; +if [[ $LD_INTERNAL -ne 1 ]]; then - export DAISY_INTERNAL=1 + export LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source fi diff --git a/daisy.source b/daisy.source index 43956ab..ade487f 100755 --- a/daisy.source +++ b/daisy.source @@ -9,11 +9,11 @@ # This file is also sourced in some of the scripts included within # lackadaisical for common functionality. Some of the shared functionality is # only included if sourced from one of the included scripts, though you are -# free to bypass this by setting env variable DAISY_INTERNAL to 1. +# free to bypass this by setting env variable LD_INTERNAL to 1. -if [[ $DAISY_INTERNAL -eq 1 ]]; +if [[ $LD_INTERNAL -eq 1 ]]; then - export DAISY_BIN=$(basename $0) + export LD_BIN=$(basename $0) fi # Variables for use in other utilities @@ -32,47 +32,54 @@ function daisy_dependency_check echo $(($res ^ 1)) } -DAISY_HAS_fzf=$(daisy_dependency_check fzf) -DAISY_HAS_md5sum=$(daisy_dependency_check md5sum) -DAISY_HAS_peco=$(daisy_dependency_check peco) -DAISY_HAS_tree=$(daisy_dependency_check tree) +LD_HAS_fzf=$(daisy_dependency_check fzf) +LD_HAS_md5sum=$(daisy_dependency_check md5sum) +LD_HAS_peco=$(daisy_dependency_check peco) +LD_HAS_tree=$(daisy_dependency_check tree) -export DAISY_FOLDER=$(dirname $(realpath $arg)) -export DAISY_SOURCE_FILE=$(realpath $arg) -export DAISY_AVAILABLE=0 +export LD_FOLDER=$(dirname $(realpath $arg)) +export LD_SOURCE_FILE=$(realpath $arg) +export LD_AVAILABLE=0 # Config folder setup -export DAISY_CONFIG_FOLDER="$HOME/.config/lackadaisical" +export LD_CONFIG_FOLDER="$HOME/.config/lackadaisical" new_install=0 -if [[ ! -d "$DAISY_CONFIG_FOLDER" ]]; +if [[ ! -d "$LD_CONFIG_FOLDER" ]]; then # Create the folder with its basics - mkdir -p "$DAISY_CONFIG_FOLDER" + mkdir -p "$LD_CONFIG_FOLDER" daisy_help new_install=1 fi -# Functions for aliases that are added once, but always available -DAISY_ALIASFILE="$DAISY_CONFIG_FOLDER"/.daisy_aliases -touch $DAISY_ALIASFILE +# Multiple default source files +# [LEA.TODO] Turn these into arrays +LD_ALIASFILE="$LD_CONFIG_FOLDER/aliases.src" +LD_EDITORFILE="$LD_CONFIG_FOLDER/editor.src" +touch $LD_ALIASFILE +touch $LD_EDITORFILE # Source everything in the config folder -for f in "$DAISY_CONFIG_FOLDER"; do - [ -f "$file" ] && source "$f" -done +function _daisy_source_configs +{ + for f in `find "$LD_CONFIG_FOLDER" -name "*.src" -type f`; + do + source "$f" + done +} # Installation into PATH -if [[ ! $PATH == *"$DAISY_FOLDER"* ]]; +if [[ ! $PATH == *"$LD_FOLDER"* ]]; then - export PATH="$PATH:$DAISY_FOLDER" + export PATH="$PATH:$LD_FOLDER" fi # Set up the basic alias for `shrc` -# Do not set these up if DAISY_INTERNAL=1 is set, or infinite recursion could +# Do not set these up if LD_INTERNAL=1 is set, or infinite recursion could # occur! -if [[ ! -v DAISY_INTERNAL ]]; +if [[ ! -v LD_INTERNAL ]]; then alias shrc=". shrc" fi @@ -114,12 +121,17 @@ alias lss="ls -a -l -S -r -h" # Simple version of `cdf` function cdf { + if [[ $LD_HAS_fzf != 1 ]]; + then + echo "This alias requires the utility 'fzf'. Please install it." + return 1 + fi cd $(dirname $(fzf)) } function cdp { - if [[ $DAISY_HAS_peco != 1 || $DAISY_HAS_tree != 1 ]]; + if [[ $LD_HAS_peco != 1 || $LD_HAS_tree != 1 ]]; then echo "This alias requires the utilities 'peco' and 'tree'. Please install them." echo "Consider using 'cdf' instead." @@ -130,12 +142,12 @@ function cdp function editpeco { - if [[ $DAISY_HAS_peco != 1 ]]; + if [[ $LD_HAS_peco != 1 || $LD_HAS_tree != 1 ]]; then - echo "This alias requires the utility 'peco'. Please install it." + echo "This alias requires the utilities 'peco' and 'tree'. Please install them." + echo "Consider using 'cdf' instead." return 1 fi - tree --noreport -fia . | peco --prompt "Press CTRL+C to quit - query:" --exec "xargs -o -I{} $EDITOR {}" } @@ -155,7 +167,7 @@ function ched available_editors=() for editor in "${editors[@]}"; do - editor_real=$(command -v "$editor") + editor_real=$(command -v "$editor") if command -v "$editor_real" >/dev/null 2>&1; then if [[ $(realpath "$EDITOR") == "$editor_real" ]]; @@ -174,7 +186,7 @@ function ched fi # Present all choices - choice=$(dialog --output-fd 1 --clear --title "Select Text Editor (Recommendation: nano)" \ + choice=$(dialog --output-fd 1 --clear --title "Select Text Editor" \ --menu "Choose one of the installed text editors:" 15 50 6 \ "${available_editors[@]}") dialog_ret=$? @@ -185,12 +197,11 @@ function ched return fi - echo export EDITOR=$choice > "$DAISY_CONFIG_FOLDER/editor.src" - echo export DAISY_EDITOR=$choice >> "$DAISY_CONFIG_FOLDER/editor.src" - echo export DAISY_OLD_EDITOR=$EDITOR >> "$DAISY_CONFIG_FOLDER/editor.src" + echo export EDITOR=$choice > "$LD_EDITORFILE" + echo export LD_EDITOR=$choice >> "$LD_EDITORFILE" + echo export LD_OLD_EDITOR=$EDITOR >>"$LD_EDITORFILE" - # Seems silly but this is also where we should export these - source "$DAISY_CONFIG_FOLDER/editor.src" + _daisy_source_configs } function wait_for_editor @@ -212,44 +223,60 @@ function wait_for_editor done } +function daisy_reload +{ + FROM_RC=0 source "$LD_SOURCE_FILE" +} + function ldrc { - FROM_RC=0 $EDITOR "$DAISY_SOURCE_FILE" - source "$DAISY_SOURCE_FILE" + $EDITOR "$LD_SOURCE_FILE" + FROM_RC=0 source "$LD_SOURCE_FILE" } function daisy_enc { - has_file=$([[ ! -z $1 ]] && file $1 1>/dev/null; echo $?) - has_file=$([[ has_file -eq 0 ]] && echo 1) - file_info="no data" - file_name="null" - if [[ has_file -eq 1 ]]; + if [ -d $1 ]; then + echo -e "daisy_create_folder=$1" + else file_info=$(file $1) + file_dir=$(dirname $1) file_name=$(basename $1) + + base64_inner=$(cat ${1:-/dev/stdin} | base64 | tr -d '\n') + + # Print out our block + echo -e "daisy_folder_$file_name=$file_dir" + echo -e "daisy_data_base64_$file_name=\"$base64_inner\"" fi - - base64_inner=$(cat ${1:-/dev/stdin} | base64 | tr -d '\n') - - # Print out our block - echo -e "# File info: $file_info" - echo -e "daisy_data_base64_$file_name=\"$base64_inner\"" } # Will only take input files, always outputs to stdout function daisy_enc_multi { for file in "$@"; do - if [[ -f "$file" ]]; then - daisy_enc "$file" - echo # separate blocks with a newline - else - echo "daisy_enc_multi: Skipping non-file: $file" - fi + daisy_enc "$file" done } +function daisy_enc_folder +{ + if [[ $LD_HAS_tree != 1 ]]; + then + echo "This function requires the utiliy 'tree'. Please install it." + return 1 + fi + + dir="$1" + cd "$dir" + tree -fia --noreport . | sed 1d | while read -r item; + do + daisy_enc "$item" + done +} + + function daisy_dec { data=$(cat ${1:-/dev/stdin} | grep -v "#" ) @@ -262,16 +289,28 @@ function daisy_dec_multi { [[ ! -f $1 ]] && echo "daisy_dec_multi: No input file specified" && return [[ ! -d $2 ]] && echo "daisy_dec_multi: No output directory specified" && return - declare -a vars=( $(cat $1 | grep -v "# File") ) - for enc in "${vars[@]}"; - do - file=$(echo -e "$enc" | cut -d "_" -f 4- | cut -d "=" -f 1) - if [[ ! "$file" == '' ]] - then - daisy_dec <(echo "$enc") > "$2"/"$file" - fi - done +folder= +while IFS= read -r line; do + if [[ "$line" == "daisy_create_folder="* ]]; + then + folder=$(echo $line | cut -d "=" -f 2) + mkdir -p "$2/$folder" + fi + + if [[ "$line" == "daisy_folder"* ]]; + then + folder=$(echo -e $line | cut -d "=" -f 2) + continue + fi + + if [[ "$line" == "daisy_data_base64"* ]]; + then + file=$(echo -e $line | cut -d "_" -f 4- | cut -d "=" -f 1) + daisy_dec <(echo $line) > "$2/$folder/$file" + fi + + done <<< $(cat "$1") } # Saves a bit on typing @@ -285,6 +324,12 @@ function daisy_unalias { unalias_param=$@ + if [[ $unalias_param =~ '^[0-9]+$' ]]; then + selection=$(head -$unalias_param "$LD_ALIASFILE" | tail -1 | cut -d "=" -f 1 | grab 2) + daisy_unalias $selection + return + fi + if [[ -z $unalias_param ]]; then return fi @@ -292,8 +337,9 @@ function daisy_unalias unalias $@ 2>/dev/null # Remove from aliases list - newdata=$(cat $DAISY_ALIASFILE | grep -v "alias $unalias_param") - echo -e $newdata > $DAISY_ALIASFILE + newdata=$(cat "$LD_ALIASFILE" | grep -v "alias $unalias_param") + bak "$LD_ALIASFILE" 1>/dev/null + echo -e $newdata > "$LD_ALIASFILE" } function daisy_alias @@ -301,31 +347,38 @@ function daisy_alias alias_param="$@" if [[ -z $alias_param ]]; then + linenum=1 echo "Active lackadaisical alias lines:" - cat $DAISY_ALIASFILE | sed 's/alias //g' + while IFS= read -r line; do + line=$(echo "$line" | sed 's/alias / /g') + echo "$linenum: $line" + linenum=$(($linenum + 1)) + done < "$LD_ALIASFILE" return fi # Plain name and contents alias_name=$(echo -e $alias_param | grep -o ".*=" | tr --delete =) + if [[ $alias_name =~ '^[0-9]+$' ]]; then + echo "An alias cannot start with a number! Exiting." + return 1 + fi + # Make persistent daisy_unalias $alias_name - echo alias ${alias_param%=*}"="\"${alias_param#*=}\" >> $DAISY_ALIASFILE - - alias $alias_param + echo alias ${alias_param%=*}"="\"${alias_param#*=}\" >> $LD_ALIASFILE + source $LD_ALIASFILE } -source $DAISY_ALIASFILE - -alias daisy_init='source "$DAISY_SOURCE_FILE"' +_daisy_source_configs ############################################################################### # end of FUNCTIONS and ALIASES ################################################ ############################################################################### # End of user section! -export DAISY_AVAILABLE=1 +export LD_AVAILABLE=1 # Start of internal section function daisy_quit_if_no @@ -343,28 +396,27 @@ function daisy_quit_if_no if [[ $has_dep -eq 0 ]]; then - echo "$DAISY_BIN: The dependency $1 was not found! Please install it" \ + echo "$LD_BIN: The dependency $1 was not found! Please install it" \ "to be able to use this utility!" exit 1 fi } -[ -d "$DAISY_FOLDER" ] && export DAISY_AVAILABLE=1 +[ -d "$LD_FOLDER" ] && export LD_AVAILABLE=1 # Help function, courtesy of Google Gemini function daisy_help() { - local target_tool="$1" - local file="$DAISY_FOLDER/README.md" - - # 1. Extract the block between the new headers - sed -n '/--- BEGIN OF DAISY HELP ---/,/--- END OF DAISY HELP ---/{//!p;}' "$file" | \ + local target_tool="$1" + local file="$LD_FOLDER/README.md" + # 1. Extract the block between the new headers + sed -n '/--- BEGIN OF DAISY HELP ---/,/--- END OF DAISY HELP ---/{//!p;}' "$file" | if [ -z "$target_tool" ]; then - # If no argument, print the whole help text - cat + # If no argument, print the whole help text + cat else - # 2. Parse specific tool - awk -v query="$target_tool" ' + # 2. Parse specific tool + awk -v query="$target_tool" ' BEGIN { found=0; printing=0 } # Match lines defining tools (e.g., " - calm:" or " - bak/unbak:") @@ -415,18 +467,31 @@ function daisy_help() { # Courtesy of Google Gemini daisy_list() { - local file="$DAISY_FOLDER/README.md" - echo "Available LACKADAISICAL commands:" + local file="$LD_FOLDER/README.md" + echo "Available LACKADAISICAL commands:" - # Extract block -> Find tool lines -> Clean formatting -> Print - sed -n '/--- BEGIN OF DAISY HELP ---/,/--- END OF DAISY HELP ---/{//!p;}' "$file" | \ + # Extract block -> Find tool lines -> Clean formatting -> Print + sed -n '/--- BEGIN OF DAISY HELP ---/,/--- END OF DAISY HELP ---/{//!p;}' "$file" | awk ' /^[[:space:]]*- / { # Remove indentation and "- " - sub(/^[[:space:]]*- /, ""); + sub(/^[[:space:]]*- /, ""); # Remove trailing ":" - sub(/:[[:space:]]*$/, ""); + sub(/:[[:space:]]*$/, ""); print " " $0 } ' | sort } + +# Hide what we don't need +if [[ ! -v LD_INTERNAL ]]; +then + unset -f _daisy_source_configs + unset -f wait_for_editor + unset -f daisy_quit_if_no + unset -f daisy_dependency_check + unset LD_HAS_fzf + unset LD_HAS_peco + unset LD_HAS_md5sum + unset LD_HAS_tree +fi \ No newline at end of file diff --git a/editx b/editx index 25017e7..276209f 100755 --- a/editx +++ b/editx @@ -2,7 +2,7 @@ # This utility pre-allocs a file and adds execution permissions. It also # removes the resulting file if it is empty after the editor closes. -DAISY_INTERNAL=1 +LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source if [[ -z $1 ]]; diff --git a/filewait b/filewait index 3fe78a9..af52929 100755 --- a/filewait +++ b/filewait @@ -1,7 +1,7 @@ #!/bin/sh # A simple utility that waits for a file to become available, infinitely -DAISY_INTERNAL=1 +LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source file=$@ diff --git a/newday b/newday index 354965b..6266505 100755 --- a/newday +++ b/newday @@ -14,7 +14,7 @@ # You can use this for a primitive form of note-taking, but aside from notes - # you can store any data this way. -DAISY_INTERNAL=1 +LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source dir_name=ByDate @@ -34,7 +34,7 @@ function errorFn() error=$? if [[ $error -gt 0 ]]; then - echo "$DAISY_BIN error ($error): " + echo "$LD_BIN error ($error): " perl -E 'say $!=shift' $error fi exit $error diff --git a/own b/own index ac503be..9d59e2c 100755 --- a/own +++ b/own @@ -2,14 +2,14 @@ # Simple program that changes ownership to the current # user, recursively. -DAISY_INTERNAL=1 +LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source if [[ $@ == '' ]]; then - echo "$DAISY_BIN: Used to quickly take ownership of files/folders." + echo "$LD_BIN: Used to quickly take ownership of files/folders." echo "Requires sudo. If sudo is not installed, this tool will fai." - echo "Usage: $DAISY_BIN " + echo "Usage: $LD_BIN " echo "Means: chown -R : " exit 2 fi diff --git a/shrc b/shrc index d3c587d..4e0d0ee 100755 --- a/shrc +++ b/shrc @@ -5,9 +5,9 @@ # and sources the .rc afterwards! # Source standard setup -if [[ $DAISY_INTERNAL -ne 1 ]]; +if [[ $LD_INTERNAL -ne 1 ]]; then - DAISY_INTERNAL=1 source $DAISY_SOURCE_FILE + LD_INTERNAL=1 source $LD_SOURCE_FILE fi function md5_opt() diff --git a/sw b/sw index e385605..8427de3 100755 --- a/sw +++ b/sw @@ -1,7 +1,7 @@ #!/bin/sh # It just swaps two files -export DAISY_INTERNAL1 +export LD_INTERNAL1 . $(dirname $(realpath $0))/daisy.source file1=$1 @@ -13,9 +13,9 @@ function helpFn() if [[ $error -gt 0 ]]; then error_text=$(perl -E 'say $!=shift' $error) - echo "$DAISY_BIN error ($error): $error_text" + echo "$LD_BIN error ($error): $error_text" fi - echo "Usage: $DAISY_BIN " + echo "Usage: $LD_BIN " echo Swap two files in a filesystem. exit $error } diff --git a/what b/what index 56ab2f5..0bf8c12 100755 --- a/what +++ b/what @@ -23,7 +23,7 @@ # /usr/sbin/vsftpd # -DAISY_INTERNAL=1 +LD_INTERNAL=1 . $(dirname $(realpath $0))/daisy.source pwd=/