From b50de6182bb8302021fb5e8d4a1279d32df3f4ba Mon Sep 17 00:00:00 2001 From: terrantechpriest Date: Mon, 22 Jul 2024 18:00:23 +0000 Subject: [PATCH] added Notes initial stuff --- LICENSE | 22 ++++++++ README.md | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ notes | 41 ++++++++++++++ 3 files changed, 220 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 notes diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6c6ba71 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2019 Nick Janetakis nick.janetakis@gmail.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1115b34 --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +# Notes ![CI](https://github.com/nickjj/notes/workflows/CI/badge.svg?branch=master) + +A zero dependency POSIX compliant shell script that makes it really simple to +manage your text notes. + +Instead of trying to impose a whole bunch of rules and syntax requirements, +this tool does its best to get out of your way. + +It tries to do everything possible so that if you're working in a terminal, you +can save whatever text you want into a file. This could come from typing a +sentence out, pasting something from your clipboard or saving the output of a +program. + +## Demo Video + +[![Demo +video](https://nickjanetakis.com/assets/blog/cards/organize-your-text-based-notes-from-the-command-line-with-this-script-53667299e8d44dbc6091a80a477dc540e201da4aa47ba974f630da4690500444.jpg)](https://nickjanetakis.com/blog/organize-your-text-based-notes-from-the-command-line-with-this-script) + +#### Updates to the notes script since this video + +- `v0.2.0` scopes the notes files [per month instead of per + day](https://github.com/nickjj/notes/commit/4693109f27dc15da6626e3afbba53730810df026). + This differs from what's in the video at the 4:00 mark. +- `v0.1.0` matches exactly what's in this video. + +## Design Goals and Philosophy + +I've been keeping track of my notes in plain text files since 2001. I always +felt like when it comes to jotting down notes it was always best to do +everything possible to keep friction low. + +That means not worrying about specific file types, formatting, tagging, +check boxes, syntax rules and a bunch of other things that delay you from +getting something out of your head and into a document. + +### Text is amazing for notes because: + +- You can use `grep` and friends to search through it later +- Even with notes dating back from 2001, I'm only using 1.5mb of disk space +- It's really easy to back up and sync to other devices using Drop Box or similar tools + +Since it's unstructured text you can use this tool for whatever type of note +taking you want. You can keep track of general thoughts, create a diary or make +plan files similar to what John Carmack did [for a number of +years](https://github.com/ESWAT/john-carmack-plan-archive). + +I personally use it as a scattered brain dump. Even with things being very +unstructured (and even untagged) I can usually `grep` out anything I want +within a few seconds. + +### Your notes are organized by auto-dated files + +Let's say it's December 25th, 2019. If you were to run `notes hello world` it +would create a `2019-12.txt` file in your `NOTES_DIRECTORY` (this is +something you can configure). It would then append `hello world` to the end of +the file. + +If you run `notes something else` on the next day it will still append to the +same file and continue appending to that file until the next months hits. For +example, on January 1st 2020 any `notes` commands will append to a +`2020-01.txt` file. + +There's other things you can do such as piping input to it, or running the +script without any arguments to open the file in your configured `EDITOR` but +let's first go over installing it before we get to that. + +### What is this script not good for? + +Depending on how you work, it's probably not ideal for grouping up a bunch of +extended thoughts about a specific topic. + +For example, if you were planning to write a book and you spent 3 months +gathering info about what you're writing about then you would end up with a +bunch of isolated date formatted files that was mixed in with everything else. + +In those cases, I recommend you make a new script called `book` which basically +does what this script does except it always dumps everything to 1 specific file +of your choosing which isn't dated. That's what I do to help plan my +[video courses](https://nickjanetakis.com/courses/). + +## Installation + +Copy / paste the line below, or if you don't like this pattern of installing +scripts then feel free to run things manually. + +### 1 liner to get `notes` downloaded to `/usr/local/bin`: + +```sh +sudo curl \ + -L https://raw.githubusercontent.com/nickjj/notes/master/notes \ + -o /usr/local/bin/notes && sudo chmod +x /usr/local/bin/notes +``` + +You can also choose to replace `master` with a specific [release +tag](https://github.com/nickjj/notes/tags) if you want to grab a specific +version. + +There's no fancy `git clone` instructions because you may end up modifying at +least 1 line of the script. Plus since the script is so simple, this repo is +likely not going to change and if it does you will be able to `diff` it without +any issues. + +### Configuration + +By default it will use `${HOME}/notes` as your notes directory and if that +directory doesn't exist beforehand, this script will allow you to create it +with a `y/n` prompt when you first run the program. + +You can also customize your notes path in 1 of 2 ways: + +1. Put `export NOTES_DIRECTORY="/tmp/foo"` in your `~/.profile` or equivalent +file (`/tmp/foo` would be your notes path) +2. Directly edit the `notes` script and replace `${HOME}/notes` with `/tmp/foo` +in the `NOTES_DIRECTORY` variable + +Also, if you want this script to open your notes in your code editor you'll +want to make sure you have your `EDITOR` defined in your `~/.profile` too. This +is a Unix standard. For example, mine looks like `export EDITOR="vim"`. + +*If you change your `~/.profile`, don't forget to log out / login.* + +## Usage Examples + +There's 3 ways of using this script: + +- `notes something you want to jot down` + - Appends whatever arguments you add as text into the dated file + +- `xclip -o | notes` + - Pipes and appends anything (in this case your clipboard's contents) into the dated file + +- `notes` + - Opens the dated file in your configured `EDITOR` + +That's really all there is to it. With the above 3 ways of adding notes you'll +find yourself adding all sorts of different types of notes with very little +friction. I encourage you to check out [just how short the source +code](https://github.com/nickjj/notes/blob/master/notes) is. + +If you wanted to go all out, you could even create custom key binds in your +code editor that would take the selected text and append it to your notes by +running one of the above commands. Since everything is text you have a lot of +flexibility! + +Also, you have the power of the command line at your finger tips to manipulate +these files however you see fit. For example you can run `cat 2019-*.txt > +2019.txt` to create a yearly file. + +## About the Author + +I'm a self taught developer and have been freelancing for the last ~20 years. +You can read about everything I've learned along the way on my site at +[https://nickjanetakis.com](https://nickjanetakis.com/). There's hundreds of +[blog posts](https://nickjanetakis.com/blog/) and a couple of [video +courses](https://nickjanetakis.com/courses/) on web development and deployment +topics. I also have a [podcast](https://runninginproduction.com) where I talk +to folks about running web apps in production. diff --git a/notes b/notes new file mode 100644 index 0000000..3351903 --- /dev/null +++ b/notes @@ -0,0 +1,41 @@ +#!/usr/bin/env sh +# Create a dated text file at a specific location and append text to it. +# +# Usage: +# $ notes something you want to jot down (appends that text to the file) +# $ xclip -o | notes (appends your clipboard to the file) +# $ notes (opens the file in your editor) +# +# Produces: +# YYYY-MM.txt in your $NOTES_DIRECTORY (this is set below). + +set -e + +readonly NOTES_DIRECTORY="${NOTES_DIRECTORY:-${HOME}/notes}" +readonly NOTES_EDITOR="${EDITOR}" + +readonly NOTES_FILE="$(date +%Y-%m).txt" +readonly NOTES_PATH="${NOTES_DIRECTORY}/${NOTES_FILE}" + +if [ ! -d "${NOTES_DIRECTORY}" ]; then + while true; do + printf "%s does not exist, do you want to create it? (y/n) " "${NOTES_DIRECTORY}" + read -r yn + + case "${yn}" in + [Yy]* ) mkdir -p "${NOTES_DIRECTORY}"; break;; + [Nn]* ) exit;; + * ) printf "Please answer y or n\n\n";; + esac + done +fi + +if [ ${#} -eq 0 ]; then + if [ -p "/dev/stdin" ]; then + (cat; printf "\n\n") >> "${NOTES_PATH}" + else + eval "${NOTES_EDITOR}" "${NOTES_PATH}" + fi +else + printf "%s\n\n" "${*}" >> "${NOTES_PATH}" +fi