+++
title = "Bash Notes"
date = "2023-04-07T11:20:20+02:00"
type = "tech"
author = "Danilo M."
excerpt = "Un'app 'sticky notes', scritta in bash per i patiti della shell."
categories = ["DIY", "Code"]
tags = ["linux", "bash"]
+++

# bash notes

## uno script semplice per prendere appunti, scritto in bash

Mi sono reso conto di aver bisogno di un modo semplice per prendere appunti e, poiché le altre soluzioni disponibili non soddisfacevano le mie esigenze, ho deciso di scrivere il mio script.

Si tratta di un semplice script bash, l'unica dipendenza (per ora) è [jq](https://stedolan.github.io/jq/).

Ecco tutte le funzioni disponibili:

```bash
Usage:
  notes.sh [PARAMS] ...

notes parameters are:
  -h | --help                   : This help text
  -p | --plain                  : Output is in plain text
                                  (without this option the output is formatted)
                                  (this option must precede all others)
  -l | --list                   : List existing notes
  -a | --add=["<title>"]        : Add new note
  -e | --edit=[<note>]          : Edit note
  -d | --delete=[<note> | all]  : Delete single note or all notes at once
  -s | --show=[<note>]          : Display note using your favourite PAGER
  -r | --restore=[<dir>]        : Restore a previous backup from dir
  -v | --version                : Print version
  --userconf                    : Export User config file
  --backup [<dest>]             : Backup your data in your destination folder

if a non option is passed and is a valid note ID, the note will be displayed.
```

Tutte le funzionalità di base sono presenti e funzionanti; probabilmente necessita di qualche rifinitura e di alcuni test, quindi, se volete provarlo, fatemi sapere cosa ne pensate.

### Impostazioni

Quando lo eseguite per la prima volta, notes.sh creerà tutti i file necessari per il suo funzionamento.
Per impostazione predefinita, la directory verrà popolata in `~/.local/share/bash-notes`.

Se volete modificare le impostazioni predefinite, potete esportare un file di configurazione utente eseguendo:

```bash
notes.sh --userconf
```

E avrete tutte le vostre impostazioni in `~/.config/bash-notes.rc`. Questo file verrà caricato ogni volta che eseguite lo script.

Potete modificare tutte queste impostazioni modificando il file:

```bash
# Binaries to use
JQ=${JQ:-/usr/bin/jq}
EDITOR=${EDITOR:-/usr/bin/vim}
TERMINAL=${TERMINAL:-/usr/bin/alacritty}
# add options for your terminal. Remember to add the last option to execute
# your editor program, otherwise the script will fail.
# see example in the addnote function
TERM_OPTS="--class notes --title notes -e "
# Setting PAGER here overrides whatever is set in your default shell
# comment this option to use your default pager if set in your shell.
PAGER=${PAGER:-/usr/bin/more}

# set this to true to have output in plain text
# or use the -p option on the command line before every other option
PLAIN=false
# base directory for program files
BASEDIR=${BASEDIR:-~/.local/share/bash-notes}
# notes database in json format
DB=${BASEDIR}/db.json
# directory containing the actual notes
NOTESDIR=${BASEDIR}/notes
```

La maggior parte sono piuttosto autoesplicative; l'unica che potrebbe richiedere chiarimenti è `TERM_OPTS`, che viene utilizzata per impostare la finestra del terminale in cui verrà eseguito l'editor durante la scrittura della nota.

