# cadmus Shell Scripts to Facilitate Effective Note Taking ## Introduction 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. ![](./MainMenu.png) ## Philosophy - ****cadmus**** acts as a menu for scripts to acheive things - the script name will always be printed to the terminal so the individual script can be used for whatever purpose. - SubFunctions will take *only one* argument or `STDIN` - If the first argument is either `-h` or `--help` help will be printed and then `exit 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='./'` - ****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 - I'll just need to be careful that loose arguments aren't dangerous - 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 - See [Recommended Aliases](#recommended-aliases) ## Installation To install: 1. satisfy [the dependencies](#Dependencies) 2. [Set up Recoll](#Configuring-recoll) 3. Download cadmus and put it in the `PATH` ```bash mkdir ~/.cadmus && \ clone https://github.com/RyanGreenup/cadmus ~/.cadmus \ || echo "Delete ~/.cadmus first" ln -s ~/.cadmus/bin/cadmus $HOME/bin/ ``` 3. If you haven't already add `$HOME/bin` to the `$PATH` variable, something like this should be fairly shell agnostic: ``` bash 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 ``` 4. You will probably need to change the directory to your notes in the script: ```bash which cadmus | xargs xdg-open ``` ``` readonly NOTES_DIR="$HOME/Notes/" readonly SERVER_DIR="/var/www/html/MD" readonly MKDOCS_YML="$HOME/Notes/mkdocs.yml" ``` --> ### Configuring recoll 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`. ## Usage It's all Menu driven so just follow the diagram to do what you need. ![Mindmap of Program Flow](./usage.svg "Diagram of the flow of the script") ### Assumptions It is assumed that: 1. Notes are: 1. *Markdown* files with a `.md` extension 2. Underneath `~/Notes` (you ma) 3. Recoll updates it's index on the fly * `~/Notes` will need to be indexed by *Recoll* so the results will show up. 3. 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. 5. All Notes have Unique Names 6. On *MacOS* you'll need to define `xdg-open` so do something like: ```bash alias xdg-open='open &>/dev/null' ``` [*nushell*]: https://github.com/nushell/nushell [*Fish*]: https://fishshell.com/ [*OMF*]: https://github.com/oh-my-fish/oh-my-fish ## Dependencies - [highlight](https://www.archlinux.org/packages/community/x86_64/highlight/) - [recode](https://www.archlinux.org/packages/extra/x86_64/recode/) - [node](https://nodejs.org/en/) - [fzf](https://github.com/junegunn/fzf) - [skim](https://github.com/lotabout/skim) - [rg](https://www.google.com/search?client=firefox-b-d&q=ripgrep+github) - [perl](https://wiki.archlinux.org/index.php/Perl) - [python](https://www.python.org/download/releases/3.0/) - [tmsu](https://aur.archlinux.org/packages/tmsu/)AUR - [ranger](https://www.archlinux.org/packages/community/any/ranger/) - [mdcat](https://aur.archlinux.org/packages/mdcat/)AUR - [xclip](https://www.archlinux.org/packages/extra/x86_64/xclip/) - [sd](https://github.com/chmln/sd) - [fd](https://github.com/sharkdp/fd) - [sed](https://www.gnu.org/software/sed/) - [cut](https://www.gnu.org/software/coreutils/manual/html_node/The-cut-command.html) - [grep](https://www.gnu.org/software/grep/) - [find](https://man7.org/linux/man-pages/man1/find.1.html) - [GNU realpath](https://www.gnu.org/software/coreutils/manual/html_node/realpath-invocation.html#realpath-invocation) - [Recoll](https://www.lesbonscomptes.com/recoll/) - [Pandoc](https://github.com/jgm/pandoc) - [bat](https://github.com/sharkdp/bat) ### Recommended for all Features - [WeasyPrint](https://aur.archlinux.org/packages/python-weasyprint/) - [tectonic](https://tectonic-typesetting.github.io/en-US/) - [nvim](https://neovim.io/) - [Kitty](https://sw.kovidgoyal.net/kitty/) - I've also heard good things about [iterm2](https://www.iterm2.com/) - [MkDocs](https://pypi.org/project/mkdocs-material-extensions/) - [MkDocs Material Theme](https://github.com/squidfunk/mkdocs-material) - [MkDocs Material Extensions](https://pypi.org/project/mkdocs-material-extensions/) - [MarkText](https://github.com/marktext/marktext) - [VNote](https://github.com/tamlok/vnote) ### recommended / Interesting / Helpful packages not required - [readability-cli](https://gitlab.com/gardenappl/readability-cli) - mdless - VSCode ### PATH If installed with `pip` or `cargo` it will be necessary to add these directories to your `PATH`: ``` bash ## 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 ``` ## Recommended Aliases 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.) ## Related - [DNote] - [TNote] - [Notable] [Notable]: https://github.com/notable/notable [TNote]: https://github.com/tasdikrahman/tnote [DNote]: https://github.com/dnote [tmpfs]: https://wiki.archlinux.org/index.php/Tmpfs [shared_memory]: http://en.wikipedia.org/wiki/Shared_memory [^wpdtmpfs]: [From Wikipedia][shared_memory] Recent 2.6 Linux kernel builds have started to offer /dev/shm as shared memory in the form of a ramdisk, more specifically as a world-writable directory that is stored in memory with a defined limit in /etc/default/tmpfs. /dev/shm support is completely optional within the kernel config file. [*stow*]: https://www.google.com/search?client=firefox-b-d&q=gnu+stow