Shell Scripts to Facilitate Effective Note Taking
Essentially I used to have a dozen shell scripts in ~/bin
that I use to capture notes,
this is an attempt to wrap them into a single script and then have aliases to make them quick to access.
The idea is that it is just a menu to dispatch different scripts so I could share those scripts with classmates.
- cadmus acts as a menu for scripts to acheive things
- the script name
willshould always be printed to the terminal so the individual script can be repurposed with out fishing through code.
- the script name
- Subscripts
willshould take only one argument (orSTDIN
)- If the first argument is either
-h
or--help
help will be printed and thenexit 0
- This might lead to some limitations but the simplicity is for sanity, modularity and extensibility.
- Will always return absolute path.
- I played around with relative path but it got confusing when calling the script from inside a function inside a script, so instead if you want a relative path you should do
scriptname './' | xargs realpath --relative-to='./'
- I played around with relative path but it got confusing when calling the script from inside a function inside a script, so instead if you want a relative path you should do
- If the first argument is either
- Be a Front end to tie together different scripts and tools
- Don't replicate work other people have done.
- Plain Text, Open Source.
- Be Modular
- Pipe in input, output goes to STDOUT
- Leave Aliases and piping to the user
- cadmus will take the notes directory from the global variable
CADMUS_NOTES_DIR
- The Actual work will be done by subscripts denoted by
description.bash
- The subscripts will take the note directory as an argument so they are portable and modular
- The Arguments will be shifted and then all passed down to subfunctions
- The Actual work will be done by subscripts denoted by
To install:
-
satisfy the dependencies
-
Download cadmus and put it in the
PATH
mkdir ~/.cadmus && \ git clone https://github.com/RyanGreenup/cadmus ~/.cadmus \ || echo "Delete ~/.cadmus first" ln -s ~/.cadmus/bin/cadmus $HOME/bin/
-
If you haven't already add
$HOME/bin
to the$PATH
variable, something like this should be fairly shell agnostic:echo $PATH | grep "$HOME/bin" &> /dev/null && echo "$HOME/bin in path already" || ls "$HOME/bin" &> /dev/null && echo 'PATH="$PATH:$HOME/bin"' >> $HOME/.profile
-
-
You will probably need to change the directory to your notes in the script:
which cadmus | xargs xdg-open
readonly NOTES_DIR="$HOME/Notes/" readonly SERVER_DIR="/var/www/html/MD" readonly MKDOCS_YML="$HOME/Notes/mkdocs.yml"
-->
Currently the search just uses the default recoll config, I intend to modify this to use ~/.cadmus
as a config directory so as to not interfere with the default config.
It isn't in practice an issue if ~/.recoll
is indexing more than the notes because you can just modify the call to Skim (sk
) in ..cadmus.. to start the call with ~/Notes/MD
.
It's all Menu driven so just follow the diagram to do what you need.
It is assumed that:
- Notes are:
- Markdown files with a
.md
extension - Underneath
~/Notes
(you ma) - Recoll updates it's index on the fly
~/Notes
will need to be indexed by Recoll so the results will show up.
- Markdown files with a
- SSD
- I use an SSD and some scripts are pretty inefficient (like
grep | cut | xargs find
to avoid creating a variable), I don't know if things like would work on a HDD.
- I use an SSD and some scripts are pretty inefficient (like
- All Notes have Unique Names
- On MacOS you'll need to define
xdg-open
so do something like:
alias xdg-open='open &>/dev/null'
- highlight
- recode
- node
- fzf
- skim
- rg
- Make sure to include
pcre2
, this comes in Arch, if usingcargo
:cargo install ripgrep --features 'pcre2'
- Make sure to include
- perl
- python
- tmsuAUR
- ranger
- mdcatAUR
- xclip
- sd
- fd
- sed
- cut
- grep
- find
- GNU realpath
- Recoll
- Pandoc
- bat
- readability-cli
- mdless
- VSCode
If installed with pip
or cargo
it will be necessary to add these directories to your PATH
:
## bash
echo '
export PATH="$HOME/.local/bin:$PATH"
export PATH="$HOME/.cargo/bin:$PATH"
' >> ~/.bashrc
## zsh
echo '
export PATH="$HOME/.local/bin:$PATH"
export PATH="$HOME/.cargo/bin:$PATH"
' >> ~/.bashrc
## fish
echo '
set PATH $HOME/.local/bin $PATH
set PATH $HOME/bin $PATH
set PATH "$HOME/.cargo/bin $PATH
' >> ~/.config/fish/config.fish
I wrote all this with aliases in mind, when I settle on some aliases i'll put up my fish
functions. (I also wanted to do some autocomplete.)