È necessario prestare particolare attenzione quando si specificano le opzioni; nel mio caso, utilizzando [alacritty](https://github.com/alacritty/alacritty), l'opzione che consente di eseguire un software nella finestra appena creata è `-e`, quindi devo specificarla come ultima opzione.

### Funzionalità

bash-notes può:

*   scrivere una nuova nota `--add="Your note title"` o, in breve, `-a"Your note title"`
*   modificare una nota esistente `--edit=[note ID]`, versione breve `-e[note ID]`
*   eliminare una nota `--delete=[note ID]` o `-d[note ID]`
*   eliminare tutte le note `--delete=all` o `-dall`
*   elencare le note esistenti `--list` o `-l` in forma abbreviata
*   visualizzare una nota `--show=[note ID]` o `-s[note ID]`.

È anche possibile semplicemente passare [ID nota] come argomento allo script e verrà visualizzata la nota corrispondente.

```bash
notes.sh 1
```

L'*ID nota* viene assegnato quando viene creata la nota ed è così che si fa riferimento alla nota nel programma.

##### Elenco semplice vs. "colorato"

L'opzione `--plain` o `-p`, in forma abbreviata, determina come viene formattata l'output dello script. Ecco un esempio dell'elenco di tutte le note:

```bash
notes.sh -l
listing all notes

[ID]    [TITLE]         [CREATED]
[1]     ciao nota       25/03/2023 18:53 +0100CET
[2]     hello there     25/03/2023 19:02 +0100CET
```

Ed ecco lo stesso elenco con l'opzione "plain":

```bash
notes.sh -pl
1 - ciao nota - 25/03/2023 18:53 +0100CET
2 - hello there - 25/03/2023 19:02 +0100CET
```

Al momento è solo una prova di concetto, ma l'idea è di utilizzare un output più interessante, magari utilizzando il markup, e di semplificarlo in modalità "plain". In fin dei conti, è ancora un progetto in corso.
L'opzione "plain" deve precedere tutte le altre opzioni, altrimenti non funzionerà. Cercherò di risolvere questo problema in futuro.

Mi piacerebbe implementare una sorta di funzionalità di ricerca, ma devo ancora studiare la questione.

##### Backup

A partire dalla versione 0.3, questo script può anche gestire i backup di tutte le vostre note. Potete specificare una cartella di backup con:

```bash
notes.sh --backup=/some/dir
```

e lo script creerà la directory se non esiste e farà il backup di tutti i vostri dati, incluso il file rc, se ne avete creato uno.

Se volete ripristinare un backup, potete farlo con:

```bash
notes.sh --restore=/some/dir
```

E lo script si occuperà di ripristinare tutto al suo posto.

{{< callout type="warning" title="Heads up" >}}

Tenete presente che tutte le vostre note esistenti verranno sovrascritte durante il processo.
{{< /callout >}}

### Installazione

{{< actions url="https://git.danix.xyz/?p=bash-notes.git;a=summary" desc="Visualizza sul Repository Git" use="repo" caption="Codice sorgente e cronologia completa disponibili sul server git di danix.xyz." >}}

Basta copiare lo script nella vostra cartella $PATH e renderlo eseguibile. Ecco un esempio:

```bash
mv notes.sh ~/bin/
chmod 755 ~/bin/notes.sh
```

Adattatelo alle vostre esigenze.

La prima volta che eseguite lo script, questo si occuperà di creare tutti i file e le cartelle necessari nelle directory standard.

### Debugging

Se lo script non funziona per qualche motivo, potete attivare il debugging eseguendo lo script in questo modo:

```bash
DEBUG=true notes.sh [options]
```

E potrete quindi controllare tutto ciò che è accaduto nel file di log all'indirizzo `/tmp/debug_bash-notes.log`.

### Visione

Ok, forse "visione" è un termine un po' pretenzioso, ma ho scritto questo script per utilizzarlo nel mio flusso di lavoro quotidiano con [rofi](https://github.com/davatorium/rofi) e [i3wm](https://github.com/i3/i3). Adatterò il suo funzionamento per soddisfare al meglio questa mia esigenza.

Ci sono ovviamente alcune cose che mi piacerebbe aggiungere, ma il mio obiettivo principale è che funzioni nel modo in cui ho inteso utilizzarlo.

### COSA FARE

*   aggiungere un modo per cercare le note
*   ~~aggiungere un modo per visualizzare una nota senza eseguire vim~~ *(fatto nella versione 0.3)*
*   supporto per markdown?
    *   forse implementare una funzione di esportazione che crei il file HTML o PDF dalla nota (pandoc??)
*   scrivere uno script di completamento bash per abilitare il completamento automatico nella shell
*   altre idee potrebbero nascere [...]

### Collaborazione

Significherebbe molto ricevere un feedback, patch se vi sentite di contribuire. Non mi aspetto molto, dato che si tratta di un progetto personale, ma sentitevi liberi di interagire quanto volete.

### ChangeLog

*   v0.3 - gestione dei backup. Alcuni miglioramenti dell'interfaccia utente
    *   creazione e ripristino dei backup di tutte le note e delle impostazioni.
    *   visualizzazione delle note utilizzando la variabile PAGER predefinita o definendo il proprio programma.
*   v0.2 - implementato il debugging
    *   ora è possibile generare un file di log di debug nel caso in cui qualcosa non funzioni
*   v0.1 - primo upload pubblico
    *   tutte le funzionalità principali sono presenti e funzionanti

### Responsabile

*   [danix](https://danix.xyz) - sono solo io, in realtà...

### LICENZA

{{< callout type="info" >}}
bash-notes © 2023 by danix è concesso in licenza sotto CC BY-NC 4.0. Per visualizzare una copia di questa licenza, visitate http://creativecommons.org/licenses/by-nc/4.0/.
{{< /callout >}}