dotfiles/.config/shell/bin/ned

139 lines
3.7 KiB
Text
Raw Normal View History

2022-01-13 14:47:59 -08:00
#!/bin/bash
# v1.0
2022-01-13 14:47:59 -08:00
# NEd: Note Editor (and your best friend!)
# Ned can edit and create notes in a folder you tell him to!
# Depends: fzf
2022-01-13 14:47:59 -08:00
# TODO: make it so the script assumes you are editing, and automatically creates a new document if the file to edit doesn't exist
# shellcheck disable=SC2068,SC2178,SC2128
2022-01-20 03:18:04 -08:00
# set default values if things are unset
NOTES_DIR="${NOTES_DIR:-"$HOME/Documents/college/current"}"
EDITOR="nvim"
EDITOR_CMD="nvim -c :ZenMode"
2022-01-13 14:47:59 -08:00
usage() {
cat <<-EOF
Usage:
ned <verb>
new <folder> [note name] create a new note in the matched class folder
edit [folder] search for and edit a text document in a folder
help print this message
ned edit ned (the thing you just ran)
2022-01-13 14:47:59 -08:00
Notes:
Right now, only the first letter of each option is considered, so \`ned n\` and \`ned neww\` do the same thing
Folder and file names are globbed
Will automatically activate the ZenMode nvim extension
Current repository path: $NOTES_DIR
EOF
}
edit() {
check_setup
if [ -n "$3" ]; then
SEARCH_TERM="$3"
if [ -d "$NOTES_DIR/$2"* ]; then
NOTES_DIR="$(echo "$NOTES_DIR"/"$2"*)"
fi
elif [ -n "$2" ]; then
SEARCH_TERM="$2"
fi
NOTE_PATH="$NOTES_DIR/$(cd "$NOTES_DIR" && fzf -1 -q "$SEARCH_TERM" --layout=reverse --info=inline --height=10%)" || exit
2022-01-29 22:53:29 -08:00
$EDITOR_CMD "$NOTE_PATH"
}
2022-01-13 14:47:59 -08:00
2022-01-20 03:18:04 -08:00
new() {
check_setup
# Find out note name
if [ -n "$3" ]; then
NOTE_NAME="$3.md"
elif [ -n "$2" ]; then
NOTE_NAME="$2.md"
else
NOTE_NAME="$(date +'%F').md"
2022-01-20 03:18:04 -08:00
fi
# TODO: use fzf instead of fd + fzf for picking the directory
NOTE_PATH="$(fd -ad 1 "^$2" "$NOTES_DIR")"
# check if there were no results
if [ -z "$NOTE_PATH" ]; then
echo "No directories found for '$2'."
echo "All possible directories:"
(cd "$NOTES_DIR" && fd -d 1 -t d "$NOTES_DIR")
exit
# if there was more than one result
elif [ "$(echo "$NOTE_PATH" | wc -l)" -gt 1 ]; then
NOTE_PATH="$(echo "$NOTE_PATH" | fzy)" || exit
fi
# TODO: allow setting location for files to go with $3, and $4 for file name
# check if there is a notes directory in the note path
if [ -d "$NOTE_PATH/notes" ]; then
NOTE_PATH="$NOTE_PATH/notes"
# if there is no notes directory
else
PROMPT="Place note in… "
NOTE_PATH="$(cd "$NOTE_PATH" && fd -ad 1 -t d | fzy -p "$PROMPT")" || exit
fi
if [ -f "$NOTE_PATH/$NOTE_NAME" ]; then
echo "File already exists. Opening..."
sleep 0.5
$EDITOR_CMD "$NOTE_PATH/$NOTE_NAME"
else
cd "$NOTE_PATH" || exit
# apply a template for notes
cat <<-EOF >> "$NOTE_PATH/$NOTE_NAME"
<!-- vim: wrap nonu nornu
-->
EOF
STARTING_MD5="$(md5sum "$NOTE_PATH/$NOTE_NAME")"
$EDITOR_CMD "$NOTE_PATH/$NOTE_NAME"
if [ "$(md5sum "$NOTE_PATH/$NOTE_NAME")" = "$STARTING_MD5" ]; then
rm "$NOTE_PATH/$NOTE_NAME"
2022-01-30 17:14:55 -08:00
fi
fi
}
subshell() {
echo 'entering subshell'
$SHELL
}
shell() {
cd "$NOTES_DIR" && subshell
}
check_setup() {
# perform preliminary checks to make sure the script can run properly
if ! [ -d "$NOTES_DIR" ]; then
echo "Error: Notes directory ($NOTES_DIR) does not exist or is not a directory"
exit 1
fi
2022-01-20 03:18:04 -08:00
}
# Parse arguments (first character only)
2022-01-30 17:19:00 -08:00
case "${1}" in
# help
2022-01-30 17:19:00 -08:00
'help') usage;;
2022-01-13 14:47:59 -08:00
# create and edit new note
2022-01-30 17:19:00 -08:00
'new') new $@;;
# edit an existing document or file
'edit'|'ed') edit $@;;
# run a shell (cd to) in the directory
2022-01-30 17:19:00 -08:00
'cd'|'shell') shell;;
# edit ned (the file you are looking at right now)
'ned') $EDITOR "$(realpath "$0")";;
2022-01-13 14:47:59 -08:00
*) echo "no such option";;
esac
# vim: et sw=3 ts=3 ft=bash