#!/bin/bash # v1.0 # NEd: Note Editor (and your best friend!) # Ned can edit and create notes in a folder you tell him to! # Depends: fzf # 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 # set default values if things are unset NOTES_DIR="${NOTES_DIR:-"$HOME/Documents/college/current"}" EDITOR="nvim" EDITOR_CMD="nvim -c :ZenMode" usage() { cat <<-EOF Usage: ned new [note name] create a new note in the matched class folder [edit|ed] [note name] search for and edit a text document in a folder ned edit ned help print this message 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 $EDITOR_CMD "$NOTE_PATH" } new() { check_setup # Find out note name if [ -n "$3" ]; then NOTE_NAME="$3.md" else NOTE_NAME="$(date +'%m-%d').md" 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" 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" 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 } # Parse arguments (first character only) case "${1}" in # help '--help'|'-h'|'help') usage;; # create and edit new note 'new') new $@;; # edit an existing document or file 'edit'|'ed') edit $@;; # run a shell (cd to) in the directory 'x'|'cd'|'shell') shell;; # edit ned (the file you are looking at right now) 'ned') $EDITOR "$(realpath "$0")";; *) echo "no such option";; esac # vim: et sw=3 ts=3 ft=bash