#!/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 /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: 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 \). 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" }