lackadaisical/daisy.source

435 lines
14 KiB
Text
Executable file

#!/bin/echo "This file can only be sourced, not run stand-alone." -- #!/bin/bash
# LACKADAISICAL SOURCE-ABLE FILE
# Source this in your RC file or manually to receive some of the simpler
# utilities, as well as aliases for `shrc` and `cdf`. Set env variable
# FROM_RC to 1 when sourcing this file to get RC-related functionality:
# FROM_RC=1 source <lackadaisical-root>/daisy.source
# 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.
if [[ $DAISY_INTERNAL -eq 1 ]];
then
export DAISY_BIN=$(basename $0)
fi
# Variables for use in other utilities
# Find the right argument for our folder
ARG=$0
if [[ ! $ARG == *daisy.source* ]];
then
ARG="${BASH_SOURCE[0]}"
fi
# Check for dependencies
function daisy_dependency_check()
{
command -v $1 1>/dev/null 2>/dev/null;
res=$?
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)
export DAISY_FOLDER=$(dirname $(realpath $ARG))
export DAISY_SOURCE_FILE=$(realpath $ARG)
export DAISY_AVAILABLE=0
# Config folder setup
export DAISY_CONFIG_FOLDER="$HOME/.config/lackadaisical"
NEW_INSTALL=0
if [[ ! -d "$DAISY_CONFIG_FOLDER" ]];
then
# Create the folder with its basics
mkdir -p "$DAISY_CONFIG_FOLDER"
daisy_help
NEW_INSTALL=1
fi
# Source everything in the config folder
for f in "$DAISY_CONFIG_FOLDER"/*; do
[ -f "$file" ] && source "$f"
done
# Installation into PATH
if [[ ! $PATH == *"$DAISY_FOLDER"* ]];
then
export PATH="$PATH:$DAISY_FOLDER"
fi
# Set up the basic alias for `shrc`
# Do not set these up if DAISY_INTERNAL=1 is set, or infinite recursion could
# occur!
if [[ ! -v DAISY_INTERNAL ]];
then
alias shrc=". shrc"
fi
###############################################################################
# FUNCTIONS and ALIASES #######################################################
###############################################################################
# bak and unbak
function bak()
{
# Input: <file>
target=$1
# Check if file exists
if ! test -f "$target";
then
echo "Path not found: \"$target\""
return 2
fi
# Handle both cases
if [[ UNBAK_MODE -eq 1 ]];
then
cp -R "$target.bak" "$target"
rm -rf "$target.bak"
echo "Restored backup: $target <-- $target.bak"
else
cp -R "$target" "$target.bak"
echo "Backup made: $target --> $target.bak"
fi
}
alias unbak="UNBAK_MODE=1 bak"
alias lsa="ls -a -l -h"
alias lsn="ls -a -l -tu -r -h"
alias lss="ls -a -l -S -r -h"
# Simple version of `cdf`
function cdf()
{
cd $(dirname $(fzf))
}
function cdp()
{
if [[ $DAISY_HAS_peco != 1 || $DAISY_HAS_tree != 1 ]];
then
echo "This alias requires the utility 'peco' 'tree'. Please install them."
echo "Consider using 'cdf' instead."
return 1
fi
cd $(dirname $(tree -fia --noreport . | peco))
}
function editpeco
{
if [[ $DAISY_HAS_peco != 1 ]];
then
echo "This alias requires the utility 'peco'. Please install it."
return 1
fi
tree --noreport -fia . | peco --prompt "Press CTRL+C to quit - query:" --exec "xargs -o -I{} $EDITOR {}"
}
# for convenience purposes
function editbin()
{
editx $(which $1)
}
# sets a new editor based on commony available ones, and some visual ones
function ched()
{
editors=("nano" "vim" "nvim" "vi" "emacs" "gedit" "kate" "mousepad" "micro" \
"code" "subl" "joe" "kwrite" "gnome-text-editor")
# Find which editors are installed
available_editors=()
for editor in "${editors[@]}";
do
EDITOR_REAL=$(command -v "$editor")
if command -v "$EDITOR_REAL" >/dev/null 2>&1;
then
if [[ $(realpath "$EDITOR") == "$EDITOR_REAL" ]];
then
available_editors+=("$EDITOR_REAL" "$editor (current choice)")
else
available_editors+=("$EDITOR_REAL" "$editor")
fi
fi
done
if [[ ! -z $@ ]];
then
TEXT="$@"
dialog --msgbox "$TEXT" 0 0
fi
# Present all choices
CHOICE=$(dialog --output-fd 1 --clear --title "Select Text Editor (Recommendation: nano)" \
--menu "Choose one of the installed text editors:" 15 50 6 \
"${available_editors[@]}")
DIALOG_RET=$?
if [ $DIALOG_RET -ne 0 ];
then
echo "No editor selected."
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"
# Seems silly but this is also where we should export these
source "$DAISY_CONFIG_FOLDER/editor.src"
}
function wait_for_editor()
{
pname="$1"
fname="$2"
# Give some time for a process to launch
sleep 1
while true;
do
ALIVE=$(ps aux | grep $fname | grep $pname)
if [[ $ALIVE == "" ]]
then
break
fi
sleep 1
done
}
function ldrc()
{
FROM_RC=0 $EDITOR "$DAISY_SOURCE_FILE"
source "$DAISY_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 ]];
then
file_info=$(file $1)
file_name=$(basename $1)
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()
{
[[ ! -d $1 ]] && echo "daisy_dec_multi: No input files specified" && return
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
done
}
function daisy_dec()
{
data=$(cat ${1:-/dev/stdin} | grep -v "#" )
echo -e "$data" | cut -d "=" -f 2- | cut -b 2- | head -c -2 | base64 -d
}
# Will only take a file and directory, sources it to find all encoded data
# Extracts to the directory
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") | tee "$2"/"$file"
fi
done
}
alias daisy_init='source "$DAISY_SOURCE_FILE"'
###############################################################################
# end of FUNCTIONS and ALIASES ################################################
###############################################################################
# End of user section!
export DAISY_AVAILABLE=1
# Start of internal section
function daisy_quit_if_no()
{
has_dep=$DAISY_HAS_$1
# Check first if we have checked for this dependency, if not, print a fixme!
# TODO: Remove upon release, or convert into self-modifying code.
if [[ ! -v DAISY_HAS_$1 ]];
then
echo "FIXME: Dependency `$1` should have an env variable, checking ad-hoc"
has_dep=$(daisy_dependency_check $1)
fi
if [[ $has_dep -eq 0 ]];
then
echo "$DAISY_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
# Help function
function daisy_help()
{
OLD_IFS="$IFS"
IFS=
echo -e "==================================================================="
echo -e ""
echo -e "Thanks for installing LACKADAISICAL!"
echo -e "This project aims to provide useful utilities as well as learning"
echo -e "material."
echo -e ""
echo -e "It is still under heavy development, not all of the things on this"
echo -e "list are present/implemented. Utils marked with * are incomplete."
echo -e ""
echo -e "==================================================================="
echo -e ""
echo -e "This suite provides a number of functions, aliases and scripts."
echo -e "They are all aimed at enhancing your efficiency."
echo -e ""
echo -e "==================================================================="
echo -e ""
echo -e "These are the included binaries:"
echo -e " - calm:"
echo -e " Reduce a process niceness to 0."
echo -e " - cdz:"
echo -e " This utility extracts an archive to /tmp and changes"
echo -e " directory to it in a new shell instance. Upon exit,"
echo -e " the files are wiped. If \`archivemount\` is present,"
echo -e " it will be used to mount the archive instead! You can"
echo -e " bypass this behavior by specifying an env value of;"
echo -e " NO_ARCHIVEMOUNT=1. The standard script supports zip,"
echo -e " tarballs, and rar archives. We recommend relying on"
echo -e " archivemount\` if you have it installed."
echo -e " - editx:"
echo -e " Uses your standard CLI editor to create/modify a"
echo -e " file and make it executable."
echo -e " - filewait:"
echo -e " This tool is given a filename of a file that does"
echo -e " not exist yet. When the file appears on disk, the"
echo -e " program quits and simply returns the filename. This"
echo -e " can be used in personal workflows."
echo -e " - newday:"
echo -e " A basic but powerful journaling system. Recommended"
echo -e " to set up via crontab. Can be used for everything"
echo -e " from diaries to BTRFS snapshots."
echo -e " - own:"
echo -e " A simple utility. It effectively uses chown -R"
echo -e " user:user on its target. Root permissions required!"
echo -e " - short:"
echo -e " This tool allows you to set up directory shortcuts."
echo -e " It enhances cd t to integrate itsef using its own"
echo -e " syntax. It is similar to wd."
echo -e " - shrc:"
echo -e " This tool allows you to edit the RC file for your"
echo -e " shell in your preferred editor. After saving, the"
echo -e " file is sourced by your shell."
echo -e " - sw:"
echo -e " A basic function that swaps two files by content."
echo -e " Useful for restoring backups."
echo -e " - what:"
echo -e " This is a tool similar to which and others, the key"
echo -e " difference is that it returns partial matches. It can"
echo -e " be used to search for binaries."
echo -e " -*binbox:"
echo -e " This tool can be used to pack bash scripts into one"
echo -e " big megascript, much like how \`busybox\` works."
echo -e " You can also make symlinks to it to invoke a specific"
echo -e " script (current symlinks do not work well)."
echo -e ""
echo -e "==================================================================="
echo -e ""
echo -e "There are aliases and functions included within this file as well:"
echo -e " - bak/unbak:"
echo -e " These small utilities make backups of files by making"
echo -e " a copy with a .bak suffix. Unbak reverses the process"
echo -e " using sw and removes the backup."
echo -e " - lsa:"
echo -e " A simple alias for ls -lah."
echo -e " - lsn:"
echo -e " A simple alias for ls -lah --sort=time --reverse."
echo -e " - lss:"
echo -e " A simple alias for ls -lah --sort=size --reverse."
echo -e " - editbin:"
echo -e " An alias for editx $\(which <x>\). Saves on typing."
echo -e " - editpeco:"
echo -e " This function uses peco+tree like 'cdp', but opens"
echo -e " your editor on the selected file(s). After you exit"
echo -e " your editor(s), you are returned to peco where you left"
echo -e " off."
echo -e " - ched:"
echo -e " Like chsh but for your editor (EDITOR env). A list"
echo -e " from which you can choose an installed editor"
echo -e " (CLI or GUI) is shown."
echo -e " - cdf:"
echo -e " Use fzf to find a file and then cd to its location."
echo -e " - cdp:"
echo -e " Similar to 'cdf' but uses tree+peco for the query."
echo -e " - ldrc:"
echo -e " Edits this file and sources it, similarly to shrc."
echo -e " - daisy_init:"
echo -e " Alias for directly sourcing this file from any"
echo -e " LACKADAISICAL binary. You may use this yourself."
echo -e " - daisy_cbin:"
echo -e " Contains the name of the current LACKADAISICAL"
echo -e " binary being run."
echo -e " -*daisy_enc:"
echo -e " Converts a file/stdin to a base64 block that can be"
echo -e " decoded by passing the output(s) to daisy_dec."
echo -e " - *_multi:"
echo -e " A version of daisy_enc that runs encodes multiple"
echo -e " files and outputs daisy_base64_data blocks to a file"
echo -e " or stdout."
echo -e " -*daisy_dec:"
echo -e " Converts daisy_base64_data blocks back to the form"
echo -e " it was in originally."
echo -e " - *_multi:"
echo -e " A version of daisy_dec that runs on multiple input"
echo -e " blocks that are either stored in a file or stdin."
echo -e ""
echo -e "==================================================================="
echo -e ""
echo -e "To uninstall LACKADAISICAL, simply remove the source line from your"
echo -e "shell RC, and reload it. This does not remove the files!"
echo -e ""
echo -e "To read this notice again, call the function 'daisy_help'."
echo -e ""
echo -e "==================================================================="
IFS="$OLD_IFS"
}